2023-08-14 22:09:29 +02:00

51 lines
1.3 KiB
TypeScript

import payload from "payload";
import { FieldBase } from "payload/dist/fields/config/types";
import { RelationshipField, Where } from "payload/types";
import { isNotEmpty } from "../../utils/asserts";
type BackPropagationField = FieldBase & {
where: (data: any) => Where;
relationTo: string;
hasMany?: boolean;
};
export const backPropagationField = ({
admin,
hooks: { beforeChange = [], afterRead = [], ...otherHooks } = {},
where,
hasMany = false,
...params
}: BackPropagationField): RelationshipField => ({
...params,
type: "relationship",
hasMany: hasMany,
admin: { ...admin, readOnly: true },
hooks: {
...otherHooks,
beforeChange: [
...beforeChange,
({ siblingData }) => {
delete siblingData[params.name];
},
],
afterRead: [
...afterRead,
async ({ data }) => {
if (isNotEmpty(data?.id)) {
const result = await payload.find({
collection: params.relationTo,
where: where(data),
limit: 100,
depth: 0,
});
if (hasMany) {
return result.docs.map((doc) => doc.id);
} else {
return result.docs[0].id;
}
}
return hasMany ? [] : undefined;
},
],
},
});