Root cause: Prisma schema uses 'assignedToId' but getTasks was passing 'assigneeId' directly to the where clause, causing PrismaClientValidationError
139 lines
4.2 KiB
TypeScript
139 lines
4.2 KiB
TypeScript
import { FastifyRequest, FastifyReply } from 'fastify';
|
|
import { TaskStatus } from '@prisma/client';
|
|
|
|
export const getTasks = async (request: FastifyRequest, reply: FastifyReply) => {
|
|
const { status, assigneeId, roomId, batchId, startDate, endDate } = request.query as any;
|
|
|
|
try {
|
|
const tasks = await request.server.prisma.task.findMany({
|
|
where: {
|
|
...(status && { status }),
|
|
...(assigneeId && { assignedToId: assigneeId }),
|
|
...(roomId && { roomId }),
|
|
...(batchId && { batchId }),
|
|
...(startDate && endDate && {
|
|
dueDate: {
|
|
gte: new Date(startDate),
|
|
lte: new Date(endDate),
|
|
},
|
|
}),
|
|
},
|
|
include: {
|
|
assignedTo: {
|
|
select: {
|
|
id: true,
|
|
name: true,
|
|
},
|
|
},
|
|
room: {
|
|
select: {
|
|
name: true,
|
|
type: true,
|
|
},
|
|
},
|
|
batch: {
|
|
select: {
|
|
name: true,
|
|
strain: true,
|
|
},
|
|
},
|
|
},
|
|
orderBy: {
|
|
dueDate: 'asc',
|
|
},
|
|
});
|
|
|
|
return tasks;
|
|
} catch (error) {
|
|
request.log.error(error);
|
|
return reply.code(500).send({ message: 'Failed to fetch tasks' });
|
|
}
|
|
};
|
|
|
|
export const createTask = async (request: FastifyRequest, reply: FastifyReply) => {
|
|
const data = request.body as any;
|
|
|
|
try {
|
|
const task = await request.server.prisma.task.create({
|
|
data: {
|
|
title: data.title,
|
|
description: data.description,
|
|
status: 'PENDING',
|
|
priority: data.priority || 'MEDIUM',
|
|
assignedToId: data.assigneeId, // Map assigneeId input to assignedToId column
|
|
roomId: data.roomId,
|
|
batchId: data.batchId,
|
|
dueDate: new Date(data.dueDate),
|
|
notes: data.notes,
|
|
templateId: data.templateId,
|
|
},
|
|
include: {
|
|
assignedTo: true,
|
|
room: true,
|
|
batch: true,
|
|
},
|
|
});
|
|
|
|
return reply.code(201).send(task);
|
|
} catch (error) {
|
|
request.log.error(error);
|
|
return reply.code(500).send({ message: 'Failed to create task' });
|
|
}
|
|
};
|
|
|
|
export const updateTask = async (request: FastifyRequest, reply: FastifyReply) => {
|
|
const { id } = request.params as { id: string };
|
|
const data = request.body as any;
|
|
|
|
try {
|
|
const task = await request.server.prisma.task.update({
|
|
where: { id },
|
|
data: {
|
|
...data,
|
|
...(data.dueDate && { dueDate: new Date(data.dueDate) }),
|
|
},
|
|
});
|
|
|
|
return task;
|
|
} catch (error) {
|
|
request.log.error(error);
|
|
return reply.code(500).send({ message: 'Failed to update task' });
|
|
}
|
|
};
|
|
|
|
export const completeTask = async (request: FastifyRequest, reply: FastifyReply) => {
|
|
const { id } = request.params as { id: string };
|
|
const { notes, photos } = request.body as { notes?: string, photos?: string[] } || {};
|
|
|
|
try {
|
|
const task = await request.server.prisma.task.update({
|
|
where: { id },
|
|
data: {
|
|
status: 'COMPLETED',
|
|
completedAt: new Date(),
|
|
notes: notes,
|
|
photos: photos || [],
|
|
},
|
|
});
|
|
|
|
return task;
|
|
} catch (error) {
|
|
request.log.error(error);
|
|
return reply.code(500).send({ message: 'Failed to complete task' });
|
|
}
|
|
};
|
|
|
|
export const deleteTask = async (request: FastifyRequest, reply: FastifyReply) => {
|
|
const { id } = request.params as { id: string };
|
|
|
|
try {
|
|
await request.server.prisma.task.delete({
|
|
where: { id },
|
|
});
|
|
|
|
return reply.code(204).send();
|
|
} catch (error) {
|
|
request.log.error(error);
|
|
return reply.code(500).send({ message: 'Failed to delete task' });
|
|
}
|
|
};
|