From 751f8dffcf211fa32aff115093ad6b8329bb7c21 Mon Sep 17 00:00:00 2001 From: wangsijie Date: Sat, 7 Jan 2023 12:19:09 +0800 Subject: [PATCH] feat(core): add resource to response scopes (#2843) --- packages/core/src/queries/resource.ts | 9 +++++++++ packages/core/src/routes/role.test.ts | 12 ++++++++++-- packages/core/src/routes/role.ts | 17 ++++++++++++++++- packages/schemas/src/types/index.ts | 1 + packages/schemas/src/types/scope.ts | 3 +++ 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 packages/schemas/src/types/scope.ts diff --git a/packages/core/src/queries/resource.ts b/packages/core/src/queries/resource.ts index 7e6c94bfe..effd96cb6 100644 --- a/packages/core/src/queries/resource.ts +++ b/packages/core/src/queries/resource.ts @@ -32,6 +32,15 @@ export const findResourceByIndicator = async (indicator: string) => where ${fields.indicator}=${indicator} `); +export const findResourcesByIds = async (resourceIds: string[]) => + resourceIds.length > 0 + ? envSet.pool.any(sql` + select ${sql.join(Object.values(fields), sql`, `)} + from ${table} + where ${fields.id} in (${sql.join(resourceIds, sql`, `)}) + `) + : []; + export const findResourceById = buildFindEntityById(Resources); export const insertResource = buildInsertInto(Resources, { diff --git a/packages/core/src/routes/role.test.ts b/packages/core/src/routes/role.test.ts index bf57ac3b9..95dd1851d 100644 --- a/packages/core/src/routes/role.test.ts +++ b/packages/core/src/routes/role.test.ts @@ -1,7 +1,7 @@ import type { Role } from '@logto/schemas'; import { pickDefault, createMockUtils } from '@logto/shared/esm'; -import { mockRole, mockScope, mockUser } from '#src/__mocks__/index.js'; +import { mockRole, mockScope, mockUser, mockResource } from '#src/__mocks__/index.js'; import { createRequester } from '#src/utils/test-utils.js'; const { jest } = import.meta; @@ -30,6 +30,9 @@ const { findScopeById, findScopesByIds } = await mockEsmWithActual('#src/queries findScopeById: jest.fn(), findScopesByIds: jest.fn(), })); +await mockEsmWithActual('#src/queries/resource.js', () => ({ + findResourcesByIds: jest.fn(async () => [mockResource]), +})); const { insertRolesScopes, findRolesScopesByRoleId } = await mockEsmWithActual( '#src/queries/roles-scopes.js', () => ({ @@ -128,7 +131,12 @@ describe('role routes', () => { findScopesByIds.mockResolvedValueOnce([mockScope]); const response = await roleRequester.get(`/roles/${mockRole.id}/scopes`); expect(response.status).toEqual(200); - expect(response.body).toEqual([mockScope]); + expect(response.body).toEqual([ + { + ...mockScope, + resource: mockResource, + }, + ]); }); it('POST /roles/:id/scopes', async () => { diff --git a/packages/core/src/routes/role.ts b/packages/core/src/routes/role.ts index 4de52731c..a18667478 100644 --- a/packages/core/src/routes/role.ts +++ b/packages/core/src/routes/role.ts @@ -1,9 +1,11 @@ import { buildIdGenerator } from '@logto/core-kit'; +import type { ScopeResponse } from '@logto/schemas'; import { Roles } from '@logto/schemas'; import { object, string, z } from 'zod'; import RequestError from '#src/errors/RequestError/index.js'; import koaGuard from '#src/middleware/koa-guard.js'; +import { findResourcesByIds } from '#src/queries/resource.js'; import { deleteRolesScope, findRolesScopesByRoleId, @@ -138,7 +140,20 @@ export default function roleRoutes(router: T) { await findRoleById(id); const rolesScopes = await findRolesScopesByRoleId(id); - ctx.body = await findScopesByIds(rolesScopes.map(({ scopeId }) => scopeId)); + const scopes = await findScopesByIds(rolesScopes.map(({ scopeId }) => scopeId)); + const resources = await findResourcesByIds(scopes.map(({ resourceId }) => resourceId)); + const result: ScopeResponse[] = scopes.map((scope) => { + const resource = resources.find(({ id }) => scope.resourceId); + + assertThat(resource, new Error(`Cannot find resource for id ${scope.resourceId}`)); + + return { + ...scope, + resource, + }; + }); + + ctx.body = result; return next(); } diff --git a/packages/schemas/src/types/index.ts b/packages/schemas/src/types/index.ts index b82788755..51ff41cff 100644 --- a/packages/schemas/src/types/index.ts +++ b/packages/schemas/src/types/index.ts @@ -6,3 +6,4 @@ export * from './logto-config.js'; export * from './interactions.js'; export * from './search.js'; export * from './resource.js'; +export * from './scope.js'; diff --git a/packages/schemas/src/types/scope.ts b/packages/schemas/src/types/scope.ts new file mode 100644 index 000000000..81bfd8f99 --- /dev/null +++ b/packages/schemas/src/types/scope.ts @@ -0,0 +1,3 @@ +import type { Resource, Scope } from '../db-entries/index.js'; + +export type ScopeResponse = Scope & { resource: Resource };