Skip to content

Commit

Permalink
feat(core): add relationData enhancer to serialize relation's value
Browse files Browse the repository at this point in the history
  • Loading branch information
paul-thebaud committed Jan 28, 2024
1 parent bb3859f commit 9721856
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 0 deletions.
37 changes: 37 additions & 0 deletions packages/core/src/actions/context/enhancers/crud/relationData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import context from '@foscia/core/actions/context/enhancers/context';
import serializeWith from '@foscia/core/actions/context/utils/serializeWith';
import makeEnhancersExtension from '@foscia/core/actions/extensions/makeEnhancersExtension';
import { Action, ActionParsedExtension, ConsumeSerializer } from '@foscia/core/actions/types';
import { ModelInstance, ModelRelationKey } from '@foscia/core/model/types';

/**
* Serialize the given instance's relation as the context's data.
*
* @param instance
* @param key
*
* @category Enhancers
*/
export default function relationData<C extends {}, I extends ModelInstance, Record, Related, Data>(
instance: I,
key: ModelRelationKey<I>,
) {
return async (
action: Action<C & ConsumeSerializer<Record, Related, Data>>,
) => action.use(context({
data: await serializeWith(action, async (serializer, ctx) => serializer.serialize(
await serializer.serializeRelation(instance, instance.$model.$schema[key], ctx),
ctx,
)),
}));
}

type EnhancerExtension = ActionParsedExtension<{
relationData<C extends {}, E extends {}, I extends ModelInstance, Record, Related, Data>(
this: Action<C & ConsumeSerializer<Record, Related, Data>, E>,
instance: I,
key: ModelRelationKey<I>,
): Action<C, E>;
}>;

relationData.extension = makeEnhancersExtension({ relationData }) as EnhancerExtension;
2 changes: 2 additions & 0 deletions packages/core/src/actions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import create from '@foscia/core/actions/context/enhancers/crud/create';
import destroy from '@foscia/core/actions/context/enhancers/crud/destroy';
import find from '@foscia/core/actions/context/enhancers/crud/find';
import instanceData from '@foscia/core/actions/context/enhancers/crud/instanceData';
import relationData from '@foscia/core/actions/context/enhancers/crud/relationData';
import save from '@foscia/core/actions/context/enhancers/crud/save';
import update from '@foscia/core/actions/context/enhancers/crud/update';
import forId from '@foscia/core/actions/context/enhancers/forId';
Expand Down Expand Up @@ -82,6 +83,7 @@ export {
forRelation,
include,
instanceData,
relationData,
onRunning,
onSuccess,
onError,
Expand Down
19 changes: 19 additions & 0 deletions website/docs/reference/actions-enhancers.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,25 @@ action().use(instanceData(post));

#### Arguments

- [`{I extends ModelInstance}`](/docs/reference/api/modules/foscia_core#modelinstance)
`instance` an instance of model to serialize

### `relationData`

<FunctionInfo version="0.6.0" requires="Serializer" />

Serialize the given instance's relation as the context's data.

#### Example

```typescript
import { relationData } from '@foscia/core';

action().use(relationData(post, 'tags'));
```

#### Arguments

- [`{I extends ModelInstance}`](/docs/reference/api/modules/foscia_core#modelinstance)
`instance` an instance of model to serialize

Expand Down

0 comments on commit 9721856

Please sign in to comment.