import { experimental_trpcMiddleware, TRPCError } from "@trpc/server"; import { and, desc, eq, inArray, notExists } from "drizzle-orm"; import { date, z } from "zod"; import { SqliteError } from "@lifetracker/db"; import { categories, days, hours, } from "@lifetracker/db/schema"; import { zDaySchema, ZDay, ZHour, zHourSchema } from "@lifetracker/shared/types/days"; import type { Context } from "../index"; import { authedProcedure, router } from "../index"; import { format } from "date-fns"; import { TZDate } from "@date-fns/tz"; import { dateFromInput } from "@lifetracker/shared/utils/days"; export const hoursAppRouter = router({ get: authedProcedure .input(z.object({ dateQuery: z.string(), time: z.number() })) .output(zHourSchema) .query(async ({ input, ctx }) => { const date = dateFromInput(input); const hourRes = await ctx.db .select({ id: hours.id, dayId: hours.dayId, time: hours.time, categoryId: hours.categoryId, categoryCode: categories.code, categoryName: categories.name, comment: hours.comment, }) .from(hours) .leftJoin(days, eq(days.id, hours.dayId)) // Ensure days table is joined first .leftJoin(categories, eq(categories.id, hours.categoryId)) .where(and(eq(hours.time, input.time), eq(days.date, date))) // Use correct alias for days table return { date: format(date, "yyyy-MM-dd"), ...hourRes[0] }; }), update: authedProcedure .input( z.object({ dateQuery: z.string(), time: z.number(), code: z.string().optional(), comment: z.string().nullable().optional(), }), ) // .output(zHourSchema) .mutation(async ({ input, ctx }) => { const { dateQuery, time, code, ...updatedProps } = input; var date = dateFromInput({ dateQuery: dateQuery }); const category = await ctx.db.select( { id: categories.id, name: categories.name, } ) .from(categories) .where( and( eq(categories.code, code), eq(categories.userId, ctx.user!.id), ) ); const day = await ctx.db.select( { id: days.id } ) .from(days) .where( and( eq(days.date, date), eq(days.userId, ctx.user!.id), ) ); const newProps = { categoryId: category[0].id, ...updatedProps }; if (newProps.comment == "") { newProps.comment = null } const hourRes = await ctx.db .update(hours) .set(newProps) .where( and( eq(hours.time, time), eq(hours.dayId, day[0].id), eq(hours.userId, ctx.user!.id) ) ) .returning(); return { date: format(date, "yyyy-MM-dd"), categoryName: category[0].name, ...hourRes[0] } }), });