Skip to content

Commit 7088af6

Browse files
authored
feat(cli): Use separate patch schema and types (#2916)
1 parent df56918 commit 7088af6

File tree

13 files changed

+456
-281
lines changed

13 files changed

+456
-281
lines changed

docs/guides/basics/schemas.md

Lines changed: 100 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ First we need to update the `src/services/users/users.schema.js` file with the s
5050

5151
<DatabaseBlock global-id="sql">
5252

53-
```ts{1,16-17,32,42-52,56,63-67}
53+
```ts{2,17-18,33,43-53,81-85}
54+
// For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html
5455
import crypto from 'crypto'
5556
import { resolve } from '@feathersjs/schema'
5657
import { Type, getDataValidator, getValidator, querySyntax } from '@feathersjs/typebox'
@@ -79,7 +80,7 @@ export const userExternalResolver = resolve<User, HookContext>({
7980
password: async () => undefined
8081
})
8182
82-
// Schema for the basic data model (e.g. creating new entries)
83+
// Schema for creating new users
8384
export const userDataSchema = Type.Pick(
8485
userSchema,
8586
['email', 'password', 'githubId', 'avatar'],
@@ -105,9 +106,26 @@ export const userDataResolver = resolve<User, HookContext>({
105106
}
106107
})
107108
109+
// Schema for updating existing users
110+
export const userPatchSchema = Type.Partial(userSchema, {
111+
$id: 'UserPatch'
112+
})
113+
export type UserPatch = Static<typeof userPatchSchema>
114+
export const userPatchValidator = getDataValidator(userPatchSchema, dataValidator)
115+
export const userPatchResolver = resolve<User, HookContext>({
116+
password: passwordHash({ strategy: 'local' })
117+
})
118+
108119
// Schema for allowed query properties
109120
export const userQueryProperties = Type.Pick(userSchema, ['id', 'email', 'githubId'])
110-
export const userQuerySchema = querySyntax(userQueryProperties)
121+
export const userQuerySchema = Type.Intersect(
122+
[
123+
querySyntax(userQueryProperties),
124+
// Add additional query properties here
125+
Type.Object({}, { additionalProperties: false })
126+
],
127+
{ additionalProperties: false }
128+
)
111129
export type UserQuery = Static<typeof userQuerySchema>
112130
export const userQueryValidator = getValidator(userQuerySchema, queryValidator)
113131
export const userQueryResolver = resolve<UserQuery, HookContext>({
@@ -128,7 +146,8 @@ export const userQueryResolver = resolve<UserQuery, HookContext>({
128146

129147
<DatabaseBlock global-id="mongodb">
130148

131-
```ts{1,16-17,32,42-52,56,63-67}
149+
```ts{2,17-18,33,43-53,81-85}
150+
// For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html
132151
import crypto from 'crypto'
133152
import { resolve } from '@feathersjs/schema'
134153
import { Type, getDataValidator, getValidator, querySyntax } from '@feathersjs/typebox'
@@ -157,11 +176,15 @@ export const userExternalResolver = resolve<User, HookContext>({
157176
password: async () => undefined
158177
})
159178
160-
// Schema for the basic data model (e.g. creating new entries)
161-
export const userDataSchema = Type.Pick(userSchema, ['email', 'password', 'githubId', 'avatar'], {
162-
$id: 'UserData',
163-
additionalProperties: false
164-
})
179+
// Schema for creating new users
180+
export const userDataSchema = Type.Pick(
181+
userSchema,
182+
['email', 'password', 'githubId', 'avatar'],
183+
{
184+
$id: 'UserData',
185+
additionalProperties: false
186+
}
187+
)
165188
export type UserData = Static<typeof userDataSchema>
166189
export const userDataValidator = getDataValidator(userDataSchema, dataValidator)
167190
export const userDataResolver = resolve<User, HookContext>({
@@ -179,9 +202,26 @@ export const userDataResolver = resolve<User, HookContext>({
179202
}
180203
})
181204
205+
// Schema for updating existing users
206+
export const userPatchSchema = Type.Partial(userSchema, {
207+
$id: 'UserPatch'
208+
})
209+
export type UserPatch = Static<typeof userPatchSchema>
210+
export const userPatchValidator = getDataValidator(userPatchSchema, dataValidator)
211+
export const userPatchResolver = resolve<User, HookContext>({
212+
password: passwordHash({ strategy: 'local' })
213+
})
214+
182215
// Schema for allowed query properties
183-
export const userQueryProperties = Type.Pick(userSchema, ['_id', 'email', 'githubId'])
184-
export const userQuerySchema = querySyntax(userQueryProperties)
216+
export const userQueryProperties = Type.Pick(userSchema, ['id', 'email', 'githubId'])
217+
export const userQuerySchema = Type.Intersect(
218+
[
219+
querySyntax(userQueryProperties),
220+
// Add additional query properties here
221+
Type.Object({}, { additionalProperties: false })
222+
],
223+
{ additionalProperties: false }
224+
)
185225
export type UserQuery = Static<typeof userQuerySchema>
186226
export const userQueryValidator = getValidator(userQuerySchema, queryValidator)
187227
export const userQueryResolver = resolve<UserQuery, HookContext>({
@@ -217,7 +257,8 @@ Update the `src/services/messages/messages.schema.js` file like this:
217257

218258
<DatabaseBlock global-id="sql">
219259

220-
```ts{1, 7,14-16,22-25,38-44,50,60-64}
260+
```ts{2,8,15-17,23-26,38-44,57-60}
261+
// For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html
221262
import { resolve, virtual } from '@feathersjs/schema'
222263
import { Type, getDataValidator, getValidator, querySyntax } from '@feathersjs/typebox'
223264
import type { Static } from '@feathersjs/typebox'
@@ -232,7 +273,7 @@ export const messageSchema = Type.Object(
232273
id: Type.Number(),
233274
text: Type.String(),
234275
createdAt: Type.Number(),
235-
userId: Type.Number(),
276+
userId: Type.String(),
236277
user: Type.Ref(userSchema)
237278
},
238279
{ $id: 'Message', additionalProperties: false }
@@ -249,8 +290,7 @@ export const messageExternalResolver = resolve<Message, HookContext>({})
249290
250291
// Schema for creating new entries
251292
export const messageDataSchema = Type.Pick(messageSchema, ['text'], {
252-
$id: 'MessageData',
253-
additionalProperties: false
293+
$id: 'MessageData'
254294
})
255295
export type MessageData = Static<typeof messageDataSchema>
256296
export const messageDataValidator = getDataValidator(messageDataSchema, dataValidator)
@@ -264,35 +304,40 @@ export const messageDataResolver = resolve<Message, HookContext>({
264304
}
265305
})
266306
307+
// Schema for updating existing entries
308+
export const messagePatchSchema = Type.Partial(messageSchema, {
309+
$id: 'MessagePatch'
310+
})
311+
export type MessagePatch = Static<typeof messagePatchSchema>
312+
export const messagePatchValidator = getDataValidator(messagePatchSchema, dataValidator)
313+
export const messagePatchResolver = resolve<Message, HookContext>({})
314+
267315
// Schema for allowed query properties
268-
export const messageQueryProperties = Type.Pick(
269-
messageSchema,
270-
['id', 'text', 'createdAt', 'userId'],
271-
{
272-
additionalProperties: false
273-
}
316+
export const messageQueryProperties = Type.Pick(messageSchema,[
317+
'id',
318+
'text',
319+
'createdAt',
320+
'userId'
321+
])
322+
export const messageQuerySchema = Type.Intersect(
323+
[
324+
querySyntax(messageQueryProperties),
325+
// Add additional query properties here
326+
Type.Object({}, { additionalProperties: false })
327+
],
328+
{ additionalProperties: false }
274329
)
275-
export const messageQuerySchema = querySyntax(messageQueryProperties)
276330
export type MessageQuery = Static<typeof messageQuerySchema>
277331
export const messageQueryValidator = getValidator(messageQuerySchema, queryValidator)
278-
export const messageQueryResolver = resolve<MessageQuery, HookContext>({
279-
userId: async (value, user, context) => {
280-
// We want to be able to get a list of all messages but
281-
// only let a user access their own messages otherwise
282-
if (context.params.user && context.method !== 'find') {
283-
return context.params.user.id
284-
}
285-
286-
return value
287-
}
288-
})
332+
export const messageQueryResolver = resolve<MessageQuery, HookContext>({})
289333
```
290334

291335
</DatabaseBlock>
292336

293337
<DatabaseBlock global-id="mongodb">
294338

295-
```ts{1,7,14-16,22-25,38-44,50,60-64}
339+
```ts{2,8,15-17,23-26,38-44,57-60}
340+
// For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html
296341
import { resolve, virtual } from '@feathersjs/schema'
297342
import { Type, getDataValidator, getValidator, querySyntax } from '@feathersjs/typebox'
298343
import type { Static } from '@feathersjs/typebox'
@@ -324,8 +369,7 @@ export const messageExternalResolver = resolve<Message, HookContext>({})
324369
325370
// Schema for creating new entries
326371
export const messageDataSchema = Type.Pick(messageSchema, ['text'], {
327-
$id: 'MessageData',
328-
additionalProperties: false
372+
$id: 'MessageData'
329373
})
330374
export type MessageData = Static<typeof messageDataSchema>
331375
export const messageDataValidator = getDataValidator(messageDataSchema, dataValidator)
@@ -339,24 +383,29 @@ export const messageDataResolver = resolve<Message, HookContext>({
339383
}
340384
})
341385
342-
// Schema for allowed query properties
343-
export const messageQueryProperties = Type.Pick(messageSchema, ['_id', 'text', 'createdAt', 'userId'], {
344-
additionalProperties: false
386+
// Schema for updating existing entries
387+
export const messagePatchSchema = Type.Partial(messageSchema, {
388+
$id: 'MessagePatch'
345389
})
346-
export const messageQuerySchema = querySyntax(messageQueryProperties)
390+
export type MessagePatch = Static<typeof messagePatchSchema>
391+
export const messagePatchValidator = getDataValidator(messagePatchSchema, dataValidator)
392+
export const messagePatchResolver = resolve<Message, HookContext>({})
393+
394+
// Schema for allowed query properties
395+
export const messageQueryProperties = Type.Pick(messageSchema,
396+
['_id', 'text', 'createdAt', 'userId']
397+
)
398+
export const messageQuerySchema = Type.Intersect(
399+
[
400+
querySyntax(messageQueryProperties),
401+
// Add additional query properties here
402+
Type.Object({}, { additionalProperties: false })
403+
],
404+
{ additionalProperties: false }
405+
)
347406
export type MessageQuery = Static<typeof messageQuerySchema>
348407
export const messageQueryValidator = getValidator(messageQuerySchema, queryValidator)
349-
export const messageQueryResolver = resolve<MessageQuery, HookContext>({
350-
userId: async (value, user, context) => {
351-
// We want to be able to get a list of all messages but
352-
// only let a user access their own messages otherwise
353-
if (context.params.user && context.method !== 'find') {
354-
return context.params.user._id
355-
}
356-
357-
return value
358-
}
359-
})
408+
export const messageQueryResolver = resolve<MessageQuery, HookContext>({})
360409
```
361410

362411
</DatabaseBlock>

0 commit comments

Comments
 (0)