Re_Backend/src/controllers/pause.controller.ts

135 lines
4.1 KiB
TypeScript

import { Response } from 'express';
import { pauseService } from '@services/pause.service';
import { ResponseHandler } from '@utils/responseHandler';
import type { AuthenticatedRequest } from '../types/express';
import { z } from 'zod';
// Validation schemas
const pauseWorkflowSchema = z.object({
levelId: z.string().uuid().optional().nullable(),
reason: z.string().min(1, 'Reason is required').max(1000, 'Reason must be less than 1000 characters'),
resumeDate: z.string().datetime().or(z.date())
});
const resumeWorkflowSchema = z.object({
// No body required for resume
});
export class PauseController {
/**
* Pause a workflow
* POST /workflows/:id/pause
*/
async pauseWorkflow(req: AuthenticatedRequest, res: Response): Promise<void> {
try {
const { id } = req.params;
const userId = req.user?.userId;
if (!userId) {
ResponseHandler.error(res, 'Unauthorized', 401);
return;
}
// Validate request body
const validated = pauseWorkflowSchema.parse(req.body);
const resumeDate = validated.resumeDate instanceof Date
? validated.resumeDate
: new Date(validated.resumeDate);
const result = await pauseService.pauseWorkflow(
id,
validated.levelId || null,
userId,
validated.reason,
resumeDate
);
ResponseHandler.success(res, {
workflow: result.workflow,
level: result.level
}, 'Workflow paused successfully', 200);
} catch (error: any) {
if (error instanceof z.ZodError) {
ResponseHandler.error(res, 'Validation failed', 400, error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join('; '));
return;
}
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
ResponseHandler.error(res, 'Failed to pause workflow', 400, errorMessage);
}
}
/**
* Resume a paused workflow
* POST /workflows/:id/resume
*/
async resumeWorkflow(req: AuthenticatedRequest, res: Response): Promise<void> {
try {
const { id } = req.params;
const userId = req.user?.userId;
if (!userId) {
ResponseHandler.error(res, 'Unauthorized', 401);
return;
}
const result = await pauseService.resumeWorkflow(id, userId);
ResponseHandler.success(res, {
workflow: result.workflow,
level: result.level
}, 'Workflow resumed successfully', 200);
} catch (error: any) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
ResponseHandler.error(res, 'Failed to resume workflow', 400, errorMessage);
}
}
/**
* Retrigger pause (initiator requests approver to resume)
* POST /workflows/:id/pause/retrigger
*/
async retriggerPause(req: AuthenticatedRequest, res: Response): Promise<void> {
try {
const { id } = req.params;
const userId = req.user?.userId;
if (!userId) {
ResponseHandler.error(res, 'Unauthorized', 401);
return;
}
await pauseService.retriggerPause(id, userId);
ResponseHandler.success(res, null, 'Pause retrigger request sent successfully', 200);
} catch (error: any) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
ResponseHandler.error(res, 'Failed to retrigger pause', 400, errorMessage);
}
}
/**
* Get pause details for a workflow
* GET /workflows/:id/pause
*/
async getPauseDetails(req: AuthenticatedRequest, res: Response): Promise<void> {
try {
const { id } = req.params;
const pauseDetails = await pauseService.getPauseDetails(id);
if (!pauseDetails) {
ResponseHandler.success(res, { isPaused: false }, 'Workflow is not paused', 200);
return;
}
ResponseHandler.success(res, pauseDetails, 'Pause details retrieved successfully', 200);
} catch (error: any) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
ResponseHandler.error(res, 'Failed to get pause details', 400, errorMessage);
}
}
}
export const pauseController = new PauseController();