import { Router, Request, Response, NextFunction } from 'express'; import { actionItemsService } from './action-items.service'; import { createActionItemSchema, updateActionItemSchema, listActionItemsSchema, } from './action-items.schemas'; import { validate } from '../../middleware/validate'; import { authenticate } from '../../middleware/auth.middleware'; import { requireRole } from '../../middleware/rbac.middleware'; import { EVENTS_ROLES } from '../../utils/roles'; const router = Router(); // --- Routes requiring EVENTS_ROLES --- // List all action items router.get('/', authenticate, requireRole(...EVENTS_ROLES), validate(listActionItemsSchema, 'query'), async (req: Request, res: Response, next: NextFunction) => { try { const result = await actionItemsService.findAll(req.query as any); res.json(result); } catch (err) { next(err); } }); // Current user's action items (authenticate only) router.get('/mine', authenticate, async (req: Request, res: Response, next: NextFunction) => { try { const status = req.query.status as string | undefined; const items = await actionItemsService.findByUser(req.user!.id, status); res.json(items); } catch (err) { next(err); } }); // Overdue items router.get('/overdue', authenticate, requireRole(...EVENTS_ROLES), async (req: Request, res: Response, next: NextFunction) => { try { const items = await actionItemsService.getOverdue(); res.json(items); } catch (err) { next(err); } }); // Get action item detail router.get('/:id', authenticate, async (req: Request, res: Response, next: NextFunction) => { try { const id = req.params.id as string; const item = await actionItemsService.findById(id); res.json(item); } catch (err) { next(err); } }); // Create action item router.post('/', authenticate, requireRole(...EVENTS_ROLES), validate(createActionItemSchema), async (req: Request, res: Response, next: NextFunction) => { try { const item = await actionItemsService.create(req.body, req.user!.id); res.status(201).json(item); } catch (err) { next(err); } }); // Update action item (authenticate only - assignees can update their own) router.put('/:id', authenticate, validate(updateActionItemSchema), async (req: Request, res: Response, next: NextFunction) => { try { const id = req.params.id as string; const item = await actionItemsService.update(id, req.body); res.json(item); } catch (err) { next(err); } }); // Delete action item router.delete('/:id', authenticate, requireRole(...EVENTS_ROLES), async (req: Request, res: Response, next: NextFunction) => { try { const id = req.params.id as string; await actionItemsService.delete(id); res.json({ message: 'Action item deleted' }); } catch (err) { next(err); } }); export { router as actionItemsRouter };