@smartive/graphql-magic 19.1.3-next.2 → 19.2.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -3
- package/dist/cjs/index.cjs +108 -68
- package/dist/esm/models/mutation-hook.d.ts +2 -1
- package/dist/esm/resolvers/mutations.d.ts +8 -3
- package/dist/esm/resolvers/mutations.js +100 -70
- package/dist/esm/resolvers/mutations.js.map +1 -1
- package/package.json +1 -1
- package/src/models/mutation-hook.ts +6 -1
- package/src/resolvers/mutations.ts +128 -75
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
# [19.2.0-next.1](https://github.com/smartive/graphql-magic/compare/v19.1.3-next.2...v19.2.0-next.1) (2025-06-18)
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
###
|
|
4
|
+
### Features
|
|
5
5
|
|
|
6
|
-
*
|
|
6
|
+
* mutation helpers ([3183ea6](https://github.com/smartive/graphql-magic/commit/3183ea6365f3bbf0e3d2dafe92f958e1ad8483d3))
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -67,7 +67,10 @@ __export(index_exports, {
|
|
|
67
67
|
args: () => args,
|
|
68
68
|
as: () => as,
|
|
69
69
|
checkCanWrite: () => checkCanWrite,
|
|
70
|
+
createEntity: () => createEntity,
|
|
70
71
|
createRevision: () => createRevision,
|
|
72
|
+
deleteEntities: () => deleteEntities,
|
|
73
|
+
deleteEntity: () => deleteEntity,
|
|
71
74
|
directive: () => directive,
|
|
72
75
|
directives: () => directives,
|
|
73
76
|
displayField: () => displayField,
|
|
@@ -182,6 +185,8 @@ __export(index_exports, {
|
|
|
182
185
|
summonByKey: () => summonByKey,
|
|
183
186
|
summonByName: () => summonByName,
|
|
184
187
|
typeToField: () => typeToField,
|
|
188
|
+
updateEntities: () => updateEntities,
|
|
189
|
+
updateEntity: () => updateEntity,
|
|
185
190
|
value: () => value
|
|
186
191
|
});
|
|
187
192
|
module.exports = __toCommonJS(index_exports);
|
|
@@ -2665,22 +2670,37 @@ var mutationResolver = async (_parent, args2, partialCtx, info) => {
|
|
|
2665
2670
|
const ctx = { ...partialCtx, knex, info, aliases: new AliasGenerator() };
|
|
2666
2671
|
const model = ctx.models.getModel(modelName, "entity");
|
|
2667
2672
|
switch (mutation) {
|
|
2668
|
-
case "create":
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
case "
|
|
2673
|
-
|
|
2673
|
+
case "create": {
|
|
2674
|
+
const id = await createEntity(model, args2.data, ctx);
|
|
2675
|
+
return await resolve(ctx, id);
|
|
2676
|
+
}
|
|
2677
|
+
case "update": {
|
|
2678
|
+
const id = args2.where.id;
|
|
2679
|
+
await updateEntity(model, id, args2.data, ctx);
|
|
2680
|
+
return await resolve(ctx, id);
|
|
2681
|
+
}
|
|
2682
|
+
case "delete": {
|
|
2683
|
+
const id = args2.where.id;
|
|
2684
|
+
await deleteEntity(model, id, args2.dryRun, model.rootModel.name, id, ctx);
|
|
2685
|
+
return await resolve(ctx, id);
|
|
2686
|
+
}
|
|
2674
2687
|
case "restore":
|
|
2675
|
-
return await
|
|
2688
|
+
return await restoreEntity(model, args2.where.id, ctx);
|
|
2676
2689
|
}
|
|
2677
2690
|
});
|
|
2678
2691
|
};
|
|
2679
|
-
var
|
|
2692
|
+
var createEntity = async (model, input2, ctx) => {
|
|
2680
2693
|
const normalizedInput = { ...input2 };
|
|
2681
|
-
normalizedInput.id
|
|
2682
|
-
|
|
2683
|
-
|
|
2694
|
+
if (!normalizedInput.id) {
|
|
2695
|
+
normalizedInput.id = (0, import_uuid.v4)();
|
|
2696
|
+
}
|
|
2697
|
+
const id = normalizedInput.id;
|
|
2698
|
+
if (!normalizedInput.createdAt) {
|
|
2699
|
+
normalizedInput.createdAt = ctx.now;
|
|
2700
|
+
}
|
|
2701
|
+
if (!normalizedInput.createdById) {
|
|
2702
|
+
normalizedInput.createdById = ctx.user?.id;
|
|
2703
|
+
}
|
|
2684
2704
|
if (model.parent) {
|
|
2685
2705
|
normalizedInput.type = model.name;
|
|
2686
2706
|
}
|
|
@@ -2689,35 +2709,39 @@ var create = async (model, { data: input2 }, ctx) => {
|
|
|
2689
2709
|
await ctx.handleUploads?.(normalizedInput);
|
|
2690
2710
|
const data = { prev: {}, input: input2, normalizedInput, next: normalizedInput };
|
|
2691
2711
|
await ctx.mutationHook?.({ model, action: "create", trigger: "mutation", when: "before", data, ctx });
|
|
2712
|
+
await createEntity(model, normalizedInput, ctx);
|
|
2692
2713
|
if (model.parent) {
|
|
2693
2714
|
const rootInput = {};
|
|
2694
|
-
const childInput = { id
|
|
2715
|
+
const childInput = { id };
|
|
2695
2716
|
for (const field of model.fields) {
|
|
2696
2717
|
const columnName = field.kind === "relation" ? `${field.name}Id` : field.name;
|
|
2697
|
-
if (columnName in
|
|
2718
|
+
if (columnName in data) {
|
|
2698
2719
|
if (field.inherited) {
|
|
2699
|
-
rootInput[columnName] =
|
|
2720
|
+
rootInput[columnName] = data[columnName];
|
|
2700
2721
|
} else {
|
|
2701
|
-
childInput[columnName] =
|
|
2722
|
+
childInput[columnName] = data[columnName];
|
|
2702
2723
|
}
|
|
2703
2724
|
}
|
|
2704
2725
|
}
|
|
2705
2726
|
await ctx.knex(model.parent).insert(rootInput);
|
|
2706
2727
|
await ctx.knex(model.name).insert(childInput);
|
|
2707
2728
|
} else {
|
|
2708
|
-
await ctx.knex(model.name).insert(
|
|
2729
|
+
await ctx.knex(model.name).insert(data);
|
|
2709
2730
|
}
|
|
2710
|
-
await createRevision(model,
|
|
2731
|
+
await createRevision(model, data, ctx);
|
|
2711
2732
|
await ctx.mutationHook?.({ model, action: "create", trigger: "mutation", when: "after", data, ctx });
|
|
2712
|
-
return
|
|
2733
|
+
return normalizedInput.id;
|
|
2713
2734
|
};
|
|
2714
|
-
var
|
|
2715
|
-
|
|
2716
|
-
|
|
2735
|
+
var updateEntities = async (model, where, updateFields, ctx) => {
|
|
2736
|
+
const entities = await ctx.knex(model.name).where(where).select("id");
|
|
2737
|
+
for (const entity of entities) {
|
|
2738
|
+
await updateEntity(model, entity.id, updateFields, ctx);
|
|
2717
2739
|
}
|
|
2740
|
+
};
|
|
2741
|
+
var updateEntity = async (model, id, input2, ctx) => {
|
|
2718
2742
|
const normalizedInput = { ...input2 };
|
|
2719
2743
|
sanitize(ctx, model, normalizedInput);
|
|
2720
|
-
const prev = await getEntityToMutate(ctx, model,
|
|
2744
|
+
const prev = await getEntityToMutate(ctx, model, { id }, "UPDATE");
|
|
2721
2745
|
for (const key of Object.keys(normalizedInput)) {
|
|
2722
2746
|
if (normalizedInput[key] === prev[key]) {
|
|
2723
2747
|
delete normalizedInput[key];
|
|
@@ -2729,39 +2753,19 @@ var update = async (model, { where, data: input2 }, ctx) => {
|
|
|
2729
2753
|
const next = { ...prev, ...normalizedInput };
|
|
2730
2754
|
const data = { prev, input: input2, normalizedInput, next };
|
|
2731
2755
|
await ctx.mutationHook?.({ model, action: "update", trigger: "mutation", when: "before", data, ctx });
|
|
2732
|
-
|
|
2733
|
-
const rootInput = {};
|
|
2734
|
-
const childInput = {};
|
|
2735
|
-
for (const field of model.fields) {
|
|
2736
|
-
const columnName = field.kind === "relation" ? `${field.name}Id` : field.name;
|
|
2737
|
-
if (columnName in normalizedInput) {
|
|
2738
|
-
if (field.inherited) {
|
|
2739
|
-
rootInput[columnName] = normalizedInput[columnName];
|
|
2740
|
-
} else {
|
|
2741
|
-
childInput[columnName] = normalizedInput[columnName];
|
|
2742
|
-
}
|
|
2743
|
-
}
|
|
2744
|
-
}
|
|
2745
|
-
if (Object.keys(rootInput).length) {
|
|
2746
|
-
await ctx.knex(model.parent).where({ id: prev.id }).update(rootInput);
|
|
2747
|
-
}
|
|
2748
|
-
if (Object.keys(childInput).length) {
|
|
2749
|
-
await ctx.knex(model.name).where({ id: prev.id }).update(childInput);
|
|
2750
|
-
}
|
|
2751
|
-
} else {
|
|
2752
|
-
await ctx.knex(model.name).where({ id: prev.id }).update(normalizedInput);
|
|
2753
|
-
}
|
|
2754
|
-
await createRevision(model, next, ctx);
|
|
2756
|
+
await doUpdate(model, normalizedInput, next, ctx);
|
|
2755
2757
|
await ctx.mutationHook?.({ model, action: "update", trigger: "mutation", when: "after", data, ctx });
|
|
2756
2758
|
}
|
|
2757
|
-
return await resolve(ctx);
|
|
2758
2759
|
};
|
|
2759
|
-
var
|
|
2760
|
-
|
|
2761
|
-
|
|
2760
|
+
var deleteEntities = async (model, where, deleteRootType, deleteRootId, ctx) => {
|
|
2761
|
+
const entities = await ctx.knex(model.name).where(where).select("id");
|
|
2762
|
+
for (const entity of entities) {
|
|
2763
|
+
await deleteEntity(model, entity.id, false, deleteRootType, deleteRootId, ctx);
|
|
2762
2764
|
}
|
|
2765
|
+
};
|
|
2766
|
+
var deleteEntity = async (model, id, dryRun, deleteRootType, deleteRootId, ctx) => {
|
|
2763
2767
|
const rootModel = model.rootModel;
|
|
2764
|
-
const entity = await getEntityToMutate(ctx, rootModel,
|
|
2768
|
+
const entity = await getEntityToMutate(ctx, rootModel, { id }, "DELETE");
|
|
2765
2769
|
if (entity.deleted) {
|
|
2766
2770
|
throw new ForbiddenError(`${getTechnicalDisplay(model, entity)} is already deleted.`);
|
|
2767
2771
|
}
|
|
@@ -2786,8 +2790,8 @@ var del = async (model, { where, dryRun }, ctx) => {
|
|
|
2786
2790
|
deleted: true,
|
|
2787
2791
|
deletedAt: ctx.now,
|
|
2788
2792
|
deletedById: ctx.user?.id,
|
|
2789
|
-
deleteRootType
|
|
2790
|
-
deleteRootId
|
|
2793
|
+
deleteRootType,
|
|
2794
|
+
deleteRootId
|
|
2791
2795
|
};
|
|
2792
2796
|
const next = { ...currentEntity, ...normalizedInput };
|
|
2793
2797
|
const data = { prev: currentEntity, input: {}, normalizedInput, next };
|
|
@@ -2804,8 +2808,7 @@ var del = async (model, { where, dryRun }, ctx) => {
|
|
|
2804
2808
|
});
|
|
2805
2809
|
}
|
|
2806
2810
|
mutations.push(async () => {
|
|
2807
|
-
await
|
|
2808
|
-
await createRevision(currentModel, next, ctx);
|
|
2811
|
+
await doUpdate(currentModel, normalizedInput, next, ctx);
|
|
2809
2812
|
});
|
|
2810
2813
|
if (mutationHook) {
|
|
2811
2814
|
afterHooks.push(async () => {
|
|
@@ -2858,8 +2861,7 @@ var del = async (model, { where, dryRun }, ctx) => {
|
|
|
2858
2861
|
});
|
|
2859
2862
|
}
|
|
2860
2863
|
mutations.push(async () => {
|
|
2861
|
-
await
|
|
2862
|
-
await createRevision(descendantModel, next, ctx);
|
|
2864
|
+
await doUpdate(descendantModel, normalizedInput, next, ctx);
|
|
2863
2865
|
});
|
|
2864
2866
|
if (mutationHook) {
|
|
2865
2867
|
afterHooks.push(async () => {
|
|
@@ -2936,12 +2938,9 @@ var del = async (model, { where, dryRun }, ctx) => {
|
|
|
2936
2938
|
}
|
|
2937
2939
|
return entity.id;
|
|
2938
2940
|
};
|
|
2939
|
-
var
|
|
2940
|
-
if (Object.keys(where).length === 0) {
|
|
2941
|
-
throw new Error(`No ${model.name} specified.`);
|
|
2942
|
-
}
|
|
2941
|
+
var restoreEntity = async (model, id, ctx) => {
|
|
2943
2942
|
const rootModel = model.rootModel;
|
|
2944
|
-
const entity = await getEntityToMutate(ctx, rootModel,
|
|
2943
|
+
const entity = await getEntityToMutate(ctx, rootModel, { id }, "RESTORE");
|
|
2945
2944
|
if (!entity.deleted) {
|
|
2946
2945
|
throw new ForbiddenError(`${getTechnicalDisplay(model, entity)} is not deleted.`);
|
|
2947
2946
|
}
|
|
@@ -2958,7 +2957,7 @@ var restore = async (model, { where }, ctx) => {
|
|
|
2958
2957
|
const afterHooks = [];
|
|
2959
2958
|
const restoreCascade = async (currentModel, currentEntity) => {
|
|
2960
2959
|
if (entity.deleteRootId) {
|
|
2961
|
-
if (!(currentEntity.deleteRootType ===
|
|
2960
|
+
if (!(currentEntity.deleteRootType === model.name && currentEntity.deleteRootId === entity.id)) {
|
|
2962
2961
|
return;
|
|
2963
2962
|
}
|
|
2964
2963
|
} else if (!anyDateToLuxon(currentEntity.deletedAt, ctx.timeZone).equals(anyDateToLuxon(entity.deletedAt, ctx.timeZone))) {
|
|
@@ -2969,7 +2968,7 @@ var restore = async (model, { where }, ctx) => {
|
|
|
2969
2968
|
}
|
|
2970
2969
|
toRestore[currentModel.name].add(currentEntity.id);
|
|
2971
2970
|
for (const relation of currentModel.relations) {
|
|
2972
|
-
const parentId =
|
|
2971
|
+
const parentId = currentEntity[relation.field.foreignKey];
|
|
2973
2972
|
if (!parentId) {
|
|
2974
2973
|
continue;
|
|
2975
2974
|
}
|
|
@@ -2997,8 +2996,7 @@ var restore = async (model, { where }, ctx) => {
|
|
|
2997
2996
|
});
|
|
2998
2997
|
}
|
|
2999
2998
|
mutations.push(async () => {
|
|
3000
|
-
await
|
|
3001
|
-
await createRevision(currentModel, { ...currentEntity, deleted: false }, ctx);
|
|
2999
|
+
await doUpdate(currentModel, normalizedInput, data.next, ctx);
|
|
3002
3000
|
});
|
|
3003
3001
|
if (ctx.mutationHook) {
|
|
3004
3002
|
afterHooks.push(async () => {
|
|
@@ -3030,7 +3028,7 @@ var restore = async (model, { where }, ctx) => {
|
|
|
3030
3028
|
for (const callback of [...beforeHooks, ...mutations, ...afterHooks]) {
|
|
3031
3029
|
await callback();
|
|
3032
3030
|
}
|
|
3033
|
-
return
|
|
3031
|
+
return id;
|
|
3034
3032
|
};
|
|
3035
3033
|
var createRevision = async (model, data, ctx) => {
|
|
3036
3034
|
if (model.updatable) {
|
|
@@ -3069,8 +3067,12 @@ var createRevision = async (model, data, ctx) => {
|
|
|
3069
3067
|
};
|
|
3070
3068
|
var sanitize = (ctx, model, data) => {
|
|
3071
3069
|
if (model.updatable) {
|
|
3072
|
-
data.updatedAt
|
|
3073
|
-
|
|
3070
|
+
if (!data.updatedAt) {
|
|
3071
|
+
data.updatedAt = ctx.now;
|
|
3072
|
+
}
|
|
3073
|
+
if (!data.updatedById) {
|
|
3074
|
+
data.updatedById = ctx.user?.id;
|
|
3075
|
+
}
|
|
3074
3076
|
}
|
|
3075
3077
|
for (const key of Object.keys(data)) {
|
|
3076
3078
|
const field = model.fields.find(({ name: name2 }) => name2 === key);
|
|
@@ -3093,6 +3095,39 @@ var sanitize = (ctx, model, data) => {
|
|
|
3093
3095
|
};
|
|
3094
3096
|
var isEndOfDay = (field) => isPrimitive(field) && field.type === "DateTime" && field?.endOfDay === true && field?.dateTimeType === "date";
|
|
3095
3097
|
var isEndOfMonth = (field) => isPrimitive(field) && field.type === "DateTime" && field?.endOfMonth === true && field?.dateTimeType === "year_and_month";
|
|
3098
|
+
var doUpdate = async (model, updateFields, allFields, ctx) => {
|
|
3099
|
+
if (model.updatable) {
|
|
3100
|
+
if (!updateFields.updatedAt) {
|
|
3101
|
+
updateFields.updatedAt = ctx.now;
|
|
3102
|
+
}
|
|
3103
|
+
if (!updateFields.updatedById) {
|
|
3104
|
+
updateFields.updatedById = ctx.user?.id;
|
|
3105
|
+
}
|
|
3106
|
+
}
|
|
3107
|
+
if (model.parent) {
|
|
3108
|
+
const rootInput = {};
|
|
3109
|
+
const childInput = {};
|
|
3110
|
+
for (const field of model.fields) {
|
|
3111
|
+
const columnName = field.kind === "relation" ? `${field.name}Id` : field.name;
|
|
3112
|
+
if (columnName in updateFields) {
|
|
3113
|
+
if (field.inherited) {
|
|
3114
|
+
rootInput[columnName] = updateFields[columnName];
|
|
3115
|
+
} else {
|
|
3116
|
+
childInput[columnName] = updateFields[columnName];
|
|
3117
|
+
}
|
|
3118
|
+
}
|
|
3119
|
+
}
|
|
3120
|
+
if (Object.keys(rootInput).length) {
|
|
3121
|
+
await ctx.knex(model.parent).where({ id: allFields.id }).update(rootInput);
|
|
3122
|
+
}
|
|
3123
|
+
if (Object.keys(childInput).length) {
|
|
3124
|
+
await ctx.knex(model.name).where({ id: allFields.id }).update(childInput);
|
|
3125
|
+
}
|
|
3126
|
+
} else {
|
|
3127
|
+
await ctx.knex(model.name).where({ id: allFields.id }).update(updateFields);
|
|
3128
|
+
}
|
|
3129
|
+
await createRevision(model, allFields, ctx);
|
|
3130
|
+
};
|
|
3096
3131
|
|
|
3097
3132
|
// src/resolvers/resolvers.ts
|
|
3098
3133
|
var getResolvers = (models) => {
|
|
@@ -3587,7 +3622,10 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql6.buildAST
|
|
|
3587
3622
|
args,
|
|
3588
3623
|
as,
|
|
3589
3624
|
checkCanWrite,
|
|
3625
|
+
createEntity,
|
|
3590
3626
|
createRevision,
|
|
3627
|
+
deleteEntities,
|
|
3628
|
+
deleteEntity,
|
|
3591
3629
|
directive,
|
|
3592
3630
|
directives,
|
|
3593
3631
|
displayField,
|
|
@@ -3702,5 +3740,7 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql6.buildAST
|
|
|
3702
3740
|
summonByKey,
|
|
3703
3741
|
summonByName,
|
|
3704
3742
|
typeToField,
|
|
3743
|
+
updateEntities,
|
|
3744
|
+
updateEntity,
|
|
3705
3745
|
value
|
|
3706
3746
|
});
|
|
@@ -2,6 +2,7 @@ import { AnyDateType, Context } from '..';
|
|
|
2
2
|
import { EntityModel } from './models';
|
|
3
3
|
export type Entity = Record<string, unknown>;
|
|
4
4
|
export type Action = 'create' | 'update' | 'delete' | 'restore';
|
|
5
|
+
export type MutationContext<DateType extends AnyDateType = AnyDateType> = Pick<Context<DateType>, 'knex' | 'now' | 'user' | 'timeZone' | 'mutationHook' | 'handleUploads' | 'models' | 'permissions'>;
|
|
5
6
|
export type MutationHook<DateType extends AnyDateType = AnyDateType> = (args: {
|
|
6
7
|
model: EntityModel;
|
|
7
8
|
action: Action;
|
|
@@ -13,5 +14,5 @@ export type MutationHook<DateType extends AnyDateType = AnyDateType> = (args: {
|
|
|
13
14
|
normalizedInput: Entity;
|
|
14
15
|
next: Entity;
|
|
15
16
|
};
|
|
16
|
-
ctx:
|
|
17
|
+
ctx: MutationContext<DateType>;
|
|
17
18
|
}) => Promise<void> | void;
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { GraphQLResolveInfo } from 'graphql';
|
|
2
2
|
import { Context } from '../context';
|
|
3
3
|
import { EntityModel } from '../models/models';
|
|
4
|
-
import { Entity } from '../models/mutation-hook';
|
|
5
|
-
export declare const mutationResolver: (_parent: any, args: any, partialCtx: Context, info: GraphQLResolveInfo) => Promise<
|
|
6
|
-
export declare const
|
|
4
|
+
import { Entity, MutationContext } from '../models/mutation-hook';
|
|
5
|
+
export declare const mutationResolver: (_parent: any, args: any, partialCtx: Context, info: GraphQLResolveInfo) => Promise<string | import("./utils").Entry | import("./utils").Entry[] | undefined>;
|
|
6
|
+
export declare const createEntity: (model: EntityModel, input: Entity, ctx: MutationContext) => Promise<string>;
|
|
7
|
+
export declare const updateEntities: (model: EntityModel, where: Record<string, unknown>, updateFields: Entity, ctx: MutationContext) => Promise<void>;
|
|
8
|
+
export declare const updateEntity: (model: EntityModel, id: string, input: Entity, ctx: MutationContext) => Promise<void>;
|
|
9
|
+
export declare const deleteEntities: (model: EntityModel, where: Record<string, unknown>, deleteRootType: string, deleteRootId: string, ctx: MutationContext) => Promise<void>;
|
|
10
|
+
export declare const deleteEntity: (model: EntityModel, id: string, dryRun: boolean, deleteRootType: string, deleteRootId: string, ctx: MutationContext) => Promise<any>;
|
|
11
|
+
export declare const createRevision: (model: EntityModel, data: Entity, ctx: MutationContext) => Promise<void>;
|
|
@@ -11,22 +11,37 @@ export const mutationResolver = async (_parent, args, partialCtx, info) => {
|
|
|
11
11
|
const ctx = { ...partialCtx, knex, info, aliases: new AliasGenerator() };
|
|
12
12
|
const model = ctx.models.getModel(modelName, 'entity');
|
|
13
13
|
switch (mutation) {
|
|
14
|
-
case 'create':
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
case '
|
|
19
|
-
|
|
14
|
+
case 'create': {
|
|
15
|
+
const id = await createEntity(model, args.data, ctx);
|
|
16
|
+
return await resolve(ctx, id);
|
|
17
|
+
}
|
|
18
|
+
case 'update': {
|
|
19
|
+
const id = args.where.id;
|
|
20
|
+
await updateEntity(model, id, args.data, ctx);
|
|
21
|
+
return await resolve(ctx, id);
|
|
22
|
+
}
|
|
23
|
+
case 'delete': {
|
|
24
|
+
const id = args.where.id;
|
|
25
|
+
await deleteEntity(model, id, args.dryRun, model.rootModel.name, id, ctx);
|
|
26
|
+
return await resolve(ctx, id);
|
|
27
|
+
}
|
|
20
28
|
case 'restore':
|
|
21
|
-
return await
|
|
29
|
+
return await restoreEntity(model, args.where.id, ctx);
|
|
22
30
|
}
|
|
23
31
|
});
|
|
24
32
|
};
|
|
25
|
-
const
|
|
33
|
+
export const createEntity = async (model, input, ctx) => {
|
|
26
34
|
const normalizedInput = { ...input };
|
|
27
|
-
normalizedInput.id
|
|
28
|
-
|
|
29
|
-
|
|
35
|
+
if (!normalizedInput.id) {
|
|
36
|
+
normalizedInput.id = uuid();
|
|
37
|
+
}
|
|
38
|
+
const id = normalizedInput.id;
|
|
39
|
+
if (!normalizedInput.createdAt) {
|
|
40
|
+
normalizedInput.createdAt = ctx.now;
|
|
41
|
+
}
|
|
42
|
+
if (!normalizedInput.createdById) {
|
|
43
|
+
normalizedInput.createdById = ctx.user?.id;
|
|
44
|
+
}
|
|
30
45
|
if (model.parent) {
|
|
31
46
|
normalizedInput.type = model.name;
|
|
32
47
|
}
|
|
@@ -35,17 +50,18 @@ const create = async (model, { data: input }, ctx) => {
|
|
|
35
50
|
await ctx.handleUploads?.(normalizedInput);
|
|
36
51
|
const data = { prev: {}, input, normalizedInput, next: normalizedInput };
|
|
37
52
|
await ctx.mutationHook?.({ model, action: 'create', trigger: 'mutation', when: 'before', data, ctx });
|
|
53
|
+
await createEntity(model, normalizedInput, ctx);
|
|
38
54
|
if (model.parent) {
|
|
39
55
|
const rootInput = {};
|
|
40
|
-
const childInput = { id
|
|
56
|
+
const childInput = { id };
|
|
41
57
|
for (const field of model.fields) {
|
|
42
58
|
const columnName = field.kind === 'relation' ? `${field.name}Id` : field.name;
|
|
43
|
-
if (columnName in
|
|
59
|
+
if (columnName in data) {
|
|
44
60
|
if (field.inherited) {
|
|
45
|
-
rootInput[columnName] =
|
|
61
|
+
rootInput[columnName] = data[columnName];
|
|
46
62
|
}
|
|
47
63
|
else {
|
|
48
|
-
childInput[columnName] =
|
|
64
|
+
childInput[columnName] = data[columnName];
|
|
49
65
|
}
|
|
50
66
|
}
|
|
51
67
|
}
|
|
@@ -53,19 +69,22 @@ const create = async (model, { data: input }, ctx) => {
|
|
|
53
69
|
await ctx.knex(model.name).insert(childInput);
|
|
54
70
|
}
|
|
55
71
|
else {
|
|
56
|
-
await ctx.knex(model.name).insert(
|
|
72
|
+
await ctx.knex(model.name).insert(data);
|
|
57
73
|
}
|
|
58
|
-
await createRevision(model,
|
|
74
|
+
await createRevision(model, data, ctx);
|
|
59
75
|
await ctx.mutationHook?.({ model, action: 'create', trigger: 'mutation', when: 'after', data, ctx });
|
|
60
|
-
return
|
|
76
|
+
return normalizedInput.id;
|
|
61
77
|
};
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
78
|
+
export const updateEntities = async (model, where, updateFields, ctx) => {
|
|
79
|
+
const entities = await ctx.knex(model.name).where(where).select('id');
|
|
80
|
+
for (const entity of entities) {
|
|
81
|
+
await updateEntity(model, entity.id, updateFields, ctx);
|
|
65
82
|
}
|
|
83
|
+
};
|
|
84
|
+
export const updateEntity = async (model, id, input, ctx) => {
|
|
66
85
|
const normalizedInput = { ...input };
|
|
67
86
|
sanitize(ctx, model, normalizedInput);
|
|
68
|
-
const prev = await getEntityToMutate(ctx, model,
|
|
87
|
+
const prev = await getEntityToMutate(ctx, model, { id }, 'UPDATE');
|
|
69
88
|
// Remove data that wouldn't mutate given that it's irrelevant for permissions
|
|
70
89
|
for (const key of Object.keys(normalizedInput)) {
|
|
71
90
|
if (normalizedInput[key] === prev[key]) {
|
|
@@ -78,41 +97,19 @@ const update = async (model, { where, data: input }, ctx) => {
|
|
|
78
97
|
const next = { ...prev, ...normalizedInput };
|
|
79
98
|
const data = { prev, input, normalizedInput, next };
|
|
80
99
|
await ctx.mutationHook?.({ model, action: 'update', trigger: 'mutation', when: 'before', data, ctx });
|
|
81
|
-
|
|
82
|
-
const rootInput = {};
|
|
83
|
-
const childInput = {};
|
|
84
|
-
for (const field of model.fields) {
|
|
85
|
-
const columnName = field.kind === 'relation' ? `${field.name}Id` : field.name;
|
|
86
|
-
if (columnName in normalizedInput) {
|
|
87
|
-
if (field.inherited) {
|
|
88
|
-
rootInput[columnName] = normalizedInput[columnName];
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
childInput[columnName] = normalizedInput[columnName];
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (Object.keys(rootInput).length) {
|
|
96
|
-
await ctx.knex(model.parent).where({ id: prev.id }).update(rootInput);
|
|
97
|
-
}
|
|
98
|
-
if (Object.keys(childInput).length) {
|
|
99
|
-
await ctx.knex(model.name).where({ id: prev.id }).update(childInput);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
await ctx.knex(model.name).where({ id: prev.id }).update(normalizedInput);
|
|
104
|
-
}
|
|
105
|
-
await createRevision(model, next, ctx);
|
|
100
|
+
await doUpdate(model, normalizedInput, next, ctx);
|
|
106
101
|
await ctx.mutationHook?.({ model, action: 'update', trigger: 'mutation', when: 'after', data, ctx });
|
|
107
102
|
}
|
|
108
|
-
return await resolve(ctx);
|
|
109
103
|
};
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
104
|
+
export const deleteEntities = async (model, where, deleteRootType, deleteRootId, ctx) => {
|
|
105
|
+
const entities = await ctx.knex(model.name).where(where).select('id');
|
|
106
|
+
for (const entity of entities) {
|
|
107
|
+
await deleteEntity(model, entity.id, false, deleteRootType, deleteRootId, ctx);
|
|
113
108
|
}
|
|
109
|
+
};
|
|
110
|
+
export const deleteEntity = async (model, id, dryRun, deleteRootType, deleteRootId, ctx) => {
|
|
114
111
|
const rootModel = model.rootModel;
|
|
115
|
-
const entity = await getEntityToMutate(ctx, rootModel,
|
|
112
|
+
const entity = await getEntityToMutate(ctx, rootModel, { id }, 'DELETE');
|
|
116
113
|
if (entity.deleted) {
|
|
117
114
|
throw new ForbiddenError(`${getTechnicalDisplay(model, entity)} is already deleted.`);
|
|
118
115
|
}
|
|
@@ -137,8 +134,8 @@ const del = async (model, { where, dryRun }, ctx) => {
|
|
|
137
134
|
deleted: true,
|
|
138
135
|
deletedAt: ctx.now,
|
|
139
136
|
deletedById: ctx.user?.id,
|
|
140
|
-
deleteRootType
|
|
141
|
-
deleteRootId
|
|
137
|
+
deleteRootType,
|
|
138
|
+
deleteRootId,
|
|
142
139
|
};
|
|
143
140
|
const next = { ...currentEntity, ...normalizedInput };
|
|
144
141
|
const data = { prev: currentEntity, input: {}, normalizedInput, next };
|
|
@@ -155,8 +152,7 @@ const del = async (model, { where, dryRun }, ctx) => {
|
|
|
155
152
|
});
|
|
156
153
|
}
|
|
157
154
|
mutations.push(async () => {
|
|
158
|
-
await
|
|
159
|
-
await createRevision(currentModel, next, ctx);
|
|
155
|
+
await doUpdate(currentModel, normalizedInput, next, ctx);
|
|
160
156
|
});
|
|
161
157
|
if (mutationHook) {
|
|
162
158
|
afterHooks.push(async () => {
|
|
@@ -207,8 +203,7 @@ const del = async (model, { where, dryRun }, ctx) => {
|
|
|
207
203
|
});
|
|
208
204
|
}
|
|
209
205
|
mutations.push(async () => {
|
|
210
|
-
await
|
|
211
|
-
await createRevision(descendantModel, next, ctx);
|
|
206
|
+
await doUpdate(descendantModel, normalizedInput, next, ctx);
|
|
212
207
|
});
|
|
213
208
|
if (mutationHook) {
|
|
214
209
|
afterHooks.push(async () => {
|
|
@@ -278,12 +273,9 @@ const del = async (model, { where, dryRun }, ctx) => {
|
|
|
278
273
|
}
|
|
279
274
|
return entity.id;
|
|
280
275
|
};
|
|
281
|
-
const
|
|
282
|
-
if (Object.keys(where).length === 0) {
|
|
283
|
-
throw new Error(`No ${model.name} specified.`);
|
|
284
|
-
}
|
|
276
|
+
const restoreEntity = async (model, id, ctx) => {
|
|
285
277
|
const rootModel = model.rootModel;
|
|
286
|
-
const entity = await getEntityToMutate(ctx, rootModel,
|
|
278
|
+
const entity = await getEntityToMutate(ctx, rootModel, { id }, 'RESTORE');
|
|
287
279
|
if (!entity.deleted) {
|
|
288
280
|
throw new ForbiddenError(`${getTechnicalDisplay(model, entity)} is not deleted.`);
|
|
289
281
|
}
|
|
@@ -298,7 +290,7 @@ const restore = async (model, { where }, ctx) => {
|
|
|
298
290
|
const afterHooks = [];
|
|
299
291
|
const restoreCascade = async (currentModel, currentEntity) => {
|
|
300
292
|
if (entity.deleteRootId) {
|
|
301
|
-
if (!(currentEntity.deleteRootType ===
|
|
293
|
+
if (!(currentEntity.deleteRootType === model.name && currentEntity.deleteRootId === entity.id)) {
|
|
302
294
|
return;
|
|
303
295
|
}
|
|
304
296
|
// Legacy heuristic
|
|
@@ -311,7 +303,7 @@ const restore = async (model, { where }, ctx) => {
|
|
|
311
303
|
}
|
|
312
304
|
toRestore[currentModel.name].add(currentEntity.id);
|
|
313
305
|
for (const relation of currentModel.relations) {
|
|
314
|
-
const parentId =
|
|
306
|
+
const parentId = currentEntity[relation.field.foreignKey];
|
|
315
307
|
if (!parentId) {
|
|
316
308
|
continue;
|
|
317
309
|
}
|
|
@@ -337,8 +329,7 @@ const restore = async (model, { where }, ctx) => {
|
|
|
337
329
|
});
|
|
338
330
|
}
|
|
339
331
|
mutations.push(async () => {
|
|
340
|
-
await
|
|
341
|
-
await createRevision(currentModel, { ...currentEntity, deleted: false }, ctx);
|
|
332
|
+
await doUpdate(currentModel, normalizedInput, data.next, ctx);
|
|
342
333
|
});
|
|
343
334
|
if (ctx.mutationHook) {
|
|
344
335
|
afterHooks.push(async () => {
|
|
@@ -365,7 +356,7 @@ const restore = async (model, { where }, ctx) => {
|
|
|
365
356
|
for (const callback of [...beforeHooks, ...mutations, ...afterHooks]) {
|
|
366
357
|
await callback();
|
|
367
358
|
}
|
|
368
|
-
return
|
|
359
|
+
return id;
|
|
369
360
|
};
|
|
370
361
|
export const createRevision = async (model, data, ctx) => {
|
|
371
362
|
if (model.updatable) {
|
|
@@ -407,8 +398,12 @@ export const createRevision = async (model, data, ctx) => {
|
|
|
407
398
|
};
|
|
408
399
|
const sanitize = (ctx, model, data) => {
|
|
409
400
|
if (model.updatable) {
|
|
410
|
-
data.updatedAt
|
|
411
|
-
|
|
401
|
+
if (!data.updatedAt) {
|
|
402
|
+
data.updatedAt = ctx.now;
|
|
403
|
+
}
|
|
404
|
+
if (!data.updatedById) {
|
|
405
|
+
data.updatedById = ctx.user?.id;
|
|
406
|
+
}
|
|
412
407
|
}
|
|
413
408
|
for (const key of Object.keys(data)) {
|
|
414
409
|
const field = model.fields.find(({ name }) => name === key);
|
|
@@ -431,4 +426,39 @@ const sanitize = (ctx, model, data) => {
|
|
|
431
426
|
};
|
|
432
427
|
const isEndOfDay = (field) => isPrimitive(field) && field.type === 'DateTime' && field?.endOfDay === true && field?.dateTimeType === 'date';
|
|
433
428
|
const isEndOfMonth = (field) => isPrimitive(field) && field.type === 'DateTime' && field?.endOfMonth === true && field?.dateTimeType === 'year_and_month';
|
|
429
|
+
const doUpdate = async (model, updateFields, allFields, ctx) => {
|
|
430
|
+
if (model.updatable) {
|
|
431
|
+
if (!updateFields.updatedAt) {
|
|
432
|
+
updateFields.updatedAt = ctx.now;
|
|
433
|
+
}
|
|
434
|
+
if (!updateFields.updatedById) {
|
|
435
|
+
updateFields.updatedById = ctx.user?.id;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
if (model.parent) {
|
|
439
|
+
const rootInput = {};
|
|
440
|
+
const childInput = {};
|
|
441
|
+
for (const field of model.fields) {
|
|
442
|
+
const columnName = field.kind === 'relation' ? `${field.name}Id` : field.name;
|
|
443
|
+
if (columnName in updateFields) {
|
|
444
|
+
if (field.inherited) {
|
|
445
|
+
rootInput[columnName] = updateFields[columnName];
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
childInput[columnName] = updateFields[columnName];
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
if (Object.keys(rootInput).length) {
|
|
453
|
+
await ctx.knex(model.parent).where({ id: allFields.id }).update(rootInput);
|
|
454
|
+
}
|
|
455
|
+
if (Object.keys(childInput).length) {
|
|
456
|
+
await ctx.knex(model.name).where({ id: allFields.id }).update(childInput);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
await ctx.knex(model.name).where({ id: allFields.id }).update(updateFields);
|
|
461
|
+
}
|
|
462
|
+
await createRevision(model, allFields, ctx);
|
|
463
|
+
};
|
|
434
464
|
//# sourceMappingURL=mutations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutations.js","sourceRoot":"","sources":["../../../src/resolvers/mutations.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mutations.js","sourceRoot":"","sources":["../../../src/resolvers/mutations.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -5,11 +5,16 @@ export type Entity = Record<string, unknown>;
|
|
|
5
5
|
|
|
6
6
|
export type Action = 'create' | 'update' | 'delete' | 'restore';
|
|
7
7
|
|
|
8
|
+
export type MutationContext<DateType extends AnyDateType = AnyDateType> = Pick<
|
|
9
|
+
Context<DateType>,
|
|
10
|
+
'knex' | 'now' | 'user' | 'timeZone' | 'mutationHook' | 'handleUploads' | 'models' | 'permissions'
|
|
11
|
+
>;
|
|
12
|
+
|
|
8
13
|
export type MutationHook<DateType extends AnyDateType = AnyDateType> = (args: {
|
|
9
14
|
model: EntityModel;
|
|
10
15
|
action: Action;
|
|
11
16
|
trigger: 'mutation' | 'cascade' | 'set-null';
|
|
12
17
|
when: 'before' | 'after';
|
|
13
18
|
data: { prev: Entity; input: Entity; normalizedInput: Entity; next: Entity };
|
|
14
|
-
ctx:
|
|
19
|
+
ctx: MutationContext<DateType>;
|
|
15
20
|
}) => Promise<void> | void;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { GraphQLResolveInfo } from 'graphql';
|
|
2
2
|
import { v4 as uuid } from 'uuid';
|
|
3
|
-
import { Context
|
|
3
|
+
import { Context } from '../context';
|
|
4
4
|
import { ForbiddenError, GraphQLError } from '../errors';
|
|
5
5
|
import { EntityField, EntityModel } from '../models/models';
|
|
6
|
-
import { Entity } from '../models/mutation-hook';
|
|
6
|
+
import { Entity, MutationContext } from '../models/mutation-hook';
|
|
7
7
|
import { get, isPrimitive, it, typeToField } from '../models/utils';
|
|
8
8
|
import { applyPermissions, checkCanWrite, getEntityToMutate } from '../permissions/check';
|
|
9
9
|
import { anyDateToLuxon } from '../utils';
|
|
@@ -16,23 +16,43 @@ export const mutationResolver = async (_parent: any, args: any, partialCtx: Cont
|
|
|
16
16
|
const ctx = { ...partialCtx, knex, info, aliases: new AliasGenerator() };
|
|
17
17
|
const model = ctx.models.getModel(modelName, 'entity');
|
|
18
18
|
switch (mutation) {
|
|
19
|
-
case 'create':
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return await
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
case 'create': {
|
|
20
|
+
const id = await createEntity(model, args.data, ctx);
|
|
21
|
+
|
|
22
|
+
return await resolve(ctx, id);
|
|
23
|
+
}
|
|
24
|
+
case 'update': {
|
|
25
|
+
const id = args.where.id;
|
|
26
|
+
|
|
27
|
+
await updateEntity(model, id, args.data, ctx);
|
|
28
|
+
|
|
29
|
+
return await resolve(ctx, id);
|
|
30
|
+
}
|
|
31
|
+
case 'delete': {
|
|
32
|
+
const id = args.where.id;
|
|
33
|
+
|
|
34
|
+
await deleteEntity(model, id, args.dryRun, model.rootModel.name, id, ctx);
|
|
35
|
+
|
|
36
|
+
return await resolve(ctx, id);
|
|
37
|
+
}
|
|
25
38
|
case 'restore':
|
|
26
|
-
return await
|
|
39
|
+
return await restoreEntity(model, args.where.id, ctx);
|
|
27
40
|
}
|
|
28
41
|
});
|
|
29
42
|
};
|
|
30
43
|
|
|
31
|
-
const
|
|
44
|
+
export const createEntity = async (model: EntityModel, input: Entity, ctx: MutationContext) => {
|
|
32
45
|
const normalizedInput = { ...input };
|
|
33
|
-
normalizedInput.id
|
|
34
|
-
|
|
35
|
-
|
|
46
|
+
if (!normalizedInput.id) {
|
|
47
|
+
normalizedInput.id = uuid();
|
|
48
|
+
}
|
|
49
|
+
const id = normalizedInput.id as string;
|
|
50
|
+
if (!normalizedInput.createdAt) {
|
|
51
|
+
normalizedInput.createdAt = ctx.now;
|
|
52
|
+
}
|
|
53
|
+
if (!normalizedInput.createdById) {
|
|
54
|
+
normalizedInput.createdById = ctx.user?.id;
|
|
55
|
+
}
|
|
36
56
|
if (model.parent) {
|
|
37
57
|
normalizedInput.type = model.name;
|
|
38
58
|
}
|
|
@@ -43,40 +63,51 @@ const create = async (model: EntityModel, { data: input }: { data: any }, ctx: F
|
|
|
43
63
|
|
|
44
64
|
const data = { prev: {}, input, normalizedInput, next: normalizedInput };
|
|
45
65
|
await ctx.mutationHook?.({ model, action: 'create', trigger: 'mutation', when: 'before', data, ctx });
|
|
66
|
+
|
|
67
|
+
await createEntity(model, normalizedInput, ctx);
|
|
68
|
+
|
|
46
69
|
if (model.parent) {
|
|
47
70
|
const rootInput = {};
|
|
48
|
-
const childInput = { id
|
|
71
|
+
const childInput = { id };
|
|
49
72
|
for (const field of model.fields) {
|
|
50
73
|
const columnName = field.kind === 'relation' ? `${field.name}Id` : field.name;
|
|
51
|
-
if (columnName in
|
|
74
|
+
if (columnName in data) {
|
|
52
75
|
if (field.inherited) {
|
|
53
|
-
rootInput[columnName] =
|
|
76
|
+
rootInput[columnName] = data[columnName];
|
|
54
77
|
} else {
|
|
55
|
-
childInput[columnName] =
|
|
78
|
+
childInput[columnName] = data[columnName];
|
|
56
79
|
}
|
|
57
80
|
}
|
|
58
81
|
}
|
|
59
82
|
await ctx.knex(model.parent).insert(rootInput);
|
|
60
83
|
await ctx.knex(model.name).insert(childInput);
|
|
61
84
|
} else {
|
|
62
|
-
await ctx.knex(model.name).insert(
|
|
85
|
+
await ctx.knex(model.name).insert(data);
|
|
63
86
|
}
|
|
64
|
-
await createRevision(model,
|
|
87
|
+
await createRevision(model, data, ctx);
|
|
65
88
|
await ctx.mutationHook?.({ model, action: 'create', trigger: 'mutation', when: 'after', data, ctx });
|
|
66
89
|
|
|
67
|
-
return
|
|
90
|
+
return normalizedInput.id as string;
|
|
68
91
|
};
|
|
69
92
|
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
93
|
+
export const updateEntities = async (
|
|
94
|
+
model: EntityModel,
|
|
95
|
+
where: Record<string, unknown>,
|
|
96
|
+
updateFields: Entity,
|
|
97
|
+
ctx: MutationContext,
|
|
98
|
+
) => {
|
|
99
|
+
const entities = await ctx.knex(model.name).where(where).select('id');
|
|
100
|
+
for (const entity of entities) {
|
|
101
|
+
await updateEntity(model, entity.id, updateFields, ctx);
|
|
73
102
|
}
|
|
103
|
+
};
|
|
74
104
|
|
|
105
|
+
export const updateEntity = async (model: EntityModel, id: string, input: Entity, ctx: MutationContext) => {
|
|
75
106
|
const normalizedInput = { ...input };
|
|
76
107
|
|
|
77
108
|
sanitize(ctx, model, normalizedInput);
|
|
78
109
|
|
|
79
|
-
const prev = await getEntityToMutate(ctx, model,
|
|
110
|
+
const prev = await getEntityToMutate(ctx, model, { id }, 'UPDATE');
|
|
80
111
|
|
|
81
112
|
// Remove data that wouldn't mutate given that it's irrelevant for permissions
|
|
82
113
|
for (const key of Object.keys(normalizedInput)) {
|
|
@@ -93,45 +124,36 @@ const update = async (model: EntityModel, { where, data: input }: { where: any;
|
|
|
93
124
|
const data = { prev, input, normalizedInput, next };
|
|
94
125
|
await ctx.mutationHook?.({ model, action: 'update', trigger: 'mutation', when: 'before', data, ctx });
|
|
95
126
|
|
|
96
|
-
|
|
97
|
-
const rootInput = {};
|
|
98
|
-
const childInput = {};
|
|
99
|
-
for (const field of model.fields) {
|
|
100
|
-
const columnName = field.kind === 'relation' ? `${field.name}Id` : field.name;
|
|
101
|
-
if (columnName in normalizedInput) {
|
|
102
|
-
if (field.inherited) {
|
|
103
|
-
rootInput[columnName] = normalizedInput[columnName];
|
|
104
|
-
} else {
|
|
105
|
-
childInput[columnName] = normalizedInput[columnName];
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
if (Object.keys(rootInput).length) {
|
|
110
|
-
await ctx.knex(model.parent).where({ id: prev.id }).update(rootInput);
|
|
111
|
-
}
|
|
112
|
-
if (Object.keys(childInput).length) {
|
|
113
|
-
await ctx.knex(model.name).where({ id: prev.id }).update(childInput);
|
|
114
|
-
}
|
|
115
|
-
} else {
|
|
116
|
-
await ctx.knex(model.name).where({ id: prev.id }).update(normalizedInput);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
await createRevision(model, next, ctx);
|
|
127
|
+
await doUpdate(model, normalizedInput, next, ctx);
|
|
120
128
|
await ctx.mutationHook?.({ model, action: 'update', trigger: 'mutation', when: 'after', data, ctx });
|
|
121
129
|
}
|
|
122
|
-
|
|
123
|
-
return await resolve(ctx);
|
|
124
130
|
};
|
|
125
131
|
|
|
126
132
|
type Callbacks = (() => Promise<void>)[];
|
|
127
133
|
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
134
|
+
export const deleteEntities = async (
|
|
135
|
+
model: EntityModel,
|
|
136
|
+
where: Record<string, unknown>,
|
|
137
|
+
deleteRootType: string,
|
|
138
|
+
deleteRootId: string,
|
|
139
|
+
ctx: MutationContext,
|
|
140
|
+
) => {
|
|
141
|
+
const entities = await ctx.knex(model.name).where(where).select('id');
|
|
142
|
+
for (const entity of entities) {
|
|
143
|
+
await deleteEntity(model, entity.id, false, deleteRootType, deleteRootId, ctx);
|
|
131
144
|
}
|
|
145
|
+
};
|
|
132
146
|
|
|
147
|
+
export const deleteEntity = async (
|
|
148
|
+
model: EntityModel,
|
|
149
|
+
id: string,
|
|
150
|
+
dryRun: boolean,
|
|
151
|
+
deleteRootType: string,
|
|
152
|
+
deleteRootId: string,
|
|
153
|
+
ctx: MutationContext,
|
|
154
|
+
) => {
|
|
133
155
|
const rootModel = model.rootModel;
|
|
134
|
-
const entity = await getEntityToMutate(ctx, rootModel,
|
|
156
|
+
const entity = await getEntityToMutate(ctx, rootModel, { id }, 'DELETE');
|
|
135
157
|
|
|
136
158
|
if (entity.deleted) {
|
|
137
159
|
throw new ForbiddenError(`${getTechnicalDisplay(model, entity)} is already deleted.`);
|
|
@@ -179,8 +201,8 @@ const del = async (model: EntityModel, { where, dryRun }: { where: any; dryRun:
|
|
|
179
201
|
deleted: true,
|
|
180
202
|
deletedAt: ctx.now,
|
|
181
203
|
deletedById: ctx.user?.id,
|
|
182
|
-
deleteRootType
|
|
183
|
-
deleteRootId
|
|
204
|
+
deleteRootType,
|
|
205
|
+
deleteRootId,
|
|
184
206
|
};
|
|
185
207
|
const next = { ...currentEntity, ...normalizedInput };
|
|
186
208
|
const data = { prev: currentEntity, input: {}, normalizedInput, next };
|
|
@@ -197,8 +219,7 @@ const del = async (model: EntityModel, { where, dryRun }: { where: any; dryRun:
|
|
|
197
219
|
});
|
|
198
220
|
}
|
|
199
221
|
mutations.push(async () => {
|
|
200
|
-
await
|
|
201
|
-
await createRevision(currentModel, next, ctx);
|
|
222
|
+
await doUpdate(currentModel, normalizedInput, next, ctx);
|
|
202
223
|
});
|
|
203
224
|
if (mutationHook) {
|
|
204
225
|
afterHooks.push(async () => {
|
|
@@ -252,8 +273,7 @@ const del = async (model: EntityModel, { where, dryRun }: { where: any; dryRun:
|
|
|
252
273
|
});
|
|
253
274
|
}
|
|
254
275
|
mutations.push(async () => {
|
|
255
|
-
await
|
|
256
|
-
await createRevision(descendantModel, next, ctx);
|
|
276
|
+
await doUpdate(descendantModel, normalizedInput, next, ctx);
|
|
257
277
|
});
|
|
258
278
|
if (mutationHook) {
|
|
259
279
|
afterHooks.push(async () => {
|
|
@@ -335,14 +355,10 @@ const del = async (model: EntityModel, { where, dryRun }: { where: any; dryRun:
|
|
|
335
355
|
return entity.id;
|
|
336
356
|
};
|
|
337
357
|
|
|
338
|
-
const
|
|
339
|
-
if (Object.keys(where).length === 0) {
|
|
340
|
-
throw new Error(`No ${model.name} specified.`);
|
|
341
|
-
}
|
|
342
|
-
|
|
358
|
+
const restoreEntity = async (model: EntityModel, id: string, ctx: MutationContext) => {
|
|
343
359
|
const rootModel = model.rootModel;
|
|
344
360
|
|
|
345
|
-
const entity = await getEntityToMutate(ctx, rootModel,
|
|
361
|
+
const entity = await getEntityToMutate(ctx, rootModel, { id }, 'RESTORE');
|
|
346
362
|
|
|
347
363
|
if (!entity.deleted) {
|
|
348
364
|
throw new ForbiddenError(`${getTechnicalDisplay(model, entity)} is not deleted.`);
|
|
@@ -364,7 +380,7 @@ const restore = async (model: EntityModel, { where }: { where: any }, ctx: FullC
|
|
|
364
380
|
|
|
365
381
|
const restoreCascade = async (currentModel: EntityModel, currentEntity: Entity) => {
|
|
366
382
|
if (entity.deleteRootId) {
|
|
367
|
-
if (!(currentEntity.deleteRootType ===
|
|
383
|
+
if (!(currentEntity.deleteRootType === model.name && currentEntity.deleteRootId === entity.id)) {
|
|
368
384
|
return;
|
|
369
385
|
}
|
|
370
386
|
|
|
@@ -381,7 +397,7 @@ const restore = async (model: EntityModel, { where }: { where: any }, ctx: FullC
|
|
|
381
397
|
toRestore[currentModel.name].add(currentEntity.id as string);
|
|
382
398
|
|
|
383
399
|
for (const relation of currentModel.relations) {
|
|
384
|
-
const parentId =
|
|
400
|
+
const parentId = currentEntity[relation.field.foreignKey] as string | undefined;
|
|
385
401
|
if (!parentId) {
|
|
386
402
|
continue;
|
|
387
403
|
}
|
|
@@ -410,8 +426,7 @@ const restore = async (model: EntityModel, { where }: { where: any }, ctx: FullC
|
|
|
410
426
|
});
|
|
411
427
|
}
|
|
412
428
|
mutations.push(async () => {
|
|
413
|
-
await
|
|
414
|
-
await createRevision(currentModel, { ...currentEntity, deleted: false }, ctx);
|
|
429
|
+
await doUpdate(currentModel, normalizedInput, data.next, ctx);
|
|
415
430
|
});
|
|
416
431
|
if (ctx.mutationHook) {
|
|
417
432
|
afterHooks.push(async () => {
|
|
@@ -449,10 +464,10 @@ const restore = async (model: EntityModel, { where }: { where: any }, ctx: FullC
|
|
|
449
464
|
await callback();
|
|
450
465
|
}
|
|
451
466
|
|
|
452
|
-
return
|
|
467
|
+
return id;
|
|
453
468
|
};
|
|
454
469
|
|
|
455
|
-
export const createRevision = async (model: EntityModel, data: Entity, ctx:
|
|
470
|
+
export const createRevision = async (model: EntityModel, data: Entity, ctx: MutationContext) => {
|
|
456
471
|
if (model.updatable) {
|
|
457
472
|
const revisionId = uuid();
|
|
458
473
|
const rootRevisionData: Entity = {
|
|
@@ -491,10 +506,14 @@ export const createRevision = async (model: EntityModel, data: Entity, ctx: Pick
|
|
|
491
506
|
}
|
|
492
507
|
};
|
|
493
508
|
|
|
494
|
-
const sanitize = (ctx:
|
|
509
|
+
const sanitize = (ctx: MutationContext, model: EntityModel, data: Entity) => {
|
|
495
510
|
if (model.updatable) {
|
|
496
|
-
data.updatedAt
|
|
497
|
-
|
|
511
|
+
if (!data.updatedAt) {
|
|
512
|
+
data.updatedAt = ctx.now;
|
|
513
|
+
}
|
|
514
|
+
if (!data.updatedById) {
|
|
515
|
+
data.updatedById = ctx.user?.id;
|
|
516
|
+
}
|
|
498
517
|
}
|
|
499
518
|
|
|
500
519
|
for (const key of Object.keys(data)) {
|
|
@@ -526,3 +545,37 @@ const isEndOfDay = (field: EntityField) =>
|
|
|
526
545
|
|
|
527
546
|
const isEndOfMonth = (field: EntityField) =>
|
|
528
547
|
isPrimitive(field) && field.type === 'DateTime' && field?.endOfMonth === true && field?.dateTimeType === 'year_and_month';
|
|
548
|
+
|
|
549
|
+
const doUpdate = async (model: EntityModel, updateFields: Entity, allFields: Entity, ctx: MutationContext) => {
|
|
550
|
+
if (model.updatable) {
|
|
551
|
+
if (!updateFields.updatedAt) {
|
|
552
|
+
updateFields.updatedAt = ctx.now;
|
|
553
|
+
}
|
|
554
|
+
if (!updateFields.updatedById) {
|
|
555
|
+
updateFields.updatedById = ctx.user?.id;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
if (model.parent) {
|
|
559
|
+
const rootInput = {};
|
|
560
|
+
const childInput = {};
|
|
561
|
+
for (const field of model.fields) {
|
|
562
|
+
const columnName = field.kind === 'relation' ? `${field.name}Id` : field.name;
|
|
563
|
+
if (columnName in updateFields) {
|
|
564
|
+
if (field.inherited) {
|
|
565
|
+
rootInput[columnName] = updateFields[columnName];
|
|
566
|
+
} else {
|
|
567
|
+
childInput[columnName] = updateFields[columnName];
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
if (Object.keys(rootInput).length) {
|
|
572
|
+
await ctx.knex(model.parent).where({ id: allFields.id }).update(rootInput);
|
|
573
|
+
}
|
|
574
|
+
if (Object.keys(childInput).length) {
|
|
575
|
+
await ctx.knex(model.name).where({ id: allFields.id }).update(childInput);
|
|
576
|
+
}
|
|
577
|
+
} else {
|
|
578
|
+
await ctx.knex(model.name).where({ id: allFields.id }).update(updateFields);
|
|
579
|
+
}
|
|
580
|
+
await createRevision(model, allFields, ctx);
|
|
581
|
+
};
|