Skip to content

Commit 6511e45

Browse files
authored
fix(schema): result resolver correctly resolves paginated find result (#2594)
1 parent 27cc7d0 commit 6511e45

3 files changed

Lines changed: 83 additions & 9 deletions

File tree

packages/schema/src/hooks.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -73,16 +73,18 @@ export const resolveResult = <T> (resolver: Resolver<T, HookContext>) =>
7373

7474
const ctx = getContext(context);
7575
const status = context.params.resolve;
76-
const data = context.method === 'find' && context.result.data
77-
? context.result.data
78-
: context.result;
7976

80-
if (Array.isArray(data)) {
81-
context.result = await Promise.all(data.map(current =>
82-
resolver.resolve(current, ctx, status)
83-
));
77+
const isPaginated = context.method === 'find' && context.result.data;
78+
const data = isPaginated ? context.result.data : context.result;
79+
80+
const result = Array.isArray(data) ?
81+
await Promise.all(data.map(async current => resolver.resolve(current, ctx, status))) :
82+
await resolver.resolve(data, ctx, status);
83+
84+
if (isPaginated) {
85+
context.result.data = result;
8486
} else {
85-
context.result = await resolver.resolve(data, ctx, status);
87+
context.result = result;
8688
}
8789
};
8890

packages/schema/test/fixture.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,21 +138,30 @@ export const messageQueryResolver = resolve<MessageQuery, HookContext<Applicatio
138138
type ServiceTypes = {
139139
users: Service<UserResult, User>,
140140
messages: Service<MessageResult, Message>
141+
pagintedMessages: Service<MessageResult, Message>
141142
}
142143
type Application = FeathersApplication<ServiceTypes>;
143144

144145
const app = feathers<ServiceTypes>()
145146
.use('users', memory({
146147
multi: ['create']
147148
}))
148-
.use('messages', memory());
149+
.use('messages', memory())
150+
.use('pagintedMessages', memory({paginate: { default: 10 }}))
151+
;
149152

150153
app.service('messages').hooks([
151154
validateQuery(messageQuerySchema),
152155
resolveQuery(messageQueryResolver),
153156
resolveResult(messageResultResolver)
154157
]);
155158

159+
app.service('pagintedMessages').hooks([
160+
validateQuery(messageQuerySchema),
161+
resolveQuery(messageQueryResolver),
162+
resolveResult(messageResultResolver)
163+
]);
164+
156165
app.service('users').hooks([
157166
resolveResult(userResultResolver)
158167
]);

packages/schema/test/hooks.test.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ describe('@feathersjs/schema/hooks', () => {
55
const text = 'Hi there';
66

77
let message: MessageResult;
8+
let messageOnPaginatedService: MessageResult;
89
let user: UserResult;
910

1011
before(async () => {
@@ -16,6 +17,10 @@ describe('@feathersjs/schema/hooks', () => {
1617
text,
1718
userId: user.id
1819
});
20+
messageOnPaginatedService = await app.service('pagintedMessages').create({
21+
text,
22+
userId: user.id
23+
});
1924
});
2025

2126
it('validates data', async () => {
@@ -69,6 +74,64 @@ describe('@feathersjs/schema/hooks', () => {
6974
});
7075
});
7176

77+
it('resolves get result with the object on result', async () => {
78+
// eslint-disable-next-line
79+
const { password, ...externalUser } = user;
80+
const payload = {
81+
userId: user.id,
82+
text
83+
}
84+
85+
assert.ok(user);
86+
assert.strictEqual(user.password, 'hashed', 'Resolved data');
87+
assert.deepStrictEqual(message, {
88+
id: 0,
89+
user,
90+
...payload
91+
});
92+
93+
const result = await app.service('messages').get(0, {
94+
provider: 'external'
95+
});
96+
97+
assert.deepStrictEqual(result, {
98+
id: 0,
99+
user: externalUser,
100+
...payload
101+
});
102+
});
103+
104+
it('resolves find results with paginated result object', async () => {
105+
// eslint-disable-next-line
106+
const { password, ...externalUser } = user;
107+
const payload = {
108+
userId: user.id,
109+
text
110+
}
111+
112+
assert.ok(user);
113+
assert.strictEqual(user.password, 'hashed', 'Resolved data');
114+
assert.deepStrictEqual(messageOnPaginatedService, {
115+
id: 0,
116+
user,
117+
...payload
118+
});
119+
120+
const messages = await app.service('pagintedMessages').find({
121+
provider: 'external',
122+
query: {
123+
$limit: 1,
124+
$skip: 0
125+
}
126+
});
127+
128+
assert.deepStrictEqual(messages, { limit: 1, skip: 0, total: 1, data: [{
129+
id: 0,
130+
user: externalUser,
131+
...payload
132+
}]});
133+
});
134+
72135
it('validates and converts the query', async () => {
73136
const otherUser = await app.service('users').create({
74137
email: 'helloagain@feathersjs.com',

0 commit comments

Comments
 (0)