118 lines
3.6 KiB
TypeScript
118 lines
3.6 KiB
TypeScript
import { Request, Response } from "express";
|
|
import { createEvent, getEventAttendance, getEventDetails, getShortEventsInRange, setAttendanceStatus, setEventCancelled, updateEvent } from "../services/calendarService";
|
|
import { CalendarAttendance, CalendarEvent } from "@app/shared/types/calendar";
|
|
|
|
const express = require('express');
|
|
const r = express.Router();
|
|
|
|
function addMonths(date: Date, months: number): Date {
|
|
const d = new Date(date)
|
|
d.setMonth(d.getMonth() + months)
|
|
return d
|
|
}
|
|
|
|
//get calendar events paged, requires a query string with from= and to= as mariadb ISO strings
|
|
r.get('/', async (req, res) => {
|
|
try {
|
|
const fromDate: string = req.query.from;
|
|
const toDate: string = req.query.to;
|
|
|
|
if (fromDate === undefined || toDate === undefined) {
|
|
res.status(400).send("Missing required query parameters 'from' and 'to'");
|
|
return;
|
|
}
|
|
|
|
const events = await getShortEventsInRange(fromDate, toDate);
|
|
|
|
res.status(200).json(events);
|
|
} catch (error) {
|
|
console.error('Error fetching calendar events:', error);
|
|
res.status(500).send('Error fetching calendar events');
|
|
}
|
|
});
|
|
|
|
r.get('/upcoming', async (req, res) => {
|
|
res.sendStatus(501);
|
|
})
|
|
|
|
r.post('/:id/cancel', async (req: Request, res: Response) => {
|
|
try {
|
|
const eventID = Number(req.params.id);
|
|
setEventCancelled(eventID, true);
|
|
res.sendStatus(200);
|
|
} catch (error) {
|
|
console.error('Error setting cancel status:', error);
|
|
res.status(500).send('Error setting cancel status');
|
|
}
|
|
})
|
|
r.post('/:id/uncancel', async (req: Request, res: Response) => {
|
|
try {
|
|
const eventID = Number(req.params.id);
|
|
setEventCancelled(eventID, false);
|
|
res.sendStatus(200);
|
|
} catch (error) {
|
|
console.error('Error setting cancel status:', error);
|
|
res.status(500).send('Error setting cancel status');
|
|
}
|
|
})
|
|
|
|
|
|
r.post('/:id/attendance', async (req: Request, res: Response) => {
|
|
try {
|
|
let member = req.user.id;
|
|
let event = Number(req.params.id);
|
|
let state = req.query.state as CalendarAttendance;
|
|
setAttendanceStatus(member, event, state);
|
|
res.sendStatus(200);
|
|
} catch (error) {
|
|
console.error('Failed to set attendance:', error);
|
|
res.status(500).json(error);
|
|
}
|
|
})
|
|
//get event details
|
|
r.get('/:id', async (req: Request, res: Response) => {
|
|
try {
|
|
const eventID: number = Number(req.params.id);
|
|
|
|
let details: CalendarEvent = await getEventDetails(eventID);
|
|
details.eventSignups = await getEventAttendance(eventID);
|
|
res.status(200).json(details);
|
|
} catch (err) {
|
|
console.error('Insert failed:', err);
|
|
res.status(500).json(err);
|
|
}
|
|
})
|
|
|
|
|
|
//post a new calendar event
|
|
r.post('/', async (req: Request, res: Response) => {
|
|
try {
|
|
const member = req.user.id;
|
|
let event: CalendarEvent = req.body;
|
|
event.creator_id = member;
|
|
event.start = new Date(event.start);
|
|
event.end = new Date(event.end);
|
|
createEvent(event);
|
|
res.sendStatus(200);
|
|
} catch (error) {
|
|
console.error('Failed to create event:', error);
|
|
res.status(500).json(error);
|
|
}
|
|
})
|
|
|
|
r.put('/', async (req: Request, res: Response) => {
|
|
try {
|
|
let event: CalendarEvent = req.body;
|
|
event.start = new Date(event.start);
|
|
event.end = new Date(event.end);
|
|
console.log(event);
|
|
updateEvent(event);
|
|
res.sendStatus(200);
|
|
} catch (error) {
|
|
console.error('Failed to update event:', error);
|
|
res.status(500).json(error);
|
|
}
|
|
})
|
|
|
|
|
|
module.exports.calendarRouter = r; |