198 lines
5.4 KiB
JavaScript
198 lines
5.4 KiB
JavaScript
import { PrismaClient } from '@prisma/client';
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
|
|
// 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'
|
|
};
|
|
}
|
|
|
|
console.log('Starting process with ID:', processId);
|
|
|
|
// Check if the ID is a UUID or numeric ID
|
|
const isUUID = processId.length === 36 && processId.includes('-');
|
|
|
|
// Find the process
|
|
console.log('Finding process...');
|
|
const process = await prisma.process.findFirst({
|
|
where: isUUID
|
|
? { processUUID: processId }
|
|
: { processID: parseInt(processId) },
|
|
include: {
|
|
creator: {
|
|
select: {
|
|
userID: true,
|
|
userFullName: true,
|
|
userUsername: true
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
if (!process) {
|
|
console.log('Process not found');
|
|
return {
|
|
success: false,
|
|
error: 'Process not found'
|
|
};
|
|
}
|
|
|
|
console.log('Process found:', process.processName);
|
|
|
|
// Check if process is published
|
|
if (process.processStatus !== 'published') {
|
|
console.log('Process is not published:', process.processStatus);
|
|
return {
|
|
success: false,
|
|
error: 'Cannot start an unpublished process'
|
|
};
|
|
}
|
|
|
|
// Get the current authenticated user from the request context
|
|
const currentUser = event.context.user;
|
|
|
|
if (!currentUser || !currentUser.userID) {
|
|
console.log('User not authenticated');
|
|
return {
|
|
success: false,
|
|
error: 'Authentication required'
|
|
};
|
|
}
|
|
|
|
// Get full user details from database
|
|
const userDetails = await prisma.user.findFirst({
|
|
where: {
|
|
userID: parseInt(currentUser.userID)
|
|
},
|
|
select: {
|
|
userID: true,
|
|
userFullName: true,
|
|
userUsername: true
|
|
}
|
|
});
|
|
|
|
if (!userDetails) {
|
|
console.log('User details not found');
|
|
return {
|
|
success: false,
|
|
error: 'User not found'
|
|
};
|
|
}
|
|
|
|
console.log('Creating case instance...');
|
|
// Create a new case instance
|
|
const caseInstance = await prisma.caseInstance.create({
|
|
data: {
|
|
caseUUID: uuidv4(),
|
|
processID: process.processID,
|
|
caseName: `${process.processName} - ${new Date().toLocaleDateString()}`,
|
|
caseStatus: 'active',
|
|
caseStartedBy: userDetails.userID,
|
|
caseVariables: process.processVariables || {},
|
|
caseSettings: process.processSettings || {},
|
|
caseDefinition: process.processDefinition || {},
|
|
caseCreatedDate: new Date(),
|
|
caseModifiedDate: new Date()
|
|
}
|
|
});
|
|
|
|
console.log('Case instance created:', caseInstance.caseUUID);
|
|
|
|
// Get the process definition
|
|
const processDefinition = process.processDefinition || {};
|
|
const nodes = processDefinition.nodes || [];
|
|
const edges = processDefinition.edges || [];
|
|
|
|
// Find all form nodes
|
|
const formNodes = nodes.filter(node => node.type === 'form');
|
|
|
|
if (formNodes.length === 0) {
|
|
console.log('No form nodes found in process');
|
|
return {
|
|
success: false,
|
|
error: 'Process does not contain any forms'
|
|
};
|
|
}
|
|
|
|
console.log(`Found ${formNodes.length} form nodes`);
|
|
|
|
// Create tasks for all forms
|
|
const tasks = [];
|
|
for (const formNode of formNodes) {
|
|
console.log('Creating task for form:', formNode.data?.label);
|
|
const task = await prisma.task.create({
|
|
data: {
|
|
taskUUID: uuidv4(),
|
|
caseID: caseInstance.caseID,
|
|
taskName: formNode.data?.label || 'Complete Form',
|
|
taskType: 'form',
|
|
taskStatus: 'pending',
|
|
taskAssignedTo: userDetails.userID,
|
|
taskFormID: formNode.data?.formId,
|
|
taskCreatedDate: new Date(),
|
|
taskModifiedDate: new Date()
|
|
}
|
|
});
|
|
tasks.push(task);
|
|
console.log('Task created:', task.taskUUID);
|
|
}
|
|
|
|
// Add to case timeline
|
|
console.log('Adding to case timeline...');
|
|
await prisma.caseTimeline.create({
|
|
data: {
|
|
caseID: caseInstance.caseID,
|
|
timelineType: 'start',
|
|
timelineDescription: `Process started by ${userDetails.userFullName}`,
|
|
timelineDate: new Date(),
|
|
timelineCreatedBy: userDetails.userID
|
|
}
|
|
});
|
|
|
|
console.log('Process started successfully');
|
|
return {
|
|
success: true,
|
|
data: {
|
|
case: {
|
|
id: caseInstance.caseUUID,
|
|
name: caseInstance.caseName,
|
|
status: caseInstance.caseStatus,
|
|
startedAt: caseInstance.caseCreatedDate
|
|
},
|
|
tasks: tasks.map(task => ({
|
|
id: task.taskUUID,
|
|
name: task.taskName,
|
|
type: task.taskType,
|
|
formId: task.taskFormID,
|
|
status: task.taskStatus
|
|
}))
|
|
}
|
|
};
|
|
} catch (error) {
|
|
console.error('Error starting process:', error);
|
|
console.error('Error details:', {
|
|
name: error.name,
|
|
message: error.message,
|
|
stack: error.stack,
|
|
code: error.code
|
|
});
|
|
|
|
return {
|
|
success: false,
|
|
error: 'Failed to start process',
|
|
details: process.env.NODE_ENV === 'development' ? error.message : undefined
|
|
};
|
|
} finally {
|
|
// Close the Prisma client connection
|
|
await prisma.$disconnect();
|
|
}
|
|
});
|