redux-object
redux-object copied to clipboard
'meta' properties on relationships
With reference to this Issue / proposed PR on json-api-normalizer: https://github.com/yury-dymov/json-api-normalizer/issues/25
I am looking to affect something similar for a PR to this package as well, however in this space it's left a bit more open to discussion with regards to how to address meta properties on relationships, or if it should be done at all. I just want to start a conversation, in the meantime I am going to experiment a bit and see if I can come up with something which works well.
Ok, I feel it largely depends on how you are using meta
. I guess I need a little bit more context to help
For context, here is the unit test I wrote for json-ap-normalizer while implementing relationship metadata handling:
describe('relationship meta', () => {
const json1 = {
"data": [{
"type": "post",
"relationships": {
"questions": {
"data": [
{
"type": "question",
"id": "295"
}
],
"meta": {
"membership": [
{
"post_id": "2620",
"question_id": "295",
"created_at": "2017-11-22",
"updated_at": "2017-11-26"
}
],
"review-status": {
"content_flags": "4"
}
}
}
},
"id": "2620",
"attributes": {
"text": "hello",
}
}]
};
const output1 = {
post: {
"2620": {
id: "2620",
attributes: {
"text": "hello",
},
relationships: {
questions: {
data: [
{
id: "295",
type: "question"
}
],
meta: {
membership: [
{
postId: "2620",
questionId: "295",
createdAt: "2017-11-22",
updatedAt: "2017-11-26"
}
],
reviewStatus: {
contentFlags: "4"
}
}
}
}
}
}
};
it('meta in relationship', () => {
const result = normalize(json1);
expect(isEqual(result, output1)).to.be.true;
});
});
So let figure "output1" is being fed to redux-object. Below is the output from the current package, which won't include the relationship metadata.
const reduxOutput = {
posts: [
{
id: "2620",
text: "hello",
questions: [
{
id: "295",
type: "question"
}
]
}
]
};
My struggle is figuring out where to put the metadata on a relationship. In particular this is made difficult by the lazy loading pattern since I don't want to read the relationship content until it is accessed, then I would like to avoid amending it to the parent resource in its own "meta" property.
So for instance I considered something like this, but it doesn't fit well with lazy loading:
const output2 = {
posts: [
{
id: "2620",
text: "hello",
questions: [
{
id: "295",
type: "question"
}
],
meta: {
relationships: {
questions: {
membership: [
{
postId: "2620",
questionId: "295",
createdAt: "2017-11-22",
updatedAt: "2017-11-26"
}
],
reviewStatus: {
contentFlags: "4"
}
}
}
}
}
]
};