From b9446ead07509703ffb8ab2b51b8201e0e215e6d Mon Sep 17 00:00:00 2001 From: Tim Connor Date: Tue, 7 Apr 2020 15:20:21 +1200 Subject: [PATCH 1/2] expose model level metadata --- src/model.ts | 4 ++++ src/util/write-payload.ts | 5 +++++ test/unit/model.test.ts | 7 +++++-- test/unit/write-payload.test.ts | 28 +++++++++++++++++++++++++++- 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/model.ts b/src/model.ts index 59d92bf..893a84a 100644 --- a/src/model.ts +++ b/src/model.ts @@ -654,6 +654,10 @@ export class SpraypaintBase { this.__meta__ = metaObj } + get meta(): object { + return this.__meta__ || {} + } + relationshipResourceIdentifiers(relationNames: string[]) { return relationshipIdentifiersFor(this, relationNames) } diff --git a/src/util/write-payload.ts b/src/util/write-payload.ts index 54e3df0..14fe6b5 100644 --- a/src/util/write-payload.ts +++ b/src/util/write-payload.ts @@ -169,6 +169,11 @@ export class WritePayload { json.included = this.included } + const _meta: object = this.model.meta + if (Object.keys(_meta).length > 0) { + data.meta = _meta + } + return json } diff --git a/test/unit/model.test.ts b/test/unit/model.test.ts index e8791dd..b129a0e 100644 --- a/test/unit/model.test.ts +++ b/test/unit/model.test.ts @@ -763,7 +763,7 @@ describe("Model", () => { it("assigns metadata correctly", () => { const instance = ApplicationRecord.fromJsonapi(doc.data, doc) - expect(instance.__meta__).to.eql({ + expect(instance.meta).to.eql({ big: true }) }) @@ -1567,6 +1567,9 @@ describe("Model", () => { links: { self: { href: "/api/person/1", meta: { count: 10 } }, web_view: "/person/1" + }, + meta: { + editable: true } } } @@ -1577,7 +1580,7 @@ describe("Model", () => { meta: { count: 10 } }) expect(person.links.webView).to.eq("/person/1") - expect(person.links.comments).to + expect(person.meta).to.deep.equal({ editable: true }) } it("from instance", () => { diff --git a/test/unit/write-payload.test.ts b/test/unit/write-payload.test.ts index 8805a31..6d385af 100644 --- a/test/unit/write-payload.test.ts +++ b/test/unit/write-payload.test.ts @@ -1,6 +1,12 @@ import { sinon, expect } from "../test-helper" import { WritePayload } from "../../src/util/write-payload" -import { Person, PersonWithDasherizedKeys, Author, Genre, Book } from "../fixtures" +import { + Person, + PersonWithDasherizedKeys, + Author, + Genre, + Book +} from "../fixtures" describe("WritePayload", () => { it("Does not serialize number attributes as empty string", () => { @@ -46,6 +52,26 @@ describe("WritePayload", () => { }) }) + describe("metadata", () => { + it("sends metadata", () => { + let person = new Person({ first_name: "Joe", age: 23 }) + person.setMeta({ mock: "metadata" }) + let payload = new WritePayload(person) + expect(payload.asJSON()).to.deep.equal({ + data: { + type: "people", + attributes: { + age: 23, + first_name: "Joe" + }, + meta: { + mock: "metadata" + } + } + }) + }) + }) + describe("sends persisted singular relationships defined via", () => { const genre = new Genre({ name: "Horror", id: "1" }) genre.isPersisted = true From 84f69e33ff538134a3eaa452b486a00f475e150c Mon Sep 17 00:00:00 2001 From: Tim Connor Date: Wed, 22 Jul 2020 09:14:38 +1200 Subject: [PATCH 2/2] only send resource metadata to the server if modified by the user --- src/model.ts | 10 +++++++++- src/util/deserialize.ts | 2 +- src/util/write-payload.ts | 2 +- test/unit/write-payload.test.ts | 17 ++++++++++++++++- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/model.ts b/src/model.ts index 893a84a..de55d6f 100644 --- a/src/model.ts +++ b/src/model.ts @@ -422,6 +422,7 @@ export class SpraypaintBase { @nonenumerable private _links!: ModelRecord @nonenumerable private _originalLinks!: ModelRecord @nonenumerable private __meta__: any + @nonenumerable private _metaDirty: boolean = false @nonenumerable private _errors: ValidationErrors = {} constructor(attrs?: Record) { @@ -650,14 +651,21 @@ export class SpraypaintBase { } } - setMeta(metaObj: object | undefined) { + setMeta(metaObj: object | undefined, markDirty = true) { this.__meta__ = metaObj + if (markDirty) { + this._metaDirty = true + } } get meta(): object { return this.__meta__ || {} } + get isMetaDirty(): boolean { + return this._metaDirty + } + relationshipResourceIdentifiers(relationNames: string[]) { return relationshipIdentifiersFor(this, relationNames) } diff --git a/src/util/deserialize.ts b/src/util/deserialize.ts index c7667b8..1e13698 100644 --- a/src/util/deserialize.ts +++ b/src/util/deserialize.ts @@ -134,7 +134,7 @@ class Deserializer { instance.assignLinks(datum.links) // assign meta - instance.setMeta(datum.meta) + instance.setMeta(datum.meta, false) // so we don't double-process the same thing // must push before relationships diff --git a/src/util/write-payload.ts b/src/util/write-payload.ts index 14fe6b5..11a4a39 100644 --- a/src/util/write-payload.ts +++ b/src/util/write-payload.ts @@ -170,7 +170,7 @@ export class WritePayload { } const _meta: object = this.model.meta - if (Object.keys(_meta).length > 0) { + if (this.model.isMetaDirty && Object.keys(_meta).length > 0) { data.meta = _meta } diff --git a/test/unit/write-payload.test.ts b/test/unit/write-payload.test.ts index 6d385af..7b47fa5 100644 --- a/test/unit/write-payload.test.ts +++ b/test/unit/write-payload.test.ts @@ -53,7 +53,7 @@ describe("WritePayload", () => { }) describe("metadata", () => { - it("sends metadata", () => { + it("sends metadata if modified by the user", () => { let person = new Person({ first_name: "Joe", age: 23 }) person.setMeta({ mock: "metadata" }) let payload = new WritePayload(person) @@ -70,6 +70,21 @@ describe("WritePayload", () => { } }) }) + + it("does not send unmodified metadata", () => { + let person = new Person({ first_name: "Joe", age: 23 }) + person.setMeta({ mock: "metadata" }, false) + let payload = new WritePayload(person) + expect(payload.asJSON()).to.deep.equal({ + data: { + type: "people", + attributes: { + age: 23, + first_name: "Joe" + } + } + }) + }) }) describe("sends persisted singular relationships defined via", () => {