78 lines
2.8 KiB
TypeScript
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 };
|