changemaker.lite/api/src/modules/meetings/action-items.routes.ts

78 lines
2.8 KiB
TypeScript

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 };