@nextage/nx-frame-be 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.
Files changed (119) hide show
  1. package/README.md +1 -0
  2. package/README.md.old +45 -0
  3. package/build/app.d.ts +0 -0
  4. package/build/app.js +1 -0
  5. package/build/aws/aws-cluster-manager.d.ts +28 -0
  6. package/build/aws/aws-cluster-manager.js +105 -0
  7. package/build/aws/aws-email-manager.d.ts +24 -0
  8. package/build/aws/aws-email-manager.js +57 -0
  9. package/build/aws/aws-queue-manager.d.ts +37 -0
  10. package/build/aws/aws-queue-manager.js +100 -0
  11. package/build/aws/aws.interfaces.d.ts +39 -0
  12. package/build/aws/aws.interfaces.js +2 -0
  13. package/build/aws/index.d.ts +4 -0
  14. package/build/aws/index.js +20 -0
  15. package/build/common/base/__test__/base.model.test.d.ts +1 -0
  16. package/build/common/base/__test__/base.model.test.js +283 -0
  17. package/build/common/base/base.controller.d.ts +124 -0
  18. package/build/common/base/base.controller.js +134 -0
  19. package/build/common/base/base.interfaces.d.ts +81 -0
  20. package/build/common/base/base.interfaces.js +2 -0
  21. package/build/common/base/base.model.d.ts +384 -0
  22. package/build/common/base/base.model.js +730 -0
  23. package/build/common/base/folded.model.d.ts +41 -0
  24. package/build/common/base/folded.model.js +215 -0
  25. package/build/common/base/mongo-utils.d.ts +122 -0
  26. package/build/common/base/mongo-utils.js +242 -0
  27. package/build/common/base/mongo.types.d.ts +20 -0
  28. package/build/common/base/mongo.types.js +2 -0
  29. package/build/common/base/sql-utils.d.ts +20 -0
  30. package/build/common/base/sql-utils.js +69 -0
  31. package/build/common/constants.d.ts +27 -0
  32. package/build/common/constants.js +70 -0
  33. package/build/common/crypto/crypto.classes.d.ts +100 -0
  34. package/build/common/crypto/crypto.classes.js +146 -0
  35. package/build/common/crypto/crypto.constants.d.ts +68 -0
  36. package/build/common/crypto/crypto.constants.js +57 -0
  37. package/build/common/crypto/crypto.error.d.ts +4 -0
  38. package/build/common/crypto/crypto.error.js +10 -0
  39. package/build/common/crypto/crypto.interfaces.d.ts +46 -0
  40. package/build/common/crypto/crypto.interfaces.js +2 -0
  41. package/build/common/crypto/crypto.utils.d.ts +139 -0
  42. package/build/common/crypto/crypto.utils.js +380 -0
  43. package/build/common/crypto/index.d.ts +3 -0
  44. package/build/common/crypto/index.js +19 -0
  45. package/build/common/enums.d.ts +61 -0
  46. package/build/common/enums.js +75 -0
  47. package/build/common/errors.d.ts +13 -0
  48. package/build/common/errors.js +24 -0
  49. package/build/common/express/express.interfaces.d.ts +20 -0
  50. package/build/common/express/express.interfaces.js +2 -0
  51. package/build/common/express/express.utils.d.ts +31 -0
  52. package/build/common/express/express.utils.js +85 -0
  53. package/build/common/express/index.d.ts +2 -0
  54. package/build/common/express/index.js +18 -0
  55. package/build/common/graphql/__test__/generator.schema.test.d.ts +1 -0
  56. package/build/common/graphql/__test__/generator.schema.test.js +391 -0
  57. package/build/common/graphql/directives.d.ts +18 -0
  58. package/build/common/graphql/directives.js +56 -0
  59. package/build/common/graphql/generator copy.d.ts +41 -0
  60. package/build/common/graphql/generator copy.js +385 -0
  61. package/build/common/graphql/generator.d.ts +42 -0
  62. package/build/common/graphql/generator.js +385 -0
  63. package/build/common/graphql/index.d.ts +4 -0
  64. package/build/common/graphql/index.js +21 -0
  65. package/build/common/graphql/interfaces.d.ts +67 -0
  66. package/build/common/graphql/interfaces.js +2 -0
  67. package/build/common/graphql/loader.d.ts +22 -0
  68. package/build/common/graphql/loader.js +186 -0
  69. package/build/common/graphql/scalars/index.d.ts +10 -0
  70. package/build/common/graphql/scalars/index.js +6 -0
  71. package/build/common/graphql/scalars/resolvers.d.ts +8 -0
  72. package/build/common/graphql/scalars/resolvers.js +71 -0
  73. package/build/common/graphql/scalars/schema.d.ts +1 -0
  74. package/build/common/graphql/scalars/schema.js +12 -0
  75. package/build/common/graphql/types/index.d.ts +3 -0
  76. package/build/common/graphql/types/index.js +6 -0
  77. package/build/common/graphql/types/schema.d.ts +1 -0
  78. package/build/common/graphql/types/schema.js +98 -0
  79. package/build/common/graphql/utils.d.ts +18 -0
  80. package/build/common/graphql/utils.js +40 -0
  81. package/build/common/grid-fs/gridfs-base.model.d.ts +53 -0
  82. package/build/common/grid-fs/gridfs-base.model.js +95 -0
  83. package/build/common/grid-fs/gridfs.interfaces.d.ts +41 -0
  84. package/build/common/grid-fs/gridfs.interfaces.js +2 -0
  85. package/build/common/index.d.ts +10 -0
  86. package/build/common/index.js +32 -0
  87. package/build/common/interfaces.d.ts +26 -0
  88. package/build/common/interfaces.js +10 -0
  89. package/build/common/manager/bulk-manager.d.ts +59 -0
  90. package/build/common/manager/bulk-manager.js +103 -0
  91. package/build/common/manager/crypto-manager.d.ts +88 -0
  92. package/build/common/manager/crypto-manager.js +200 -0
  93. package/build/common/manager/index.d.ts +5 -0
  94. package/build/common/manager/index.js +21 -0
  95. package/build/common/manager/pubsub-manager.d.ts +20 -0
  96. package/build/common/manager/pubsub-manager.js +38 -0
  97. package/build/common/manager/shutdown-manager.d.ts +27 -0
  98. package/build/common/manager/shutdown-manager.js +118 -0
  99. package/build/common/manager/socket-io-cli-manager.d.ts +53 -0
  100. package/build/common/manager/socket-io-cli-manager.js +91 -0
  101. package/build/common/manager/tunnel-manager.d.ts +28 -0
  102. package/build/common/manager/tunnel-manager.js +49 -0
  103. package/build/common/models/coded-entity.controller.d.ts +5 -0
  104. package/build/common/models/coded-entity.controller.js +9 -0
  105. package/build/common/models/coded-entity.model.d.ts +25 -0
  106. package/build/common/models/coded-entity.model.js +51 -0
  107. package/build/common/models/user.model.d.ts +56 -0
  108. package/build/common/models/user.model.js +72 -0
  109. package/build/common/types.d.ts +136 -0
  110. package/build/common/types.js +16 -0
  111. package/build/common/utils.d.ts +552 -0
  112. package/build/common/utils.js +1100 -0
  113. package/build/index.d.ts +2 -0
  114. package/build/index.js +18 -0
  115. package/build/test/env.d.ts +0 -0
  116. package/build/test/env.js +5 -0
  117. package/build/test/setup.d.ts +6 -0
  118. package/build/test/setup.js +59 -0
  119. package/package.json +90 -0
