Skip to content

Commit 5109c1b

Browse files
committed
Modified server api. Dates are stored in calendar events, REST methods no more provided for them. Occurencies can still be count by /occurencies/... GET method
1 parent 8ee0134 commit 5109c1b

File tree

8 files changed

+32
-45
lines changed

8 files changed

+32
-45
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,17 @@ Server app provides fake api to these listed entities:
5555
| ------------- | ------------- | ------------------------------------------ | --------------- |
5656
| #calendarTypes | /calendarTypes/:id? | [id](#objects),<br/><hr/> name |
5757
| #calendars<sup>extensible</sup> | /calendars/:id? | [id](#objects), <br/><hr/> [typeId](#calendarTypes), <br/> name,<br>**...** | _typeId determines calendar type._, _This entity can be extended._|
58-
| #calendarEvents<sup>extensible</sup> | /calendarEvents/:id? | [id](#objects),<hr/>[calendarId](#calendars),<br/>name, <br/> description, **...** | _this entity can be extended._ _The [calendar type](#calendarTypes) determines the type of event._ |
58+
| #calendarEvents<sup>extensible</sup> | /calendarEvents/:id? | [id](#objects),<hr/>[calendarId](#calendars),<br/>name,<br/>[dates](#dates)<br/> description, **...** | _this entity can be extended._ _The [calendar type](#calendarTypes) determines the type of event._ |
5959

