@smartive/graphql-magic 19.1.3-next.1 → 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 +125 -72
- 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 +115 -76
- 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 +147 -81
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
|
}
|
|
@@ -2957,7 +2956,11 @@ var restore = async (model, { where }, ctx) => {
|
|
|
2957
2956
|
const mutations = [];
|
|
2958
2957
|
const afterHooks = [];
|
|
2959
2958
|
const restoreCascade = async (currentModel, currentEntity) => {
|
|
2960
|
-
if (
|
|
2959
|
+
if (entity.deleteRootId) {
|
|
2960
|
+
if (!(currentEntity.deleteRootType === model.name && currentEntity.deleteRootId === entity.id)) {
|
|
2961
|
+
return;
|
|
2962
|
+
}
|
|
2963
|
+
} else if (!anyDateToLuxon(currentEntity.deletedAt, ctx.timeZone).equals(anyDateToLuxon(entity.deletedAt, ctx.timeZone))) {
|
|
2961
2964
|
return;
|
|
2962
2965
|
}
|
|
2963
2966
|
if (!(currentModel.name in toRestore)) {
|
|
@@ -2965,11 +2968,11 @@ var restore = async (model, { where }, ctx) => {
|
|
|
2965
2968
|
}
|
|
2966
2969
|
toRestore[currentModel.name].add(currentEntity.id);
|
|
2967
2970
|
for (const relation of currentModel.relations) {
|
|
2968
|
-
const parentId =
|
|
2971
|
+
const parentId = currentEntity[relation.field.foreignKey];
|
|
2969
2972
|
if (!parentId) {
|
|
2970
2973
|
continue;
|
|
2971
2974
|
}
|
|
2972
|
-
if (toRestore[relation.targetModel.name]
|
|
2975
|
+
if (toRestore[relation.targetModel.name]?.has(parentId)) {
|
|
2973
2976
|
continue;
|
|
2974
2977
|
}
|
|
2975
2978
|
const parent = await ctx.knex(relation.targetModel.name).where({ id: parentId }).first();
|
|
@@ -2993,8 +2996,7 @@ var restore = async (model, { where }, ctx) => {
|
|
|
2993
2996
|
});
|
|
2994
2997
|
}
|
|
2995
2998
|
mutations.push(async () => {
|
|
2996
|
-
await
|
|
2997
|
-
await createRevision(currentModel, { ...currentEntity, deleted: false }, ctx);
|
|
2999
|
+
await doUpdate(currentModel, normalizedInput, data.next, ctx);
|
|
2998
3000
|
});
|
|
2999
3001
|
if (ctx.mutationHook) {
|
|
3000
3002
|
afterHooks.push(async () => {
|
|
@@ -3005,10 +3007,19 @@ var restore = async (model, { where }, ctx) => {
|
|
|
3005
3007
|
targetModel: descendantModel,
|
|
3006
3008
|
field: { foreignKey }
|
|
3007
3009
|
} of currentModel.reverseRelations.filter((reverseRelation) => !reverseRelation.field.inherited).filter(({ targetModel: { deletable } }) => deletable)) {
|
|
3008
|
-
const query = ctx.knex(descendantModel.name).where({ [foreignKey]: currentEntity.id });
|
|
3010
|
+
const query = ctx.knex(descendantModel.name).where({ [foreignKey]: currentEntity.id, deleted: true });
|
|
3011
|
+
const deletedDescendants = await query;
|
|
3009
3012
|
applyPermissions(ctx, descendantModel.name, descendantModel.name, query, "RESTORE");
|
|
3010
|
-
const
|
|
3011
|
-
|
|
3013
|
+
const restorableDescendants = await query;
|
|
3014
|
+
const notRestorableDescendants = deletedDescendants.filter(
|
|
3015
|
+
(descendant) => !restorableDescendants.some((d) => d.id === descendant.id)
|
|
3016
|
+
);
|
|
3017
|
+
if (notRestorableDescendants.length) {
|
|
3018
|
+
throw new ForbiddenError(
|
|
3019
|
+
`${getTechnicalDisplay(currentModel, currentEntity)} depends on ${descendantModel.labelPlural} which you have no permissions to restore.`
|
|
3020
|
+
);
|
|
3021
|
+
}
|
|
3022
|
+
for (const descendant of deletedDescendants) {
|
|
3012
3023
|
await restoreCascade(descendantModel, descendant);
|
|
3013
3024
|
}
|
|
3014
3025
|
}
|
|
@@ -3017,7 +3028,7 @@ var restore = async (model, { where }, ctx) => {
|
|
|
3017
3028
|
for (const callback of [...beforeHooks, ...mutations, ...afterHooks]) {
|
|
3018
3029
|
await callback();
|
|
3019
3030
|
}
|
|
3020
|
-
return
|
|
3031
|
+
return id;
|
|
3021
3032
|
};
|
|
3022
3033
|
var createRevision = async (model, data, ctx) => {
|
|
3023
3034
|
if (model.updatable) {
|
|
@@ -3056,8 +3067,12 @@ var createRevision = async (model, data, ctx) => {
|
|
|
3056
3067
|
};
|
|
3057
3068
|
var sanitize = (ctx, model, data) => {
|
|
3058
3069
|
if (model.updatable) {
|
|
3059
|
-
data.updatedAt
|
|
3060
|
-
|
|
3070
|
+
if (!data.updatedAt) {
|
|
3071
|
+
data.updatedAt = ctx.now;
|
|
3072
|
+
}
|
|
3073
|
+
if (!data.updatedById) {
|
|
3074
|
+
data.updatedById = ctx.user?.id;
|
|
3075
|
+
}
|
|
3061
3076
|
}
|
|
3062
3077
|
for (const key of Object.keys(data)) {
|
|
3063
3078
|
const field = model.fields.find(({ name: name2 }) => name2 === key);
|
|
@@ -3080,6 +3095,39 @@ var sanitize = (ctx, model, data) => {
|
|
|
3080
3095
|
};
|
|
3081
3096
|
var isEndOfDay = (field) => isPrimitive(field) && field.type === "DateTime" && field?.endOfDay === true && field?.dateTimeType === "date";
|
|
3082
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
|
+
};
|
|
3083
3131
|
|
|
3084
3132
|
// src/resolvers/resolvers.ts
|
|
3085
3133
|
var getResolvers = (models) => {
|
|
@@ -3574,7 +3622,10 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql6.buildAST
|
|
|
3574
3622
|
args,
|
|
3575
3623
|
as,
|
|
3576
3624
|
checkCanWrite,
|
|
3625
|
+
createEntity,
|
|
3577
3626
|
createRevision,
|
|
3627
|
+
deleteEntities,
|
|
3628
|
+
deleteEntity,
|
|
3578
3629
|
directive,
|
|
3579
3630
|
directives,
|
|
3580
3631
|
displayField,
|
|
@@ -3689,5 +3740,7 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql6.buildAST
|
|
|
3689
3740
|
summonByKey,
|
|
3690
3741
|
summonByName,
|
|
3691
3742
|
typeToField,
|
|
3743
|
+
updateEntities,
|
|
3744
|
+
updateEntity,
|
|
3692
3745
|
value
|
|
3693
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
|
}
|
|
@@ -297,9 +289,13 @@ const restore = async (model, { where }, ctx) => {
|
|
|
297
289
|
const mutations = [];
|
|
298
290
|
const afterHooks = [];
|
|
299
291
|
const restoreCascade = async (currentModel, currentEntity) => {
|
|
300
|
-
if (
|
|
301
|
-
!currentEntity.
|
|
302
|
-
|
|
292
|
+
if (entity.deleteRootId) {
|
|
293
|
+
if (!(currentEntity.deleteRootType === model.name && currentEntity.deleteRootId === entity.id)) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
// Legacy heuristic
|
|
297
|
+
}
|
|
298
|
+
else if (!anyDateToLuxon(currentEntity.deletedAt, ctx.timeZone).equals(anyDateToLuxon(entity.deletedAt, ctx.timeZone))) {
|
|
303
299
|
return;
|
|
304
300
|
}
|
|
305
301
|
if (!(currentModel.name in toRestore)) {
|
|
@@ -307,11 +303,11 @@ const restore = async (model, { where }, ctx) => {
|
|
|
307
303
|
}
|
|
308
304
|
toRestore[currentModel.name].add(currentEntity.id);
|
|
309
305
|
for (const relation of currentModel.relations) {
|
|
310
|
-
const parentId =
|
|
306
|
+
const parentId = currentEntity[relation.field.foreignKey];
|
|
311
307
|
if (!parentId) {
|
|
312
308
|
continue;
|
|
313
309
|
}
|
|
314
|
-
if (toRestore[relation.targetModel.name]
|
|
310
|
+
if (toRestore[relation.targetModel.name]?.has(parentId)) {
|
|
315
311
|
continue;
|
|
316
312
|
}
|
|
317
313
|
const parent = await ctx.knex(relation.targetModel.name).where({ id: parentId }).first();
|
|
@@ -333,8 +329,7 @@ const restore = async (model, { where }, ctx) => {
|
|
|
333
329
|
});
|
|
334
330
|
}
|
|
335
331
|
mutations.push(async () => {
|
|
336
|
-
await
|
|
337
|
-
await createRevision(currentModel, { ...currentEntity, deleted: false }, ctx);
|
|
332
|
+
await doUpdate(currentModel, normalizedInput, data.next, ctx);
|
|
338
333
|
});
|
|
339
334
|
if (ctx.mutationHook) {
|
|
340
335
|
afterHooks.push(async () => {
|
|
@@ -344,10 +339,15 @@ const restore = async (model, { where }, ctx) => {
|
|
|
344
339
|
for (const { targetModel: descendantModel, field: { foreignKey }, } of currentModel.reverseRelations
|
|
345
340
|
.filter((reverseRelation) => !reverseRelation.field.inherited)
|
|
346
341
|
.filter(({ targetModel: { deletable } }) => deletable)) {
|
|
347
|
-
const query = ctx.knex(descendantModel.name).where({ [foreignKey]: currentEntity.id });
|
|
342
|
+
const query = ctx.knex(descendantModel.name).where({ [foreignKey]: currentEntity.id, deleted: true });
|
|
343
|
+
const deletedDescendants = await query;
|
|
348
344
|
applyPermissions(ctx, descendantModel.name, descendantModel.name, query, 'RESTORE');
|
|
349
|
-
const
|
|
350
|
-
|
|
345
|
+
const restorableDescendants = await query;
|
|
346
|
+
const notRestorableDescendants = deletedDescendants.filter((descendant) => !restorableDescendants.some((d) => d.id === descendant.id));
|
|
347
|
+
if (notRestorableDescendants.length) {
|
|
348
|
+
throw new ForbiddenError(`${getTechnicalDisplay(currentModel, currentEntity)} depends on ${descendantModel.labelPlural} which you have no permissions to restore.`);
|
|
349
|
+
}
|
|
350
|
+
for (const descendant of deletedDescendants) {
|
|
351
351
|
await restoreCascade(descendantModel, descendant);
|
|
352
352
|
}
|
|
353
353
|
}
|
|
@@ -356,7 +356,7 @@ const restore = async (model, { where }, ctx) => {
|
|
|
356
356
|
for (const callback of [...beforeHooks, ...mutations, ...afterHooks]) {
|
|
357
357
|
await callback();
|
|
358
358
|
}
|
|
359
|
-
return
|
|
359
|
+
return id;
|
|
360
360
|
};
|
|
361
361
|
export const createRevision = async (model, data, ctx) => {
|
|
362
362
|
if (model.updatable) {
|
|
@@ -398,8 +398,12 @@ export const createRevision = async (model, data, ctx) => {
|
|
|
398
398
|
};
|
|
399
399
|
const sanitize = (ctx, model, data) => {
|
|
400
400
|
if (model.updatable) {
|
|
401
|
-
data.updatedAt
|
|
402
|
-
|
|
401
|
+
if (!data.updatedAt) {
|
|
402
|
+
data.updatedAt = ctx.now;
|
|
403
|
+
}
|
|
404
|
+
if (!data.updatedById) {
|
|
405
|
+
data.updatedById = ctx.user?.id;
|
|
406
|
+
}
|
|
403
407
|
}
|
|
404
408
|
for (const key of Object.keys(data)) {
|
|
405
409
|
const field = model.fields.find(({ name }) => name === key);
|
|
@@ -422,4 +426,39 @@ const sanitize = (ctx, model, data) => {
|
|
|
422
426
|
};
|
|
423
427
|
const isEndOfDay = (field) => isPrimitive(field) && field.type === 'DateTime' && field?.endOfDay === true && field?.dateTimeType === 'date';
|
|
424
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
|
+
};
|
|
425
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.`);
|
|
@@ -363,9 +379,13 @@ const restore = async (model: EntityModel, { where }: { where: any }, ctx: FullC
|
|
|
363
379
|
const afterHooks: Callbacks = [];
|
|
364
380
|
|
|
365
381
|
const restoreCascade = async (currentModel: EntityModel, currentEntity: Entity) => {
|
|
366
|
-
if (
|
|
367
|
-
!currentEntity.
|
|
368
|
-
|
|
382
|
+
if (entity.deleteRootId) {
|
|
383
|
+
if (!(currentEntity.deleteRootType === model.name && currentEntity.deleteRootId === entity.id)) {
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// Legacy heuristic
|
|
388
|
+
} else if (
|
|
369
389
|
!anyDateToLuxon(currentEntity.deletedAt, ctx.timeZone)!.equals(anyDateToLuxon(entity.deletedAt, ctx.timeZone)!)
|
|
370
390
|
) {
|
|
371
391
|
return;
|
|
@@ -377,11 +397,11 @@ const restore = async (model: EntityModel, { where }: { where: any }, ctx: FullC
|
|
|
377
397
|
toRestore[currentModel.name].add(currentEntity.id as string);
|
|
378
398
|
|
|
379
399
|
for (const relation of currentModel.relations) {
|
|
380
|
-
const parentId =
|
|
400
|
+
const parentId = currentEntity[relation.field.foreignKey] as string | undefined;
|
|
381
401
|
if (!parentId) {
|
|
382
402
|
continue;
|
|
383
403
|
}
|
|
384
|
-
if (toRestore[relation.targetModel.name]
|
|
404
|
+
if (toRestore[relation.targetModel.name]?.has(parentId)) {
|
|
385
405
|
continue;
|
|
386
406
|
}
|
|
387
407
|
const parent = await ctx.knex(relation.targetModel.name).where({ id: parentId }).first();
|
|
@@ -406,8 +426,7 @@ const restore = async (model: EntityModel, { where }: { where: any }, ctx: FullC
|
|
|
406
426
|
});
|
|
407
427
|
}
|
|
408
428
|
mutations.push(async () => {
|
|
409
|
-
await
|
|
410
|
-
await createRevision(currentModel, { ...currentEntity, deleted: false }, ctx);
|
|
429
|
+
await doUpdate(currentModel, normalizedInput, data.next, ctx);
|
|
411
430
|
});
|
|
412
431
|
if (ctx.mutationHook) {
|
|
413
432
|
afterHooks.push(async () => {
|
|
@@ -421,10 +440,19 @@ const restore = async (model: EntityModel, { where }: { where: any }, ctx: FullC
|
|
|
421
440
|
} of currentModel.reverseRelations
|
|
422
441
|
.filter((reverseRelation) => !reverseRelation.field.inherited)
|
|
423
442
|
.filter(({ targetModel: { deletable } }) => deletable)) {
|
|
424
|
-
const query = ctx.knex(descendantModel.name).where({ [foreignKey]: currentEntity.id });
|
|
443
|
+
const query = ctx.knex(descendantModel.name).where({ [foreignKey]: currentEntity.id, deleted: true });
|
|
444
|
+
const deletedDescendants = await query;
|
|
425
445
|
applyPermissions(ctx, descendantModel.name, descendantModel.name, query, 'RESTORE');
|
|
426
|
-
const
|
|
427
|
-
|
|
446
|
+
const restorableDescendants = await query;
|
|
447
|
+
const notRestorableDescendants = deletedDescendants.filter(
|
|
448
|
+
(descendant) => !restorableDescendants.some((d) => d.id === descendant.id),
|
|
449
|
+
);
|
|
450
|
+
if (notRestorableDescendants.length) {
|
|
451
|
+
throw new ForbiddenError(
|
|
452
|
+
`${getTechnicalDisplay(currentModel, currentEntity)} depends on ${descendantModel.labelPlural} which you have no permissions to restore.`,
|
|
453
|
+
);
|
|
454
|
+
}
|
|
455
|
+
for (const descendant of deletedDescendants) {
|
|
428
456
|
await restoreCascade(descendantModel, descendant);
|
|
429
457
|
}
|
|
430
458
|
}
|
|
@@ -436,10 +464,10 @@ const restore = async (model: EntityModel, { where }: { where: any }, ctx: FullC
|
|
|
436
464
|
await callback();
|
|
437
465
|
}
|
|
438
466
|
|
|
439
|
-
return
|
|
467
|
+
return id;
|
|
440
468
|
};
|
|
441
469
|
|
|
442
|
-
export const createRevision = async (model: EntityModel, data: Entity, ctx:
|
|
470
|
+
export const createRevision = async (model: EntityModel, data: Entity, ctx: MutationContext) => {
|
|
443
471
|
if (model.updatable) {
|
|
444
472
|
const revisionId = uuid();
|
|
445
473
|
const rootRevisionData: Entity = {
|
|
@@ -478,10 +506,14 @@ export const createRevision = async (model: EntityModel, data: Entity, ctx: Pick
|
|
|
478
506
|
}
|
|
479
507
|
};
|
|
480
508
|
|
|
481
|
-
const sanitize = (ctx:
|
|
509
|
+
const sanitize = (ctx: MutationContext, model: EntityModel, data: Entity) => {
|
|
482
510
|
if (model.updatable) {
|
|
483
|
-
data.updatedAt
|
|
484
|
-
|
|
511
|
+
if (!data.updatedAt) {
|
|
512
|
+
data.updatedAt = ctx.now;
|
|
513
|
+
}
|
|
514
|
+
if (!data.updatedById) {
|
|
515
|
+
data.updatedById = ctx.user?.id;
|
|
516
|
+
}
|
|
485
517
|
}
|
|
486
518
|
|
|
487
519
|
for (const key of Object.keys(data)) {
|
|
@@ -513,3 +545,37 @@ const isEndOfDay = (field: EntityField) =>
|
|
|
513
545
|
|
|
514
546
|
const isEndOfMonth = (field: EntityField) =>
|
|
515
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
|
+
};
|