87 lines
2.3 KiB
TypeScript
87 lines
2.3 KiB
TypeScript
import { Router, Request, Response, NextFunction } from 'express';
|
|
import { campaignsService } from './campaigns.service';
|
|
import { createCampaignSchema, updateCampaignSchema, listCampaignsSchema } from './campaigns.schemas';
|
|
import { validate } from '../../../middleware/validate';
|
|
import { authenticate } from '../../../middleware/auth.middleware';
|
|
import { requireRole } from '../../../middleware/rbac.middleware';
|
|
import { INFLUENCE_ROLES } from '../../../utils/roles';
|
|
|
|
const router = Router();
|
|
|
|
// All campaign admin routes require authentication + admin role
|
|
router.use(authenticate);
|
|
router.use(requireRole(...INFLUENCE_ROLES));
|
|
|
|
// GET /api/campaigns — list campaigns with pagination/filters
|
|
router.get(
|
|
'/',
|
|
validate(listCampaignsSchema, 'query'),
|
|
async (req: Request, res: Response, next: NextFunction) => {
|
|
try {
|
|
const result = await campaignsService.findAll(req.query as any, req.user!);
|
|
res.json(result);
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
}
|
|
);
|
|
|
|
// GET /api/campaigns/:id — get single campaign
|
|
router.get(
|
|
'/:id',
|
|
async (req: Request, res: Response, next: NextFunction) => {
|
|
try {
|
|
const id = req.params.id as string;
|
|
const campaign = await campaignsService.findById(id);
|
|
res.json(campaign);
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
}
|
|
);
|
|
|
|
// POST /api/campaigns — create campaign
|
|
router.post(
|
|
'/',
|
|
validate(createCampaignSchema),
|
|
async (req: Request, res: Response, next: NextFunction) => {
|
|
try {
|
|
const campaign = await campaignsService.create(req.body, req.user!);
|
|
res.status(201).json(campaign);
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
}
|
|
);
|
|
|
|
// PUT /api/campaigns/:id — update campaign
|
|
router.put(
|
|
'/:id',
|
|
validate(updateCampaignSchema),
|
|
async (req: Request, res: Response, next: NextFunction) => {
|
|
try {
|
|
const id = req.params.id as string;
|
|
const campaign = await campaignsService.update(id, req.body);
|
|
res.json(campaign);
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
}
|
|
);
|
|
|
|
// DELETE /api/campaigns/:id — delete campaign
|
|
router.delete(
|
|
'/:id',
|
|
async (req: Request, res: Response, next: NextFunction) => {
|
|
try {
|
|
const id = req.params.id as string;
|
|
await campaignsService.delete(id);
|
|
res.status(204).send();
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
}
|
|
);
|
|
|
|
export { router as campaignsRouter };
|