Skip to content

Commit

Permalink
fix(schema): result resolver correctly resolves paginated find result (
Browse files Browse the repository at this point in the history
  • Loading branch information
idaho committed Apr 11, 2022
1 parent 27cc7d0 commit 6511e45
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 9 deletions.
18 changes: 10 additions & 8 deletions packages/schema/src/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,16 +73,18 @@ export const resolveResult = <T> (resolver: Resolver<T, HookContext>) =>

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;
}
};

Expand Down
11 changes: 10 additions & 1 deletion packages/schema/test/fixture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,21 +138,30 @@ export const messageQueryResolver = resolve<MessageQuery, HookContext<Applicatio
type ServiceTypes = {
users: Service<UserResult, User>,
messages: Service<MessageResult, Message>
pagintedMessages: Service<MessageResult, Message>
}
type Application = FeathersApplication<ServiceTypes>;

const app = feathers<ServiceTypes>()
.use('users', memory({
multi: ['create']
}))
.use('messages', memory());
.use('messages', memory())
.use('pagintedMessages', memory({paginate: { default: 10 }}))
;

app.service('messages').hooks([
validateQuery(messageQuerySchema),
resolveQuery(messageQueryResolver),
resolveResult(messageResultResolver)
]);

app.service('pagintedMessages').hooks([
validateQuery(messageQuerySchema),
resolveQuery(messageQueryResolver),
resolveResult(messageResultResolver)
]);

app.service('users').hooks([
resolveResult(userResultResolver)
]);
Expand Down
63 changes: 63 additions & 0 deletions packages/schema/test/hooks.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ describe('@feathersjs/schema/hooks', () => {
const text = 'Hi there';

let message: MessageResult;
let messageOnPaginatedService: MessageResult;
let user: UserResult;

before(async () => {
Expand All @@ -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 () => {
Expand Down Expand Up @@ -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',
Expand Down

0 comments on commit 6511e45

Please sign in to comment.