import { z } from "zod"; import { and, eq, desc } from "drizzle-orm"; import { userFavorites, objects } from "@tasks/database/schema"; import { router, protectedProcedure } from "@/server/trpc"; export const favoritesRouter = router({ list: protectedProcedure .query(async ({ ctx }) => { const rows = await ctx.db .select({ id: userFavorites.id, objectId: userFavorites.objectId, createdAt: userFavorites.createdAt, objectTitle: objects.title, objectType: objects.type, objectIcon: objects.icon, }) .from(userFavorites) .innerJoin(objects, eq(userFavorites.objectId, objects.id)) .where(eq(userFavorites.userId, ctx.session.user.id)) .orderBy(desc(userFavorites.createdAt)); return rows; }), toggle: protectedProcedure .input(z.object({ objectId: z.string().uuid() })) .mutation(async ({ ctx, input }) => { const existing = await ctx.db .select({ id: userFavorites.id }) .from(userFavorites) .where( and( eq(userFavorites.userId, ctx.session.user.id), eq(userFavorites.objectId, input.objectId), ), ) .limit(1); if (existing.length > 0) { await ctx.db.delete(userFavorites).where(eq(userFavorites.id, existing[0].id)); return { favorited: false }; } await ctx.db.insert(userFavorites).values({ userId: ctx.session.user.id, objectId: input.objectId, }); return { favorited: true }; }), isFavorited: protectedProcedure .input(z.object({ objectId: z.string().uuid() })) .query(async ({ ctx, input }) => { const rows = await ctx.db .select({ id: userFavorites.id }) .from(userFavorites) .where( and( eq(userFavorites.userId, ctx.session.user.id), eq(userFavorites.objectId, input.objectId), ), ) .limit(1); return { favorited: rows.length > 0 }; }), });