@smartive/graphql-magic 1.0.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/.eslintrc +21 -0
- package/.github/workflows/release.yml +24 -0
- package/.github/workflows/testing.yml +37 -0
- package/.nvmrc +1 -0
- package/.prettierignore +34 -0
- package/.prettierrc.json +1 -0
- package/.releaserc +27 -0
- package/CHANGELOG.md +6 -0
- package/README.md +15 -0
- package/dist/cjs/index.cjs +2646 -0
- package/dist/esm/client/gql.d.ts +1 -0
- package/dist/esm/client/gql.js +5 -0
- package/dist/esm/client/gql.js.map +1 -0
- package/dist/esm/client/index.d.ts +2 -0
- package/dist/esm/client/index.js +4 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/client/queries.d.ts +24 -0
- package/dist/esm/client/queries.js +152 -0
- package/dist/esm/client/queries.js.map +1 -0
- package/dist/esm/context.d.ts +30 -0
- package/dist/esm/context.js +2 -0
- package/dist/esm/context.js.map +1 -0
- package/dist/esm/errors.d.ts +17 -0
- package/dist/esm/errors.js +27 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/generate/generate.d.ts +7 -0
- package/dist/esm/generate/generate.js +211 -0
- package/dist/esm/generate/generate.js.map +1 -0
- package/dist/esm/generate/index.d.ts +3 -0
- package/dist/esm/generate/index.js +5 -0
- package/dist/esm/generate/index.js.map +1 -0
- package/dist/esm/generate/mutations.d.ts +2 -0
- package/dist/esm/generate/mutations.js +18 -0
- package/dist/esm/generate/mutations.js.map +1 -0
- package/dist/esm/generate/utils.d.ts +22 -0
- package/dist/esm/generate/utils.js +150 -0
- package/dist/esm/generate/utils.js.map +1 -0
- package/dist/esm/index.d.ts +10 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/migrations/generate.d.ts +28 -0
- package/dist/esm/migrations/generate.js +516 -0
- package/dist/esm/migrations/generate.js.map +1 -0
- package/dist/esm/migrations/index.d.ts +1 -0
- package/dist/esm/migrations/index.js +3 -0
- package/dist/esm/migrations/index.js.map +1 -0
- package/dist/esm/models.d.ts +170 -0
- package/dist/esm/models.js +27 -0
- package/dist/esm/models.js.map +1 -0
- package/dist/esm/permissions/check.d.ts +15 -0
- package/dist/esm/permissions/check.js +162 -0
- package/dist/esm/permissions/check.js.map +1 -0
- package/dist/esm/permissions/generate.d.ts +45 -0
- package/dist/esm/permissions/generate.js +77 -0
- package/dist/esm/permissions/generate.js.map +1 -0
- package/dist/esm/permissions/index.d.ts +2 -0
- package/dist/esm/permissions/index.js +4 -0
- package/dist/esm/permissions/index.js.map +1 -0
- package/dist/esm/resolvers/arguments.d.ts +26 -0
- package/dist/esm/resolvers/arguments.js +88 -0
- package/dist/esm/resolvers/arguments.js.map +1 -0
- package/dist/esm/resolvers/filters.d.ts +5 -0
- package/dist/esm/resolvers/filters.js +126 -0
- package/dist/esm/resolvers/filters.js.map +1 -0
- package/dist/esm/resolvers/index.d.ts +7 -0
- package/dist/esm/resolvers/index.js +9 -0
- package/dist/esm/resolvers/index.js.map +1 -0
- package/dist/esm/resolvers/mutations.d.ts +3 -0
- package/dist/esm/resolvers/mutations.js +255 -0
- package/dist/esm/resolvers/mutations.js.map +1 -0
- package/dist/esm/resolvers/node.d.ts +44 -0
- package/dist/esm/resolvers/node.js +102 -0
- package/dist/esm/resolvers/node.js.map +1 -0
- package/dist/esm/resolvers/resolver.d.ts +5 -0
- package/dist/esm/resolvers/resolver.js +143 -0
- package/dist/esm/resolvers/resolver.js.map +1 -0
- package/dist/esm/resolvers/resolvers.d.ts +9 -0
- package/dist/esm/resolvers/resolvers.js +39 -0
- package/dist/esm/resolvers/resolvers.js.map +1 -0
- package/dist/esm/resolvers/utils.d.ts +43 -0
- package/dist/esm/resolvers/utils.js +125 -0
- package/dist/esm/resolvers/utils.js.map +1 -0
- package/dist/esm/utils.d.ts +25 -0
- package/dist/esm/utils.js +159 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/esm/values.d.ts +15 -0
- package/dist/esm/values.js +7 -0
- package/dist/esm/values.js.map +1 -0
- package/jest.config.ts +12 -0
- package/package.json +66 -0
- package/renovate.json +32 -0
- package/src/client/gql.ts +7 -0
- package/src/client/index.ts +4 -0
- package/src/client/queries.ts +251 -0
- package/src/context.ts +27 -0
- package/src/errors.ts +32 -0
- package/src/generate/generate.ts +273 -0
- package/src/generate/index.ts +5 -0
- package/src/generate/mutations.ts +35 -0
- package/src/generate/utils.ts +223 -0
- package/src/index.ts +12 -0
- package/src/migrations/generate.ts +633 -0
- package/src/migrations/index.ts +3 -0
- package/src/models.ts +228 -0
- package/src/permissions/check.ts +239 -0
- package/src/permissions/generate.ts +143 -0
- package/src/permissions/index.ts +4 -0
- package/src/resolvers/arguments.ts +129 -0
- package/src/resolvers/filters.ts +163 -0
- package/src/resolvers/index.ts +9 -0
- package/src/resolvers/mutations.ts +313 -0
- package/src/resolvers/node.ts +193 -0
- package/src/resolvers/resolver.ts +223 -0
- package/src/resolvers/resolvers.ts +40 -0
- package/src/resolvers/utils.ts +188 -0
- package/src/utils.ts +186 -0
- package/src/values.ts +19 -0
- package/tests/unit/__snapshots__/generate.spec.ts.snap +105 -0
- package/tests/unit/__snapshots__/resolve.spec.ts.snap +60 -0
- package/tests/unit/generate.spec.ts +8 -0
- package/tests/unit/resolve.spec.ts +128 -0
- package/tests/unit/utils.ts +82 -0
- package/tsconfig.jest.json +13 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../../src/resolvers/arguments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA6BvC,SAAS,WAAW,CAAC,KAAgB,EAAE,MAAuB;IAC5D,QAAQ,KAAK,CAAC,IAAI,EAAE;QAClB,KAAK,IAAI,CAAC,IAAI;YACZ,IAAI,CAAC,MAAM,EAAE;gBACX,OAAO;aACR;YACD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACjE,KAAK,IAAI,CAAC,QAAQ;YAChB,OAAO,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG;YACX,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,IAAI;YACZ,OAAO,IAAI,CAAC;QACd,KAAK,IAAI,CAAC,KAAK;YACb,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,KAAK,IAAI,CAAC,MAAM,CAAC;QACjB,KAAK,IAAI,CAAC,OAAO,CAAC;QAClB,KAAK,IAAI,CAAC,IAAI;YACZ,OAAO,KAAK,CAAC,KAAK,CAAC;QACrB,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;YAChB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;gBACxB,OAAO;aACR;YACD,MAAM,GAAG,GAA0B,EAAE,CAAC;YACtC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE;gBAChC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;aAC1D;YACD,OAAO,GAAG,CAAC;SACZ;KACF;AACH,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAuB,EAAE,EAAE;IAC5D,MAAM,mBAAmB,GAAwB,EAAE,CAAC;IACpD,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QACxB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YAC3C,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3E,MAAM,eAAe,GAAG,cAAc,CACpC,QAAQ,EACR,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,IAAI,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EACzF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CACrB,CAAC;YACF,IAAI,eAAe,KAAK,SAAS,EAAE;gBACjC,SAAS;aACV;YACD,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,eAAsB,CAAC;SACnE;KACF;IACD,OAAO,mBAAmB,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,IAAc,EAAE,MAAqB;IAChF,QAAQ,IAAI,CAAC,IAAI,EAAE;QACjB,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC;YACnB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACxB,MAAM,GAAG,GAAY,EAAE,CAAC;gBACxB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;oBACrB,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;iBAChD;gBACD,OAAO,GAAG,CAAC;aACZ;YAED,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACjE,IAAI,eAAe,KAAK,SAAS,EAAE;gBACjC,OAAO;aACR;YAED,OAAO,CAAC,eAAe,CAAC,CAAC;SAC1B;QACD,KAAK,IAAI,CAAC,aAAa;YACrB,OAAO,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClD,KAAK,IAAI,CAAC,UAAU;YAClB,OAAO,8BAA8B,CACnC,KAAK,EACJ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAA8B,EAAE,OAAO,EACtE,MAAM,CACP,CAAC;KACL;AACH,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,KAAY,EAAE,IAA+B,EAAE,MAAqB,EAAE,EAAE;IACrH,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,4BAA4B,EAAE;QAC5D,OAAO,KAAK,CAAC;KACd;IACD,IAAI,CAAC,KAAK,EAAE;QACV,OAAO;KACR;IACD,MAAM,GAAG,GAA0B,EAAE,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACpC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,eAAe,GAAG,cAAc,CAAE,KAA+B,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClG,IAAI,eAAe,KAAK,SAAS,EAAE;YACjC,SAAS;SACV;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC;KAC5B;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
import { FieldResolverNode } from './node';
|
|
3
|
+
import { Joins } from './utils';
|
|
4
|
+
export declare const SPECIAL_FILTERS: Record<string, string>;
|
|
5
|
+
export declare const applyFilters: (node: FieldResolverNode, query: Knex.QueryBuilder, joins: Joins) => void;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { ForbiddenError, UserInputError } from '../errors';
|
|
2
|
+
import { get, summonByName } from '../utils';
|
|
3
|
+
import { normalizeArguments } from './arguments';
|
|
4
|
+
import { addJoin, apply, ors } from './utils';
|
|
5
|
+
export const SPECIAL_FILTERS = {
|
|
6
|
+
GT: '?? > ?',
|
|
7
|
+
GTE: '?? >= ?',
|
|
8
|
+
LT: '?? < ?',
|
|
9
|
+
LTE: '?? <= ?',
|
|
10
|
+
};
|
|
11
|
+
export const applyFilters = (node, query, joins) => {
|
|
12
|
+
const normalizedArguments = normalizeArguments(node);
|
|
13
|
+
if (!normalizedArguments.orderBy) {
|
|
14
|
+
if (node.model.defaultOrderBy) {
|
|
15
|
+
normalizedArguments.orderBy = node.model.defaultOrderBy;
|
|
16
|
+
}
|
|
17
|
+
else if (node.model.creatable) {
|
|
18
|
+
normalizedArguments.orderBy = [{ createdAt: 'DESC' }];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (node.model.deletable) {
|
|
22
|
+
if (!normalizedArguments.where) {
|
|
23
|
+
normalizedArguments.where = {};
|
|
24
|
+
}
|
|
25
|
+
if (normalizedArguments.where.deleted &&
|
|
26
|
+
(!Array.isArray(normalizedArguments.where.deleted) || normalizedArguments.where.deleted.some((v) => v))) {
|
|
27
|
+
if (node.ctx.user.role !== 'ADMIN') {
|
|
28
|
+
throw new ForbiddenError('You cannot access deleted entries.');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
normalizedArguments.where.deleted = false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const { limit, offset, orderBy, where, search } = normalizedArguments;
|
|
36
|
+
if (limit) {
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
38
|
+
query.limit(limit);
|
|
39
|
+
}
|
|
40
|
+
if (offset) {
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
42
|
+
query.offset(offset);
|
|
43
|
+
}
|
|
44
|
+
if (orderBy) {
|
|
45
|
+
applyOrderBy(node, orderBy, query);
|
|
46
|
+
}
|
|
47
|
+
if (where) {
|
|
48
|
+
const ops = [];
|
|
49
|
+
applyWhere(node, where, ops, joins);
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
51
|
+
apply(query, ops);
|
|
52
|
+
}
|
|
53
|
+
if (search) {
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
55
|
+
applySearch(node, search, query);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const applyWhere = (node, where, ops, joins) => {
|
|
59
|
+
for (const key of Object.keys(where)) {
|
|
60
|
+
const value = where[key];
|
|
61
|
+
const specialFilter = key.match(/^(\w+)_(\w+)$/);
|
|
62
|
+
if (specialFilter) {
|
|
63
|
+
const [, actualKey, filter] = specialFilter;
|
|
64
|
+
if (!SPECIAL_FILTERS[filter]) {
|
|
65
|
+
// Should not happen
|
|
66
|
+
throw new Error(`Invalid filter ${key}.`);
|
|
67
|
+
}
|
|
68
|
+
ops.push((query) => query.whereRaw(SPECIAL_FILTERS[filter], [`${node.shortTableAlias}.${actualKey}`, value]));
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const field = summonByName(node.model.fields, key);
|
|
72
|
+
const fullKey = `${node.shortTableAlias}.${key}`;
|
|
73
|
+
if (field.relation) {
|
|
74
|
+
const relation = get(node.model.relationsByName, field.name);
|
|
75
|
+
const tableAlias = `${node.model.name}__W__${key}`;
|
|
76
|
+
const subNode = {
|
|
77
|
+
ctx: node.ctx,
|
|
78
|
+
model: relation.model,
|
|
79
|
+
tableName: relation.model.name,
|
|
80
|
+
tableAlias,
|
|
81
|
+
shortTableAlias: node.ctx.aliases.getShort(tableAlias),
|
|
82
|
+
foreignKey: relation.field.foreignKey,
|
|
83
|
+
};
|
|
84
|
+
addJoin(joins, node.tableAlias, subNode.tableName, subNode.tableAlias, get(subNode, 'foreignKey'), 'id');
|
|
85
|
+
applyWhere(subNode, value, ops, joins);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (Array.isArray(value)) {
|
|
89
|
+
if (field && field.list) {
|
|
90
|
+
ops.push((query) => ors(query, value.map((v) => (subQuery) => subQuery.whereRaw('? = ANY(??)', [v, fullKey]))));
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (value.some((v) => v === null)) {
|
|
94
|
+
if (value.some((v) => v !== null)) {
|
|
95
|
+
ops.push((query) => ors(query, [
|
|
96
|
+
(subQuery) => subQuery.whereIn(fullKey, value.filter((v) => v !== null)),
|
|
97
|
+
(subQuery) => subQuery.whereNull(fullKey),
|
|
98
|
+
]));
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
ops.push((query) => query.whereNull(fullKey));
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
ops.push((query) => query.whereIn(fullKey, value));
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
ops.push((query) => query.where({ [fullKey]: value }));
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
const applySearch = (node, search, query) => ors(query, node.model.fields
|
|
111
|
+
.filter(({ searchable }) => searchable)
|
|
112
|
+
.map(({ name }) => (query) => query.whereILike(`${node.shortTableAlias}.${name}`, `%${search}%`)));
|
|
113
|
+
const applyOrderBy = (node, orderBy, query) => {
|
|
114
|
+
for (const vals of orderBy) {
|
|
115
|
+
const keys = Object.keys(vals);
|
|
116
|
+
if (keys.length !== 1) {
|
|
117
|
+
throw new UserInputError(`You need to specify exactly 1 value to order by for each orderBy entry.`);
|
|
118
|
+
}
|
|
119
|
+
const key = keys[0];
|
|
120
|
+
const value = vals[key];
|
|
121
|
+
// Simple field
|
|
122
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
123
|
+
query.orderBy(`${node.shortTableAlias}.${key}`, value);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/resolvers/filters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// created from 'create-ts-index'
|
|
2
|
+
export * from './arguments';
|
|
3
|
+
export * from './filters';
|
|
4
|
+
export * from './mutations';
|
|
5
|
+
export * from './node';
|
|
6
|
+
export * from './resolver';
|
|
7
|
+
export * from './resolvers';
|
|
8
|
+
export * from './utils';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { v4 as uuid } from 'uuid';
|
|
2
|
+
import { ForbiddenError, GraphQLError } from '../errors';
|
|
3
|
+
import { isEnumList } from '../models';
|
|
4
|
+
import { applyPermissions, checkCanWrite, getEntityToMutate } from '../permissions/check';
|
|
5
|
+
import { get, it, summonByName, typeToField } from '../utils';
|
|
6
|
+
import { resolve } from './resolver';
|
|
7
|
+
import { AliasGenerator } from './utils';
|
|
8
|
+
export const mutationResolver = async (_parent, args, partialCtx, info) => {
|
|
9
|
+
return await partialCtx.knex.transaction(async (knex) => {
|
|
10
|
+
const [, mutation, modelName] = it(info.fieldName.match(/^(create|update|delete|restore)(.+)$/));
|
|
11
|
+
const ctx = { ...partialCtx, knex, info, aliases: new AliasGenerator() };
|
|
12
|
+
const model = summonByName(ctx.models, modelName);
|
|
13
|
+
switch (mutation) {
|
|
14
|
+
case 'create':
|
|
15
|
+
return await create(model, args, ctx);
|
|
16
|
+
case 'update':
|
|
17
|
+
return await update(model, args, ctx);
|
|
18
|
+
case 'delete':
|
|
19
|
+
return await del(model, args, ctx);
|
|
20
|
+
case 'restore':
|
|
21
|
+
return await restore(model, args, ctx);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
const create = async (model, { data: input }, ctx) => {
|
|
26
|
+
const normalizedInput = { ...input };
|
|
27
|
+
normalizedInput.id = uuid();
|
|
28
|
+
normalizedInput.createdAt = ctx.now;
|
|
29
|
+
normalizedInput.createdById = ctx.user.id;
|
|
30
|
+
sanitize(ctx, model, normalizedInput);
|
|
31
|
+
await checkCanWrite(ctx, model, normalizedInput, 'CREATE');
|
|
32
|
+
await ctx.handleUploads?.(normalizedInput);
|
|
33
|
+
const data = { prev: {}, input, normalizedInput, next: normalizedInput };
|
|
34
|
+
await ctx.mutationHook?.(model, 'create', 'before', data, ctx);
|
|
35
|
+
await ctx.knex(model.name).insert(normalizedInput);
|
|
36
|
+
await createRevision(model, normalizedInput, ctx);
|
|
37
|
+
await ctx.mutationHook?.(model, 'create', 'after', data, ctx);
|
|
38
|
+
return await resolve(ctx, normalizedInput.id);
|
|
39
|
+
};
|
|
40
|
+
const update = async (model, { where, data: input }, ctx) => {
|
|
41
|
+
if (Object.keys(where).length === 0) {
|
|
42
|
+
throw new Error(`No ${model.name} specified.`);
|
|
43
|
+
}
|
|
44
|
+
const normalizedInput = { ...input };
|
|
45
|
+
sanitize(ctx, model, normalizedInput);
|
|
46
|
+
const prev = await getEntityToMutate(ctx, model, where, 'UPDATE');
|
|
47
|
+
// Remove data that wouldn't mutate given that it's irrelevant for permissions
|
|
48
|
+
for (const key of Object.keys(normalizedInput)) {
|
|
49
|
+
if (normalizedInput[key] === prev[key]) {
|
|
50
|
+
delete normalizedInput[key];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (Object.keys(normalizedInput).length > 0) {
|
|
54
|
+
await checkCanWrite(ctx, model, normalizedInput, 'UPDATE');
|
|
55
|
+
await ctx.handleUploads?.(normalizedInput);
|
|
56
|
+
const next = { ...prev, ...normalizedInput };
|
|
57
|
+
const data = { prev, input, normalizedInput, next };
|
|
58
|
+
await ctx.mutationHook?.(model, 'update', 'before', data, ctx);
|
|
59
|
+
await ctx.knex(model.name).where(where).update(normalizedInput);
|
|
60
|
+
await createRevision(model, next, ctx);
|
|
61
|
+
await ctx.mutationHook?.(model, 'update', 'after', data, ctx);
|
|
62
|
+
}
|
|
63
|
+
return await resolve(ctx);
|
|
64
|
+
};
|
|
65
|
+
const del = async (model, { where, dryRun }, ctx) => {
|
|
66
|
+
if (Object.keys(where).length === 0) {
|
|
67
|
+
throw new Error(`No ${model.name} specified.`);
|
|
68
|
+
}
|
|
69
|
+
const entity = await getEntityToMutate(ctx, model, where, 'DELETE');
|
|
70
|
+
if (entity.deleted) {
|
|
71
|
+
throw new ForbiddenError('Entity is already deleted.');
|
|
72
|
+
}
|
|
73
|
+
const toDelete = {};
|
|
74
|
+
const toUnlink = {};
|
|
75
|
+
const beforeHooks = [];
|
|
76
|
+
const mutations = [];
|
|
77
|
+
const afterHooks = [];
|
|
78
|
+
const deleteCascade = async (currentModel, entity) => {
|
|
79
|
+
if (entity.deleted) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (dryRun) {
|
|
83
|
+
if (!(currentModel.name in toDelete)) {
|
|
84
|
+
toDelete[currentModel.name] = {};
|
|
85
|
+
}
|
|
86
|
+
toDelete[currentModel.name][entity.id] = entity[currentModel.displayField || 'id'] || entity.id;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const normalizedInput = { deleted: true, deletedAt: ctx.now, deletedById: ctx.user.id };
|
|
90
|
+
const data = { prev: entity, input: {}, normalizedInput, next: { ...entity, ...normalizedInput } };
|
|
91
|
+
if (ctx.mutationHook) {
|
|
92
|
+
beforeHooks.push(async () => {
|
|
93
|
+
await ctx.mutationHook(currentModel, 'delete', 'before', data, ctx);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
mutations.push(async () => {
|
|
97
|
+
await ctx.knex(currentModel.name).where({ id: entity.id }).update(normalizedInput);
|
|
98
|
+
await createRevision(currentModel, { ...entity, deleted: true }, ctx);
|
|
99
|
+
});
|
|
100
|
+
if (ctx.mutationHook) {
|
|
101
|
+
afterHooks.push(async () => {
|
|
102
|
+
await ctx.mutationHook(currentModel, 'delete', 'after', data, ctx);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for (const { model: descendantModel, foreignKey, field: { name, onDelete }, } of currentModel.reverseRelations) {
|
|
107
|
+
const query = ctx.knex(descendantModel.name).where({ [foreignKey]: entity.id });
|
|
108
|
+
switch (onDelete) {
|
|
109
|
+
case 'set-null': {
|
|
110
|
+
const descendants = await query;
|
|
111
|
+
for (const descendant of descendants) {
|
|
112
|
+
if (dryRun) {
|
|
113
|
+
if (!toUnlink[descendantModel.name]) {
|
|
114
|
+
toUnlink[descendantModel.name] = {};
|
|
115
|
+
}
|
|
116
|
+
if (!toUnlink[descendantModel.name][descendant.id]) {
|
|
117
|
+
toUnlink[descendantModel.name][descendant.id] = {
|
|
118
|
+
display: descendant[descendantModel.displayField || 'id'] || entity.id,
|
|
119
|
+
fields: [],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
toUnlink[descendantModel.name][descendant.id].fields.push(name);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
mutations.push(async () => {
|
|
126
|
+
await ctx
|
|
127
|
+
.knex(descendantModel.name)
|
|
128
|
+
.where({ id: descendant.id })
|
|
129
|
+
.update({
|
|
130
|
+
[`${name}Id`]: null,
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
case 'cascade':
|
|
138
|
+
default: {
|
|
139
|
+
applyPermissions(ctx, descendantModel.name, descendantModel.name, query, 'DELETE');
|
|
140
|
+
const descendants = await query;
|
|
141
|
+
if (descendants.length && !descendantModel.deletable) {
|
|
142
|
+
throw new ForbiddenError(`This ${model.name} depends on a ${descendantModel.name} which cannot be deleted.`);
|
|
143
|
+
}
|
|
144
|
+
for (const descendant of descendants) {
|
|
145
|
+
await deleteCascade(descendantModel, descendant);
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
await deleteCascade(model, entity);
|
|
153
|
+
for (const callback of [...beforeHooks, ...mutations, ...afterHooks]) {
|
|
154
|
+
await callback();
|
|
155
|
+
}
|
|
156
|
+
if (dryRun) {
|
|
157
|
+
throw new GraphQLError(`Delete dry run:`, {
|
|
158
|
+
code: 'DELETE_DRY_RUN',
|
|
159
|
+
toDelete,
|
|
160
|
+
toUnlink,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return entity.id;
|
|
164
|
+
};
|
|
165
|
+
const restore = async (model, { where }, ctx) => {
|
|
166
|
+
if (Object.keys(where).length === 0) {
|
|
167
|
+
throw new Error(`No ${model.name} specified.`);
|
|
168
|
+
}
|
|
169
|
+
const entity = await getEntityToMutate(ctx, model, where, 'RESTORE');
|
|
170
|
+
if (!entity.deleted) {
|
|
171
|
+
throw new ForbiddenError('Entity is not deleted.');
|
|
172
|
+
}
|
|
173
|
+
const beforeHooks = [];
|
|
174
|
+
const mutations = [];
|
|
175
|
+
const afterHooks = [];
|
|
176
|
+
const restoreCascade = async (currentModel, relatedEntity) => {
|
|
177
|
+
if (!relatedEntity.deleted || !relatedEntity.deletedAt || !relatedEntity.deletedAt.equals(entity.deletedAt)) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const normalizedInput = { deleted: false, deletedAt: null, deletedById: null };
|
|
181
|
+
const data = { prev: relatedEntity, input: {}, normalizedInput, next: { ...relatedEntity, ...normalizedInput } };
|
|
182
|
+
if (ctx.mutationHook) {
|
|
183
|
+
beforeHooks.push(async () => {
|
|
184
|
+
await ctx.mutationHook(model, 'restore', 'before', data, ctx);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
mutations.push(async () => {
|
|
188
|
+
await ctx.knex(currentModel.name).where({ id: relatedEntity.id }).update(normalizedInput);
|
|
189
|
+
await createRevision(currentModel, { ...relatedEntity, deleted: false }, ctx);
|
|
190
|
+
});
|
|
191
|
+
if (ctx.mutationHook) {
|
|
192
|
+
afterHooks.push(async () => {
|
|
193
|
+
await ctx.mutationHook(model, 'restore', 'after', data, ctx);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
for (const { model: descendantModel, foreignKey } of currentModel.reverseRelations.filter(({ model: { deletable } }) => deletable)) {
|
|
197
|
+
const query = ctx.knex(descendantModel.name).where({ [foreignKey]: relatedEntity.id });
|
|
198
|
+
applyPermissions(ctx, descendantModel.name, descendantModel.name, query, 'RESTORE');
|
|
199
|
+
const descendants = await query;
|
|
200
|
+
for (const descendant of descendants) {
|
|
201
|
+
await restoreCascade(descendantModel, descendant);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
await restoreCascade(model, entity);
|
|
206
|
+
for (const callback of [...beforeHooks, ...mutations, ...afterHooks]) {
|
|
207
|
+
await callback();
|
|
208
|
+
}
|
|
209
|
+
return entity.id;
|
|
210
|
+
};
|
|
211
|
+
const createRevision = async (model, data, ctx) => {
|
|
212
|
+
if (model.updatable) {
|
|
213
|
+
const revisionData = {
|
|
214
|
+
id: uuid(),
|
|
215
|
+
[`${typeToField(model.name)}Id`]: data.id,
|
|
216
|
+
createdAt: ctx.now,
|
|
217
|
+
createdById: ctx.user.id,
|
|
218
|
+
};
|
|
219
|
+
if (model.deletable) {
|
|
220
|
+
revisionData.deleted = data.deleted || false;
|
|
221
|
+
}
|
|
222
|
+
for (const { name, relation, nonNull, ...field } of model.fields.filter(({ updatable }) => updatable)) {
|
|
223
|
+
const col = relation ? `${name}Id` : name;
|
|
224
|
+
if (nonNull && (!(col in data) || col === undefined || col === null)) {
|
|
225
|
+
revisionData[col] = get(field, 'default');
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
revisionData[col] = data[col];
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
await ctx.knex(`${model.name}Revision`).insert(revisionData);
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
const sanitize = (ctx, model, data) => {
|
|
235
|
+
if (model.updatable) {
|
|
236
|
+
data.updatedAt = ctx.now;
|
|
237
|
+
data.updatedById = ctx.user.id;
|
|
238
|
+
}
|
|
239
|
+
for (const key of Object.keys(data)) {
|
|
240
|
+
const field = model.fields.find(({ name }) => name === key);
|
|
241
|
+
if (!field) {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (isEndOfDay(field) && data[key]) {
|
|
245
|
+
data[key] = data[key].endOf('day');
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
if (isEnumList(ctx.rawModels, field) && Array.isArray(data[key])) {
|
|
249
|
+
data[key] = `{${data[key].join(',')}}`;
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
const isEndOfDay = (field) => field?.endOfDay === true && field?.dateTimeType === 'date' && field?.type === 'DateTime';
|
|
255
|
+
//# sourceMappingURL=mutations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutations.js","sourceRoot":"","sources":["../../../src/resolvers/mutations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { FieldDefinitionNode, FieldNode, FragmentDefinitionNode, InlineFragmentNode, ObjectTypeDefinitionNode, SelectionNode } from 'graphql';
|
|
2
|
+
import { FullContext } from '../context';
|
|
3
|
+
import { Model } from '../models';
|
|
4
|
+
export type ResolverNode = {
|
|
5
|
+
ctx: FullContext;
|
|
6
|
+
tableName: string;
|
|
7
|
+
tableAlias: string;
|
|
8
|
+
shortTableAlias: string;
|
|
9
|
+
baseTypeDefinition: ObjectTypeDefinitionNode;
|
|
10
|
+
baseModel?: Model;
|
|
11
|
+
typeDefinition: ObjectTypeDefinitionNode;
|
|
12
|
+
model: Model;
|
|
13
|
+
selectionSet: readonly SelectionNode[];
|
|
14
|
+
};
|
|
15
|
+
export type FieldResolverNode = ResolverNode & {
|
|
16
|
+
field: FieldNode;
|
|
17
|
+
fieldDefinition: FieldDefinitionNode;
|
|
18
|
+
foreignKey?: string;
|
|
19
|
+
isList: boolean;
|
|
20
|
+
};
|
|
21
|
+
export type WhereNode = {
|
|
22
|
+
ctx: FullContext;
|
|
23
|
+
tableName: string;
|
|
24
|
+
tableAlias: string;
|
|
25
|
+
shortTableAlias: string;
|
|
26
|
+
model: Model;
|
|
27
|
+
foreignKey?: string;
|
|
28
|
+
};
|
|
29
|
+
export declare const getResolverNode: ({ ctx, node, tableAlias, baseTypeDefinition, typeName, }: {
|
|
30
|
+
ctx: FullContext;
|
|
31
|
+
node: FieldNode | InlineFragmentNode | FragmentDefinitionNode;
|
|
32
|
+
baseTypeDefinition: ObjectTypeDefinitionNode;
|
|
33
|
+
tableAlias: string;
|
|
34
|
+
typeName: string;
|
|
35
|
+
}) => ResolverNode;
|
|
36
|
+
export declare const getRootFieldNode: ({ ctx, node, baseTypeDefinition, }: {
|
|
37
|
+
ctx: FullContext;
|
|
38
|
+
node: FieldNode;
|
|
39
|
+
baseTypeDefinition: ObjectTypeDefinitionNode;
|
|
40
|
+
}) => FieldResolverNode;
|
|
41
|
+
export declare const getSimpleFields: (node: ResolverNode) => FieldNode[];
|
|
42
|
+
export declare const getInlineFragments: (node: ResolverNode) => ResolverNode[];
|
|
43
|
+
export declare const getFragmentSpreads: (node: ResolverNode) => ResolverNode[];
|
|
44
|
+
export declare const getJoins: (node: ResolverNode, toMany: boolean) => FieldResolverNode[];
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { isJsonObjectModel } from '../models';
|
|
2
|
+
import { get, summonByKey, summonByName } from '../utils';
|
|
3
|
+
import { getFragmentTypeName, getNameOrAlias, getType, getTypeName, isFieldNode, isFragmentSpreadNode, isInlineFragmentNode, isListType, } from './utils';
|
|
4
|
+
export const getResolverNode = ({ ctx, node, tableAlias, baseTypeDefinition, typeName, }) => ({
|
|
5
|
+
ctx,
|
|
6
|
+
tableName: typeName,
|
|
7
|
+
tableAlias,
|
|
8
|
+
shortTableAlias: ctx.aliases.getShort(tableAlias),
|
|
9
|
+
baseTypeDefinition,
|
|
10
|
+
baseModel: ctx.models.find((model) => model.name === baseTypeDefinition.name.value),
|
|
11
|
+
typeDefinition: getType(ctx.info.schema, typeName),
|
|
12
|
+
model: summonByName(ctx.models, typeName),
|
|
13
|
+
selectionSet: get(node.selectionSet, 'selections'),
|
|
14
|
+
});
|
|
15
|
+
export const getRootFieldNode = ({ ctx, node, baseTypeDefinition, }) => {
|
|
16
|
+
const fieldName = node.name.value;
|
|
17
|
+
const fieldDefinition = summonByKey(baseTypeDefinition.fields || [], 'name.value', fieldName);
|
|
18
|
+
const typeName = getTypeName(fieldDefinition.type);
|
|
19
|
+
return {
|
|
20
|
+
ctx,
|
|
21
|
+
tableName: typeName,
|
|
22
|
+
tableAlias: typeName,
|
|
23
|
+
shortTableAlias: ctx.aliases.getShort(typeName),
|
|
24
|
+
baseTypeDefinition,
|
|
25
|
+
typeDefinition: getType(ctx.info.schema, typeName),
|
|
26
|
+
model: summonByName(ctx.models, typeName),
|
|
27
|
+
selectionSet: get(node.selectionSet, 'selections'),
|
|
28
|
+
field: node,
|
|
29
|
+
fieldDefinition,
|
|
30
|
+
isList: isListType(fieldDefinition.type),
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
export const getSimpleFields = (node) => {
|
|
34
|
+
return node.selectionSet.filter(isFieldNode).filter((selection) => {
|
|
35
|
+
if (!selection.selectionSet) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return node.model.fields.some(({ json, name }) => json && name === selection.name.value);
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
export const getInlineFragments = (node) => node.selectionSet.filter(isInlineFragmentNode).map((subNode) => getResolverNode({
|
|
42
|
+
ctx: node.ctx,
|
|
43
|
+
node: subNode,
|
|
44
|
+
tableAlias: node.tableAlias + '__' + getFragmentTypeName(subNode),
|
|
45
|
+
baseTypeDefinition: node.baseTypeDefinition,
|
|
46
|
+
typeName: getFragmentTypeName(subNode),
|
|
47
|
+
}));
|
|
48
|
+
export const getFragmentSpreads = (node) => node.selectionSet.filter(isFragmentSpreadNode).map((subNode) => getResolverNode({
|
|
49
|
+
ctx: node.ctx,
|
|
50
|
+
node: node.ctx.info.fragments[subNode.name.value],
|
|
51
|
+
tableAlias: node.tableAlias,
|
|
52
|
+
baseTypeDefinition: node.baseTypeDefinition,
|
|
53
|
+
typeName: node.model.name,
|
|
54
|
+
}));
|
|
55
|
+
export const getJoins = (node, toMany) => {
|
|
56
|
+
const nodes = [];
|
|
57
|
+
for (const subNode of node.selectionSet.filter(isFieldNode).filter(({ selectionSet }) => selectionSet)) {
|
|
58
|
+
const ctx = node.ctx;
|
|
59
|
+
const baseTypeDefinition = node.typeDefinition;
|
|
60
|
+
const fieldName = subNode.name.value;
|
|
61
|
+
const fieldNameOrAlias = getNameOrAlias(subNode);
|
|
62
|
+
const fieldDefinition = summonByKey(baseTypeDefinition.fields || [], 'name.value', fieldName);
|
|
63
|
+
const typeName = getTypeName(fieldDefinition.type);
|
|
64
|
+
if (isJsonObjectModel(summonByName(ctx.rawModels, typeName))) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const baseModel = summonByName(ctx.models, baseTypeDefinition.name.value);
|
|
68
|
+
let foreignKey;
|
|
69
|
+
if (toMany) {
|
|
70
|
+
const reverseRelation = baseModel.reverseRelationsByName[fieldName];
|
|
71
|
+
if (!reverseRelation) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
foreignKey = reverseRelation.foreignKey;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const modelField = baseModel.fieldsByName[fieldName];
|
|
78
|
+
if (!modelField || modelField.raw) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
foreignKey = modelField.foreignKey;
|
|
82
|
+
}
|
|
83
|
+
const tableAlias = node.tableAlias + '__' + fieldNameOrAlias;
|
|
84
|
+
nodes.push({
|
|
85
|
+
ctx,
|
|
86
|
+
tableName: typeName,
|
|
87
|
+
tableAlias,
|
|
88
|
+
shortTableAlias: ctx.aliases.getShort(tableAlias),
|
|
89
|
+
baseTypeDefinition,
|
|
90
|
+
baseModel,
|
|
91
|
+
typeDefinition: getType(ctx.info.schema, typeName),
|
|
92
|
+
model: summonByName(ctx.models, typeName),
|
|
93
|
+
selectionSet: get(subNode.selectionSet, 'selections'),
|
|
94
|
+
field: subNode,
|
|
95
|
+
fieldDefinition,
|
|
96
|
+
foreignKey,
|
|
97
|
+
isList: isListType(fieldDefinition.type),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return nodes;
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/resolvers/node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { GraphQLResolveInfo } from 'graphql';
|
|
2
|
+
import { Context, FullContext } from '../context';
|
|
3
|
+
import { Entry } from './utils';
|
|
4
|
+
export declare const queryResolver: (_parent: any, _args: any, ctx: Context, info: GraphQLResolveInfo) => Promise<Entry | Entry[]>;
|
|
5
|
+
export declare const resolve: (ctx: FullContext, id?: string) => Promise<Entry | Entry[]>;
|