lifetracker/packages/trpc/routers/hours.ts

112 lines
3.7 KiB
TypeScript

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);
console.log(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
console.log(hourRes);
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]
}
}),
});