Update : getAll in users API
This commit is contained in:
parent
33c0f73257
commit
e5bc2b1a40
|
|
@ -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, {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user