Skip to content

Commit eda1f6a

Browse files
authored
Merge pull request #62 from tlconnor/master
Expose resource level metadata
2 parents 6f15dbd + 84f69e3 commit eda1f6a

File tree

5 files changed

+66
-5
lines changed

5 files changed

+66
-5
lines changed

src/model.ts

+13-1
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,7 @@ export class SpraypaintBase {
422422
@nonenumerable private _links!: ModelRecord<this>
423423
@nonenumerable private _originalLinks!: ModelRecord<this>
424424
@nonenumerable private __meta__: any
425+
@nonenumerable private _metaDirty: boolean = false
425426
@nonenumerable private _errors: ValidationErrors<this> = {}
426427

427428
constructor(attrs?: Record<string, any>) {
@@ -651,8 +652,19 @@ export class SpraypaintBase {
651652
}
652653
}
653654

654-
setMeta(metaObj: object | undefined) {
655+
setMeta(metaObj: object | undefined, markDirty = true) {
655656
this.__meta__ = metaObj
657+
if (markDirty) {
658+
this._metaDirty = true
659+
}
660+
}
661+
662+
get meta(): object {
663+
return this.__meta__ || {}
664+
}
665+
666+
get isMetaDirty(): boolean {
667+
return this._metaDirty
656668
}
657669

658670
relationshipResourceIdentifiers(relationNames: string[]) {

src/util/deserialize.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ class Deserializer {
134134
instance.assignLinks(datum.links)
135135

136136
// assign meta
137-
instance.setMeta(datum.meta)
137+
instance.setMeta(datum.meta, false)
138138

139139
// so we don't double-process the same thing
140140
// must push before relationships

src/util/write-payload.ts

+5
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,11 @@ export class WritePayload<T extends SpraypaintBase> {
169169
json.included = this.included
170170
}
171171

172+
const _meta: object = this.model.meta
173+
if (this.model.isMetaDirty && Object.keys(_meta).length > 0) {
174+
data.meta = _meta
175+
}
176+
172177
return json
173178
}
174179

test/unit/model.test.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ describe("Model", () => {
763763

764764
it("assigns metadata correctly", () => {
765765
const instance = ApplicationRecord.fromJsonapi(doc.data, doc)
766-
expect(instance.__meta__).to.eql({
766+
expect(instance.meta).to.eql({
767767
big: true
768768
})
769769
})
@@ -1577,6 +1577,9 @@ describe("Model", () => {
15771577
links: {
15781578
self: { href: "/api/person/1", meta: { count: 10 } },
15791579
web_view: "/person/1"
1580+
},
1581+
meta: {
1582+
editable: true
15801583
}
15811584
}
15821585
}
@@ -1587,7 +1590,7 @@ describe("Model", () => {
15871590
meta: { count: 10 }
15881591
})
15891592
expect(person.links.webView).to.eq("/person/1")
1590-
expect(person.links.comments).to
1593+
expect(person.meta).to.deep.equal({ editable: true })
15911594
}
15921595

15931596
it("from instance", () => {

test/unit/write-payload.test.ts

+42-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
import { sinon, expect } from "../test-helper"
22
import { WritePayload } from "../../src/util/write-payload"
3-
import { Person, PersonWithDasherizedKeys, Author, Genre, Book } from "../fixtures"
3+
import {
4+
Person,
5+
PersonWithDasherizedKeys,
6+
Author,
7+
Genre,
8+
Book
9+
} from "../fixtures"
410

511
describe("WritePayload", () => {
612
it("Does not serialize number attributes as empty string", () => {
@@ -46,6 +52,41 @@ describe("WritePayload", () => {
4652
})
4753
})
4854

55+
describe("metadata", () => {
56+
it("sends metadata if modified by the user", () => {
57+
let person = new Person({ first_name: "Joe", age: 23 })
58+
person.setMeta({ mock: "metadata" })
59+
let payload = new WritePayload(person)
60+
expect(payload.asJSON()).to.deep.equal({
61+
data: {
62+
type: "people",
63+
attributes: {
64+
age: 23,
65+
first_name: "Joe"
66+
},
67+
meta: {
68+
mock: "metadata"
69+
}
70+
}
71+
})
72+
})
73+
74+
it("does not send unmodified metadata", () => {
75+
let person = new Person({ first_name: "Joe", age: 23 })
76+
person.setMeta({ mock: "metadata" }, false)
77+
let payload = new WritePayload(person)
78+
expect(payload.asJSON()).to.deep.equal({
79+
data: {
80+
type: "people",
81+
attributes: {
82+
age: 23,
83+
first_name: "Joe"
84+
}
85+
}
86+
})
87+
})
88+
})
89+
4990
describe("sends persisted singular relationships defined via", () => {
5091
const genre = new Genre({ name: "Horror", id: "1" })
5192
genre.isPersisted = true

0 commit comments

Comments
 (0)