()
| 211 | * - publicApiRouter: Public API routes (/api/events/*) |
| 212 | */ |
| 213 | export function createEventsRouter(): { |
| 214 | pageRouter: Router; |
| 215 | adminApiRouter: Router; |
| 216 | publicApiRouter: Router; |
| 217 | } { |
| 218 | const pageRouter = Router(); |
| 219 | const adminApiRouter = Router(); |
| 220 | const publicApiRouter = Router(); |
| 221 | |
| 222 | // ========================================================================= |
| 223 | // ADMIN PAGE ROUTES (mounted at /admin) |
| 224 | // ========================================================================= |
| 225 | |
| 226 | // Admin events management page |
| 227 | pageRouter.get("/events", requireAuth, requireAdmin, (req, res) => { |
| 228 | serveHtmlWithConfig(req, res, "admin-events.html").catch((err) => { |
| 229 | logger.error({ err }, "Error serving admin events page"); |
| 230 | res.status(500).send("Internal server error"); |
| 231 | }); |
| 232 | }); |
| 233 | |
| 234 | // ========================================================================= |
| 235 | // ADMIN API ROUTES (mounted at /api/admin/events) |
| 236 | // ========================================================================= |
| 237 | |
| 238 | // GET /api/admin/events - List all events (including drafts) |
| 239 | adminApiRouter.get("/", requireAuth, requireAdmin, async (req: Request, res: Response) => { |
| 240 | try { |
| 241 | const status = req.query.status as EventStatus | undefined; |
| 242 | const event_type = req.query.event_type as EventType | undefined; |
| 243 | const event_format = req.query.event_format as EventFormat | undefined; |
| 244 | const search = req.query.search as string | undefined; |
| 245 | const limit = req.query.limit ? parseInt(req.query.limit as string, 10) : undefined; |
| 246 | const offset = req.query.offset ? parseInt(req.query.offset as string, 10) : undefined; |
| 247 | |
| 248 | const events = await eventsDb.listEvents({ |
| 249 | status, |
| 250 | event_type, |
| 251 | event_format, |
| 252 | search, |
| 253 | limit, |
| 254 | offset, |
| 255 | include_invite_unlisted: true, // Admin sees all events regardless of visibility |
| 256 | }); |
| 257 | |
| 258 | res.json({ events }); |
| 259 | } catch (error) { |
| 260 | logger.error({ err: error }, "Error listing events"); |
| 261 | res.status(500).json({ |
| 262 | error: "Failed to list events", |
| 263 | message: "An unexpected error occurred", |
| 264 | }); |
| 265 | } |
| 266 | }); |
| 267 | |
| 268 | // POST /api/admin/events - Create a new event |
| 269 | adminApiRouter.post("/", requireAuth, requireAdmin, async (req: Request, res: Response) => { |
| 270 | try { |
no test coverage detected