-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathpets-serializer.js
83 lines (72 loc) · 2.36 KB
/
pets-serializer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { Serializer as JsonApiSerializer } from 'jsonapi-serializer';
import _ from 'lodash';
import { serializerOptions } from 'utils/jsonapi';
import { openapi } from 'utils/load-openapi';
import { paginate } from 'utils/paginator';
import { apiBaseUrl, resourcePathLink, paramsLink } from 'utils/uri-builder';
const petResourceProp = openapi.definitions.PetResource.properties;
const petResourceType = petResourceProp.type.enum[0];
const petResourceKeys = _.keys(petResourceProp.attributes.properties);
const petResourcePath = 'pets';
const petResourceUrl = resourcePathLink(apiBaseUrl, petResourcePath);
/**
* Serialize petResources to JSON API
*
* @param {object[]} rawPets Raw data rows from data source
* @param {object} req Express request object
* @returns {object} Serialized petResources object
*/
const serializePets = (rawPets, req) => {
const { query } = req;
// Add pagination links and meta information to options if pagination is enabled
const pageQuery = {
size: query['page[size]'],
number: query['page[number]'],
};
const pagination = paginate(rawPets, pageQuery);
pagination.totalResults = rawPets.length;
rawPets = pagination.paginatedRows;
// TODO use req.path
const topLevelSelfLink = paramsLink(petResourceUrl, query);
const serializerArgs = {
identifierField: 'id',
resourceKeys: petResourceKeys,
pagination,
resourcePath: petResourcePath,
topLevelSelfLink,
query,
enableDataLinks: true,
};
return new JsonApiSerializer(
petResourceType,
serializerOptions(serializerArgs),
).serialize(rawPets);
};
/**
* Serialize petResource to JSON API
*
* @param {object} rawPet Raw data row from data source
* @param {boolean} req Express request object
* @returns {object} Serialized petResource object
*/
const serializePet = (rawPet, req) => {
const { query } = req;
// TODO use req.path
const baseUrl = req.method === 'POST'
? petResourceUrl
: resourcePathLink(petResourceUrl, rawPet.id);
const topLevelSelfLink = paramsLink(baseUrl, query);
const serializerArgs = {
identifierField: 'id',
resourceKeys: petResourceKeys,
resourcePath: petResourcePath,
topLevelSelfLink,
query,
enableDataLinks: true,
};
return new JsonApiSerializer(
petResourceType,
serializerOptions(serializerArgs),
).serialize(rawPet);
};
export { serializePets, serializePet };