corrad-bp/server/api/process/[id].put.js
Afiq 33dc901107 Add Form and Process History Modals with Versioning Support
- Introduced FormHistoryModal and ProcessHistoryModal components for viewing and restoring previous versions of forms and processes.
- Implemented version tracking in the backend with new API endpoints for fetching and restoring historical data.
- Added database migrations for form and process history tables to support versioning functionality.
- Enhanced form and process update logic to save previous versions before modifications.
- Updated documentation to include details on the new history system and its benefits for data management.
- Improved user experience with intuitive modals for accessing historical data and restoring previous versions.
2025-05-30 19:10:43 +08:00

147 lines
4.7 KiB
JavaScript

import { PrismaClient } from '@prisma/client';
import { defineEventHandler, getRouterParam, readBody } from 'h3';
// Initialize Prisma client
const prisma = new PrismaClient();
export default defineEventHandler(async (event) => {
try {
// Get the process ID from the route parameter
const processId = getRouterParam(event, 'id');
if (!processId) {
return {
success: false,
error: 'Process ID is required'
};
}
// Parse the request body
const body = await readBody(event);
// Validate required fields
if (!body.processName) {
return {
success: false,
error: 'Process name is required'
};
}
// Check if the ID is a UUID or numeric ID
const isUUID = processId.length === 36 && processId.includes('-');
// Find the existing process first to save its current state to history
const existingProcess = await prisma.process.findFirst({
where: isUUID
? { processUUID: processId }
: { processID: parseInt(processId) },
include: {
creator: {
select: {
userID: true,
userFullName: true,
userUsername: true
}
}
}
});
if (!existingProcess) {
return {
success: false,
error: 'Process not found'
};
}
// Get the next version number for history
const lastHistory = await prisma.processHistory.findFirst({
where: { processID: existingProcess.processID },
orderBy: { versionNumber: 'desc' },
select: { versionNumber: true }
});
const nextVersionNumber = (lastHistory?.versionNumber || 0) + 1;
// Save current state to history before updating
await prisma.processHistory.create({
data: {
processID: existingProcess.processID,
processUUID: existingProcess.processUUID,
processName: existingProcess.processName,
processDescription: existingProcess.processDescription,
processDefinition: existingProcess.processDefinition,
processVersion: existingProcess.processVersion,
processStatus: existingProcess.processStatus,
processCategory: existingProcess.processCategory,
processOwner: existingProcess.processOwner,
processPermissions: existingProcess.processPermissions,
processPriority: existingProcess.processPriority,
processSettings: existingProcess.processSettings,
processVariables: existingProcess.processVariables,
templateCategory: existingProcess.templateCategory,
versionNumber: nextVersionNumber,
changeDescription: body.changeDescription || null,
savedBy: body.savedBy || existingProcess.processCreatedBy
}
});
// Prepare process definition
const processDefinition = {
nodes: body.nodes || [],
edges: body.edges || [],
viewport: body.viewport || { x: 0, y: 0, zoom: 1 }
};
// Prepare process variables (if any)
const processVariables = body.variables || {};
// Prepare process settings (if any)
const processSettings = body.settings || {};
// Prepare process permissions (if any)
const processPermissions = body.permissions || {};
// Update the process
const updatedProcess = await prisma.process.update({
where: isUUID
? { processUUID: processId }
: { processID: parseInt(processId) },
data: {
processName: body.processName,
processDescription: body.processDescription || null,
processCategory: body.processCategory || null,
processPriority: body.processPriority || 'normal',
processOwner: body.processOwner || null,
processDefinition: processDefinition,
processVariables: Object.keys(processVariables).length > 0 ? processVariables : null,
processSettings: Object.keys(processSettings).length > 0 ? processSettings : null,
processPermissions: Object.keys(processPermissions).length > 0 ? processPermissions : null,
processStatus: body.processStatus || existingProcess.processStatus,
processVersion: existingProcess.processVersion + 1
},
include: {
creator: {
select: {
userID: true,
userFullName: true,
userUsername: true
}
}
}
});
return {
success: true,
process: updatedProcess,
message: 'Process updated successfully and previous version saved to history'
};
} catch (error) {
console.error('Error updating process:', error);
return {
success: false,
error: 'Failed to update process',
details: process.env.NODE_ENV === 'development' ? error.message : undefined
};
}
});