| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-01 21:27:46 -04:00
										 |  |  | const noteService = require('./notes'); | 
					
						
							| 
									
										
										
										
											2018-08-07 13:33:10 +02:00
										 |  |  | const attributeService = require('./attributes'); | 
					
						
							| 
									
										
										
										
											2018-04-02 20:46:46 -04:00
										 |  |  | const dateUtils = require('./date_utils'); | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  | const repository = require('./repository'); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-02 21:56:55 -04:00
										 |  |  | const CALENDAR_ROOT_LABEL = 'calendarRoot'; | 
					
						
							| 
									
										
										
										
											2018-04-04 23:04:31 -04:00
										 |  |  | const YEAR_LABEL = 'yearNote'; | 
					
						
							|  |  |  | const MONTH_LABEL = 'monthNote'; | 
					
						
							|  |  |  | const DATE_LABEL = 'dateNote'; | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-10 13:53:35 -05:00
										 |  |  | const DAYS = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']; | 
					
						
							|  |  |  | const MONTHS = ['January','February','March','April','May','June','July','August','September','October','November','December']; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-21 21:12:07 +01:00
										 |  |  | async function createNote(parentNoteId, noteTitle) { | 
					
						
							| 
									
										
										
										
											2019-11-16 11:09:52 +01:00
										 |  |  |     return (await noteService.createNewNote({ | 
					
						
							|  |  |  |         parentNoteId: parentNoteId, | 
					
						
							| 
									
										
										
										
											2018-01-28 19:30:14 -05:00
										 |  |  |         title: noteTitle, | 
					
						
							| 
									
										
										
										
											2019-11-21 21:12:07 +01:00
										 |  |  |         content: '', | 
					
						
							|  |  |  |         isProtected: false, | 
					
						
							|  |  |  |         type: 'text' | 
					
						
							| 
									
										
										
										
											2018-04-07 13:14:01 -04:00
										 |  |  |     })).note; | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | async function getNoteStartingWith(parentNoteId, startsWith) { | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |     return await repository.getEntity(`SELECT notes.* FROM notes JOIN branches USING(noteId) 
 | 
					
						
							| 
									
										
										
										
											2018-01-28 19:30:14 -05:00
										 |  |  |                                     WHERE parentNoteId = ? AND title LIKE '${startsWith}%' | 
					
						
							|  |  |  |                                     AND notes.isDeleted = 0 AND isProtected = 0  | 
					
						
							| 
									
										
										
										
											2018-03-24 21:39:15 -04:00
										 |  |  |                                     AND branches.isDeleted = 0`, [parentNoteId]);
 | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  | /** @return {Promise<Note>} */ | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  | async function getRootCalendarNote() { | 
					
						
							| 
									
										
										
										
											2018-05-08 16:39:01 -04:00
										 |  |  |     // some caching here could be useful (e.g. in CLS)
 | 
					
						
							| 
									
										
										
										
											2018-08-07 13:33:10 +02:00
										 |  |  |     let rootNote = await attributeService.getNoteWithLabel(CALENDAR_ROOT_LABEL); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |     if (!rootNote) { | 
					
						
							| 
									
										
										
										
											2019-11-16 11:09:52 +01:00
										 |  |  |         rootNote = (await noteService.createNewNote({ | 
					
						
							|  |  |  |             parentNoteId: 'root', | 
					
						
							| 
									
										
										
										
											2018-01-28 19:30:14 -05:00
										 |  |  |             title: 'Calendar', | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  |             target: 'into', | 
					
						
							| 
									
										
										
										
											2018-01-28 19:30:14 -05:00
										 |  |  |             isProtected: false | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |         })).note; | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-07 13:33:10 +02:00
										 |  |  |         await attributeService.createLabel(rootNote.noteId, CALENDAR_ROOT_LABEL); | 
					
						
							|  |  |  |         await attributeService.createLabel(rootNote.noteId, 'sorted'); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |     return rootNote; | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  | /** @return {Promise<Note>} */ | 
					
						
							| 
									
										
										
										
											2019-01-15 23:46:01 +01:00
										 |  |  | async function getYearNote(dateStr, rootNote) { | 
					
						
							| 
									
										
										
										
											2019-02-19 22:49:57 +01:00
										 |  |  |     if (!rootNote) { | 
					
						
							|  |  |  |         rootNote = await getRootCalendarNote(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-15 23:46:01 +01:00
										 |  |  |     const yearStr = dateStr.substr(0, 4); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-07 13:33:10 +02:00
										 |  |  |     let yearNote = await attributeService.getNoteWithLabel(YEAR_LABEL, yearStr); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |     if (!yearNote) { | 
					
						
							|  |  |  |         yearNote = await getNoteStartingWith(rootNote.noteId, yearStr); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |         if (!yearNote) { | 
					
						
							|  |  |  |             yearNote = await createNote(rootNote.noteId, yearStr); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-27 19:42:10 +01:00
										 |  |  |             await attributeService.createLabel(yearNote.noteId, YEAR_LABEL, yearStr); | 
					
						
							|  |  |  |             await attributeService.createLabel(yearNote.noteId, 'sorted'); | 
					
						
							| 
									
										
										
										
											2019-09-07 21:40:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-27 19:42:10 +01:00
										 |  |  |             const yearTemplateAttr = await rootNote.getOwnedAttribute('relation', 'yearTemplate'); | 
					
						
							| 
									
										
										
										
											2019-09-07 21:40:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-27 19:42:10 +01:00
										 |  |  |             if (yearTemplateAttr) { | 
					
						
							|  |  |  |                 await attributeService.createRelation(yearNote.noteId, 'template', yearTemplateAttr.value); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-09-07 21:40:18 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |     return yearNote; | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-19 11:30:17 +02:00
										 |  |  | async function getMonthNoteTitle(rootNote, monthNumber, dateObj) { | 
					
						
							| 
									
										
										
										
											2019-12-01 11:10:04 +01:00
										 |  |  |     const pattern = await rootNote.getOwnedLabelValue("monthPattern") || "{monthNumberPadded} - {month}"; | 
					
						
							| 
									
										
										
										
											2019-05-19 11:30:17 +02:00
										 |  |  |     const monthName = MONTHS[dateObj.getMonth()]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return pattern | 
					
						
							|  |  |  |         .replace(/{monthNumberPadded}/g, monthNumber) | 
					
						
							|  |  |  |         .replace(/{month}/g, monthName); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  | /** @return {Promise<Note>} */ | 
					
						
							| 
									
										
										
										
											2019-01-15 23:46:01 +01:00
										 |  |  | async function getMonthNote(dateStr, rootNote) { | 
					
						
							| 
									
										
										
										
											2019-09-07 21:40:18 +02:00
										 |  |  |     if (!rootNote) { | 
					
						
							|  |  |  |         rootNote = await getRootCalendarNote(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-15 23:46:01 +01:00
										 |  |  |     const monthStr = dateStr.substr(0, 7); | 
					
						
							|  |  |  |     const monthNumber = dateStr.substr(5, 2); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-07 13:33:10 +02:00
										 |  |  |     let monthNote = await attributeService.getNoteWithLabel(MONTH_LABEL, monthStr); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |     if (!monthNote) { | 
					
						
							| 
									
										
										
										
											2019-01-15 23:46:01 +01:00
										 |  |  |         const yearNote = await getYearNote(dateStr, rootNote); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |         monthNote = await getNoteStartingWith(yearNote.noteId, monthNumber); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |         if (!monthNote) { | 
					
						
							| 
									
										
										
										
											2019-01-15 23:46:01 +01:00
										 |  |  |             const dateObj = dateUtils.parseLocalDate(dateStr); | 
					
						
							| 
									
										
										
										
											2018-02-10 13:53:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-19 11:30:17 +02:00
										 |  |  |             const noteTitle = await getMonthNoteTitle(rootNote, monthNumber, dateObj); | 
					
						
							| 
									
										
										
										
											2018-02-10 13:53:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |             monthNote = await createNote(yearNote.noteId, noteTitle); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-27 19:42:10 +01:00
										 |  |  |             await attributeService.createLabel(monthNote.noteId, MONTH_LABEL, monthStr); | 
					
						
							|  |  |  |             await attributeService.createLabel(monthNote.noteId, 'sorted'); | 
					
						
							| 
									
										
										
										
											2019-09-07 21:40:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-27 19:42:10 +01:00
										 |  |  |             const monthTemplateAttr = await rootNote.getOwnedAttribute('relation', 'monthTemplate'); | 
					
						
							| 
									
										
										
										
											2019-09-07 21:40:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-27 19:42:10 +01:00
										 |  |  |             if (monthTemplateAttr) { | 
					
						
							|  |  |  |                 await attributeService.createRelation(monthNote.noteId, 'template', monthTemplateAttr.value); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-09-07 21:40:18 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |     return monthNote; | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-19 11:30:17 +02:00
										 |  |  | async function getDateNoteTitle(rootNote, dayNumber, dateObj) { | 
					
						
							| 
									
										
										
										
											2019-12-01 11:10:04 +01:00
										 |  |  |     const pattern = await rootNote.getOwnedLabelValue("datePattern") || "{dayInMonthPadded} - {weekDay}"; | 
					
						
							| 
									
										
										
										
											2019-05-19 11:30:17 +02:00
										 |  |  |     const weekDay = DAYS[dateObj.getDay()]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return pattern | 
					
						
							|  |  |  |         .replace(/{dayInMonthPadded}/g, dayNumber) | 
					
						
							|  |  |  |         .replace(/{weekDay}/g, weekDay) | 
					
						
							|  |  |  |         .replace(/{weekDay3}/g, weekDay.substr(0, 3)) | 
					
						
							|  |  |  |         .replace(/{weekDay2}/g, weekDay.substr(0, 2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  | /** @return {Promise<Note>} */ | 
					
						
							| 
									
										
										
										
											2019-01-15 23:46:01 +01:00
										 |  |  | async function getDateNote(dateStr) { | 
					
						
							| 
									
										
										
										
											2018-05-08 16:39:01 -04:00
										 |  |  |     const rootNote = await getRootCalendarNote(); | 
					
						
							| 
									
										
										
										
											2018-01-26 23:40:48 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-15 23:46:01 +01:00
										 |  |  |     const dayNumber = dateStr.substr(8, 2); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-07 13:33:10 +02:00
										 |  |  |     let dateNote = await attributeService.getNoteWithLabel(DATE_LABEL, dateStr); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |     if (!dateNote) { | 
					
						
							| 
									
										
										
										
											2019-01-15 23:46:01 +01:00
										 |  |  |         const monthNote = await getMonthNote(dateStr, rootNote); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |         dateNote = await getNoteStartingWith(monthNote.noteId, dayNumber); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |         if (!dateNote) { | 
					
						
							| 
									
										
										
										
											2019-01-15 23:46:01 +01:00
										 |  |  |             const dateObj = dateUtils.parseLocalDate(dateStr); | 
					
						
							| 
									
										
										
										
											2018-02-10 13:53:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-19 11:30:17 +02:00
										 |  |  |             const noteTitle = await getDateNoteTitle(rootNote, dayNumber, dateObj); | 
					
						
							| 
									
										
										
										
											2018-02-10 13:53:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |             dateNote = await createNote(monthNote.noteId, noteTitle); | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-27 19:42:10 +01:00
										 |  |  |             await attributeService.createLabel(dateNote.noteId, DATE_LABEL, dateStr.substr(0, 10)); | 
					
						
							| 
									
										
										
										
											2019-09-07 21:40:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-27 19:42:10 +01:00
										 |  |  |             const dateTemplateAttr = await rootNote.getOwnedAttribute('relation', 'dateTemplate'); | 
					
						
							| 
									
										
										
										
											2019-09-07 21:40:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-27 19:42:10 +01:00
										 |  |  |             if (dateTemplateAttr) { | 
					
						
							|  |  |  |                 await attributeService.createRelation(dateNote.noteId, 'template', dateTemplateAttr.value); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-09-07 21:40:18 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |     return dateNote; | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-27 23:07:10 +01:00
										 |  |  | async function getTodayNote() { | 
					
						
							|  |  |  |     return await getDateNote(dateUtils.localNowDate()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-19 22:49:57 +01:00
										 |  |  | function getStartOfTheWeek(date, startOfTheWeek) { | 
					
						
							|  |  |  |     const day = date.getDay(); | 
					
						
							|  |  |  |     let diff; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (startOfTheWeek === 'monday') { | 
					
						
							|  |  |  |         diff = date.getDate() - day + (day === 0 ? -6 : 1); // adjust when day is sunday
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (startOfTheWeek === 'sunday') { | 
					
						
							|  |  |  |         diff = date.getDate() - day; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         throw new Error("Unrecognized start of the week " + startOfTheWeek); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return new Date(date.setDate(diff)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | async function getWeekNote(dateStr, options = {}) { | 
					
						
							|  |  |  |     const startOfTheWeek = options.startOfTheWeek || "monday"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const dateObj = getStartOfTheWeek(dateUtils.parseLocalDate(dateStr), startOfTheWeek); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 22:43:59 +01:00
										 |  |  |     dateStr = dateUtils.utcDateStr(dateObj); | 
					
						
							| 
									
										
										
										
											2019-02-19 22:49:57 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return getDateNote(dateStr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | module.exports = { | 
					
						
							| 
									
										
										
										
											2018-04-07 13:03:16 -04:00
										 |  |  |     getRootCalendarNote, | 
					
						
							|  |  |  |     getYearNote, | 
					
						
							|  |  |  |     getMonthNote, | 
					
						
							| 
									
										
										
										
											2019-02-19 22:49:57 +01:00
										 |  |  |     getWeekNote, | 
					
						
							| 
									
										
										
										
											2019-11-27 23:07:10 +01:00
										 |  |  |     getDateNote, | 
					
						
							|  |  |  |     getTodayNote | 
					
						
							| 
									
										
										
										
											2018-01-24 23:08:14 -05:00
										 |  |  | }; |