Skip to content

Commit 8de02c8

Browse files
authored
Merge pull request #104 from ProyectoIntegrador2018/Mongod2021
ReadMe actualizado
2 parents 616c946 + 5dcaff1 commit 8de02c8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+20109
-808
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Silma Web is a platform that facilitates the process for the acceptance of texts
88
* [Enviornment URLS](#Enviornment-URLS)
99
* [Antlers](#Antlers)
1010
* [Zelda Labs](#Zelda-Labs)
11+
* [Mongod](#Mongod)
1112
* [Technologies](#Technologies)
1213
* [Management tools](#management-tools)
1314
* [Setup the project](#setup-the-project)
@@ -47,6 +48,17 @@ Silma Web is a platform that facilitates the process for the acceptance of texts
4748
| Francisco Castro | [email protected] | Product Owner Proxy |
4849
| Renato Sánchez | [email protected] | Admin. de Configuración y deProyecto |
4950

51+
### Mongod
52+
#### (Febrero - Junio 2021)
53+
54+
| Name | Email | Role |
55+
| -------------- | ----------------------------- | ------------------------|
56+
| Héctor León | [email protected] | Scrum Master |
57+
| Luis Bravo | [email protected] | Admin. de Proyecto |
58+
| Jesús Ángeles | [email protected] | Admin. de Configuración |
59+
| Ulises Serrano | [email protected] | Product Owner Proxy |
60+
61+
5062

5163
### Technologies
5264
Front end:

back/src/config/config.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ const config = Object.freeze({
1313
EMAIL_PORT: process.env.EMAIL_PORT,
1414
EMAIL_USER: process.env.EMAIL_USER,
1515
EMAIL_PASSWORD: process.env.EMAIL_PASSWORD,
16-
AWS_BUCKET: process.env.AWS_BUCKET
16+
AWS_BUCKET: process.env.AWS_BUCKET || 'silmaprod',
17+
AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID,
18+
AWS_SECRET_ACCESS_KEY: process.env.AWS_SECRET_ACCESS_KEY
1719
});
1820

1921
export default config;

back/src/controllers/admin.controller.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,19 @@ export const getFeedback = (request, response) => {
7373
});
7474
};
7575

76+
const phaseDateUtil = (datesPerPhase, newPhase, oldPhase) =>{
77+
if(oldPhase < newPhase){
78+
for(let i=oldPhase+1; i<=newPhase; i++){
79+
datesPerPhase[i] = new Date();
80+
}
81+
}
82+
else{
83+
for(let i=oldPhase; i>newPhase; i--){
84+
datesPerPhase[i] = null;
85+
}
86+
}
87+
return datesPerPhase;
88+
}
7689
//Funcion que avanza la fase del texto del cual recibe su ID
7790
export const movePhase = (request, response) => {
7891
send(response, async () => {
@@ -82,7 +95,7 @@ export const movePhase = (request, response) => {
8295
const newPhase = request.body.phase;
8396
const phase = await TextModel.updateOne(
8497
{ _id: id },
85-
{ $set: { phase: newPhase } },
98+
{ $set: { phase: newPhase, datesPerPhase: phaseDateUtil(text.datesPerPhase, newPhase, text.phase)}},
8699
function (err, res) {
87100
if (err) throw err;
88101
}

back/src/controllers/aws.controller.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,18 @@ export const uploadDocument = async (id, data) => {
3232
}
3333
});
3434
};
35+
36+
37+
//Funcion que obtiene una imagen de AWS S3
38+
export const getImage = async (id) => {
39+
const params = { Bucket: config.AWS_BUCKET + "/Images", Key: id + ".png" };
40+
var s3 = new AWS.S3({credentials:{secretAccessKey: config.AWS_SECRET_ACCESS_KEY, accessKeyId: config.AWS_ACCESS_KEY_ID},});
41+
return new Promise((resolve, reject) => {
42+
s3.getObject(params, function(err, data) {
43+
if (err) {
44+
reject(err);
45+
}
46+
resolve(data);
47+
});
48+
});
49+
};
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
import { send } from "@/utils/errors";
2+
import { TextModel } from "@/models/text.model";
3+
import { UserModel } from "@/models/user.model";
4+
5+
const initialPhases = {
6+
1: {
7+
max: Number.MIN_VALUE,
8+
min: Number.MAX_VALUE,
9+
total: 0
10+
},
11+
2: {
12+
max: Number.MIN_VALUE,
13+
min: Number.MAX_VALUE,
14+
total: 0
15+
},
16+
3: {
17+
max: Number.MIN_VALUE,
18+
min: Number.MAX_VALUE,
19+
total: 0
20+
},
21+
4: {
22+
max: Number.MIN_VALUE,
23+
min: Number.MAX_VALUE,
24+
total: 0
25+
},
26+
5: {
27+
max: Number.MIN_VALUE,
28+
min: Number.MAX_VALUE,
29+
total: 0
30+
},
31+
6: {
32+
max: Number.MIN_VALUE,
33+
min: Number.MAX_VALUE,
34+
total: 0
35+
},
36+
7: {
37+
max: Number.MIN_VALUE,
38+
min: Number.MAX_VALUE,
39+
total: 0
40+
},
41+
8: {
42+
max: Number.MIN_VALUE,
43+
min: Number.MAX_VALUE,
44+
total: 0
45+
},
46+
47+
overall:{
48+
max: Number.MIN_VALUE,
49+
min: Number.MAX_VALUE,
50+
total: 0
51+
}
52+
}
53+
54+
55+
// Response with all texts with their genres.
56+
export const getTimeBenchmarks = (request, response) => {
57+
send(response, async () => {
58+
const texts = await TextModel.find().populate("genres").populate("writer");
59+
const phases = {...initialPhases};
60+
texts.forEach((text) => {
61+
let thisDate = new Date(text.createdAt)
62+
for(let i=1; i<9; i++){
63+
const nextDate = text.datesPerPhase[i+1] !== null ? new Date(text.datesPerPhase[i+1]) : null
64+
console.log(nextDate)
65+
const timeInPhase = getHours(thisDate, nextDate)
66+
phases[i] ={
67+
min: phases[i].min > timeInPhase ? ((timeInPhase !== -1) ? timeInPhase : phases[i].min) : phases[i].min,
68+
max: phases[i].max < timeInPhase ? ((timeInPhase !== -1) ? timeInPhase : phases[i].max) : phases[i].max,
69+
total: (timeInPhase !== -1) ? timeInPhase + phases[i].total : phases[i].total
70+
}
71+
thisDate = nextDate
72+
}
73+
const startDate = new Date(text.createdAt)
74+
const endDate = text.datesPerPhase[9] !== null ? new Date(text.datesPerPhase[9]) : null
75+
const totalTime = getHours(startDate, endDate)
76+
phases['overall'] = {
77+
min: phases['overall'].min > totalTime ? ((totalTime !== -1) ? totalTime : phases['overall'].min) : phases['overall'].min,
78+
max: phases['overall'].max < totalTime ? ((totalTime !== -1) ? totalTime : phases['overall'].max) : phases['overall'].max,
79+
total: (totalTime !== -1) ? totalTime + phases['overall'].total : phases['overall'].total
80+
}
81+
})
82+
for(let i=1; i<9; i++){
83+
phases[i] ={
84+
...phases[i],
85+
avg: phases[i].total/getLengthOfNotNull(texts,i+1)
86+
}
87+
}
88+
phases['overall'] = {
89+
...phases['overall'],
90+
avg: phases['overall'].total/getLengthOfNotNull(texts,9)
91+
}
92+
93+
console.log(phases)
94+
return phases;
95+
});
96+
};
97+
98+
99+
export const getTimeBenchmarksByWriter = (request, response) => {
100+
send(response, async () => {
101+
const texts = await TextModel.find().populate("genres").populate("writer");
102+
const phasesByWriters = {};
103+
console.log(initialPhases)
104+
texts.forEach((text) => {
105+
let thisDate = new Date(text.createdAt)
106+
const writer = text.writer.pseudonym
107+
if(!phasesByWriters[writer]) phasesByWriters[writer] = {...initialPhases};
108+
for(let i=1; i<9; i++){
109+
const nextDate = text.datesPerPhase[i+1] !== null ? new Date(text.datesPerPhase[i+1]) : null
110+
const timeInPhase = getHours(thisDate, nextDate)
111+
phasesByWriters[writer][i] ={
112+
min: (phasesByWriters[writer][i].min > timeInPhase && timeInPhase !== -1) ? timeInPhase : phasesByWriters[writer][i].min,
113+
max: (phasesByWriters[writer][i].max < timeInPhase && timeInPhase !== -1) ? timeInPhase : phasesByWriters[writer][i].max,
114+
total: (timeInPhase !== -1) ? timeInPhase + phasesByWriters[writer][i].total : phasesByWriters[writer][i].total
115+
}
116+
thisDate = nextDate
117+
}
118+
const startDate = new Date(text.createdAt)
119+
const endDate = text.datesPerPhase[9] !== null ? new Date(text.datesPerPhase[9]) : null
120+
const totalTime = getHours(startDate, endDate)
121+
phasesByWriters[writer]['overall'] = {
122+
min: (phasesByWriters[writer]['overall'].min > totalTime && totalTime !== -1) ? totalTime : phasesByWriters[writer]['overall'].min,
123+
max: (phasesByWriters[writer]['overall'].max < totalTime && totalTime !== -1) ? totalTime : phasesByWriters[writer]['overall'].max,
124+
total: (totalTime !== -1) ? totalTime + phasesByWriters[writer]['overall'].total : phasesByWriters[writer]['overall'].total
125+
}
126+
console.log(phasesByWriters)
127+
})
128+
Object.keys(phasesByWriters).forEach((key, index) => {
129+
const writerPhase = phasesByWriters[key]
130+
const textsWriter = texts.map((text) => text.writer.pseudonym == key ? text : undefined)
131+
for(let i=1; i<9; i++){
132+
writerPhase[i] ={
133+
...writerPhase[i],
134+
avg: writerPhase[i].total/getLengthOfNotNull(textsWriter,i+1)
135+
}
136+
}
137+
writerPhase['overall'] = {
138+
...writerPhase['overall'],
139+
avg: writerPhase['overall'].total/getLengthOfNotNull(textsWriter,9)
140+
}
141+
})
142+
return phasesByWriters;
143+
});
144+
};
145+
146+
147+
// Response with a particular text based on its id.
148+
export const getText = (request, response) => {
149+
send(response, async () => {
150+
const { id } = request.params;
151+
const reader = await TextModel.find({_id:id}).populate("genres");
152+
return reader;
153+
});
154+
};
155+
156+
const getHours = (date1, date2) =>{
157+
if(date1 !== null && date2 !== null){
158+
const milliseconds = Math.abs(date2 - date1);
159+
return milliseconds / 36e5;
160+
}
161+
return -1
162+
}
163+
164+
const getLengthOfNotNull = (texts, phase) => {
165+
let length = 0
166+
texts.forEach((text) =>{
167+
if(text && text.datesPerPhase[phase] !== null) length++
168+
})
169+
return length
170+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { InventoryModel } from "@/models/inventory.model";
2+
import { send } from "@/utils/errors";
3+
import { WriterModel } from "@/models/writer.model";
4+
5+
//Obtiene todos los inventarios
6+
export const getInventories = (request, response) => {
7+
send(response, async () => {
8+
const inventories = await InventoryModel.find().populate("writer").populate("items");
9+
return inventories;
10+
});
11+
};
12+
13+
//Obtiene un inventario por su id
14+
export const getInventory = (request, response) => {
15+
send(response, async () => {
16+
const { id } = request.params;
17+
const inventory = await InventoryModel.findById(id).populate("writer").populate("items");
18+
return inventory;
19+
});
20+
};
21+
22+
//Obtiene un inventario especifico por el id del escritor
23+
export const getInventoryByWriterId = (request, response) => {
24+
send(response, async () => {
25+
const { writerId } = request.params;
26+
const inventoryWriter = await WriterModel.findOne({ user: writerId });
27+
const inventory = await InventoryModel.findOne({'writer': inventoryWriter}).populate("writer").populate("items");
28+
return inventory;
29+
});
30+
};
31+
32+
//Funcion que crea un usuario y lector que no está registrado
33+
export const createInventory = (request, response, item) => {
34+
send(response, async () => {
35+
const {writerId } = request.query;
36+
try{
37+
const inventoryWriter = await WriterModel.findOne({ user: writerId });
38+
const inventory = await InventoryModel.findOne({ writer: inventoryWriter });
39+
if (!inventory) {
40+
const inventoryData = {
41+
writer: inventoryWriter._id,
42+
items: []
43+
};
44+
const newInventory= await InventoryModel.create(inventoryData);
45+
newInventory.writer = inventoryWriter;
46+
return newInventory;
47+
} else {
48+
throw { error: "This user has already an inventory"};
49+
}
50+
}catch(error) {
51+
console.log(error)
52+
throw { error: "Error creating inventory" };
53+
}
54+
});
55+
};
56+
57+

0 commit comments

Comments
 (0)