From ee49880845217667154d167ca44d92bdc5890ed1 Mon Sep 17 00:00:00 2001 From: Xiao Yijun Date: Wed, 16 Feb 2022 15:55:08 +0800 Subject: [PATCH] feat(core): get `/users` (#237) --- packages/core/src/queries/user.ts | 14 ++++++++------ packages/core/src/routes/admin-user.ts | 14 +++++++++++--- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/packages/core/src/queries/user.ts b/packages/core/src/queries/user.ts index 297ed6b7c..e681e93ae 100644 --- a/packages/core/src/queries/user.ts +++ b/packages/core/src/queries/user.ts @@ -1,10 +1,11 @@ import { User, CreateUser, Users } from '@logto/schemas'; import { sql } from 'slonik'; +import { buildFindMany } from '@/database/find-many'; import { buildInsertInto } from '@/database/insert-into'; import pool from '@/database/pool'; import { buildUpdateWhere } from '@/database/update-where'; -import { convertToIdentifiers, OmitAutoSetFields } from '@/database/utils'; +import { convertToIdentifiers, getTotalRowCount, OmitAutoSetFields } from '@/database/utils'; import { DeletionError } from '@/errors/SlonikError'; const { table, fields } = convertToIdentifiers(Users); @@ -85,11 +86,12 @@ export const hasUserWithIdentity = async (connectorId: string, userId: string) = export const insertUser = buildInsertInto(pool, Users, { returning: true }); -export const findAllUsers = async () => - pool.many(sql` - select ${sql.join(Object.values(fields), sql`, `)} - from ${table} - `); +export const findTotalNumberOfUsers = async () => getTotalRowCount(table); + +const findUserMany = buildFindMany(pool, Users); + +export const findAllUsers = async (limit: number, offset: number) => + findUserMany({ limit, offset }); const updateUser = buildUpdateWhere(pool, Users, true); diff --git a/packages/core/src/routes/admin-user.ts b/packages/core/src/routes/admin-user.ts index 2a84eabc1..695c9b88b 100644 --- a/packages/core/src/routes/admin-user.ts +++ b/packages/core/src/routes/admin-user.ts @@ -4,14 +4,22 @@ import { InvalidInputError } from 'slonik'; import { object, string } from 'zod'; import koaGuard from '@/middleware/koa-guard'; +import koaPagination from '@/middleware/koa-pagination'; import { findRolesByRoleNames } from '@/queries/roles'; -import { findAllUsers, findUserById, updateUserById } from '@/queries/user'; +import { findAllUsers, findTotalNumberOfUsers, findUserById, updateUserById } from '@/queries/user'; import { AuthedRouter } from './types'; export default function adminUserRoutes(router: T) { - router.get('/users', async (ctx, next) => { - const users = await findAllUsers(); + router.get('/users', koaPagination(), async (ctx, next) => { + const { limit, offset } = ctx.pagination; + + const [{ count }, users] = await Promise.all([ + findTotalNumberOfUsers(), + findAllUsers(limit, offset), + ]); + + ctx.pagination.totalCount = count; ctx.body = users.map((user) => pick(user, ...userInfoSelectFields)); return next();