@smartive/graphql-magic 10.0.0 → 11.1.0
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 +20 -9
- package/dist/esm/client/queries.js +1 -1
- package/dist/esm/client/queries.js.map +1 -1
- package/dist/esm/errors.d.ts +1 -1
- package/dist/esm/errors.js +2 -2
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/permissions/check.js +6 -6
- package/dist/esm/permissions/check.js.map +1 -1
- package/dist/esm/resolvers/selects.js +1 -1
- package/dist/esm/resolvers/selects.js.map +1 -1
- package/package.json +9 -9
- package/src/client/queries.ts +1 -1
- package/src/errors.ts +2 -2
- package/src/permissions/check.ts +16 -6
- package/src/resolvers/selects.ts +1 -0
- package/tests/unit/__snapshots__/resolve.spec.ts.snap +0 -43
- package/tests/unit/resolve.spec.ts +1 -107
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# [
|
|
1
|
+
# [11.1.0](https://github.com/smartive/graphql-magic/compare/v11.0.0...v11.1.0) (2023-11-16)
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
###
|
|
4
|
+
### Features
|
|
5
5
|
|
|
6
|
-
*
|
|
6
|
+
* Update knex ([e7821f6](https://github.com/smartive/graphql-magic/commit/e7821f6d11c4ce92b39f06a890a991ddf7ba3523))
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -861,7 +861,7 @@ var isVisibleRelation = (visibleRelationsByRole, modelName, role) => {
|
|
|
861
861
|
const whitelist = visibleRelationsByRole[role]?.[modelName];
|
|
862
862
|
return (relation) => whitelist ? whitelist.includes(relation.name) : true;
|
|
863
863
|
};
|
|
864
|
-
var getEntityQuery = (model, role, visibleRelationsByRole, typesWithSubRelations) => `query
|
|
864
|
+
var getEntityQuery = (model, role, visibleRelationsByRole, typesWithSubRelations) => `query Get${model.name}Entity ($id: ID!) {
|
|
865
865
|
data: ${typeToField(model.name)}(where: { id: $id }) {
|
|
866
866
|
${displayField(model)}
|
|
867
867
|
${model.fields.filter(and(isSimpleField, isQueriableBy(role))).map(({ name: name2 }) => name2)}
|
|
@@ -1552,8 +1552,8 @@ var UserInputError = class extends GraphQLError {
|
|
|
1552
1552
|
}
|
|
1553
1553
|
};
|
|
1554
1554
|
var PermissionError = class extends ForbiddenError {
|
|
1555
|
-
constructor(action, what, why) {
|
|
1556
|
-
super(`
|
|
1555
|
+
constructor(role, action, what, why) {
|
|
1556
|
+
super(`Role ${role} does not have sufficient permissions to ${action.toLowerCase()} ${what} (${why}).`);
|
|
1557
1557
|
}
|
|
1558
1558
|
};
|
|
1559
1559
|
|
|
@@ -1744,7 +1744,7 @@ var getEntityToMutate = async (ctx, model, where, action) => {
|
|
|
1744
1744
|
console.error(
|
|
1745
1745
|
`Permission error: ${Object.entries(where).map(([key, value2]) => `${key}: ${value2}`).join(", ")}`
|
|
1746
1746
|
);
|
|
1747
|
-
throw new PermissionError(action, `this ${model.name}`, "no available permissions applied");
|
|
1747
|
+
throw new PermissionError(ctx.user.role, action, `this ${model.name}`, "no available permissions applied");
|
|
1748
1748
|
}
|
|
1749
1749
|
if (model.parent) {
|
|
1750
1750
|
const subEntity = await ctx.knex(model.name).where({ id: entity.id }).first();
|
|
@@ -1758,7 +1758,7 @@ var checkCanWrite = async (ctx, model, data, action) => {
|
|
|
1758
1758
|
return;
|
|
1759
1759
|
}
|
|
1760
1760
|
if (permissionStack === false) {
|
|
1761
|
-
throw new PermissionError(action, model.plural, "no applicable permissions");
|
|
1761
|
+
throw new PermissionError(ctx.user.role, action, model.plural, "no applicable permissions");
|
|
1762
1762
|
}
|
|
1763
1763
|
const query = ctx.knex.select(1).first();
|
|
1764
1764
|
let linked = false;
|
|
@@ -1770,7 +1770,12 @@ var checkCanWrite = async (ctx, model, data, action) => {
|
|
|
1770
1770
|
}
|
|
1771
1771
|
const fieldPermissions = field[action === "CREATE" ? "creatable" : "updatable"];
|
|
1772
1772
|
if (fieldPermissions && typeof fieldPermissions === "object" && !fieldPermissions.roles?.includes(ctx.user.role)) {
|
|
1773
|
-
throw new PermissionError(
|
|
1773
|
+
throw new PermissionError(
|
|
1774
|
+
ctx.user.role,
|
|
1775
|
+
action,
|
|
1776
|
+
`this ${model.name}'s ${field.name}`,
|
|
1777
|
+
"field permission not available"
|
|
1778
|
+
);
|
|
1774
1779
|
}
|
|
1775
1780
|
linked = true;
|
|
1776
1781
|
const fieldPermissionStack = getPermissionStack(ctx, field.type, "LINK");
|
|
@@ -1779,7 +1784,12 @@ var checkCanWrite = async (ctx, model, data, action) => {
|
|
|
1779
1784
|
continue;
|
|
1780
1785
|
}
|
|
1781
1786
|
if (fieldPermissionStack === false || !fieldPermissionStack.length) {
|
|
1782
|
-
throw new PermissionError(
|
|
1787
|
+
throw new PermissionError(
|
|
1788
|
+
ctx.user.role,
|
|
1789
|
+
action,
|
|
1790
|
+
`this ${model.name}'s ${field.name}`,
|
|
1791
|
+
"no applicable permissions on data to link"
|
|
1792
|
+
);
|
|
1783
1793
|
}
|
|
1784
1794
|
ors(
|
|
1785
1795
|
query,
|
|
@@ -1791,10 +1801,10 @@ var checkCanWrite = async (ctx, model, data, action) => {
|
|
|
1791
1801
|
if (linked) {
|
|
1792
1802
|
const canMutate = await query;
|
|
1793
1803
|
if (!canMutate) {
|
|
1794
|
-
throw new PermissionError(action, `this ${model.name}`, "no linkable entities");
|
|
1804
|
+
throw new PermissionError(ctx.user.role, action, `this ${model.name}`, "no linkable entities");
|
|
1795
1805
|
}
|
|
1796
1806
|
} else if (action === "CREATE") {
|
|
1797
|
-
throw new PermissionError(action, `this ${model.name}`, "no linkable entities");
|
|
1807
|
+
throw new PermissionError(ctx.user.role, action, `this ${model.name}`, "no linkable entities");
|
|
1798
1808
|
}
|
|
1799
1809
|
};
|
|
1800
1810
|
var permissionLinkQuery = (ctx, subQuery, links, id) => {
|
|
@@ -2291,6 +2301,7 @@ var applySelects = (node, query, joins) => {
|
|
|
2291
2301
|
}
|
|
2292
2302
|
if (typeof field.queriable === "object" && !field.queriable.roles?.includes(node.ctx.user.role)) {
|
|
2293
2303
|
throw new PermissionError(
|
|
2304
|
+
node.ctx.user.role,
|
|
2294
2305
|
"READ",
|
|
2295
2306
|
`${node.model.name}'s field "${field.name}"`,
|
|
2296
2307
|
"field permission not available"
|
|
@@ -115,7 +115,7 @@ export const isVisibleRelation = (visibleRelationsByRole, modelName, role) => {
|
|
|
115
115
|
const whitelist = visibleRelationsByRole[role]?.[modelName];
|
|
116
116
|
return (relation) => (whitelist ? whitelist.includes(relation.name) : true);
|
|
117
117
|
};
|
|
118
|
-
export const getEntityQuery = (model, role, visibleRelationsByRole, typesWithSubRelations) => `query
|
|
118
|
+
export const getEntityQuery = (model, role, visibleRelationsByRole, typesWithSubRelations) => `query Get${model.name}Entity ($id: ID!) {
|
|
119
119
|
data: ${typeToField(model.name)}(where: { id: $id }) {
|
|
120
120
|
${displayField(model)}
|
|
121
121
|
${model.fields.filter(and(isSimpleField, isQueriableBy(role))).map(({ name }) => name)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/client/queries.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/client/queries.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/errors.d.ts
CHANGED
|
@@ -13,5 +13,5 @@ export declare class UserInputError extends GraphQLError {
|
|
|
13
13
|
constructor(what: string);
|
|
14
14
|
}
|
|
15
15
|
export declare class PermissionError extends ForbiddenError {
|
|
16
|
-
constructor(action: PermissionAction, what: string, why: string);
|
|
16
|
+
constructor(role: string, action: PermissionAction, what: string, why: string);
|
|
17
17
|
}
|
package/dist/esm/errors.js
CHANGED
|
@@ -20,8 +20,8 @@ export class UserInputError extends GraphQLError {
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
export class PermissionError extends ForbiddenError {
|
|
23
|
-
constructor(action, what, why) {
|
|
24
|
-
super(`
|
|
23
|
+
constructor(role, action, what, why) {
|
|
24
|
+
super(`Role ${role} does not have sufficient permissions to ${action.toLowerCase()} ${what} (${why}).`);
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
//# sourceMappingURL=errors.js.map
|
package/dist/esm/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnD,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACxC,YAAY,OAAe,EAAE,UAAqD;QAChF,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACpF,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC9C,YAAY,IAAY;QACtB,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC7C,YAAY,IAAY;QACtB,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC9C,YAAY,IAAY;QACtB,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACjD,YAAY,MAAwB,EAAE,IAAY,EAAE,GAAW;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnD,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACxC,YAAY,OAAe,EAAE,UAAqD;QAChF,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACpF,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC9C,YAAY,IAAY;QACtB,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC7C,YAAY,IAAY;QACtB,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC9C,YAAY,IAAY;QACtB,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACjD,YAAY,IAAY,EAAE,MAAwB,EAAE,IAAY,EAAE,GAAW;QAC3E,KAAK,CAAC,QAAQ,IAAI,4CAA4C,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC;IAC1G,CAAC;CACF"}
|
|
@@ -62,7 +62,7 @@ export const getEntityToMutate = async (ctx, model, where, action) => {
|
|
|
62
62
|
console.error(`Permission error: ${Object.entries(where)
|
|
63
63
|
.map(([key, value]) => `${key}: ${value}`)
|
|
64
64
|
.join(', ')}`);
|
|
65
|
-
throw new PermissionError(action, `this ${model.name}`, 'no available permissions applied');
|
|
65
|
+
throw new PermissionError(ctx.user.role, action, `this ${model.name}`, 'no available permissions applied');
|
|
66
66
|
}
|
|
67
67
|
if (model.parent) {
|
|
68
68
|
const subEntity = await ctx.knex(model.name).where({ id: entity.id }).first();
|
|
@@ -79,7 +79,7 @@ export const checkCanWrite = async (ctx, model, data, action) => {
|
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
81
81
|
if (permissionStack === false) {
|
|
82
|
-
throw new PermissionError(action, model.plural, 'no applicable permissions');
|
|
82
|
+
throw new PermissionError(ctx.user.role, action, model.plural, 'no applicable permissions');
|
|
83
83
|
}
|
|
84
84
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- using `select(1 as any)` to instantiate an "empty" query builder
|
|
85
85
|
const query = ctx.knex.select(1).first();
|
|
@@ -94,7 +94,7 @@ export const checkCanWrite = async (ctx, model, data, action) => {
|
|
|
94
94
|
}
|
|
95
95
|
const fieldPermissions = field[action === 'CREATE' ? 'creatable' : 'updatable'];
|
|
96
96
|
if (fieldPermissions && typeof fieldPermissions === 'object' && !fieldPermissions.roles?.includes(ctx.user.role)) {
|
|
97
|
-
throw new PermissionError(action, `this ${model.name}'s ${field.name}`, 'field permission not available');
|
|
97
|
+
throw new PermissionError(ctx.user.role, action, `this ${model.name}'s ${field.name}`, 'field permission not available');
|
|
98
98
|
}
|
|
99
99
|
linked = true;
|
|
100
100
|
const fieldPermissionStack = getPermissionStack(ctx, field.type, 'LINK');
|
|
@@ -105,7 +105,7 @@ export const checkCanWrite = async (ctx, model, data, action) => {
|
|
|
105
105
|
continue;
|
|
106
106
|
}
|
|
107
107
|
if (fieldPermissionStack === false || !fieldPermissionStack.length) {
|
|
108
|
-
throw new PermissionError(action, `this ${model.name}'s ${field.name}`, 'no applicable permissions on data to link');
|
|
108
|
+
throw new PermissionError(ctx.user.role, action, `this ${model.name}'s ${field.name}`, 'no applicable permissions on data to link');
|
|
109
109
|
}
|
|
110
110
|
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
111
111
|
ors(query, fieldPermissionStack.map((links) => (query) => query.whereExists((subQuery) => permissionLinkQuery(ctx, subQuery, links, foreignId))));
|
|
@@ -113,11 +113,11 @@ export const checkCanWrite = async (ctx, model, data, action) => {
|
|
|
113
113
|
if (linked) {
|
|
114
114
|
const canMutate = await query;
|
|
115
115
|
if (!canMutate) {
|
|
116
|
-
throw new PermissionError(action, `this ${model.name}`, 'no linkable entities');
|
|
116
|
+
throw new PermissionError(ctx.user.role, action, `this ${model.name}`, 'no linkable entities');
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
else if (action === 'CREATE') {
|
|
120
|
-
throw new PermissionError(action, `this ${model.name}`, 'no linkable entities');
|
|
120
|
+
throw new PermissionError(ctx.user.role, action, `this ${model.name}`, 'no linkable entities');
|
|
121
121
|
}
|
|
122
122
|
};
|
|
123
123
|
const permissionLinkQuery = (ctx, subQuery, links, id) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/permissions/check.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/permissions/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@ export const applySelects = (node, query, joins) => {
|
|
|
14
14
|
return false;
|
|
15
15
|
}
|
|
16
16
|
if (typeof field.queriable === 'object' && !field.queriable.roles?.includes(node.ctx.user.role)) {
|
|
17
|
-
throw new PermissionError('READ', `${node.model.name}'s field "${field.name}"`, 'field permission not available');
|
|
17
|
+
throw new PermissionError(node.ctx.user.role, 'READ', `${node.model.name}'s field "${field.name}"`, 'field permission not available');
|
|
18
18
|
}
|
|
19
19
|
return true;
|
|
20
20
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selects.js","sourceRoot":"","sources":["../../../src/resolvers/selects.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"selects.js","sourceRoot":"","sources":["../../../src/resolvers/selects.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smartive/graphql-magic",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "11.1.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"source": "src/index.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -55,8 +55,8 @@
|
|
|
55
55
|
"dotenv": "^16.3.1",
|
|
56
56
|
"graphql": "^15.8.0",
|
|
57
57
|
"inflection": "^2.0.1",
|
|
58
|
-
"knex": "^
|
|
59
|
-
"knex-schema-inspector": "^3.0
|
|
58
|
+
"knex": "^3.0.1",
|
|
59
|
+
"knex-schema-inspector": "^3.1.0",
|
|
60
60
|
"lodash": "^4.17.21",
|
|
61
61
|
"luxon": "^3.3.0",
|
|
62
62
|
"ts-morph": "^19.0.0",
|
|
@@ -65,15 +65,15 @@
|
|
|
65
65
|
"devDependencies": {
|
|
66
66
|
"@smartive/eslint-config": "3.3.0",
|
|
67
67
|
"@smartive/prettier-config": "3.1.2",
|
|
68
|
-
"@types/jest": "29.5.
|
|
69
|
-
"@types/lodash": "4.14.
|
|
70
|
-
"@types/luxon": "3.3.
|
|
71
|
-
"@types/pg": "8.10.
|
|
72
|
-
"@types/uuid": "9.0.
|
|
68
|
+
"@types/jest": "29.5.8",
|
|
69
|
+
"@types/lodash": "4.14.201",
|
|
70
|
+
"@types/luxon": "3.3.4",
|
|
71
|
+
"@types/pg": "8.10.9",
|
|
72
|
+
"@types/uuid": "9.0.7",
|
|
73
73
|
"create-ts-index": "1.14.0",
|
|
74
74
|
"del-cli": "5.1.0",
|
|
75
75
|
"esbuild": "0.19.5",
|
|
76
|
-
"eslint": "8.
|
|
76
|
+
"eslint": "8.53.0",
|
|
77
77
|
"graphql-request": "6.1.0",
|
|
78
78
|
"jest": "29.7.0",
|
|
79
79
|
"mock-knex": "0.4.12",
|
package/src/client/queries.ts
CHANGED
|
@@ -183,7 +183,7 @@ export const getEntityQuery = (
|
|
|
183
183
|
role: string,
|
|
184
184
|
visibleRelationsByRole: VisibleRelationsByRole,
|
|
185
185
|
typesWithSubRelations: string[]
|
|
186
|
-
) => `query
|
|
186
|
+
) => `query Get${model.name}Entity ($id: ID!) {
|
|
187
187
|
data: ${typeToField(model.name)}(where: { id: $id }) {
|
|
188
188
|
${displayField(model)}
|
|
189
189
|
${model.fields.filter(and(isSimpleField, isQueriableBy(role))).map(({ name }) => name)}
|
package/src/errors.ts
CHANGED
|
@@ -26,7 +26,7 @@ export class UserInputError extends GraphQLError {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
export class PermissionError extends ForbiddenError {
|
|
29
|
-
constructor(action: PermissionAction, what: string, why: string) {
|
|
30
|
-
super(`
|
|
29
|
+
constructor(role: string, action: PermissionAction, what: string, why: string) {
|
|
30
|
+
super(`Role ${role} does not have sufficient permissions to ${action.toLowerCase()} ${what} (${why}).`);
|
|
31
31
|
}
|
|
32
32
|
}
|
package/src/permissions/check.ts
CHANGED
|
@@ -113,7 +113,7 @@ export const getEntityToMutate = async (
|
|
|
113
113
|
.map(([key, value]) => `${key}: ${value}`)
|
|
114
114
|
.join(', ')}`
|
|
115
115
|
);
|
|
116
|
-
throw new PermissionError(action, `this ${model.name}`, 'no available permissions applied');
|
|
116
|
+
throw new PermissionError(ctx.user.role, action, `this ${model.name}`, 'no available permissions applied');
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
if (model.parent) {
|
|
@@ -139,7 +139,7 @@ export const checkCanWrite = async (
|
|
|
139
139
|
return;
|
|
140
140
|
}
|
|
141
141
|
if (permissionStack === false) {
|
|
142
|
-
throw new PermissionError(action, model.plural, 'no applicable permissions');
|
|
142
|
+
throw new PermissionError(ctx.user.role, action, model.plural, 'no applicable permissions');
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- using `select(1 as any)` to instantiate an "empty" query builder
|
|
@@ -157,7 +157,12 @@ export const checkCanWrite = async (
|
|
|
157
157
|
|
|
158
158
|
const fieldPermissions = field[action === 'CREATE' ? 'creatable' : 'updatable'];
|
|
159
159
|
if (fieldPermissions && typeof fieldPermissions === 'object' && !fieldPermissions.roles?.includes(ctx.user.role)) {
|
|
160
|
-
throw new PermissionError(
|
|
160
|
+
throw new PermissionError(
|
|
161
|
+
ctx.user.role,
|
|
162
|
+
action,
|
|
163
|
+
`this ${model.name}'s ${field.name}`,
|
|
164
|
+
'field permission not available'
|
|
165
|
+
);
|
|
161
166
|
}
|
|
162
167
|
|
|
163
168
|
linked = true;
|
|
@@ -172,7 +177,12 @@ export const checkCanWrite = async (
|
|
|
172
177
|
}
|
|
173
178
|
|
|
174
179
|
if (fieldPermissionStack === false || !fieldPermissionStack.length) {
|
|
175
|
-
throw new PermissionError(
|
|
180
|
+
throw new PermissionError(
|
|
181
|
+
ctx.user.role,
|
|
182
|
+
action,
|
|
183
|
+
`this ${model.name}'s ${field.name}`,
|
|
184
|
+
'no applicable permissions on data to link'
|
|
185
|
+
);
|
|
176
186
|
}
|
|
177
187
|
|
|
178
188
|
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
@@ -187,10 +197,10 @@ export const checkCanWrite = async (
|
|
|
187
197
|
if (linked) {
|
|
188
198
|
const canMutate = await query;
|
|
189
199
|
if (!canMutate) {
|
|
190
|
-
throw new PermissionError(action, `this ${model.name}`, 'no linkable entities');
|
|
200
|
+
throw new PermissionError(ctx.user.role, action, `this ${model.name}`, 'no linkable entities');
|
|
191
201
|
}
|
|
192
202
|
} else if (action === 'CREATE') {
|
|
193
|
-
throw new PermissionError(action, `this ${model.name}`, 'no linkable entities');
|
|
203
|
+
throw new PermissionError(ctx.user.role, action, `this ${model.name}`, 'no linkable entities');
|
|
194
204
|
}
|
|
195
205
|
};
|
|
196
206
|
|
package/src/resolvers/selects.ts
CHANGED
|
@@ -30,6 +30,7 @@ export const applySelects = (node: ResolverNode, query: Knex.QueryBuilder, joins
|
|
|
30
30
|
|
|
31
31
|
if (typeof field.queriable === 'object' && !field.queriable.roles?.includes(node.ctx.user.role)) {
|
|
32
32
|
throw new PermissionError(
|
|
33
|
+
node.ctx.user.role,
|
|
33
34
|
'READ',
|
|
34
35
|
`${node.model.name}'s field "${field.name}"`,
|
|
35
36
|
'field permission not available'
|
|
@@ -41,46 +41,3 @@ exports[`resolvers are generated correctly 1`] = `
|
|
|
41
41
|
},
|
|
42
42
|
}
|
|
43
43
|
`;
|
|
44
|
-
|
|
45
|
-
exports[`resolvers resolve lists, many-to-one and one-to-many queries 1`] = `
|
|
46
|
-
{
|
|
47
|
-
"data": {
|
|
48
|
-
"manyObjects": [
|
|
49
|
-
{
|
|
50
|
-
"another": {
|
|
51
|
-
"id": "bar",
|
|
52
|
-
"manyObjects": [
|
|
53
|
-
{
|
|
54
|
-
"field": "foo",
|
|
55
|
-
"id": "foo",
|
|
56
|
-
},
|
|
57
|
-
],
|
|
58
|
-
},
|
|
59
|
-
"field": "foo",
|
|
60
|
-
"id": "foo",
|
|
61
|
-
},
|
|
62
|
-
],
|
|
63
|
-
},
|
|
64
|
-
}
|
|
65
|
-
`;
|
|
66
|
-
|
|
67
|
-
exports[`resolvers resolve lists, many-to-one and one-to-many queries: query 1`] = `"select * from "User" where "id" = $1 limit $2"`;
|
|
68
|
-
|
|
69
|
-
exports[`resolvers resolve lists, many-to-one and one-to-many queries: query 2`] = `"select "SO"."id" as "SO__ID", "SO"."id" as "SO__id", "SO"."field" as "SO__field", "SO__a"."id" as "SO__a__ID", "SO__a"."id" as "SO__a__id" from "SomeObject" as "SO" left join "AnotherObject" as "SO__W__a" on "SO"."anotherId" = "SO__W__a"."id" left join "AnotherObject" as "SO__a" on "SO"."anotherId" = "SO__a"."id" where "SO__W__a"."id" in ($1) and "SO"."deleted" = $2 order by "SO"."xyz" DESC"`;
|
|
70
|
-
|
|
71
|
-
exports[`resolvers resolve lists, many-to-one and one-to-many queries: query 3`] = `"select "SO__a__mO"."id" as "SO__a__mO__ID", "SO__a__mO"."id" as "SO__a__mO__id", "SO__a__mO"."field" as "SO__a__mO__field", "SO__a__mO"."anotherId" as "SO__a__mO__anotherId" from "SomeObject" as "SO__a__mO" where "SO__a__mO"."id" in ($1) and "SO__a__mO"."deleted" = $2 and "SO__a__mO"."anotherId" = $3 order by "SO__a__mO"."createdAt" DESC"`;
|
|
72
|
-
|
|
73
|
-
exports[`resolvers resolve single query 1`] = `
|
|
74
|
-
{
|
|
75
|
-
"data": {
|
|
76
|
-
"someObject": {
|
|
77
|
-
"field": "foo",
|
|
78
|
-
"id": "foo",
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
}
|
|
82
|
-
`;
|
|
83
|
-
|
|
84
|
-
exports[`resolvers resolve single query: query 1`] = `"select * from "User" where "id" = $1 limit $2"`;
|
|
85
|
-
|
|
86
|
-
exports[`resolvers resolve single query: query 2`] = `"select "SO"."id" as "SO__ID", "SO"."id" as "SO__id", "SO"."field" as "SO__field" from "SomeObject" as "SO" where "SO"."id" = $1 and "SO"."deleted" = $2 order by "SO"."createdAt" DESC limit $3"`;
|
|
@@ -1,114 +1,8 @@
|
|
|
1
|
-
import knex from 'knex';
|
|
2
|
-
import { DateTime } from 'luxon';
|
|
3
|
-
import { execute } from '../../src';
|
|
4
|
-
import { gql } from '../../src/client/gql';
|
|
5
1
|
import { getResolvers } from '../../src/resolvers';
|
|
6
|
-
import {
|
|
7
|
-
import { models, permissions } from '../utils/models';
|
|
8
|
-
|
|
9
|
-
const test = async (operationName: string, query: string, variables: object, responses: unknown[]) => {
|
|
10
|
-
const knexInstance = knex({
|
|
11
|
-
client: 'postgresql',
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
15
|
-
const mockKnex = require('mock-knex');
|
|
16
|
-
mockKnex.mock(knexInstance);
|
|
17
|
-
const tracker = mockKnex.getTracker();
|
|
18
|
-
|
|
19
|
-
tracker.install();
|
|
20
|
-
tracker.on('query', function someFunction(query, step) {
|
|
21
|
-
expect(query.sql).toMatchSnapshot('query');
|
|
22
|
-
query.response(responses[step - 1]);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
const user = await knexInstance('User').where({ id: ADMIN_ID }).first();
|
|
26
|
-
const result = await execute({
|
|
27
|
-
req: null as any,
|
|
28
|
-
knex: knexInstance,
|
|
29
|
-
locale: 'en',
|
|
30
|
-
locales: ['en'],
|
|
31
|
-
user,
|
|
32
|
-
models,
|
|
33
|
-
permissions,
|
|
34
|
-
now: DateTime.fromISO('2020-01-01T00:00:00.000Z'),
|
|
35
|
-
body: { operationName, query, variables },
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
expect(result).toMatchSnapshot();
|
|
39
|
-
|
|
40
|
-
tracker.uninstall();
|
|
41
|
-
};
|
|
2
|
+
import { models } from '../utils/models';
|
|
42
3
|
|
|
43
4
|
describe('resolvers', () => {
|
|
44
5
|
it('are generated correctly', () => {
|
|
45
6
|
expect(getResolvers(models)).toMatchSnapshot();
|
|
46
7
|
});
|
|
47
|
-
|
|
48
|
-
it('resolve lists, many-to-one and one-to-many queries', async () => {
|
|
49
|
-
await test(
|
|
50
|
-
'AnotherQuery',
|
|
51
|
-
gql`
|
|
52
|
-
query AnotherQuery {
|
|
53
|
-
manyObjects(where: { another: { id: "bar" } }, orderBy: [{ xyz: DESC }]) {
|
|
54
|
-
id
|
|
55
|
-
field
|
|
56
|
-
another {
|
|
57
|
-
id
|
|
58
|
-
manyObjects(where: { id: "foo" }) {
|
|
59
|
-
id
|
|
60
|
-
field
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
`,
|
|
66
|
-
{},
|
|
67
|
-
[
|
|
68
|
-
{ id: 1, role: 'ADMIN' },
|
|
69
|
-
[
|
|
70
|
-
{
|
|
71
|
-
SO__ID: 'foo',
|
|
72
|
-
SO__id: 'foo',
|
|
73
|
-
SO__field: 'foo',
|
|
74
|
-
SO__a__ID: 'bar',
|
|
75
|
-
SO__a__id: 'bar',
|
|
76
|
-
},
|
|
77
|
-
],
|
|
78
|
-
[
|
|
79
|
-
{
|
|
80
|
-
SO__a__mO__ID: 'foo',
|
|
81
|
-
SO__a__mO__id: 'foo',
|
|
82
|
-
SO__a__mO__field: 'foo',
|
|
83
|
-
SO__a__mO__anotherId: 'bar',
|
|
84
|
-
},
|
|
85
|
-
],
|
|
86
|
-
]
|
|
87
|
-
);
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it('resolve single query', async () => {
|
|
91
|
-
await test(
|
|
92
|
-
'YetAnotherQuery',
|
|
93
|
-
gql`
|
|
94
|
-
query YetAnotherQuery {
|
|
95
|
-
someObject(where: { id: "foo" }) {
|
|
96
|
-
id
|
|
97
|
-
field
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
`,
|
|
101
|
-
{},
|
|
102
|
-
[
|
|
103
|
-
{ id: 1, role: 'ADMIN' },
|
|
104
|
-
[
|
|
105
|
-
{
|
|
106
|
-
SO__ID: 'foo',
|
|
107
|
-
SO__id: 'foo',
|
|
108
|
-
SO__field: 'foo',
|
|
109
|
-
},
|
|
110
|
-
],
|
|
111
|
-
]
|
|
112
|
-
);
|
|
113
|
-
});
|
|
114
8
|
});
|