@@ -0,0 +1,13 @@
1
+ import { NxObject } from './interfaces';
2
+ export declare class AuthenticationError extends Error {
3
+ extensions: NxObject;
4
+ constructor(message?: string, i18n?: string);
5
+ }
6
+ export declare class ForbiddenError extends Error {
7
+ extensions: NxObject;
8
+ constructor(message?: string, i18n?: string);
9
+ }
10
+ export declare class AppError extends Error {
11
+ extensions: NxObject;
12
+ constructor(message?: string, i18n?: string);
13
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AppError = exports.ForbiddenError = exports.AuthenticationError = void 0;
4
+ class AuthenticationError extends Error {
5
+ constructor(message = 'Authentication required', i18n = 'messages.authentication.required') {
6
+ super(message);
7
+ this.extensions = { code: 401, i18n };
8
+ }
9
+ }
10
+ exports.AuthenticationError = AuthenticationError;
11
+ class ForbiddenError extends Error {
12
+ constructor(message = 'Forbidden', i18n = 'messages.authorization.accessDenied') {
13
+ super(message);
14
+ this.extensions = { code: 403, i18n };
15
+ }
16
+ }
17
+ exports.ForbiddenError = ForbiddenError;
18
+ class AppError extends Error {
19
+ constructor(message = 'Application Error', i18n) {
20
+ super(message);
21
+ this.extensions = { code: 'APP_ERROR', i18n };
22
+ }
23
+ }
24
+ exports.AppError = AppError;
@@ -0,0 +1,20 @@
1
+ import { JwtPayload } from 'jsonwebtoken';
2
+ import { Request } from 'express';
3
+ import { UserDoc } from '../models/user.model';
4
+ export interface ErrorResponse extends Error {
5
+ status?: number;
6
+ }
7
+ export interface ExpressErrorResult {
8
+ result: {
9
+ fields: string[];
10
+ code: number;
11
+ message: string;
12
+ };
13
+ }
14
+ export interface AuthRequest extends Request {
15
+ auth?: AuthRequestContext;
16
+ }
17
+ export interface AuthRequestContext extends JwtPayload {
18
+ user?: UserDoc | null;
19
+ err?: ErrorResponse;
20
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,31 @@
1
+ import { Request, Response, NextFunction, Handler } from 'express';
2
+ import { ValidationError, Result, Schema } from 'express-validator';
3
+ import { DefaultSchemaKeys } from 'express-validator/lib/middlewares/schema';
4
+ import { ExpressErrorResult } from './express.interfaces';
5
+ /**
6
+ *
7
+ * @param schema
8
+ * @param errorFormatter
9
+ * @returns
10
+ */
11
+ export declare function validateSchema(schema: Schema<DefaultSchemaKeys>, errorFormatter?: (err: Result<ValidationError>, req: Request) => ExpressErrorResult | Result<ValidationError>): (req: Request, res: Response, next: NextFunction) => Promise<void>;
12
+ /**
13
+ *
14
+ * @param {*} res
15
+ * @param {*} status
16
+ * @param {*} content
17
+ * @returns
18
+ */
19
+ export declare function sendJSONResponse(res: Response, status?: number, content?: Object): void;
20
+ /**
21
+ * Create an Express middleware function which errors if an HTTP method is not allowed.
22
+ *
23
+ * @access public
24
+ * @param {Array<string>} [methods=[]]
25
+ * The HTTP methods which will not throw 405 errors.
26
+ * @param {string} [message]
27
+ * The error message text to use if a disallowed method is used.
28
+ * @returns {import('express').Handler}
29
+ * Returns a middleware function.
30
+ */
31
+ export declare function allowMethods(methods?: string[], message?: string): Handler;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.allowMethods = exports.sendJSONResponse = exports.validateSchema = void 0;
16
+ const http_errors_1 = __importDefault(require("http-errors"));
17
+ const express_validator_1 = require("express-validator");
18
+ /**
19
+ *
20
+ * @param schema
21
+ * @param errorFormatter
22
+ * @returns
23
+ */
24
+ function validateSchema(schema, errorFormatter = (err, req) => err) {
25
+ return (req, res, next) => __awaiter(this, void 0, void 0, function* () {
26
+ yield (0, express_validator_1.checkSchema)(schema).run(req);
27
+ const errors = (0, express_validator_1.validationResult)(req);
28
+ if (errors.isEmpty())
29
+ return next();
30
+ res.status(400).json(errorFormatter(errors, req));
31
+ });
32
+ }
33
+ exports.validateSchema = validateSchema;
34
+ /**
35
+ *
36
+ * @param {*} res
37
+ * @param {*} status
38
+ * @param {*} content
39
+ * @returns
40
+ */
41
+ function sendJSONResponse(res, status = 200, content = {}) {
42
+ if (!res)
43
+ return;
44
+ res.status(status);
45
+ res.json(content);
46
+ }
47
+ exports.sendJSONResponse = sendJSONResponse;
48
+ /**
49
+ * Create an Express middleware function which errors if an HTTP method is not allowed.
50
+ *
51
+ * @access public
52
+ * @param {Array<string>} [methods=[]]
53
+ * The HTTP methods which will not throw 405 errors.
54
+ * @param {string} [message]
55
+ * The error message text to use if a disallowed method is used.
56
+ * @returns {import('express').Handler}
57
+ * Returns a middleware function.
58
+ */
59
+ function allowMethods(methods = [], message = 'Method Not Allowed') {
60
+ const normalizedMethods = normalizeAllowedMethods(methods);
61
+ return (request, response, next) => {
62
+ if (!normalizedMethods.includes(request.method.toUpperCase())) {
63
+ response.header('Allow', normalizedMethods.join(', '));
64
+ return next((0, http_errors_1.default)(405, message));
65
+ }
66
+ next();
67
+ };
68
+ }
69
+ exports.allowMethods = allowMethods;
70
+ ;
71
+ /**
72
+ * Normalise an array of HTTP methods.
73
+ *
74
+ * @access private
75
+ * @param {Array<string>} methods
76
+ * The HTTP methods to normalise.
77
+ * @returns {Array<string>}
78
+ * Returns an array of capitalised HTTP methods.
79
+ */
80
+ function normalizeAllowedMethods(methods) {
81
+ if (!Array.isArray(methods))
82
+ return [];
83
+ return methods.filter(method => typeof method === 'string')
84
+ .map(method => method.toUpperCase());
85
+ }
@@ -0,0 +1,2 @@
1
+ export * from './express.interfaces';
2
+ export * from './express.utils';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./express.interfaces"), exports);
18
+ __exportStar(require("./express.utils"), exports);
@@ -0,0 +1,391 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const assert_1 = __importDefault(require("assert"));
16
+ const server_1 = require("@apollo/server");
17
+ const graphql_constraint_directive_1 = require("graphql-constraint-directive");
18
+ const coded_entity_model_1 = require("../../models/coded-entity.model");
19
+ const coded_entity_controller_1 = require("../../models/coded-entity.controller");
20
+ const utils_1 = require("../../utils");
21
+ const directives_1 = require("../directives");
22
+ const generator_1 = require("../generator");
23
+ const loader_1 = require("../loader");
24
+ // ensure our server's context is typed correctly
25
+ // create a test server to test against, using our production typeDefs,
26
+ // resolvers, and dataSources.
27
+ let server;
28
+ const roles = { read: 'READ_ROLE', write: 'WRITE_ROLE' };
29
+ beforeAll(() => __awaiter(void 0, void 0, void 0, function* () {
30
+ const params = {
31
+ fields: {
32
+ type: `
33
+ id : String
34
+ code: String
35
+ name: String
36
+ data: JSON
37
+ `,
38
+ query: `
39
+ code: String
40
+ name: String
41
+ `,
42
+ input: `
43
+ code: String
44
+ name: String
45
+ data: JSON
46
+ `
47
+ },
48
+ roles: { write: roles.write }
49
+ };
50
+ // generateSchema<CodedEntity>(ceModel, params);
51
+ (0, generator_1.generateSchema)(coded_entity_controller_1.ceCtrl, params);
52
+ const constraintDir = { name: 'constraint', typeDefs: graphql_constraint_directive_1.constraintDirectiveTypeDefs, transformer: (0, graphql_constraint_directive_1.constraintDirective)() };
53
+ const config = (0, loader_1.makeApolloConfig)([directives_1.authDirective, constraintDir]);
54
+ server = new server_1.ApolloServer(config);
55
+ }));
56
+ afterAll(() => __awaiter(void 0, void 0, void 0, function* () {
57
+ server === null || server === void 0 ? void 0 : server.stop();
58
+ }));
59
+ const createItem = () => __awaiter(void 0, void 0, void 0, function* () {
60
+ const item = {
61
+ code: (0, utils_1.uuid)(),
62
+ name: 'Test',
63
+ data: {
64
+ items: [
65
+ { id: (0, utils_1.uuid)(), value: Math.random() },
66
+ { id: (0, utils_1.uuid)(), value: Math.random() },
67
+ { id: (0, utils_1.uuid)(), value: Math.random() }
68
+ ]
69
+ }
70
+ };
71
+ const ceItem = yield (coded_entity_model_1.ceModel === null || coded_entity_model_1.ceModel === void 0 ? void 0 : coded_entity_model_1.ceModel.create(item, {}));
72
+ return { ceItem, item };
73
+ });
74
+ it('returns an error if not authenticated (count', () => __awaiter(void 0, void 0, void 0, function* () {
75
+ var _a;
76
+ const response = yield server.executeOperation({
77
+ query: 'query codedEntityCount($params: CodedEntityQuery) { codedEntityCount(params: $params) }',
78
+ variables: { params: {} }
79
+ });
80
+ (0, assert_1.default)(response.body.kind === 'single');
81
+ expect(response.body.singleResult.errors).toBeDefined();
82
+ expect(response.body.singleResult.errors[0].message).toEqual('messages.authentication.required');
83
+ expect((_a = response.body.singleResult.errors[0].extensions) === null || _a === void 0 ? void 0 : _a.code).toEqual(401);
84
+ }));
85
+ it('returns an error if not authenticated (list)', () => __awaiter(void 0, void 0, void 0, function* () {
86
+ var _b;
87
+ //const { ceItem: ce1 } = await createItem();
88
+ const response = yield server.executeOperation({
89
+ query: 'query codedEntityList($params: CodedEntityQuery) { codedEntityList(params: $params) { id code name } }',
90
+ variables: { params: {} }
91
+ });
92
+ (0, assert_1.default)(response.body.kind === 'single');
93
+ expect(response.body.singleResult.errors).toBeDefined();
94
+ expect(response.body.singleResult.errors[0].message).toEqual('messages.authentication.required');
95
+ expect((_b = response.body.singleResult.errors[0].extensions) === null || _b === void 0 ? void 0 : _b.code).toEqual(401);
96
+ }));
97
+ it('returns an error if not authenticated (get)', () => __awaiter(void 0, void 0, void 0, function* () {
98
+ var _c;
99
+ const { ceItem: ce1 } = yield createItem();
100
+ const response = yield server.executeOperation({
101
+ query: 'query codedEntity($id: ID!) { codedEntity(id: $id) { id code name data } }',
102
+ variables: { id: ce1.id }
103
+ });
104
+ (0, assert_1.default)(response.body.kind === 'single');
105
+ expect(response.body.singleResult.errors).toBeDefined();
106
+ expect(response.body.singleResult.errors[0].message).toEqual('messages.authentication.required');
107
+ expect((_c = response.body.singleResult.errors[0].extensions) === null || _c === void 0 ? void 0 : _c.code).toEqual(401);
108
+ }));
109
+ it('returns an error if not authenticated (findOne)', () => __awaiter(void 0, void 0, void 0, function* () {
110
+ var _d;
111
+ //const { ceItem: ce1 } = await createItem();
112
+ const response = yield server.executeOperation({
113
+ query: 'query findOneCodedEntity($params: CodedEntityQuery) { findOneCodedEntity(params: $params) { id code name } }',
114
+ variables: { params: {} }
115
+ });
116
+ (0, assert_1.default)(response.body.kind === 'single');
117
+ expect(response.body.singleResult.errors).toBeDefined();
118
+ expect(response.body.singleResult.errors[0].message).toEqual('messages.authentication.required');
119
+ expect((_d = response.body.singleResult.errors[0].extensions) === null || _d === void 0 ? void 0 : _d.code).toEqual(401);
120
+ }));
121
+ it('returns an error if missing role (create)', () => __awaiter(void 0, void 0, void 0, function* () {
122
+ //const { ceItem: ce1 } = await createItem();
123
+ var _e;
124
+ const item = {
125
+ code: (0, utils_1.uuid)(),
126
+ name: 'Test',
127
+ data: { items: [] }
128
+ };
129
+ const response = yield server.executeOperation({
130
+ query: 'mutation createCodedEntity($item: CodedEntityInput!) { createCodedEntity(item: $item) { id code name } }',
131
+ variables: { item }
132
+ }, { contextValue: global.getContext() });
133
+ (0, assert_1.default)(response.body.kind === 'single');
134
+ expect(response.body.singleResult.errors).toBeDefined();
135
+ expect(response.body.singleResult.errors[0].message).toEqual('messages.authorization.missingRole');
136
+ expect((_e = response.body.singleResult.errors[0].extensions) === null || _e === void 0 ? void 0 : _e.code).toEqual(403);
137
+ }));
138
+ it('returns an error if missing role (update)', () => __awaiter(void 0, void 0, void 0, function* () {
139
+ var _f;
140
+ const { ceItem: ce1 } = yield createItem();
141
+ const updatedName = `${ce1.name}_updated`;
142
+ const response = yield server.executeOperation({
143
+ query: 'mutation updateCodedEntity($id: ID!, $item: CodedEntityInput!) { updateCodedEntity(id: $id, item: $item) { id code name data } }',
144
+ variables: { id: ce1.id, item: { name: updatedName } }
145
+ }, { contextValue: global.getContext() });
146
+ (0, assert_1.default)(response.body.kind === 'single');
147
+ expect(response.body.singleResult.errors).toBeDefined();
148
+ expect(response.body.singleResult.errors[0].message).toEqual('messages.authorization.missingRole');
149
+ expect((_f = response.body.singleResult.errors[0].extensions) === null || _f === void 0 ? void 0 : _f.code).toEqual(403);
150
+ }));
151
+ it('returns an error if missing role (copy)', () => __awaiter(void 0, void 0, void 0, function* () {
152
+ var _g;
153
+ const { ceItem: ce1 } = yield createItem();
154
+ const updatedName = `${ce1.name}_updated`;
155
+ const response = yield server.executeOperation({
156
+ query: 'mutation copyCodedEntity($id: ID!, $item: CodedEntityInput!) { copyCodedEntity(id: $id, item: $item) { id code name data } }',
157
+ variables: { id: ce1.id, item: { name: updatedName } }
158
+ }, { contextValue: global.getContext() });
159
+ (0, assert_1.default)(response.body.kind === 'single');
160
+ expect(response.body.singleResult.errors).toBeDefined();
161
+ expect(response.body.singleResult.errors[0].message).toEqual('messages.authorization.missingRole');
162
+ expect((_g = response.body.singleResult.errors[0].extensions) === null || _g === void 0 ? void 0 : _g.code).toEqual(403);
163
+ }));
164
+ it('returns an error if missing role (remove)', () => __awaiter(void 0, void 0, void 0, function* () {
165
+ var _h;
166
+ const { ceItem: ce1 } = yield createItem();
167
+ const response = yield server.executeOperation({
168
+ query: 'mutation removeCodedEntity($id: ID!) { removeCodedEntity(id: $id) { id } }',
169
+ variables: { id: ce1.id }
170
+ }, { contextValue: global.getContext() });
171
+ (0, assert_1.default)(response.body.kind === 'single');
172
+ expect(response.body.singleResult.errors).toBeDefined();
173
+ expect(response.body.singleResult.errors[0].message).toEqual('messages.authorization.missingRole');
174
+ expect((_h = response.body.singleResult.errors[0].extensions) === null || _h === void 0 ? void 0 : _h.code).toEqual(403);
175
+ }));
176
+ it('returns an error if missing role (addArrayItem)', () => __awaiter(void 0, void 0, void 0, function* () {
177
+ var _j;
178
+ const { ceItem: ce1 } = yield createItem();
179
+ const item = { path: 'data.items', data: { id: (0, utils_1.uuid)() } };
180
+ const response = yield server.executeOperation({
181
+ query: 'mutation addCodedEntityArrayItem($id: ID!, $item: AddArrayElemItem!) { addCodedEntityArrayItem(id: $id, item: $item) { id code name data } }',
182
+ variables: { id: ce1.id, item }
183
+ }, { contextValue: global.getContext() });
184
+ (0, assert_1.default)(response.body.kind === 'single');
185
+ expect(response.body.singleResult.errors).toBeDefined();
186
+ expect(response.body.singleResult.errors[0].message).toEqual('messages.authorization.missingRole');
187
+ expect((_j = response.body.singleResult.errors[0].extensions) === null || _j === void 0 ? void 0 : _j.code).toEqual(403);
188
+ }));
189
+ it('returns an error if missing role (updateArrayItem)', () => __awaiter(void 0, void 0, void 0, function* () {
190
+ var _k;
191
+ const { ceItem: ce1 } = yield createItem();
192
+ const item = { path: 'data.items', filter: { id: ce1.data.items[1].id }, data: { id: ce1.data.items[1].id, value: 1000 } };
193
+ const response = yield server.executeOperation({
194
+ query: 'mutation updateCodedEntityArrayItem($id: ID!, $item: UpdateArrayElemItem!) { updateCodedEntityArrayItem(id: $id, item: $item) { id code name data } }',
195
+ variables: { id: ce1.id, item }
196
+ }, { contextValue: global.getContext() });
197
+ (0, assert_1.default)(response.body.kind === 'single');
198
+ expect(response.body.singleResult.errors).toBeDefined();
199
+ expect(response.body.singleResult.errors[0].message).toEqual('messages.authorization.missingRole');
200
+ expect((_k = response.body.singleResult.errors[0].extensions) === null || _k === void 0 ? void 0 : _k.code).toEqual(403);
201
+ }));
202
+ it('returns an error if missing role (removeArrayItem)', () => __awaiter(void 0, void 0, void 0, function* () {
203
+ var _l;
204
+ const { ceItem: ce1 } = yield createItem();
205
+ const item = { path: 'data.items', data: { id: (0, utils_1.uuid)() } };
206
+ const response = yield server.executeOperation({
207
+ query: 'mutation removeCodedEntityArrayItem($id: ID!, $item: RemoveArrayElemItem!) { removeCodedEntityArrayItem(id: $id, item: $item) { id code name data } }',
208
+ variables: { id: ce1.id, item }
209
+ }, { contextValue: global.getContext() });
210
+ (0, assert_1.default)(response.body.kind === 'single');
211
+ expect(response.body.singleResult.errors).toBeDefined();
212
+ expect(response.body.singleResult.errors[0].message).toEqual('messages.authorization.missingRole');
213
+ expect((_l = response.body.singleResult.errors[0].extensions) === null || _l === void 0 ? void 0 : _l.code).toEqual(403);
214
+ }));
215
+ it('queries GraphQL to get a list of items', () => __awaiter(void 0, void 0, void 0, function* () {
216
+ var _m, _o, _p, _q, _r;
217
+ const { ceItem: ce1 } = yield createItem();
218
+ const { ceItem: ce2 } = yield createItem();
219
+ const { ceItem: ce3 } = yield createItem();
220
+ const response = yield server.executeOperation({
221
+ query: 'query codedEntityList($params: CodedEntityQuery) { codedEntityList(params: $params) { id code name } }',
222
+ variables: { params: {} }
223
+ }, { contextValue: global.getContext() });
224
+ (0, assert_1.default)(response.body.kind === 'single');
225
+ expect(response.body.singleResult.errors).toBeUndefined();
226
+ expect((_o = (_m = response.body.singleResult.data) === null || _m === void 0 ? void 0 : _m.codedEntityList) === null || _o === void 0 ? void 0 : _o.length).toEqual(3);
227
+ expect((_p = response.body.singleResult.data) === null || _p === void 0 ? void 0 : _p.codedEntityList[0].code).toEqual(ce1.code);
228
+ expect((_q = response.body.singleResult.data) === null || _q === void 0 ? void 0 : _q.codedEntityList[1].code).toEqual(ce2.code);
229
+ expect((_r = response.body.singleResult.data) === null || _r === void 0 ? void 0 : _r.codedEntityList[2].code).toEqual(ce3.code);
230
+ }));
231
+ it('queries GraphQL to get items count', () => __awaiter(void 0, void 0, void 0, function* () {
232
+ var _s;
233
+ yield createItem();
234
+ yield createItem();
235
+ yield createItem();
236
+ const response = yield server.executeOperation({
237
+ query: 'query codedEntityCount($params: CodedEntityQuery) { codedEntityCount(params: $params) }',
238
+ variables: { params: {} }
239
+ }, { contextValue: global.getContext() });
240
+ (0, assert_1.default)(response.body.kind === 'single');
241
+ expect(response.body.singleResult.errors).toBeUndefined();
242
+ expect((_s = response.body.singleResult.data) === null || _s === void 0 ? void 0 : _s.codedEntityCount).toEqual(3);
243
+ }));
244
+ it('queries GraphQL to get one item by id', () => __awaiter(void 0, void 0, void 0, function* () {
245
+ var _t, _u, _v, _w, _x;
246
+ const { ceItem: ce1 } = yield createItem();
247
+ const response = yield server.executeOperation({
248
+ query: 'query codedEntity($id: ID!) { codedEntity(id: $id) { id code name data } }',
249
+ variables: { id: ce1.id }
250
+ }, { contextValue: global.getContext() });
251
+ (0, assert_1.default)(response.body.kind === 'single');
252
+ expect(response.body.singleResult.errors).toBeUndefined();
253
+ expect((_t = response.body.singleResult.data) === null || _t === void 0 ? void 0 : _t.codedEntity).toBeDefined();
254
+ expect((_u = response.body.singleResult.data) === null || _u === void 0 ? void 0 : _u.codedEntity.id).toEqual(ce1.id);
255
+ expect((_v = response.body.singleResult.data) === null || _v === void 0 ? void 0 : _v.codedEntity.code).toEqual(ce1.code);
256
+ expect((_w = response.body.singleResult.data) === null || _w === void 0 ? void 0 : _w.codedEntity.name).toEqual(ce1.name);
257
+ expect((_x = response.body.singleResult.data) === null || _x === void 0 ? void 0 : _x.codedEntity.data).toEqual(ce1.data);
258
+ }));
259
+ it('queries GraphQL to get one item by filter', () => __awaiter(void 0, void 0, void 0, function* () {
260
+ var _y, _z, _0, _1, _2;
261
+ const { ceItem: ce1 } = yield createItem();
262
+ const response = yield server.executeOperation({
263
+ query: 'query findOneCodedEntity($params: CodedEntityQuery) { findOneCodedEntity(params: $params) { id code name data } }',
264
+ variables: { params: {} }
265
+ }, { contextValue: global.getContext() });
266
+ (0, assert_1.default)(response.body.kind === 'single');
267
+ expect(response.body.singleResult.errors).toBeUndefined();
268
+ expect((_y = response.body.singleResult.data) === null || _y === void 0 ? void 0 : _y.findOneCodedEntity).toBeDefined();
269
+ expect((_z = response.body.singleResult.data) === null || _z === void 0 ? void 0 : _z.findOneCodedEntity.id).toEqual(ce1.id);
270
+ expect((_0 = response.body.singleResult.data) === null || _0 === void 0 ? void 0 : _0.findOneCodedEntity.code).toEqual(ce1.code);
271
+ expect((_1 = response.body.singleResult.data) === null || _1 === void 0 ? void 0 : _1.findOneCodedEntity.name).toEqual(ce1.name);
272
+ expect((_2 = response.body.singleResult.data) === null || _2 === void 0 ? void 0 : _2.findOneCodedEntity.data).toEqual(ce1.data);
273
+ }));
274
+ it('queries GraphQL to get create a new item', () => __awaiter(void 0, void 0, void 0, function* () {
275
+ const item = {
276
+ code: (0, utils_1.uuid)(),
277
+ name: 'Test',
278
+ data: { items: [{ id: (0, utils_1.uuid)() }] }
279
+ };
280
+ const response = yield server.executeOperation({
281
+ query: 'mutation createCodedEntity($item: CodedEntityInput!) { createCodedEntity(item: $item) { id code name data } }',
282
+ variables: { item }
283
+ },
284
+ // write permission in needed for this test
285
+ { contextValue: global.getContext([roles.write]) });
286
+ (0, assert_1.default)(response.body.kind === 'single');
287
+ expect(response.body.singleResult.errors).toBeUndefined();
288
+ expect(response.body.singleResult.data).toBeDefined();
289
+ expect(response.body.singleResult.data.createCodedEntity).toBeDefined();
290
+ expect(response.body.singleResult.data.createCodedEntity.id).toBeDefined();
291
+ expect(response.body.singleResult.data.createCodedEntity.code).toEqual(item.code);
292
+ expect(response.body.singleResult.data.createCodedEntity.name).toEqual(item.name);
293
+ expect(response.body.singleResult.data.createCodedEntity.data).toEqual(item.data);
294
+ }));
295
+ it('queries GraphQL to get update one item', () => __awaiter(void 0, void 0, void 0, function* () {
296
+ const { ceItem: ce1 } = yield createItem();
297
+ const updatedName = `${ce1.name}_updated`;
298
+ const response = yield server.executeOperation({
299
+ query: 'mutation updateCodedEntity($id: ID!, $item: CodedEntityInput!) { updateCodedEntity(id: $id, item: $item) { id code name data } }',
300
+ variables: { id: ce1.id, item: { name: updatedName } }
301
+ }, { contextValue: global.getContext([roles.write]) });
302
+ (0, assert_1.default)(response.body.kind === 'single');
303
+ expect(response.body.singleResult.errors).toBeUndefined();
304
+ expect(response.body.singleResult.data).toBeDefined();
305
+ expect(response.body.singleResult.data.updateCodedEntity).toBeDefined();
306
+ expect(response.body.singleResult.data.updateCodedEntity.id).toEqual(ce1.id);
307
+ expect(response.body.singleResult.data.updateCodedEntity.code).toEqual(ce1.code);
308
+ expect(response.body.singleResult.data.updateCodedEntity.name).toEqual(updatedName);
309
+ expect(response.body.singleResult.data.updateCodedEntity.data).toEqual(ce1.data);
310
+ }));
311
+ it('queries GraphQL to copy one item', () => __awaiter(void 0, void 0, void 0, function* () {
312
+ const { ceItem: ce1 } = yield createItem();
313
+ const updatedName = `${ce1.name}_updated`;
314
+ const response = yield server.executeOperation({
315
+ query: 'mutation copyCodedEntity($id: ID!, $item: CodedEntityInput!) { copyCodedEntity(id: $id, item: $item) { id code name data } }',
316
+ variables: { id: ce1.id, item: { name: updatedName } }
317
+ }, { contextValue: global.getContext([roles.write]) });
318
+ const ceList = yield coded_entity_model_1.ceModel.list();
319
+ (0, assert_1.default)(response.body.kind === 'single');
320
+ expect(response.body.singleResult.errors).toBeUndefined();
321
+ expect(response.body.singleResult.data).toBeDefined();
322
+ expect(response.body.singleResult.data.copyCodedEntity).toBeDefined();
323
+ expect(response.body.singleResult.data.copyCodedEntity.id).not.toEqual(ce1.id);
324
+ expect(response.body.singleResult.data.copyCodedEntity.code).toEqual(ce1.code);
325
+ expect(response.body.singleResult.data.copyCodedEntity.name).toEqual(updatedName);
326
+ expect(response.body.singleResult.data.copyCodedEntity.data).toEqual(ce1.data);
327
+ expect(ceList.length).toEqual(2);
328
+ expect(ceList[0].id).toEqual(ce1.id);
329
+ expect(ceList[1].id).toContain(response.body.singleResult.data.copyCodedEntity.id);
330
+ }));
331
+ it('queries GraphQL to get remove one item', () => __awaiter(void 0, void 0, void 0, function* () {
332
+ const { ceItem: ce1 } = yield createItem();
333
+ const response = yield server.executeOperation({
334
+ query: 'mutation removeCodedEntity($id: ID!) { removeCodedEntity(id: $id) { id } }',
335
+ variables: { id: ce1.id }
336
+ }, { contextValue: global.getContext([roles.write]) });
337
+ (0, assert_1.default)(response.body.kind === 'single');
338
+ expect(response.body.singleResult.errors).toBeUndefined();
339
+ expect(response.body.singleResult.data).toBeDefined();
340
+ expect(response.body.singleResult.data.removeCodedEntity).toBeDefined();
341
+ expect(response.body.singleResult.data.removeCodedEntity).toEqual({ id: ce1.id });
342
+ const ce = yield coded_entity_model_1.ceModel.get(ce1.id, {});
343
+ expect(ce).toBeNull();
344
+ }));
345
+ it('queries GraphQL to add one array element inside one item', () => __awaiter(void 0, void 0, void 0, function* () {
346
+ const { ceItem: ce1 } = yield createItem();
347
+ const item = { path: 'data.items', data: { id: (0, utils_1.uuid)() } };
348
+ const response = yield server.executeOperation({
349
+ query: 'mutation addCodedEntityArrayItem($id: ID!, $item: AddArrayElemItem!) { addCodedEntityArrayItem(id: $id, item: $item) { id code name data } }',
350
+ variables: { id: ce1.id, item }
351
+ }, { contextValue: global.getContext([roles.write]) });
352
+ (0, assert_1.default)(response.body.kind === 'single');
353
+ expect(response.body.singleResult.errors).toBeUndefined();
354
+ expect(response.body.singleResult.data).toBeDefined();
355
+ expect(response.body.singleResult.data.addCodedEntityArrayItem).toBeDefined();
356
+ expect(response.body.singleResult.data.addCodedEntityArrayItem.data.items.length).toEqual(ce1.data.items.length + 1);
357
+ expect(response.body.singleResult.data.addCodedEntityArrayItem.data.items[ce1.data.items.length].id).toEqual(item.data.id);
358
+ }));
359
+ it('queries GraphQL to update one array element inside one item', () => __awaiter(void 0, void 0, void 0, function* () {
360
+ const { ceItem: ce1 } = yield createItem();
361
+ const item = { path: 'data.items', filter: { id: ce1.data.items[1].id }, data: { id: ce1.data.items[1].id, value: 1000 } };
362
+ const response = yield server.executeOperation({
363
+ query: 'mutation updateCodedEntityArrayItem($id: ID!, $item: UpdateArrayElemItem!) { updateCodedEntityArrayItem(id: $id, item: $item) { id code name data } }',
364
+ variables: { id: ce1.id, item }
365
+ }, { contextValue: global.getContext([roles.write]) });
366
+ (0, assert_1.default)(response.body.kind === 'single');
367
+ expect(response.body.singleResult.errors).toBeUndefined();
368
+ expect(response.body.singleResult.data).toBeDefined();
369
+ expect(response.body.singleResult.data.updateCodedEntityArrayItem).toBeDefined();
370
+ expect(response.body.singleResult.data.updateCodedEntityArrayItem.data.items.length).toEqual(ce1.data.items.length);
371
+ expect(response.body.singleResult.data.updateCodedEntityArrayItem.data.items[1].id).toEqual(item.data.id);
372
+ expect(response.body.singleResult.data.updateCodedEntityArrayItem.data.items[1].value).toEqual(item.data.value);
373
+ }));
374
+ it('queries GraphQL to remove one array element inside one item', () => __awaiter(void 0, void 0, void 0, function* () {
375
+ const { ceItem: ce1 } = yield createItem();
376
+ const item = { path: 'data.items', data: { id: ce1.data.items[1].id } };
377
+ const response = yield server.executeOperation({
378
+ query: 'mutation removeCodedEntityArrayItem($id: ID!, $item: RemoveArrayElemItem!) { removeCodedEntityArrayItem(id: $id, item: $item) { id code name data } }',
379
+ variables: { id: ce1.id, item }
380
+ }, { contextValue: global.getContext([roles.write]) });
381
+ (0, assert_1.default)(response.body.kind === 'single');
382
+ expect(response.body.singleResult.errors).toBeUndefined();
383
+ expect(response.body.singleResult.data).toBeDefined();
384
+ expect(response.body.singleResult.data.removeCodedEntityArrayItem).toBeDefined();
385
+ expect(response.body.singleResult.data.removeCodedEntityArrayItem.data.items.length).toEqual(ce1.data.items.length - 1);
386
+ expect(response.body.singleResult.data.removeCodedEntityArrayItem.data.items[1].id).not.toEqual(item.data.id);
387
+ expect(response.body.singleResult.data.removeCodedEntityArrayItem.data.items[1].id).toEqual(ce1.data.items[2].id);
388
+ response.body.singleResult.data.removeCodedEntityArrayItem.data.items.forEach(di => {
389
+ expect(di.id).not.toEqual(ce1 === null || ce1 === void 0 ? void 0 : ce1.data.items[1].id);
390
+ });
391
+ }));
@@ -0,0 +1,18 @@
1
+ import { GraphQLSchema } from 'graphql';
2
+ import { BaseUser, NxContext } from '../interfaces';
3
+ export declare function createAuthDirective(directiveName: string, getUserFn: (ctx: NxContext) => BaseUser | null): {
4
+ name: string;
5
+ typeDefs: string;
6
+ transformer: (schema: GraphQLSchema) => GraphQLSchema;
7
+ };
8
+ /**
9
+ *
10
+ * @param {*} context
11
+ * @returns
12
+ */
13
+ export declare function getUser(context: NxContext): BaseUser | null;
14
+ export declare const authDirective: {
15
+ name: string;
16
+ typeDefs: string;
17
+ transformer: (schema: GraphQLSchema) => GraphQLSchema;
18
+ };