diff --git a/api/src/routes/calendar.ts b/api/src/routes/calendar.ts index 9faa333..cc6fa2f 100644 --- a/api/src/routes/calendar.ts +++ b/api/src/routes/calendar.ts @@ -1,6 +1,6 @@ import { Request, Response } from "express"; -import { getEventAttendance, getEventDetails, getShortEventsInRange } from "../services/calendarService"; -import { CalendarEvent } from "@app/shared/types/calendar"; +import { getEventAttendance, getEventDetails, getShortEventsInRange, setAttendanceStatus } from "../services/calendarService"; +import { CalendarAttendance, CalendarEvent } from "@app/shared/types/calendar"; const express = require('express'); const r = express.Router(); @@ -35,6 +35,18 @@ r.get('/upcoming', async (req, res) => { res.sendStatus(501); }) +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 { @@ -46,10 +58,11 @@ r.get('/:id', async (req: Request, res: Response) => { res.status(200).json(details); } catch (err) { console.error('Insert failed:', err); - res.status(500).json(err); + res.status(500).json(err); } }) + //post a new calendar event r.post('/', async (req, res) => { diff --git a/api/src/services/calendarService.ts b/api/src/services/calendarService.ts index 9c1a4c0..4e36206 100644 --- a/api/src/services/calendarService.ts +++ b/api/src/services/calendarService.ts @@ -1,7 +1,5 @@ import pool from '../db'; -import { CalendarEventShort, CalendarSignup, CalendarEvent } from "@app/shared/types/calendar" - -export type Attendance = 'attending' | 'maybe' | 'not_attending'; +import { CalendarEventShort, CalendarSignup, CalendarEvent, CalendarAttendance } from "@app/shared/types/calendar" export async function createEvent(eventObject: Omit) { const sql = ` @@ -113,7 +111,7 @@ export async function getUpcomingEvents(date: Date, limit: number) { } -export async function setAttendanceStatus(memberID: number, eventID: number, status: Attendance) { +export async function setAttendanceStatus(memberID: number, eventID: number, status: CalendarAttendance) { const sql = ` INSERT INTO calendar_events_signups (member_id, event_id, status) VALUES (?, ?, ?) diff --git a/shared/types/calendar.ts b/shared/types/calendar.ts index 2aa38b2..6ff2695 100644 --- a/shared/types/calendar.ts +++ b/shared/types/calendar.ts @@ -22,9 +22,10 @@ export enum CalendarAttendance { } export interface CalendarSignup { - memberID: number; + member_id: number; eventID: number; - state: CalendarAttendance; + status: CalendarAttendance; + member_name?: string; } export interface CalendarEventShort { diff --git a/ui/src/api/calendar.ts b/ui/src/api/calendar.ts index 533cfda..9b2ee88 100644 --- a/ui/src/api/calendar.ts +++ b/ui/src/api/calendar.ts @@ -33,7 +33,7 @@ export async function getMonthCalendarEvents(viewedMonth: Date): Promise { let res = await fetch(`${addr}/calendar/${id}`); - if(res.ok) { + if (res.ok) { return await res.json(); } else { throw new Error(`Failed to fetch event: ${res.status} ${res.statusText}`); @@ -84,5 +84,14 @@ export async function adminCancelCalendarEvent(eventID: number) { } export async function setCalendarEventAttendance(eventID: number, state: CalendarAttendance) { + let res = await fetch(`${addr}/calendar/ ${eventID}/attendance?state=${state}`, { + method: "POST", + credentials: "include", + }); + if (res.ok) { + return; + } else { + throw new Error(`Failed to set attendance: ${res.status} ${res.statusText}`); + } } \ No newline at end of file diff --git a/ui/src/components/calendar/ViewCalendarEvent.vue b/ui/src/components/calendar/ViewCalendarEvent.vue index 6035542..7afae45 100644 --- a/ui/src/components/calendar/ViewCalendarEvent.vue +++ b/ui/src/components/calendar/ViewCalendarEvent.vue @@ -1,9 +1,10 @@