All checks were successful
Build and Push Docker Image to Gitea / build-and-push (push) Successful in 4m23s
- Remove "type": "module" and switch tsconfig to CommonJS/Node resolution to fix drizzle-kit ESM/CJS incompatibility - Strip .js extensions from all backend TypeScript imports - Fix gamification resolver: combine two .where() calls using and() - Fix index.ts: wrap top-level awaits in async main(), fix Fastify+yoga request handling via handleNodeRequestAndResponse - Generate initial Drizzle SQL migration (0000_pale_hellion.sql) for all 15 tables - Add src/scripts/migrate.ts: programmatic Drizzle migrator for production - Copy migrations folder into Docker image (Dockerfile.backend) - Add schema:migrate npm script Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
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]);
|
|
},
|
|
}),
|
|
);
|