6060
### Calendario event date domain
6161
| Entity | Urls | Fields | Comments |
6262
| ------------- | ------------- | ------------------------------------------ | --------------- |
63-
| #dates<sup>extensible</sup>| /dates |[eventId](#eventId),<br/> $type,<br/>isExcept,<br/> **...** | |
63+
| #dates<sup>extensible</sup>| No url provided. These VO are included in calendarEvent entity |[eventId](#eventId),<br/> $type,<br/>isExcept,<br/> **...** | |
6464
| #dates$type=simpleDate | - | dateTime,<br/> hasTime <br/> | |
6565
| #dates$type=continuousDate| - | start, end,<br/>hasTime| |
6666
| #dates$type=reccurenceDate| - | hasTime,<br/>rrule | |
6767
| #dates$type=continuousReccurenceDate | - | start, end,<br/>hasTime,<br/> rrule | |
68-
| occurence | /dates/from/:start/till/:end | [eventId](#eventId),<br/> dateTime.value,<br/> dateTime.hasTime <br/> dateTime.belonging<sup>[nullable]</sup>, status<sup>[nullable]</sup> | |
68+
| occurence | /dates/from/:start/till/:end | [eventId](#eventId),<br/> dateTime.value,<br/> dateTime.hasTime <br/> dateTime.belonging<sup>[nullable]</sup>, status<sup>[nullable]</sup> | _Event occurencies are calculated from dates_|
6969

7070
These entities are randomly generated when server app starts.
7171

server/controllers/dates.js

Lines changed: 0 additions & 14 deletions
This file was deleted.

server/controllers/occurencies.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
const getCollection = (req) => req.app.locals['objects'];
2+
const computeOccurencies = require('../logic/occurencies.js');
3+
4+
const occurencies = async (req, res, next, start, end) => {
5+
const objectsCollection = getCollection(req);
6+
const values = await objectsCollection.find({ type: /\w*Event/i }).project({ id: true, dates: true, _id: false }).toArray();
7+
const occurencies = values.map(x => computeOccurencies(x.dates, start, end)).reduce((a, b) => a.concat(b), []);
8+
res.json(occurencies);
9+
}
10+
11+
module.exports = {
12+
occurencies
13+
}

server/db/configurate.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,10 @@ module.exports = async (db) => {
1313
db.collection("subjects").insertMany(entities.subjects, insertFunc );
1414
db.collection("objects").insertMany(entities.objects, insertFunc);
1515
db.collection("relations").insertMany(entities.relations, insertFunc);
16-
db.collection("dates").insertMany(entities.dates, insertFunc);
1716

1817
return {
1918
subjects: db.collection("subjects"),
2019
objects: db.collection("objects"),
2120
relations: db.collection('relations'),
22-
dates: db.collection('dates')
2321
}
2422
}

server/db/random-entities.js

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ for (let i = 0; i < EVENTS_COUNT; i++) {
103103
id: getObjectId(),
104104
calendarId: calendars[Math.floor(Math.random() * calendars.length)].id,
105105
name: getRandomName(),
106-
description: i % 3 == 0 ? '' : getRandomName()
106+
description: i % 3 == 0 ? '' : getRandomName(),
107+
dates: []
107108
})
108109
);
109110
}
@@ -176,12 +177,11 @@ objects.forEach(object => {
176177
3. Notification events can have all type of dates and can have no date. All these events must be displayed to user
177178
4. Occurence is a composed value. It is composed from date
178179
*/
179-
const dates = []
180180
const freq = [RRule.YEARLY, RRule.MONTHLY, RRule.WEEKLY, RRule.DAILY, RRule.HOURLY]
181181
const getRandomRRule = (hasTime, start) =>
182182
new RRule({
183183
freq: freq[rand(0, freq.length - 1)],
184-
dtstart: start || (rand(0, 5) != 5 ? getRandomDate(hasTime) : undefined),
184+
dtstart: start || (rand(0, 5) != 5 ? getRandomDate(hasTime) : undefined),
185185
interval: rand(1, 3),
186186
until: rand(0, 5) == 5 ? getRandomDate(hasTime) : undefined
187187
}).toString();
@@ -197,7 +197,7 @@ calendarEvents.forEach(event => {
197197
bymonthday: rand(1, 28),
198198
bymonth: rand(1, 12)
199199
});
200-
dates.push({
200+
event.dates.push({
201201
eventId: event.id,
202202
type: "reccurenceDate",
203203
hasTime: false,
@@ -249,7 +249,7 @@ calendarEvents.forEach(event => {
249249
date.end = dateAndTime.addMinutes(date.start, rand(30, 20160))
250250
break;
251251
}
252-
dates.push(date);
252+
event.dates.push(date);
253253
}
254254
break;
255255
case 'taskEvent':
@@ -283,7 +283,7 @@ calendarEvents.forEach(event => {
283283
rrule: getRandomRRule(date.hasTime)
284284
}
285285
if (rand(0, 2) > 0) {
286-
dates.push({
286+
event.dates.push({
287287
eventId: event.id,
288288
hasTime: rand(0, 1) > 0,
289289
type: 'simpleDate',
@@ -302,7 +302,7 @@ calendarEvents.forEach(event => {
302302
rrule: getRandomRRule(date.hasTime, start)
303303
}
304304
if (rand(0, 2) > 0) {
305-
dates.push({
305+
event.dates.push({
306306
eventId: event.id,
307307
isExcept: true,
308308
hasTime: rand(0, 1) > 0,
@@ -315,13 +315,12 @@ calendarEvents.forEach(event => {
315315
date.end = dateAndTime.addMinutes(date.start, rand(30, 20160))
316316
break;
317317
}
318-
dates.push(date);
318+
event.dates.push(date);
319319
}
320320
break;
321321
}
322322

323323
});
324-
325324
module.exports = {
326325
groups,
327326
users,
@@ -330,6 +329,5 @@ module.exports = {
330329
calendars,
331330
calendarEvents,
332331
objects,
333-
relations,
334-
dates
332+
relations
335333
}

server/logic/occurencies.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ function computeOccurencies(dateArray, start, finish) {
1414
isExcept: v.isExcept
1515
}))
1616
})
17-
.reduce((a, b) => a.concat(b))
17+
.reduce((a, b) => a.concat(b),[])
1818
.filter(x => x.dateTime.value >= start && x.dateTime.value <= finish)
1919
.reduce((gr, d) => {
2020
(gr[d.eventId] = gr[d.eventId] || []).push(d);
@@ -30,7 +30,7 @@ function computeOccurencies(dateArray, start, finish) {
3030
}
3131
});
3232
const result = Object.values(groupedByEventId)
33-
.reduce((a, b) => a.concat(b))
33+
.reduce((a, b) => a.concat(b), [])
3434
.sort((a, b) => a.dateTime.value - b.dateTime.value);
3535
result.forEach(x => { delete x.isExcept });
3636
return result;

server/routes.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const alias = require('./routes/alias.js')
44
const subjects = require("./routes/subjects");
55
const objects = require("./routes/objects");
66
const relations = require("./routes/relations");
7-
const dates = require("./routes/dates");
7+
const occurencies = require("./routes/occurencies");
88
const date = require('date-and-time')
99

1010
router.use(function (req, res, next) {
@@ -18,7 +18,7 @@ router.use('/', alias)
1818
router.use('/subjects', subjects)
1919
router.use('/objects', objects)
2020
router.use('/relations', relations)
21-
router.use('/dates', dates)
21+
router.use('/occurencies', occurencies)
2222
router.use('*', (req, res) => {
2323
console.log('\tRoute not found!')
2424
res.status(404).sendFile(__dirname + '/404.html')}

server/routes/dates.js renamed to server/routes/occurencies.js

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,13 @@
11
const express = require('express');
2-
const controller = require('../controllers/dates.js');
2+
const controller = require('../controllers/occurencies.js');
33
const router = express.Router();
44

55
const parse = (str) => require('date-and-time').parse(str,'YYYY-MM-DD')
66

7-
/**
8-
* Get all calendario event dates
9-
* @route GET /dates
10-
* @param {string} type.query filter result by type
11-
* @returns {Array} 200 - Dates array
12-
*/
13-
router.get('/', controller.all)
14-
157
/**
168
* Get all calendario event date occurencies between two dates (inclusively)
17-
* @route GET /dates/from/{start}/till/{end}
18-
* @param {string} start.param.requied start date (YYYY-MM-DD) - eg: 2020-12-01
9+
* @route GET /occurencies/from/{start}/till/{end}
10+
* @param {string} start.param.required start date (YYYY-MM-DD) - eg: 2020-12-01
1911
* @param {string} end.param.required finish date (YYYY-MM-DD) - eg: 2021-01-05
2012
* @returns {Array} 200 - Occurencies array
2113
*/

0 commit comments

Comments
 (0)