@@ -244,62 +244,149 @@ module.exports = function (MyModel) {
244
244
```
245
245
246
246
##### function parameters
247
- - ` options ` All config options set for the serialization process
248
- - ` options.type `
249
- - ` options.model `
250
- - ` options.method `
251
- - ` options.primaryKeyField `
252
- - ` options.requestedIncludes `
253
- - ` options.host `
254
- - ` options.topLevelLinks `
255
- - ` options.dataLinks `
256
- - ` options.relationships `
257
- - ` options.results `
258
- - ` options.restApiRoot `
259
- - ` options.enable `
260
- - ` options.handleErrors `
261
- - ` options.exclude `
262
- - ` options.hideIrrelevantMethods `
263
- - ` options.attributes `
247
+
248
+ - ` options ` All config options set for the serialization process. See below.
264
249
- ` callback ` Callback to call with error or serialized records
265
250
251
+ ###### ` options.type `
252
+ Resource type. Originally calculated from a models plural. Is used in the default
253
+ serialization process to set the type property for each model in a jsonapi response.
254
+ - eg. ` posts `
255
+
256
+ ###### ` options.method `
257
+ The method that was called to get the data for the current request. This is not
258
+ used in the serialization process but is provided for custom hook and serialization
259
+ context.
260
+ - Eg. ` create ` , ` updateAttributes `
261
+
262
+ ###### ` options.primaryKeyField `
263
+ The name of the property that is the primary key for the model. This is usually just
264
+ ` id ` unless defined differently in a model.json file.
265
+
266
+ ###### ` options.requestedIncludes `
267
+ The relationships that the user has requested be side loaded with the request.
268
+ For example, for the request ` GET /api/posts?include=comments ` options.requestedIncludes
269
+ would be ` 'comments' ` .
270
+ - Type: ` string ` or ` array `
271
+ - eg: ` 'comments' ` or ` ['posts', 'comments'] `
272
+
273
+ ###### ` options.host `
274
+ The host part of the url including any port information.
275
+ - eg. ` http://localhost:3000 `
276
+
277
+ ###### ` options.restApiRoot `
278
+ The api prefix used before resource information. Can be used in conjunction with
279
+ ` options.host ` and ` options.type ` to build up the full url for a resource.
280
+ - eg. ` /api `
281
+
282
+ ###### ` options.topLevelLinks `
283
+ JSON API links object used at the top level of the JSON API response structure.
284
+ - eg. ` {links: {self: 'http://localhost:3000/api/posts'}} `
285
+
286
+ ###### ` options.dataLinks `
287
+ links object used to generate links for individual resource items. The structure is
288
+ and object with JSON API link keys such as ` self ` or ` related ` that are defined as
289
+ a function that will be called for each resource.
290
+
291
+ Eg.
292
+ ``` js
293
+ options .dataLinks : {
294
+ self : function (resource ) {
295
+ return ' http://localhost:3000/posts/' + resource .id ;
296
+ }
297
+ }
298
+ ```
299
+ As shown above, each resource gets passed to the function and the result of the
300
+ function is assigned to the key in the final JSON API response.
301
+
302
+ ###### ` options.relationships `
303
+ This contains all the relationship definitions for the model being serialized.
304
+ Relationship definition objects are in the same format as in loopback's ` Model.relations `
305
+ definition. An object with relationship name keys, each having properties:
306
+
307
+ - ` modelTo ` loopback model object
308
+ - ` keyTo ` name of key on to model
309
+ - ` modelFrom ` loopback model object
310
+ - ` keyFrom ` name of key on from model
311
+ - ` type ` type of relationship (belongsTo, hasOne, hasMany)
312
+
313
+ This information is used to build relationship urls and even setup side loaded
314
+ data correctly during the serialization process.
315
+
316
+ eg.
317
+ ``` js
318
+ options .relationships = {
319
+ comments: { modelTo: ... etc },
320
+ tags: { modelTo: ... etc }
321
+ }
322
+ ```
323
+
324
+ ###### ` options.results `
325
+ This is the actual data to be serialized. In ` beforeJsonApiSerialize ` and
326
+ ` jsonApiSerialize ` this will be the raw data as you would ordinarily get it from
327
+ loopback. In ` afterJsonApiSerialize ` this will be the serialized data ready for
328
+ any final modifications.
329
+
330
+ ###### ` options.exclude `
331
+ This is the exclude settings as defined in the ` exclude ` configuration option
332
+ explained earlier. Use this in ` beforeJsonApiSerialize ` to make any model specific
333
+ adjustments before serialization.
334
+
335
+ ###### ` options.attributes `
336
+ This is the attributes settings as defined in the ` attributes ` configuration option
337
+ explained earlier. Use this in ` beforeJsonApiSerialize ` to make any model specific
338
+ adjustments before serialization.
339
+
266
340
## Serialization Hooks
267
341
For occasions when you don't want to fully implement serialization for a model manually but
268
342
you need to manipulate the serialization process, you can use the serialization
269
- hooks ` beforeJsonApiSerialization ` and ` afterJsonApiSerialization ` .
270
-
271
- ### beforeJsonApiSerialization
272
-
273
- #### example
343
+ hooks ` beforeJsonApiSerialize ` and ` afterJsonApiSerialize ` .
344
+
345
+ ### beforeJsonApiSerialize
346
+ In order to modify the serialization process on a model by model basis, you can
347
+ define a ` Model.beforeJsonApiSerialize ` function as shown below. The function
348
+ will be called with an options object and a callback which must be called with either
349
+ an error as the first argument or the modified options object as the second
350
+ parameter.
351
+
352
+ ** Examples of things you might want to use this feature for**
353
+ - modify the record(s) before serialization by modifying ` options.results `
354
+ - modify the resource type by modifying ` options.type `
355
+ - setup serialization differently depending on ` options.method `
356
+ - side load data (advanced)
357
+ - modify the way relationships are serialized
358
+
359
+ #### code example
274
360
``` js
275
361
module .exports = function (MyModel ) {
276
362
MyModel .beforeJsonApiSerialize = function (options , callback ) {
277
363
// either return an error
278
364
var err = new Error (' Unable to serialize record' );
279
365
err .status = 500 ;
280
- cb (err)
366
+ callback (err)
281
367
282
368
// or return modified records
283
- if (Array .isArray (options .records )) {
369
+ if (Array .isArray (options .results )) {
284
370
// modify an array of records
285
371
} else {
286
372
// modify a single record
287
373
}
288
374
// returned options.records will be serialized by either the default serialization process
289
375
// or by a custom serialize function (described above) if one is present on the model.
290
- cb (null , options);
376
+ callback (null , options);
291
377
}
292
378
}
293
379
```
294
380
295
381
##### function parameters
296
- - ` options ` All config options set for the serialization process
297
- - ` callback ` Callback to call with error or modified records
382
+ - ` options ` All config options set for the serialization process. See the "function parameters"
383
+ section above for info on what options properties are available for modification.
384
+ - ` callback ` Callback to call with error or options object.
298
385
299
386
#### example use case
300
387
Because the ` beforeJsonApiSerialize ` method is passed all the options that will
301
388
be used during serialization, it is possible to tweak options to affect the
302
- serialization process. One example of this is modifiying the ` type ` option to
389
+ serialization process. One example of this is modifying the ` type ` option to
303
390
change the resource type that will be output.
304
391
305
392
``` js
@@ -311,7 +398,12 @@ module.exports = function (MyModel) {
311
398
}
312
399
```
313
400
314
- ### afterJsonApiSerialization
401
+ ### afterJsonApiSerialize
402
+ In order to modify the serialized data on a model by model basis, you can
403
+ define a ` Model.afterJsonApiSerialize ` function as shown below. The function
404
+ will be called with an options object and a callback which must be called with either
405
+ an error as the first argument or the modified options object as the second
406
+ parameter.
315
407
316
408
#### example
317
409
``` js
@@ -320,16 +412,16 @@ module.exports = function (MyModel) {
320
412
// either return an error
321
413
var err = new Error (' Unable to modify serialized record' );
322
414
err .status = 500 ;
323
- cb (err)
415
+ callback (err)
324
416
325
417
// or return modified records
326
- if (Array .isArray (options .records )) {
418
+ if (Array .isArray (options .results )) {
327
419
// modify an array of serialized records
328
420
} else {
329
421
// modify a single serialized record
330
422
}
331
423
// returned options.records will be output through the api.
332
- cb (null , options);
424
+ callback (null , options);
333
425
}
334
426
}
335
427
```
0 commit comments