135 lines
4.1 KiB
TypeScript
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();
|
|
|