Update : getAll in users API

This commit is contained in:
percyfikri 2024-09-17 15:43:37 +07:00
parent 33c0f73257
commit e5bc2b1a40

View File

@ -1,4 +1,4 @@
import { and, eq, ilike, isNull, or, sql, not } from "drizzle-orm"; import { and, eq, ilike, isNull, or, sql, not, inArray } from "drizzle-orm";
import { Hono } from "hono"; import { Hono } from "hono";
import { z } from "zod"; import { z } from "zod";
@ -58,7 +58,7 @@ const usersRoute = new Hono<HonoEnv>()
.optional() .optional()
.transform((v) => v?.toLowerCase() === "true"), .transform((v) => v?.toLowerCase() === "true"),
page: z.coerce.number().int().min(0).default(0), page: z.coerce.number().int().min(0).default(0),
limit: z.coerce.number().int().min(1).max(1000).default(1), limit: z.coerce.number().int().min(1).max(1000).default(10),
q: z.string().default(""), q: z.string().default(""),
}) })
), ),
@ -70,42 +70,53 @@ const usersRoute = new Hono<HonoEnv>()
? sql<number>`(SELECT count(*) FROM ${users})` ? sql<number>`(SELECT count(*) FROM ${users})`
: sql<number>`(SELECT count(*) FROM ${users} WHERE ${users.deletedAt} IS NULL)`; : sql<number>`(SELECT count(*) FROM ${users} WHERE ${users.deletedAt} IS NULL)`;
const result = await db // Query to get unique user IDs with pagination (Sub Query)
.select({ const userIdsQuery = db
id: users.id, .select({
name: users.name, id: users.id,
email: users.email, })
username: users.username, .from(users)
isEnabled: users.isEnabled, .where(
createdAt: users.createdAt, and(
updatedAt: users.updatedAt, includeTrashed ? undefined : isNull(users.deletedAt),
...(includeTrashed ? { deletedAt: users.deletedAt } : {}), q
company: respondents.companyName, ? or(
role: { ilike(users.name, q),
name: rolesSchema.name, ilike(users.username, q),
id: rolesSchema.id, ilike(users.email, q),
}, eq(users.id, q)
fullCount: totalCountQuery,
})
.from(users)
.leftJoin(respondents, eq(users.id, respondents.userId))
.leftJoin(rolesToUsers, eq(users.id, rolesToUsers.userId))
.leftJoin(rolesSchema, eq(rolesToUsers.roleId, rolesSchema.id))
.where(
and(
includeTrashed ? undefined : isNull(users.deletedAt),
q
? or(
ilike(users.name, q),
ilike(users.username, q),
ilike(users.email, q),
eq(users.id, q)
)
: undefined
) )
: undefined
) )
.offset(page * limit) )
.limit(limit); .offset(page * limit)
.limit(limit);
// Main query
const result = await db
.select({
id: users.id,
name: users.name,
email: users.email,
username: users.username,
isEnabled: users.isEnabled,
createdAt: users.createdAt,
updatedAt: users.updatedAt,
...(includeTrashed ? { deletedAt: users.deletedAt } : {}),
company: respondents.companyName,
role: {
name: rolesSchema.name,
id: rolesSchema.id,
},
fullCount: totalCountQuery,
})
.from(users)
.leftJoin(respondents, eq(users.id, respondents.userId))
.leftJoin(rolesToUsers, eq(users.id, rolesToUsers.userId))
.leftJoin(rolesSchema, eq(rolesToUsers.roleId, rolesSchema.id))
.where(inArray(users.id, userIdsQuery)) // using ID from subquery
.orderBy(users.createdAt); // sort by createdAt
// Group roles for each user to prevent duplication // Group roles for each user to prevent duplication
const userMap = new Map<string, { const userMap = new Map<string, {