diff --git a/packages/schema/src/hooks.ts b/packages/schema/src/hooks.ts index f41347c2ad..b12d22508e 100644 --- a/packages/schema/src/hooks.ts +++ b/packages/schema/src/hooks.ts @@ -73,16 +73,18 @@ export const resolveResult = (resolver: Resolver) => const ctx = getContext(context); const status = context.params.resolve; - const data = context.method === 'find' && context.result.data - ? context.result.data - : context.result; - if (Array.isArray(data)) { - context.result = await Promise.all(data.map(current => - resolver.resolve(current, ctx, status) - )); + const isPaginated = context.method === 'find' && context.result.data; + const data = isPaginated ? context.result.data : context.result; + + const result = Array.isArray(data) ? + await Promise.all(data.map(async current => resolver.resolve(current, ctx, status))) : + await resolver.resolve(data, ctx, status); + + if (isPaginated) { + context.result.data = result; } else { - context.result = await resolver.resolve(data, ctx, status); + context.result = result; } }; diff --git a/packages/schema/test/fixture.ts b/packages/schema/test/fixture.ts index 509eded507..06e0fd6df2 100644 --- a/packages/schema/test/fixture.ts +++ b/packages/schema/test/fixture.ts @@ -138,6 +138,7 @@ export const messageQueryResolver = resolve, messages: Service + pagintedMessages: Service } type Application = FeathersApplication; @@ -145,7 +146,9 @@ const app = feathers() .use('users', memory({ multi: ['create'] })) - .use('messages', memory()); + .use('messages', memory()) + .use('pagintedMessages', memory({paginate: { default: 10 }})) + ; app.service('messages').hooks([ validateQuery(messageQuerySchema), @@ -153,6 +156,12 @@ app.service('messages').hooks([ resolveResult(messageResultResolver) ]); +app.service('pagintedMessages').hooks([ + validateQuery(messageQuerySchema), + resolveQuery(messageQueryResolver), + resolveResult(messageResultResolver) +]); + app.service('users').hooks([ resolveResult(userResultResolver) ]); diff --git a/packages/schema/test/hooks.test.ts b/packages/schema/test/hooks.test.ts index 7b47fec4e9..62e7620b17 100644 --- a/packages/schema/test/hooks.test.ts +++ b/packages/schema/test/hooks.test.ts @@ -5,6 +5,7 @@ describe('@feathersjs/schema/hooks', () => { const text = 'Hi there'; let message: MessageResult; + let messageOnPaginatedService: MessageResult; let user: UserResult; before(async () => { @@ -16,6 +17,10 @@ describe('@feathersjs/schema/hooks', () => { text, userId: user.id }); + messageOnPaginatedService = await app.service('pagintedMessages').create({ + text, + userId: user.id + }); }); it('validates data', async () => { @@ -69,6 +74,64 @@ describe('@feathersjs/schema/hooks', () => { }); }); + it('resolves get result with the object on result', async () => { + // eslint-disable-next-line + const { password, ...externalUser } = user; + const payload = { + userId: user.id, + text + } + + assert.ok(user); + assert.strictEqual(user.password, 'hashed', 'Resolved data'); + assert.deepStrictEqual(message, { + id: 0, + user, + ...payload + }); + + const result = await app.service('messages').get(0, { + provider: 'external' + }); + + assert.deepStrictEqual(result, { + id: 0, + user: externalUser, + ...payload + }); + }); + + it('resolves find results with paginated result object', async () => { + // eslint-disable-next-line + const { password, ...externalUser } = user; + const payload = { + userId: user.id, + text + } + + assert.ok(user); + assert.strictEqual(user.password, 'hashed', 'Resolved data'); + assert.deepStrictEqual(messageOnPaginatedService, { + id: 0, + user, + ...payload + }); + + const messages = await app.service('pagintedMessages').find({ + provider: 'external', + query: { + $limit: 1, + $skip: 0 + } + }); + + assert.deepStrictEqual(messages, { limit: 1, skip: 0, total: 1, data: [{ + id: 0, + user: externalUser, + ...payload + }]}); + }); + it('validates and converts the query', async () => { const otherUser = await app.service('users').create({ email: 'helloagain@feathersjs.com',