import { builder } from "../builder"; import { ModelType } from "../types/index"; import { users, user_photos, files } from "../../db/schema/index"; import { eq, and, desc } from "drizzle-orm"; async function enrichModel(db: any, user: any) { // Fetch photos const photoRows = await db .select({ id: files.id, filename: files.filename }) .from(user_photos) .leftJoin(files, eq(user_photos.file_id, files.id)) .where(eq(user_photos.user_id, user.id)) .orderBy(user_photos.sort); return { ...user, photos: photoRows.map((p: any) => ({ id: p.id, filename: p.filename })), }; } builder.queryField("models", (t) => t.field({ type: [ModelType], args: { featured: t.arg.boolean(), limit: t.arg.int(), }, resolve: async (_root, args, ctx) => { let query = ctx.db .select() .from(users) .where(eq(users.role, "model")) .orderBy(desc(users.date_created)); if (args.limit) { query = (query as any).limit(args.limit); } const modelList = await query; return Promise.all(modelList.map((m: any) => enrichModel(ctx.db, m))); }, }), ); builder.queryField("model", (t) => t.field({ type: ModelType, nullable: true, args: { slug: t.arg.string({ required: true }), }, resolve: async (_root, args, ctx) => { const model = await ctx.db .select() .from(users) .where(and(eq(users.slug, args.slug), eq(users.role, "model"))) .limit(1); if (!model[0]) return null; return enrichModel(ctx.db, model[0]); }, }), );