Add possibility to add birthdays + repeating events to the API
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Jenkins Production Deployment
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Jenkins Production Deployment
				
			This commit is contained in:
		
							parent
							
								
									9c45fb11ee
								
							
						
					
					
						commit
						dc65b49219
					
				| 
						 | 
					@ -65,6 +65,8 @@ export const hasAccess = async (calendarName: string, sessionId: string, session
 | 
				
			||||||
			return await checkChoirPrivileges(sessionId, sessionKey, password, ip);
 | 
								return await checkChoirPrivileges(sessionId, sessionKey, password, ip);
 | 
				
			||||||
		case 'management':
 | 
							case 'management':
 | 
				
			||||||
			return await checkManagementPrivileges(sessionId, sessionKey, password, ip);
 | 
								return await checkManagementPrivileges(sessionId, sessionKey, password, ip);
 | 
				
			||||||
 | 
					        case 'birthdays':
 | 
				
			||||||
 | 
					            return await checkChoirPrivileges(sessionId, sessionKey, password, ip);
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			return false;
 | 
								return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,5 +108,6 @@ export interface Event {
 | 
				
			||||||
	lastModifiedById?: number;
 | 
						lastModifiedById?: number;
 | 
				
			||||||
	url: string;
 | 
						url: string;
 | 
				
			||||||
	wholeDay: boolean;
 | 
						wholeDay: boolean;
 | 
				
			||||||
 | 
					    repeatFrequency: string;
 | 
				
			||||||
	status?: string;
 | 
						status?: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,8 @@ export const calendarNames = new Map<string, any>([
 | 
				
			||||||
	['public', {id: 1, name: 'Nachklang_calendar'}],
 | 
						['public', {id: 1, name: 'Nachklang_calendar'}],
 | 
				
			||||||
	['members', {id: 2, name: 'Nachklang_internal_calendar'}],
 | 
						['members', {id: 2, name: 'Nachklang_internal_calendar'}],
 | 
				
			||||||
	['choir', {id: 4, name: 'Nachklang_choir_calendar'}],
 | 
						['choir', {id: 4, name: 'Nachklang_choir_calendar'}],
 | 
				
			||||||
	['management', {id: 3, name: 'Nachklang_management_calendar'}]
 | 
						['management', {id: 3, name: 'Nachklang_management_calendar'}],
 | 
				
			||||||
 | 
					    ['birthdays', {id: 5, name: 'Nachklang_birthday_calendar'}]
 | 
				
			||||||
]);
 | 
					]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -557,6 +558,7 @@ eventsRouter.post('/', async (req: Request, res: Response) => {
 | 
				
			||||||
			createdById: user.userId ?? -1,
 | 
								createdById: user.userId ?? -1,
 | 
				
			||||||
			url: req.body.url ?? '',
 | 
								url: req.body.url ?? '',
 | 
				
			||||||
			wholeDay: req.body.wholeDay ?? false,
 | 
								wholeDay: req.body.wholeDay ?? false,
 | 
				
			||||||
 | 
					            repeatFrequency: req.body.repeatFrequency ?? '',
 | 
				
			||||||
			status: req.body.status ?? 'PUBLIC'
 | 
								status: req.body.status ?? 'PUBLIC'
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -736,6 +738,7 @@ eventsRouter.put('/:eventId', async (req: Request, res: Response) => {
 | 
				
			||||||
			createdById: user.userId ?? -1,
 | 
								createdById: user.userId ?? -1,
 | 
				
			||||||
			url: req.body.url ?? '',
 | 
								url: req.body.url ?? '',
 | 
				
			||||||
			wholeDay: req.body.wholeDay ?? false,
 | 
								wholeDay: req.body.wholeDay ?? false,
 | 
				
			||||||
 | 
					            repeatFrequency: req.body.repeatFrequency ?? '',
 | 
				
			||||||
			status: req.body.status ?? 'PUBLIC'
 | 
								status: req.body.status ?? 'PUBLIC'
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -913,6 +916,7 @@ eventsRouter.put('/move/:eventId', async (req: Request, res: Response) => {
 | 
				
			||||||
			createdById: user.userId ?? -1,
 | 
								createdById: user.userId ?? -1,
 | 
				
			||||||
			url: req.body.url ?? '',
 | 
								url: req.body.url ?? '',
 | 
				
			||||||
			wholeDay: req.body.wholeDay ?? false,
 | 
								wholeDay: req.body.wholeDay ?? false,
 | 
				
			||||||
 | 
					            repeatFrequency: req.body.repeatFrequency ?? '',
 | 
				
			||||||
			status: req.body.status ?? 'PUBLIC'
 | 
								status: req.body.status ?? 'PUBLIC'
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1044,6 +1048,7 @@ eventsRouter.delete('/:eventId', async (req: Request, res: Response) => {
 | 
				
			||||||
			createdById: user.userId ?? -1,
 | 
								createdById: user.userId ?? -1,
 | 
				
			||||||
			url: '',
 | 
								url: '',
 | 
				
			||||||
			wholeDay: false,
 | 
								wholeDay: false,
 | 
				
			||||||
 | 
					            repeatFrequency: '',
 | 
				
			||||||
			status: 'DELETED'
 | 
								status: 'DELETED'
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,7 +55,8 @@ export const getAllEvents = async (calendarId: number): Promise<Event[]> => {
 | 
				
			||||||
				lastModifiedBy: row.last_modified_by_name,
 | 
									lastModifiedBy: row.last_modified_by_name,
 | 
				
			||||||
				lastModifiedById: row.version_created_by_id,
 | 
									lastModifiedById: row.version_created_by_id,
 | 
				
			||||||
				url: row.url,
 | 
									url: row.url,
 | 
				
			||||||
				wholeDay: row.whole_day
 | 
									wholeDay: row.whole_day,
 | 
				
			||||||
 | 
					                repeatFrequency: row.repeat_frequency
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -111,6 +112,7 @@ export const getAllEventsAdmin = async (calendarId: number): Promise<Event[]> =>
 | 
				
			||||||
				lastModifiedById: row.version_created_by_id,
 | 
									lastModifiedById: row.version_created_by_id,
 | 
				
			||||||
				url: row.url,
 | 
									url: row.url,
 | 
				
			||||||
				wholeDay: row.whole_day,
 | 
									wholeDay: row.whole_day,
 | 
				
			||||||
 | 
					                repeatFrequency: row.repeat_frequency,
 | 
				
			||||||
				status: row.status
 | 
									status: row.status
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -135,8 +137,8 @@ export const createEvent = async (event: Event): Promise<number> => {
 | 
				
			||||||
		const eventsQuery = 'INSERT INTO events (calendar_id, uuid, created_by_id) VALUES (?,?,?) RETURNING event_id';
 | 
							const eventsQuery = 'INSERT INTO events (calendar_id, uuid, created_by_id) VALUES (?,?,?) RETURNING event_id';
 | 
				
			||||||
		const eventsRes = await conn.execute(eventsQuery, [event.calendarId, eventUUID, event.createdById]);
 | 
							const eventsRes = await conn.execute(eventsQuery, [event.calendarId, eventUUID, event.createdById]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		const versionQuery = 'INSERT INTO event_versions (event_id, name, description, start_datetime, end_datetime, whole_day, location, url, status, version_created_by_id) VALUES (?,?,?,?,?,?,?,?,?,?);'
 | 
							const versionQuery = 'INSERT INTO event_versions (event_id, name, description, start_datetime, end_datetime, whole_day, repeat_frequency, location, url, status, version_created_by_id) VALUES (?,?,?,?,?,?,?,?,?,?,?);'
 | 
				
			||||||
		const versionRes = await conn.execute(versionQuery, [eventsRes[0].event_id, event.name, event.description, event.startDateTime, event.endDateTime, event.wholeDay, event.location, event.url, event.status, event.createdById]);
 | 
							const versionRes = await conn.execute(versionQuery, [eventsRes[0].event_id, event.name, event.description, event.startDateTime, event.endDateTime, event.wholeDay, event.repeatFrequency, event.location, event.url, event.status, event.createdById]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		await conn.commit();
 | 
							await conn.commit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -158,8 +160,8 @@ export const createEvent = async (event: Event): Promise<number> => {
 | 
				
			||||||
export const updateEvent = async (event: Event): Promise<number> => {
 | 
					export const updateEvent = async (event: Event): Promise<number> => {
 | 
				
			||||||
	let conn = await NachklangCalendarDB.getConnection();
 | 
						let conn = await NachklangCalendarDB.getConnection();
 | 
				
			||||||
	try {
 | 
						try {
 | 
				
			||||||
		const versionQuery = 'INSERT INTO event_versions (event_id, name, description, start_datetime, end_datetime, whole_day, location, url, status, version_created_by_id) VALUES (?,?,?,?,?,?,?,?,?,?);'
 | 
							const versionQuery = 'INSERT INTO event_versions (event_id, name, description, start_datetime, end_datetime, whole_day, repeat_frequency, location, url, status, version_created_by_id) VALUES (?,?,?,?,?,?,?,?,?,?,?);'
 | 
				
			||||||
		const versionRes = await conn.execute(versionQuery, [event.eventId, event.name, event.description, event.startDateTime, event.endDateTime, event.wholeDay, event.location, event.url, event.status, event.createdById]);
 | 
							const versionRes = await conn.execute(versionQuery, [event.eventId, event.name, event.description, event.startDateTime, event.endDateTime, event.wholeDay, event.repeatFrequency, event.location, event.url, event.status, event.createdById]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		await conn.commit();
 | 
							await conn.commit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -274,7 +276,8 @@ export const getNextUpcomingEvent = async (calendarId: number): Promise<Event |
 | 
				
			||||||
			lastModifiedBy: row.last_modified_by_name,
 | 
								lastModifiedBy: row.last_modified_by_name,
 | 
				
			||||||
			lastModifiedById: row.version_created_by_id,
 | 
								lastModifiedById: row.version_created_by_id,
 | 
				
			||||||
			url: row.url,
 | 
								url: row.url,
 | 
				
			||||||
			wholeDay: row.whole_day
 | 
								wholeDay: row.whole_day,
 | 
				
			||||||
 | 
					            repeatFrequency: row.repeat_frequency
 | 
				
			||||||
		} as Event;
 | 
							} as Event;
 | 
				
			||||||
	} catch (err) {
 | 
						} catch (err) {
 | 
				
			||||||
		throw err;
 | 
							throw err;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,6 +53,7 @@ const serializeIcalEvent = (icalevent: iCalEvent): string => {
 | 
				
			||||||
		returnString += 'DTSTART;TZID=Europe/Berlin:' + icalevent.start;
 | 
							returnString += 'DTSTART;TZID=Europe/Berlin:' + icalevent.start;
 | 
				
			||||||
		returnString += 'DTEND;TZID=Europe/Berlin:' + icalevent.end;
 | 
							returnString += 'DTEND;TZID=Europe/Berlin:' + icalevent.end;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					    if(!isNullOrBlank(icalevent.repeatFrequency)) returnString += 'RRULE:FREQ=' + icalevent.repeatFrequency;
 | 
				
			||||||
	returnString += 'SUMMARY:' + icalevent.summary;
 | 
						returnString += 'SUMMARY:' + icalevent.summary;
 | 
				
			||||||
	if(!isNullOrBlank(icalevent.description)) returnString += 'DESCRIPTION:' + icalevent.description;
 | 
						if(!isNullOrBlank(icalevent.description)) returnString += 'DESCRIPTION:' + icalevent.description;
 | 
				
			||||||
	if(!isNullOrBlank(icalevent.location)) returnString += 'LOCATION:' + icalevent.location;
 | 
						if(!isNullOrBlank(icalevent.location)) returnString += 'LOCATION:' + icalevent.location;
 | 
				
			||||||
| 
						 | 
					@ -126,6 +127,7 @@ const createIcalEvent = (event: Event): iCalEvent => {
 | 
				
			||||||
		organizer: event.createdBy + '\n',
 | 
							organizer: event.createdBy + '\n',
 | 
				
			||||||
		start: formatDate(event.startDateTime, event.wholeDay) + '\n',
 | 
							start: formatDate(event.startDateTime, event.wholeDay) + '\n',
 | 
				
			||||||
		end: formatDate(event.endDateTime, event.wholeDay, true) + '\n',
 | 
							end: formatDate(event.endDateTime, event.wholeDay, true) + '\n',
 | 
				
			||||||
 | 
					        repeatFrequency: event.repeatFrequency ? event.repeatFrequency + '\n' : '',
 | 
				
			||||||
		summary: event.name + '\n',
 | 
							summary: event.name + '\n',
 | 
				
			||||||
		description: description,
 | 
							description: description,
 | 
				
			||||||
		location: location,
 | 
							location: location,
 | 
				
			||||||
| 
						 | 
					@ -178,6 +180,7 @@ export interface iCalEvent {
 | 
				
			||||||
	location: string;
 | 
						location: string;
 | 
				
			||||||
	url: string;
 | 
						url: string;
 | 
				
			||||||
	wholeDay: boolean;
 | 
						wholeDay: boolean;
 | 
				
			||||||
 | 
					    repeatFrequency: string;
 | 
				
			||||||
	footer: string;
 | 
						footer: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user