import { createId } from "@paralleldrive/cuid2"; import { eq } from "drizzle-orm"; import { HTTPException } from "hono/http-exception"; import db from "../../database"; import { taskTable, timeEntryTable } from "../../database/schema"; import { publishEvent } from "../../events"; async function createTimeEntry({ taskId, userId, description, startTime, endTime, duration, }: { taskId: string; userId: string; description?: string; startTime: Date; endTime?: Date; duration?: number; }) { const [createdTimeEntry] = await db .insert(timeEntryTable) .values({ id: createId(), taskId, userId, description: description || "", startTime, endTime: endTime || null, duration: duration || 0, }) .returning(); if (!createdTimeEntry) { throw new HTTPException(500, { message: "Failed to create time entry", }); } const [task] = await db .select({ userId: taskTable.userId, title: taskTable.title }) .from(taskTable) .where(eq(taskTable.id, taskId)); await publishEvent("time-entry.created", { timeEntryId: createdTimeEntry.id, taskId: createdTimeEntry.taskId, userId, type: "create", content: "started time tracking", taskOwnerId: task?.userId, taskTitle: task?.title, }); return createdTimeEntry; } export default createTimeEntry;