Re_Backend/src/routes/admin.routes.ts

219 lines
6.4 KiB
TypeScript

import { Router } from 'express';
import { authenticateToken } from '@middlewares/auth.middleware';
import { requireAdmin } from '@middlewares/authorization.middleware';
import { validateBody, validateParams } from '../middlewares/validate.middleware';
import {
createHolidaySchema,
updateHolidaySchema,
holidayParamsSchema,
calendarParamsSchema,
configKeyParamsSchema,
updateConfigSchema,
assignRoleSchema,
updateRoleSchema,
userIdParamsSchema,
createActivityTypeSchema,
updateActivityTypeSchema,
activityTypeParamsSchema,
} from '../validators/admin.validator';
import {
getAllHolidays,
getHolidayCalendar,
createHoliday,
updateHoliday,
deleteHoliday,
bulkImportHolidays,
getAllConfigurations,
updateConfiguration,
resetConfiguration,
getForm16Config,
putForm16Config,
updateUserRole,
getUsersByRole,
getRoleStatistics,
assignRoleByEmail,
getAllActivityTypes,
getActivityTypeById,
createActivityType,
updateActivityType,
deleteActivityType
} from '@controllers/admin.controller';
const router = Router();
// All admin routes require authentication and admin role
router.use(authenticateToken);
router.use(requireAdmin);
// ==================== Holiday Management Routes ====================
/**
* @route GET /api/admin/holidays
* @desc Get all holidays (optional year filter)
* @query year (optional)
* @access Admin
*/
router.get('/holidays', getAllHolidays);
/**
* @route GET /api/admin/holidays/calendar/:year
* @desc Get holiday calendar for a specific year
* @params year
* @access Admin
*/
router.get('/holidays/calendar/:year', validateParams(calendarParamsSchema), getHolidayCalendar);
/**
* @route POST /api/admin/holidays
* @desc Create a new holiday
* @body { holidayDate, holidayName, description, holidayType, isRecurring, ... }
* @access Admin
*/
router.post('/holidays', validateBody(createHolidaySchema), createHoliday);
/**
* @route PUT /api/admin/holidays/:holidayId
* @desc Update a holiday
* @params holidayId
* @body Holiday fields to update
* @access Admin
*/
router.put('/holidays/:holidayId', validateParams(holidayParamsSchema), validateBody(updateHolidaySchema), updateHoliday);
/**
* @route DELETE /api/admin/holidays/:holidayId
* @desc Delete (deactivate) a holiday
* @params holidayId
* @access Admin
*/
router.delete('/holidays/:holidayId', validateParams(holidayParamsSchema), deleteHoliday);
/**
* @route POST /api/admin/holidays/bulk-import
* @desc Bulk import holidays from CSV/JSON
* @body { holidays: [...] }
* @access Admin
*/
router.post('/holidays/bulk-import', bulkImportHolidays);
// ==================== Configuration Management Routes ====================
/**
* @route GET /api/admin/configurations
* @desc Get all admin configurations (optional category filter)
* @query category (optional)
* @access Admin
*/
router.get('/configurations', getAllConfigurations);
/**
* @route PUT /api/admin/configurations/:configKey
* @desc Update a configuration value
* @params configKey
* @body { configValue }
* @access Admin
*/
router.put('/configurations/:configKey', validateParams(configKeyParamsSchema), validateBody(updateConfigSchema), updateConfiguration);
/**
* @route POST /api/admin/configurations/:configKey/reset
* @desc Reset configuration to default value
* @params configKey
* @access Admin
*/
router.post('/configurations/:configKey/reset', validateParams(configKeyParamsSchema), resetConfiguration);
/**
* @route GET /api/admin/form16-config
* @desc Get Form 16 admin config (submission/26AS viewers, reminders)
* @access Admin
*/
router.get('/form16-config', getForm16Config);
/**
* @route PUT /api/admin/form16-config
* @desc Update Form 16 admin config
* @body { submissionViewerEmails?, twentySixAsViewerEmails?, reminderEnabled?, reminderDays? }
* @access Admin
*/
router.put('/form16-config', putForm16Config);
// ==================== User Role Management Routes (RBAC) ====================
/**
* @route POST /api/admin/users/assign-role
* @desc Assign role to user by email (creates user from Okta if doesn't exist)
* @body { email: string, role: 'USER' | 'MANAGEMENT' | 'ADMIN' }
* @access Admin
*/
router.post('/users/assign-role', validateBody(assignRoleSchema), assignRoleByEmail);
/**
* @route PUT /api/admin/users/:userId/role
* @desc Update user's role (USER, MANAGEMENT, ADMIN)
* @params userId
* @body { role: 'USER' | 'MANAGEMENT' | 'ADMIN' }
* @access Admin
*/
router.put('/users/:userId/role', validateParams(userIdParamsSchema), validateBody(updateRoleSchema), updateUserRole);
/**
* @route GET /api/admin/users/by-role
* @desc Get all users filtered by role
* @query role (optional): ADMIN | MANAGEMENT | USER
* @access Admin
*/
router.get('/users/by-role', getUsersByRole);
/**
* @route GET /api/admin/users/role-statistics
* @desc Get count of users in each role
* @access Admin
*/
router.get('/users/role-statistics', getRoleStatistics);
// ==================== Activity Type Management Routes ====================
/**
* @route GET /api/admin/activity-types
* @desc Get all activity types (optional activeOnly filter)
* @query activeOnly (optional): true | false
* @access Admin
*/
router.get('/activity-types', getAllActivityTypes);
/**
* @route GET /api/admin/activity-types/:activityTypeId
* @desc Get a single activity type by ID
* @params activityTypeId
* @access Admin
*/
router.get('/activity-types/:activityTypeId', validateParams(activityTypeParamsSchema), getActivityTypeById);
/**
* @route POST /api/admin/activity-types
* @desc Create a new activity type
* @body { title, itemCode?, taxationType?, sapRefNo? }
* @access Admin
*/
router.post('/activity-types', validateBody(createActivityTypeSchema), createActivityType);
/**
* @route PUT /api/admin/activity-types/:activityTypeId
* @desc Update an activity type
* @params activityTypeId
* @body Activity type fields to update
* @access Admin
*/
router.put('/activity-types/:activityTypeId', validateParams(activityTypeParamsSchema), validateBody(updateActivityTypeSchema), updateActivityType);
/**
* @route DELETE /api/admin/activity-types/:activityTypeId
* @desc Delete (deactivate) an activity type
* @params activityTypeId
* @access Admin
*/
router.delete('/activity-types/:activityTypeId', validateParams(activityTypeParamsSchema), deleteActivityType);
export default router;