Skip to content

Commit 07ebb00

Browse files
committed
Adds processing of relationship’s resource object meta field when deserializing
1 parent 485b95c commit 07ebb00

File tree

5 files changed

+97
-23
lines changed

5 files changed

+97
-23
lines changed

src/JsonaTypes.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export interface IJsonPropertiesMapper {
1212
setAttributes(model: TJsonaModel, attributes: TAnyKeyValueObject): void;
1313
setMeta(model: TJsonaModel, meta: TAnyKeyValueObject): void;
1414
setLinks(model: TJsonaModel, links: TAnyKeyValueObject): void;
15-
setRelationMeta(model: TJsonaModel, relationMeta: TRelationMeta): void;
15+
setResourceIdObjMeta(model: TJsonaModel, meta: TResourceIdObj): void;
1616
setRelationships(model: TJsonaModel, relationships: TJsonaRelationships): void;
1717
setRelationshipLinks(parentModel: TJsonaModel, relationName: string, links: TJsonApiLinks): void;
1818
setRelationshipMeta(parentModel: TJsonaModel, relationName: string, meta: TAnyKeyValueObject): void;
@@ -95,6 +95,7 @@ export type TJsonApiData = {
9595
export type TJsonApiRelationshipData = {
9696
type: string;
9797
id: string|number;
98+
meta?: TAnyKeyValueObject
9899
};
99100

100101
export type TJsonApiRelation = {
@@ -147,7 +148,7 @@ export type TJsonaModel = {
147148
[propertyName: string]: any
148149
};
149150

150-
export type TRelationMeta = {
151+
export type TResourceIdObj = {
151152
[propertyName: string]: any
152153
};
153154

src/builders/JsonDeserializer.ts

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
TJsonApiBody,
66
TJsonApiData,
77
IJsonaDeserializer,
8-
IDeserializeCache, TRelationMeta,
8+
IDeserializeCache, TResourceIdObj,
99
} from '../JsonaTypes';
1010

1111
export class JsonDeserializer implements IJsonaDeserializer {
@@ -66,7 +66,7 @@ export class JsonDeserializer implements IJsonaDeserializer {
6666
return stuff;
6767
}
6868

69-
buildModelByData(data: TJsonApiData, payload: TRelationMeta = {}): TJsonaModel {
69+
buildModelByData(data: TJsonApiData, resourceIdObj: TResourceIdObj = {}): TJsonaModel {
7070
const cachedModel = this.dc.getCachedModel(data);
7171

7272
if (cachedModel) {
@@ -92,8 +92,8 @@ export class JsonDeserializer implements IJsonaDeserializer {
9292
this.pm.setLinks(model, data.links);
9393
}
9494

95-
if (payload.relationMeta) {
96-
this.pm.setRelationMeta(model, payload.relationMeta);
95+
if (resourceIdObj.meta) {
96+
this.pm.setResourceIdObjMeta(model, resourceIdObj.meta);
9797
}
9898

9999
const relationships: null | TJsonaRelationships = this.buildRelationsByData(data, model);
@@ -112,48 +112,45 @@ export class JsonDeserializer implements IJsonaDeserializer {
112112
if (data.relationships) {
113113
for (let k in data.relationships) {
114114
const relation = data.relationships[k];
115-
const relationPayload = {
116-
relationMeta: relation.meta,
117-
};
118115

119116
if (Array.isArray(relation.data)) {
120117
readyRelations[k] = [];
121118

122-
const relationItemsLength = relation.data.length;
123-
let relationItem;
119+
const relationDataLength = relation.data.length;
120+
let resourceIdObj;
124121

125-
for (let i = 0; i < relationItemsLength; i++) {
126-
relationItem = relation.data[i];
122+
for (let i = 0; i < relationDataLength; i++) {
123+
resourceIdObj = relation.data[i];
127124

128-
if (!relationItem) {
125+
if (!resourceIdObj) {
129126
return;
130127
}
131128

132129
let dataItem = this.buildDataFromIncludedOrData(
133-
relationItem.id,
134-
relationItem.type
130+
resourceIdObj.id,
131+
resourceIdObj.type
135132
);
136133
readyRelations[k].push(
137-
this.buildModelByData(dataItem, relationPayload)
134+
this.buildModelByData(dataItem, resourceIdObj)
138135
);
139136
}
140137
} else if (relation.data) {
141138
let dataItem = this.buildDataFromIncludedOrData(relation.data.id, relation.data.type);
142-
readyRelations[k] = this.buildModelByData(dataItem, relationPayload);
139+
readyRelations[k] = this.buildModelByData(dataItem, relation.data);
143140
} else if (relation.data === null) {
144141
readyRelations[k] = null;
145142
}
146143

147144
if (relation.links) {
148145
const {setRelationshipLinks} = this.pm;
149-
if (setRelationshipLinks) { // support was added in patch release
146+
if (setRelationshipLinks) {
150147
setRelationshipLinks(model, k, relation.links);
151148
}
152149
}
153150

154151
if (relation.meta) {
155152
const {setRelationshipMeta} = this.pm;
156-
if (setRelationshipMeta) { // support was added in patch release
153+
if (setRelationshipMeta) {
157154
setRelationshipMeta(model, k, relation.meta);
158155
}
159156
}

src/simplePropertyMappers.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
IJsonPropertiesMapper,
44
TAnyKeyValueObject,
55
TJsonaModel,
6-
TJsonaRelationships, TJsonaRelationshipBuild, TJsonApiLinks, TRelationMeta
6+
TJsonaRelationships, TJsonaRelationshipBuild, TJsonApiLinks, TResourceIdObj
77
} from './JsonaTypes';
88

99
export const RELATIONSHIP_NAMES_PROP = 'relationshipNames';
@@ -115,8 +115,8 @@ export class JsonPropertiesMapper implements IJsonPropertiesMapper {
115115
model.links = links;
116116
}
117117

118-
setRelationMeta(model: TJsonaModel, relationMeta: TRelationMeta) {
119-
model.relationMeta = relationMeta;
118+
setResourceIdObjMeta(model: TJsonaModel, meta: TResourceIdObj) {
119+
model.resourceIdObjMeta = meta;
120120
}
121121

122122
setRelationships(model: TJsonaModel, relationships: TJsonaRelationships) {

tests/Jsona.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
reduxObjectWithCircular,
1818
withoutRootIdsMock,
1919
withNullRelationsMock,
20+
resourceIdObjMetaMock,
2021
} from './mocks';
2122

2223
chai.config.showDiff = true;
@@ -90,6 +91,12 @@ describe('Jsona', () => {
9091
const collectionWithNullRelations = jsona.deserialize({data: withNullRelationsMock.json});
9192
expect(collectionWithNullRelations).to.be.deep.equal(withNullRelationsMock.collection);
9293
});
94+
95+
it('should deserialize resource id object meta field into resourceIdObjMeta', () => {
96+
const stuff = jsona.deserialize(resourceIdObjMetaMock.json);
97+
expect(stuff).to.be.deep.equal(resourceIdObjMetaMock.collection);
98+
});
99+
93100
});
94101

95102
describe('denormalizeReduxObject', () => {

tests/mocks.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,3 +680,72 @@ export const withNullRelationsMock = {
680680
}],
681681

682682
};
683+
684+
export const resourceIdObjMetaMock = {
685+
686+
json: {
687+
"data": [{
688+
"type": "node--site_configuration",
689+
"id": "f8895943-7f51-451b-bb8f-a479853f1b4b",
690+
"attributes": {
691+
"langcode": "en",
692+
"title": "Site Configuration"
693+
},
694+
"relationships": {
695+
"field_logo": {
696+
"data": {
697+
"type": "file--file",
698+
"id": "551ec1b9-b0c6-4649-bb7c-b6ebb09354ff",
699+
"meta": {
700+
"alt": "ACME Corp Logo",
701+
"title": "",
702+
"width": 206,
703+
"height": 278
704+
}
705+
}
706+
}
707+
}
708+
}],
709+
"included": [{
710+
"type": "file--file",
711+
"id": "551ec1b9-b0c6-4649-bb7c-b6ebb09354ff",
712+
"attributes": {
713+
"langcode": "en",
714+
"uri": {
715+
"value": "public://2020-07/acmecorp-logo-colour-2x.png",
716+
"url": "http://acmecorp.oss-cn-hongkong.aliyuncs.com/s3fs-public/2020-07/acmecorp-logo-colour-2x.png"
717+
},
718+
"filemime": "image/png",
719+
"filesize": 54952
720+
}
721+
}]
722+
},
723+
724+
collection: [{
725+
"type": "node--site_configuration",
726+
"id": "f8895943-7f51-451b-bb8f-a479853f1b4b",
727+
"langcode": "en",
728+
"title": "Site Configuration",
729+
"field_logo": {
730+
"resourceIdObjMeta": {
731+
"alt": "ACME Corp Logo",
732+
"height": 278,
733+
"title": "",
734+
"width": 206,
735+
},
736+
"type": "file--file",
737+
"id": "551ec1b9-b0c6-4649-bb7c-b6ebb09354ff",
738+
"langcode": "en",
739+
"uri": {
740+
"value": "public://2020-07/acmecorp-logo-colour-2x.png",
741+
"url": "http://acmecorp.oss-cn-hongkong.aliyuncs.com/s3fs-public/2020-07/acmecorp-logo-colour-2x.png"
742+
},
743+
"filemime": "image/png",
744+
"filesize": 54952,
745+
},
746+
"relationshipNames": [
747+
"field_logo"
748+
],
749+
}],
750+
751+
};

0 commit comments

Comments
 (0)