redux-object icon indicating copy to clipboard operation
redux-object copied to clipboard

'meta' properties on relationships

Open GregPeden opened this issue 6 years ago • 2 comments

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.

GregPeden avatar Nov 26 '17 02:11 GregPeden

Ok, I feel it largely depends on how you are using meta. I guess I need a little bit more context to help

yury-dymov avatar Nov 27 '17 17:11 yury-dymov

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"
              }
            }
          }
        }
      }
    ]
  };

GregPeden avatar Nov 27 '17 20:11 GregPeden