@volcanicminds/backend 0.2.28 → 0.2.29
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/README.md +0 -7
- package/dist/index.js +39 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/api/auth/controller/auth.js +136 -17
- package/dist/lib/api/auth/controller/auth.js.map +1 -1
- package/dist/lib/api/auth/routes.js +107 -13
- package/dist/lib/api/auth/routes.js.map +1 -1
- package/dist/lib/api/health/routes.js +2 -2
- package/dist/lib/api/health/routes.js.map +1 -1
- package/dist/lib/api/users/routes.js +12 -14
- package/dist/lib/api/users/routes.js.map +1 -1
- package/dist/lib/hooks/onRequest.js +13 -9
- package/dist/lib/hooks/onRequest.js.map +1 -1
- package/dist/lib/loader/plugins.js +0 -1
- package/dist/lib/loader/plugins.js.map +1 -1
- package/dist/lib/loader/router.js +66 -35
- package/dist/lib/loader/router.js.map +1 -1
- package/dist/lib/loader/schemas.js +8 -3
- package/dist/lib/loader/schemas.js.map +1 -1
- package/dist/lib/middleware/isAdmin.js +5 -4
- package/dist/lib/middleware/isAdmin.js.map +1 -1
- package/dist/lib/middleware/isAuthenticated.js +7 -6
- package/dist/lib/middleware/isAuthenticated.js.map +1 -1
- package/dist/lib/middleware/postAuth.js +19 -0
- package/dist/lib/middleware/postAuth.js.map +1 -0
- package/dist/lib/middleware/preAuth.js +17 -0
- package/dist/lib/middleware/preAuth.js.map +1 -0
- package/dist/lib/util/generate.js +10 -0
- package/dist/lib/util/generate.js.map +1 -0
- package/dist/lib/util/regexp.js +13 -13
- package/dist/lib/util/regexp.js.map +1 -1
- package/index.d.ts +2 -1
- package/index.ts +50 -2
- package/lib/api/auth/controller/auth.ts +118 -23
- package/lib/api/auth/routes.ts +107 -14
- package/lib/api/health/routes.ts +2 -2
- package/lib/api/users/routes.ts +12 -14
- package/lib/hooks/onRequest.ts +13 -19
- package/lib/loader/plugins.ts +0 -1
- package/lib/loader/router.ts +71 -34
- package/lib/loader/schemas.ts +7 -3
- package/lib/middleware/isAdmin.ts +3 -3
- package/lib/middleware/isAuthenticated.ts +5 -5
- package/lib/middleware/postAuth.ts +5 -0
- package/lib/middleware/preAuth.ts +3 -0
- package/lib/util/generate.ts +6 -0
- package/lib/util/regexp.ts +34 -32
- package/package.json +1 -1
- package/types/global.d.ts +15 -1
- package/dist/lib/api/auth/controller/password.js +0 -23
- package/dist/lib/api/auth/controller/password.js.map +0 -1
- package/dist/lib/middleware/example.js +0 -13
- package/dist/lib/middleware/example.js.map +0 -1
- package/lib/api/auth/controller/password.ts +0 -21
- package/lib/middleware/example.ts +0 -12
|
@@ -8,14 +8,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
11
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
15
|
exports.apply = exports.load = void 0;
|
|
16
|
+
const yn_1 = __importDefault(require("../util/yn"));
|
|
13
17
|
const glob = require('glob');
|
|
14
18
|
const path = require('path');
|
|
15
19
|
const methods = ['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'PATCH', 'OPTIONS'];
|
|
16
20
|
function load() {
|
|
17
21
|
const validRoutes = [];
|
|
18
22
|
const patterns = [`${__dirname}/../api/**/routes.{ts,js}`, `${process.cwd()}/src/api/**/routes.{ts,js}`];
|
|
23
|
+
const authMiddlewares = ['global.isAuthenticated', 'global.isAdmin'];
|
|
19
24
|
patterns.forEach((pattern) => {
|
|
20
25
|
log.t && log.trace('Looking for ' + pattern);
|
|
21
26
|
glob.sync(pattern).forEach((f, index, values) => {
|
|
@@ -24,22 +29,17 @@ function load() {
|
|
|
24
29
|
const file = path.join(dir, path.basename(f));
|
|
25
30
|
const routesjs = require(f);
|
|
26
31
|
const { routes = [], config: defaultConfig = {} } = routesjs || {};
|
|
27
|
-
if (!defaultConfig.enable)
|
|
28
|
-
defaultConfig.enable = true;
|
|
29
|
-
if (defaultConfig.deprecated == null)
|
|
30
|
-
defaultConfig.deprecated = false;
|
|
31
|
-
if (defaultConfig.controller == null)
|
|
32
|
-
defaultConfig.controller = 'controller';
|
|
33
32
|
log.t && log.trace(`* Add ${routes.length} routes from ${file}`);
|
|
34
33
|
routes.forEach((route, index) => {
|
|
35
34
|
const errors = [];
|
|
36
|
-
const { method: methodCase, path: pathName = '/', handler, config = {}, middlewares = [], roles:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
const { method: methodCase, path: pathName = '/', handler, config = {}, middlewares = [], roles: rs = [] } = route;
|
|
36
|
+
const requiredRoles = !rs.length ? [roles.public] : rs;
|
|
37
|
+
const reqAuth = middlewares.some((m) => authMiddlewares.includes(m)) ||
|
|
38
|
+
requiredRoles.every((r) => r.code !== roles.public.code);
|
|
39
|
+
if (!(config === null || config === void 0 ? void 0 : config.security) && reqAuth) {
|
|
40
40
|
config.security = 'bearer';
|
|
41
41
|
}
|
|
42
|
-
const { title = '', description = '', enable = defaultConfig.enable
|
|
42
|
+
const { title = '', description = '', enable = (0, yn_1.default)(defaultConfig.enable, true), deprecated = (0, yn_1.default)(defaultConfig.deprecated, false), tags = defaultConfig.tags, version = defaultConfig.version || '', security = defaultConfig.security, query, params, body, response } = config || {};
|
|
43
43
|
const endpoint = `${dir}${pathName.replace(/\/+$/, '')}`;
|
|
44
44
|
const method = methodCase.toUpperCase();
|
|
45
45
|
const num = index + 1;
|
|
@@ -62,20 +62,21 @@ function load() {
|
|
|
62
62
|
log.e && errors.forEach((error) => log.error(error));
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
65
|
+
const toAdd = enable && errors.length === 0;
|
|
66
|
+
toAdd
|
|
67
|
+
? log.t &&
|
|
68
|
+
log.trace(`* Method [${method}] path ${endpoint} handler ${handler} enabled with ${(middlewares === null || middlewares === void 0 ? void 0 : middlewares.length) || 0} middlewares`)
|
|
69
|
+
: log.w && log.warn(`* Method [${method}] path ${endpoint} handler ${handler} disabled. Skip.`);
|
|
70
|
+
toAdd &&
|
|
70
71
|
validRoutes.push({
|
|
71
72
|
handler,
|
|
72
73
|
method,
|
|
73
74
|
path: '/' + endpoint,
|
|
74
75
|
middlewares,
|
|
75
|
-
roles:
|
|
76
|
+
roles: requiredRoles,
|
|
76
77
|
enable,
|
|
77
78
|
base,
|
|
78
|
-
file: path.join(base, defaultConfig.controller, handlerParts[0]),
|
|
79
|
+
file: path.join(base, defaultConfig.controller || 'controller', handlerParts[0]),
|
|
79
80
|
func: handlerParts[1],
|
|
80
81
|
doc: {
|
|
81
82
|
summary: title,
|
|
@@ -90,7 +91,6 @@ function load() {
|
|
|
90
91
|
response
|
|
91
92
|
}
|
|
92
93
|
});
|
|
93
|
-
}
|
|
94
94
|
});
|
|
95
95
|
});
|
|
96
96
|
});
|
|
@@ -98,27 +98,59 @@ function load() {
|
|
|
98
98
|
return validRoutes;
|
|
99
99
|
}
|
|
100
100
|
exports.load = load;
|
|
101
|
-
function
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
101
|
+
function tryToLoadFile(fileName) {
|
|
102
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
103
|
+
return new Promise((resolve, reject) => {
|
|
104
|
+
try {
|
|
105
|
+
const required = fileName ? require(fileName) : null;
|
|
106
|
+
resolve(required);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
reject(err);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function loadMiddleware(base, middleware = '') {
|
|
115
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
116
|
+
const key = 'global.';
|
|
117
|
+
const isGlobal = middleware.indexOf(key) > -1;
|
|
118
|
+
let required = null;
|
|
119
|
+
if (isGlobal) {
|
|
120
|
+
const name = middleware.substring(key.length);
|
|
121
|
+
required = yield tryToLoadFile(path.resolve(process.cwd() + '/src/middleware/' + name)).catch(() => __awaiter(this, void 0, void 0, function* () {
|
|
122
|
+
return yield tryToLoadFile(path.resolve(__dirname + '/../middleware/' + name));
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
required = yield tryToLoadFile(path.resolve(base + '/middleware/' + middleware));
|
|
127
|
+
}
|
|
128
|
+
if (!required) {
|
|
129
|
+
log.error(`Middleware ${middleware} not loaded`);
|
|
130
|
+
throw new Error(`Middleware ${middleware} not loaded`);
|
|
131
|
+
}
|
|
132
|
+
return required;
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
function loadMiddlewares(base, middlewares = []) {
|
|
136
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
137
|
+
const midds = {};
|
|
138
|
+
yield Promise.all(middlewares.map((m) => __awaiter(this, void 0, void 0, function* () {
|
|
139
|
+
const middleware = yield loadMiddleware(base, m);
|
|
140
|
+
Object.keys(middleware).map((name) => (midds[name] = [...(midds[name] || []), middleware[name]]));
|
|
141
|
+
})));
|
|
142
|
+
return midds;
|
|
143
|
+
});
|
|
107
144
|
}
|
|
108
145
|
function apply(server, routes) {
|
|
109
146
|
log.t && log.trace(`Apply ${routes.length} routes to server with pid ${process.pid}`);
|
|
110
147
|
routes.forEach(({ handler, method, path, middlewares, roles, enable, base, file, func, doc }) => __awaiter(this, void 0, void 0, function* () {
|
|
111
148
|
if (enable) {
|
|
112
149
|
log.t && log.trace(`* Add path ${method} ${path} on handle ${handler}`);
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
path: path,
|
|
116
|
-
schema: doc,
|
|
117
|
-
preHandler: (middlewares || []).map((m) => require(normalizeMiddlewarePath(base, m))),
|
|
118
|
-
config: {
|
|
150
|
+
const midds = yield loadMiddlewares(base, middlewares);
|
|
151
|
+
server.route(Object.assign(Object.assign({ method: method, path: path, schema: doc }, midds), { config: {
|
|
119
152
|
requiredRoles: roles || []
|
|
120
|
-
},
|
|
121
|
-
handler: function (req, reply) {
|
|
153
|
+
}, handler: function (req, reply) {
|
|
122
154
|
try {
|
|
123
155
|
return require(file)[func](req, reply);
|
|
124
156
|
}
|
|
@@ -126,8 +158,7 @@ function apply(server, routes) {
|
|
|
126
158
|
log.e && log.error(`Cannot find ${file} or method ${func}: ${err}`);
|
|
127
159
|
return reply.code(500).send(`Invalid handler ${handler}`);
|
|
128
160
|
}
|
|
129
|
-
}
|
|
130
|
-
});
|
|
161
|
+
} }));
|
|
131
162
|
}
|
|
132
163
|
}));
|
|
133
164
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../lib/loader/router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../lib/loader/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,9 +15,14 @@ function apply(server) {
|
|
|
15
15
|
schemaNames.map((name) => {
|
|
16
16
|
const schema = schemaClass[name];
|
|
17
17
|
if (schema != null) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
if (schema === null || schema === void 0 ? void 0 : schema.$id) {
|
|
19
|
+
log.trace(`* Schema [${schema.$id}] loaded from ${schemaFileName}`);
|
|
20
|
+
server.addSchema(schema);
|
|
21
|
+
schemaCount++;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
log.warn(`* Schema [${schema.$id}] not loaded from ${schemaFileName}`);
|
|
25
|
+
}
|
|
21
26
|
}
|
|
22
27
|
});
|
|
23
28
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../lib/loader/schemas.ts"],"names":[],"mappings":";;;AAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAE5B,SAAgB,KAAK,CAAC,MAAW;IAC/B,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,uBAAuB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAA;IAEhG,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC,CAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE;YACvC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAE5C,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACvB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;gBAChC,IAAI,MAAM,IAAI,IAAI,EAAE;oBAClB,GAAG,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,GAAG,iBAAiB,cAAc,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../lib/loader/schemas.ts"],"names":[],"mappings":";;;AAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAE5B,SAAgB,KAAK,CAAC,MAAW;IAC/B,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,uBAAuB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAA;IAEhG,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC,CAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE;YACvC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAE5C,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACvB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;gBAChC,IAAI,MAAM,IAAI,IAAI,EAAE;oBAClB,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,GAAG,EAAE;wBACf,GAAG,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,GAAG,iBAAiB,cAAc,EAAE,CAAC,CAAA;wBACnE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;wBACxB,WAAW,EAAE,CAAA;qBACd;yBAAM;wBACL,GAAG,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,GAAG,qBAAqB,cAAc,EAAE,CAAC,CAAA;qBACvE;iBACF;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,mBAAmB,WAAW,wBAAwB,CAAC,CAAA;AAC5E,CAAC;AA3BD,sBA2BC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
exports.preHandler = void 0;
|
|
4
|
+
function preHandler(req, res, done) {
|
|
5
5
|
try {
|
|
6
6
|
if (req.user && req.user.id && req.hasRole(roles.admin)) {
|
|
7
|
-
return
|
|
7
|
+
return done();
|
|
8
8
|
}
|
|
9
9
|
throw new Error('User without this privilege');
|
|
10
10
|
}
|
|
@@ -12,5 +12,6 @@ module.exports = (req, res, next) => {
|
|
|
12
12
|
log.e && log.error(`Upps, something just happened ${err}`);
|
|
13
13
|
res.code(403).send(err);
|
|
14
14
|
}
|
|
15
|
-
}
|
|
15
|
+
}
|
|
16
|
+
exports.preHandler = preHandler;
|
|
16
17
|
//# sourceMappingURL=isAdmin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isAdmin.js","sourceRoot":"","sources":["../../../lib/middleware/isAdmin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"isAdmin.js","sourceRoot":"","sources":["../../../lib/middleware/isAdmin.ts"],"names":[],"mappings":";;;AAEA,SAAgB,UAAU,CAAC,GAAmB,EAAE,GAAiB,EAAE,IAAS;IAC1E,IAAI;QACF,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACvD,OAAO,IAAI,EAAE,CAAA;SACd;QAED,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;KAC/C;IAAC,OAAO,GAAG,EAAE;QACZ,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAA;QAC1D,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;KACxB;AACH,CAAC;AAXD,gCAWC"}
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
exports.preHandler = void 0;
|
|
4
|
+
function preHandler(req, res, done) {
|
|
5
5
|
var _a;
|
|
6
6
|
try {
|
|
7
7
|
if (!!((_a = req.user) === null || _a === void 0 ? void 0 : _a.id)) {
|
|
8
|
-
return
|
|
8
|
+
return done();
|
|
9
9
|
}
|
|
10
|
-
throw new Error('
|
|
10
|
+
throw new Error('Unauthorized');
|
|
11
11
|
}
|
|
12
12
|
catch (err) {
|
|
13
13
|
log.e && log.error(`Upps, something just happened ${err}`);
|
|
14
|
-
res.code(
|
|
14
|
+
return res.code(401).send(err);
|
|
15
15
|
}
|
|
16
|
-
}
|
|
16
|
+
}
|
|
17
|
+
exports.preHandler = preHandler;
|
|
17
18
|
//# sourceMappingURL=isAuthenticated.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isAuthenticated.js","sourceRoot":"","sources":["../../../lib/middleware/isAuthenticated.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"isAuthenticated.js","sourceRoot":"","sources":["../../../lib/middleware/isAuthenticated.ts"],"names":[],"mappings":";;;AAEA,SAAgB,UAAU,CAAC,GAAmB,EAAE,GAAiB,EAAE,IAAS;;IAC1E,IAAI;QACF,IAAI,CAAC,CAAC,CAAA,MAAA,GAAG,CAAC,IAAI,0CAAE,EAAE,CAAA,EAAE;YAClB,OAAO,IAAI,EAAE,CAAA;SACd;QAED,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAA;KAChC;IAAC,OAAO,GAAG,EAAE;QACZ,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAA;QAC1D,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;KAC/B;AACH,CAAC;AAXD,gCAWC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.preSerialization = void 0;
|
|
13
|
+
function preSerialization(req, res, payload) {
|
|
14
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
15
|
+
return payload;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
exports.preSerialization = preSerialization;
|
|
19
|
+
//# sourceMappingURL=postAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postAuth.js","sourceRoot":"","sources":["../../../lib/middleware/postAuth.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,SAAsB,gBAAgB,CAAC,GAAmB,EAAE,GAAiB,EAAE,OAAO;;QACpF,OAAO,OAAO,CAAA;IAChB,CAAC;CAAA;AAFD,4CAEC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.preHandler = void 0;
|
|
13
|
+
function preHandler(req, res) {
|
|
14
|
+
return __awaiter(this, void 0, void 0, function* () { });
|
|
15
|
+
}
|
|
16
|
+
exports.preHandler = preHandler;
|
|
17
|
+
//# sourceMappingURL=preAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preAuth.js","sourceRoot":"","sources":["../../../lib/middleware/preAuth.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,SAAsB,UAAU,CAAC,GAAmB,EAAE,GAAiB;0DAAG,CAAC;CAAA;AAA3E,gCAA2E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.newAuthCode = void 0;
|
|
4
|
+
const { customAlphabet } = require('nanoid');
|
|
5
|
+
const nanoid = customAlphabet('AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789');
|
|
6
|
+
function newAuthCode() {
|
|
7
|
+
return nanoid(Number(process.env.AUTH_CODE_SIZE) || 10);
|
|
8
|
+
}
|
|
9
|
+
exports.newAuthCode = newAuthCode;
|
|
10
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../lib/util/generate.ts"],"names":[],"mappings":";;;AAAA,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,gEAAgE,CAAC,CAAA;AAE/F,SAAgB,WAAW;IACzB,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAA;AACzD,CAAC;AAFD,kCAEC"}
|
package/dist/lib/util/regexp.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tollFreePhone = exports.landLinePhone = exports.mobilePhone = exports.iban = exports.taxCodeCompany = exports.taxCodePersona = exports.zipCode = exports.password = exports.email = exports.emailAlt = exports.username = void 0;
|
|
4
|
+
exports.username = /(?=^.{3,33}$)^[a-z][a-z0-9]*[._-]?[a-z0-9]+$/gi;
|
|
5
|
+
exports.emailAlt = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
|
6
|
+
exports.email = /^\w+([\.+-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
|
|
7
|
+
exports.password = /^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[^\w\d\s:])([^\s]){8,16}$/;
|
|
8
|
+
exports.zipCode = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
|
|
9
|
+
exports.taxCodePersona = /^[a-zA-Z]{6}[0-9]{2}[abcdehlmprstABCDEHLMPRST]{1}[0-9]{2}([a-zA-Z]{1}[0-9]{3})[a-zA-Z]{1}$/;
|
|
10
|
+
exports.taxCodeCompany = /^([A-Z]{2}|)[0-9]{11}$/;
|
|
11
|
+
exports.iban = /^[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}$/;
|
|
12
|
+
exports.mobilePhone = /^((00|\+)39)?3[0-9]{8,9}$/;
|
|
13
|
+
exports.landLinePhone = /^(((00|\+)39))?[\s]?(0{1}[1-9]{1,3})[\s]?(\d{4,6})$/;
|
|
14
|
+
exports.tollFreePhone = /^((00|\+)39)?(800|803|167)\d{3,6}$/;
|
|
15
15
|
//# sourceMappingURL=regexp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regexp.js","sourceRoot":"","sources":["../../../lib/util/regexp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"regexp.js","sourceRoot":"","sources":["../../../lib/util/regexp.ts"],"names":[],"mappings":";;;AAIa,QAAA,QAAQ,GAAG,gDAAgD,CAAA;AAC3D,QAAA,QAAQ,GACnB,yJAAyJ,CAAA;AAM9I,QAAA,KAAK,GAAG,gDAAgD,CAAA;AASxD,QAAA,QAAQ,GAAG,+DAA+D,CAAA;AAC1E,QAAA,OAAO,GAAG,2BAA2B,CAAA;AACrC,QAAA,cAAc,GACzB,4FAA4F,CAAA;AAKjF,QAAA,cAAc,GAAG,wBAAwB,CAAA;AACzC,QAAA,IAAI,GAAG,iEAAiE,CAAA;AACxE,QAAA,WAAW,GAAG,2BAA2B,CAAA;AACzC,QAAA,aAAa,GAAG,qDAAqD,CAAA;AACrE,QAAA,aAAa,GAAG,oCAAoC,CAAA"}
|
package/index.d.ts
CHANGED
package/index.ts
CHANGED
|
@@ -27,6 +27,7 @@ import fastifyApollo, { fastifyApolloDrainPlugin } from '@as-integrations/fastif
|
|
|
27
27
|
import { myContextFunction, MyContext } from './lib/apollo/context'
|
|
28
28
|
import resolvers from './lib/apollo/resolvers'
|
|
29
29
|
import typeDefs from './lib/apollo/type-defs'
|
|
30
|
+
import { UserManagement } from './types/global'
|
|
30
31
|
|
|
31
32
|
global.log = logger
|
|
32
33
|
|
|
@@ -132,7 +133,7 @@ async function addFastifySwagger(fastify: FastifyInstance) {
|
|
|
132
133
|
}
|
|
133
134
|
}
|
|
134
135
|
|
|
135
|
-
const start = async () => {
|
|
136
|
+
const start = async (decorators) => {
|
|
136
137
|
const begin = new Date().getTime()
|
|
137
138
|
mark.print(logger)
|
|
138
139
|
global.roles = loaderRoles.load()
|
|
@@ -164,6 +165,52 @@ const start = async () => {
|
|
|
164
165
|
await addApolloRouting(fastify, apollo)
|
|
165
166
|
await addFastifyRouting(fastify)
|
|
166
167
|
|
|
168
|
+
// defaults
|
|
169
|
+
decorators = {
|
|
170
|
+
userManager: {
|
|
171
|
+
createUser(data: any) {
|
|
172
|
+
throw Error('Not implemented')
|
|
173
|
+
},
|
|
174
|
+
resetExternalId(data: any) {
|
|
175
|
+
throw Error('Not implemented')
|
|
176
|
+
},
|
|
177
|
+
updateUserById(id: string, user: any) {
|
|
178
|
+
throw Error('Not implemented')
|
|
179
|
+
},
|
|
180
|
+
retrieveUserById(id: string) {
|
|
181
|
+
throw Error('Not implemented')
|
|
182
|
+
},
|
|
183
|
+
retrieveUserByEmail(email: string) {
|
|
184
|
+
throw Error('Not implemented')
|
|
185
|
+
},
|
|
186
|
+
retrieveUserByExternalId(externalId: string) {
|
|
187
|
+
throw Error('Not implemented')
|
|
188
|
+
},
|
|
189
|
+
retrieveUserByPassword(email: string, password: string) {
|
|
190
|
+
throw Error('Not implemented')
|
|
191
|
+
},
|
|
192
|
+
changePassword(email: string, password: string, oldPassword: string) {
|
|
193
|
+
throw Error('Not implemented')
|
|
194
|
+
},
|
|
195
|
+
enableUserById(id: string) {
|
|
196
|
+
throw Error('Not implemented')
|
|
197
|
+
},
|
|
198
|
+
disableUserById(id: string) {
|
|
199
|
+
throw Error('Not implemented')
|
|
200
|
+
},
|
|
201
|
+
isValidUser(data: any) {
|
|
202
|
+
throw Error('Not implemented')
|
|
203
|
+
}
|
|
204
|
+
} as UserManagement,
|
|
205
|
+
...decorators
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
await Promise.all(
|
|
209
|
+
Object.keys(decorators || {}).map(async (key) => {
|
|
210
|
+
await fastify.decorate(key, decorators[key])
|
|
211
|
+
})
|
|
212
|
+
)
|
|
213
|
+
|
|
167
214
|
await fastify
|
|
168
215
|
.listen({
|
|
169
216
|
port: Number(port),
|
|
@@ -192,7 +239,8 @@ export {
|
|
|
192
239
|
Roles,
|
|
193
240
|
Route,
|
|
194
241
|
RouteConfig,
|
|
195
|
-
ConfiguredRoute
|
|
242
|
+
ConfiguredRoute,
|
|
243
|
+
UserManagement
|
|
196
244
|
} from './types/global'
|
|
197
245
|
|
|
198
246
|
/**
|
|
@@ -1,31 +1,126 @@
|
|
|
1
1
|
import { FastifyReply, FastifyRequest } from 'fastify'
|
|
2
|
-
import
|
|
2
|
+
import * as regExp from '../../../util/regexp'
|
|
3
|
+
|
|
4
|
+
export async function register(req: FastifyRequest, reply: FastifyReply) {
|
|
5
|
+
const { password1: password, password2, ...data } = req.data()
|
|
6
|
+
|
|
7
|
+
if (!data.username) {
|
|
8
|
+
return reply.status(404).send(Error('Username not valid'))
|
|
9
|
+
}
|
|
10
|
+
if (!data.email || !regExp.email.test(data.email)) {
|
|
11
|
+
return reply.status(404).send(Error('Email not valid'))
|
|
12
|
+
}
|
|
13
|
+
if (!password || !regExp.password.test(password)) {
|
|
14
|
+
return reply.status(404).send(Error('Password not valid'))
|
|
15
|
+
}
|
|
16
|
+
if (!password2 || password2 !== password) {
|
|
17
|
+
return reply.status(404).send(Error('Repeated password not match'))
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// public is the default
|
|
21
|
+
const publicRole = global.roles?.public?.code || 'public'
|
|
22
|
+
data.roles = (data.requiredRoles || []).map((r) => global.roles[r]?.code).filter((r) => !!r)
|
|
23
|
+
if (!data.roles.includes(publicRole)) {
|
|
24
|
+
data.roles.push(publicRole)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const user = await req.server['userManager'].createUser({ ...data, password: password })
|
|
28
|
+
if (!user) {
|
|
29
|
+
return reply.status(400).send(Error('User not registered'))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return user
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function unregister(req: FastifyRequest, reply: FastifyReply) {
|
|
36
|
+
const { email, password } = req.data()
|
|
37
|
+
|
|
38
|
+
let user = await req.server['userManager'].retrieveUserByPassword(email, password)
|
|
39
|
+
let isValid = await req.server['userManager'].isValidUser(user)
|
|
40
|
+
|
|
41
|
+
if (!isValid) {
|
|
42
|
+
return reply.status(403).send(Error('Wrong credentials'))
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (!user.enabled) {
|
|
46
|
+
return reply.status(403).send(Error('User not enabled'))
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
user = await req.server['userManager'].disableUserById(user?.id)
|
|
50
|
+
isValid = await req.server['userManager'].isValidUser(user)
|
|
51
|
+
|
|
52
|
+
if (!isValid) {
|
|
53
|
+
return reply.status(400).send(Error('User not valid'))
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return { ok: true }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function changePassword(req: FastifyRequest, reply: FastifyReply) {
|
|
60
|
+
const { email, oldPassword, newPassword1, newPassword2 } = req.data()
|
|
61
|
+
|
|
62
|
+
if (!newPassword1 || !regExp.password.test(newPassword1)) {
|
|
63
|
+
return reply.status(404).send(Error('New password not valid'))
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (!newPassword2 || newPassword2 !== newPassword1) {
|
|
67
|
+
return reply.status(404).send(Error('Repeated new password not match'))
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
let user = await req.server['userManager'].retrieveUserByPassword(email, oldPassword)
|
|
71
|
+
let isValid = await req.server['userManager'].isValidUser(user)
|
|
72
|
+
|
|
73
|
+
if (!isValid) {
|
|
74
|
+
return reply.status(403).send(Error('Wrong credentials'))
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (!user.enabled) {
|
|
78
|
+
return reply.status(403).send(Error('User not enabled'))
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
user = await req.server['userManager'].changePassword(email, newPassword1, oldPassword)
|
|
82
|
+
isValid = await req.server['userManager'].isValidUser(user)
|
|
83
|
+
return { ok: isValid }
|
|
84
|
+
}
|
|
3
85
|
|
|
4
86
|
export async function login(req: FastifyRequest, reply: FastifyReply) {
|
|
5
|
-
const { email
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
87
|
+
const { email, password } = req.data()
|
|
88
|
+
|
|
89
|
+
if (!email || !regExp.email.test(email)) {
|
|
90
|
+
return reply.status(404).send(Error('Email not valid'))
|
|
91
|
+
}
|
|
92
|
+
if (!password || !regExp.password.test(password)) {
|
|
93
|
+
return reply.status(404).send(Error('Password not valid'))
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const user = await req.server['userManager'].retrieveUserByPassword(email, password)
|
|
97
|
+
const isValid = await req.server['userManager'].isValidUser(user)
|
|
98
|
+
|
|
99
|
+
if (!isValid) {
|
|
100
|
+
return reply.status(403).send(Error('Wrong credentials'))
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (!user.enabled) {
|
|
104
|
+
return reply.status(403).send(Error('User not enabled'))
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// log.trace('User: ' + JSON.stringify(user) + ' ' + roles)
|
|
22
108
|
// https://www.iana.org/assignments/jwt/jwt.xhtml
|
|
23
|
-
const token = user !== null ? await reply.jwtSign({ sub: user.
|
|
24
|
-
|
|
109
|
+
const token = user !== null ? await reply.jwtSign({ sub: user.externalId }) : null
|
|
110
|
+
return {
|
|
111
|
+
...user,
|
|
112
|
+
token: token || null,
|
|
113
|
+
roles: (user.roles || [global.role?.public?.code || 'public']).map((r) => r?.code || r)
|
|
114
|
+
}
|
|
25
115
|
}
|
|
26
116
|
|
|
27
|
-
export async function
|
|
28
|
-
|
|
117
|
+
export async function invalidateTokens(req: FastifyRequest, reply: FastifyReply) {
|
|
118
|
+
let isValid = await req.server['userManager'].isValidUser(req.user)
|
|
119
|
+
if (!isValid) {
|
|
120
|
+
return reply.status(403).send(Error('User not linked'))
|
|
121
|
+
}
|
|
29
122
|
|
|
30
|
-
|
|
123
|
+
const user = await req.server['userManager'].resetExternalId(req.user?.id)
|
|
124
|
+
isValid = await req.server['userManager'].isValidUser(user)
|
|
125
|
+
return { ok: isValid }
|
|
31
126
|
}
|