feat(types): add util to transform get response to an update request (#6289)

what:

- add util to transform get response to an update request 

RESOLVES CORE-1687


Given an update data object, we can infer the `fields` and `selects` of a data object using a util we already have - `getSelectsAndRelationsFromObjectArray`. Using the `fields` and `selects`, we can call either the module `retrieve` or `list` method to get a snapshot of the data down to its exact attributes. We can pass this data into the revert step.

In the revert step, we just need to convert the snapshot received from `retrieve` or `list` to a shape that the `update` methods will accept. The util that is introduced in this PR aims to do exactly that, so that the revert step looks as simple as:

```
const { snapshotData, selects, relations } = revertInput

await promotionModule.updateCampaigns(
  convertItemResponseToUpdateRequest(snapshotData, selects, relations)
)
```

entity before update:
```
Campaign: {
  id: "campaign-test-1",
  name: "test campaign",
  budget: {
    total: 2000
  },
  promotions: [{ id: "promotion-1" }],
  rules: [
    { id: "rule-1", operator: "gt", value: "10" }
  ]
}
```

This is how the util will transform the data for different types of attributes in the object:

simple attributes:
```
invoke:
{
  id: "campaign-test-1",
  name: "change name",
}

compensate:
{
  id: "test-1",
  name: "test campaign"
}
```

one to one relationship:
```
invoke:
{
  id: "campaign-test-1",
  budget: { total: 4000 }
}

compensate:
{
  id: "campaign-test-1",
  budget: { total: 2000 }
}
```

one to many / many to many relationship:
```
invoke:
{
  id: "campaign-test-1",
  promotions: [{ id: "promotion-2" }]
  rules: [
    { id: "rule-1", operator: "gt", value: "20" },
    { operator: "gt", value: "20" }
  ]
}

compensate:
{
  id: "campaign-test-1",
  promotions: [{ id: "promotion-1" }]
  rules: [{ id: "rule-1", operator: "gt", value: "20" }]
}
```

all together:
```
invoke:
{
  id: "campaign-test-1",
  name: "change name",
  promotions: [{ id: "promotion-2" }],
  budget: { total: 4000 },
  rules: [
    { id: "rule-1", operator: "gt", value: "20" },
    { operator: "gt", value: "20" }
  ]
}

compensate:
{
  id: "test-1",
  name: "test campaign",
  promotions: [{ id: "promotion-1" }],
  budget: { total: 2000 },
  rules: [{ id: "rule-1", operator: "gt", value: "20" }],
}
```
This commit is contained in:
Riqwan Thamir
2024-02-28 16:55:50 +05:30
committed by GitHub
parent c5d35ec7f2
commit a6d7070dd6
6 changed files with 205 additions and 14 deletions

View File

@@ -0,0 +1,59 @@
import { convertItemResponseToUpdateRequest } from "../convert-item-response-to-update-request"
describe("convertItemResponseToUpdateRequest", function () {
it("should return true or false for different types of data", function () {
const expectations = [
{
item: {
id: "test-id",
test_attr: "test-name",
relation_object_with_params: {
id: "test-relation-object-id",
test_attr: "test-object-name",
},
relation_object_without_params: {
id: "test-relation-object-without-params-id",
},
relation_array: [
{
id: "test-relation-array-id",
test_attr: "test-array-name",
},
],
},
selects: [
"id",
"test_attr",
"relation_object_with_params.id",
"relation_object_with_params.test_attr",
"relation_object_without_params.id",
"relation_array.id",
"relation_array.test_attr",
],
relations: [
"relation_object_with_params",
"relation_object_without_params",
"relation_array",
],
output: {
id: "test-id",
test_attr: "test-name",
relation_object_with_params: { test_attr: "test-object-name" },
relation_array: [{ id: "test-relation-array-id" }],
relation_object_without_params_id:
"test-relation-object-without-params-id",
},
},
]
expectations.forEach((expectation) => {
const response = convertItemResponseToUpdateRequest(
expectation.item,
expectation.selects,
expectation.relations
)
expect(response).toEqual(expectation.output)
})
})
})