diff --git a/src/userRoute.ts b/src/userRoute.ts index 0ec03f9..88db5eb 100644 --- a/src/userRoute.ts +++ b/src/userRoute.ts @@ -1,9 +1,16 @@ import { router, publicProcedure, protectedProcedure } from "./trpc"; import { db } from "./db"; -import { imageToUser, opinion, user, userOpinion } from "./schema"; +import { + imageToUser, + opinion, + province, + user, + userOpinion, + zone, +} from "./schema"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; -import { SQL, count, eq } from "drizzle-orm"; +import { SQL, count, eq, inArray } from "drizzle-orm"; import { Config } from "./config"; import { TRPCError } from "@trpc/server"; import * as jwt from "jsonwebtoken"; @@ -83,6 +90,7 @@ export const userRoute = router({ group: z.number().optional(), zone: z.number().optional(), opinionCount: z.number().default(3), + province: z.number().optional(), }) ) .query( @@ -92,7 +100,8 @@ export const userRoute = router({ input.limit, input.opinionCount, input.group, - input.zone + input.zone, + input.province ) ), }); @@ -102,8 +111,20 @@ async function getAllUser( limit: number, opinionLimit: number, group?: number, - zone?: number + zoneId?: number, + provinceId?: number ) { + let zoneIds: number[] = []; + if (provinceId) { + zoneIds = await db + .select({ id: zone.id }) + .from(zone) + .where(eq(zone.province, provinceId)) + .then((queryResult) => queryResult.map((v) => v.id)); + if (zoneIds.length === 0) { + return []; + } + } let users = await db.query.user.findMany({ with: { group: true, @@ -121,8 +142,11 @@ async function getAllUser( if (group) { conditions.push(eq(user.group, group)); } - if (zone) { - conditions.push(eq(user.zone, zone)); + if (zoneId) { + conditions.push(eq(user.zone, zoneId)); + } + if (zoneIds.length > 0) { + conditions.push(inArray(user.zone, zoneIds)); } return and(...conditions); },