@volcanicminds/backend 2.0.4 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -7
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +160 -210
- package/dist/index.js.map +1 -1
- package/dist/lib/api/auth/controller/auth.d.ts +35 -0
- package/dist/lib/api/auth/controller/auth.d.ts.map +1 -0
- package/dist/lib/api/auth/controller/auth.js +245 -333
- package/dist/lib/api/auth/controller/auth.js.map +1 -1
- package/dist/lib/api/auth/routes.d.ts +90 -0
- package/dist/lib/api/auth/routes.d.ts.map +1 -0
- package/dist/lib/api/auth/routes.js +1 -2
- package/dist/lib/api/auth/routes.js.map +1 -1
- package/dist/lib/api/health/controller/health.d.ts +3 -0
- package/dist/lib/api/health/controller/health.d.ts.map +1 -0
- package/dist/lib/api/health/controller/health.js +1 -4
- package/dist/lib/api/health/controller/health.js.map +1 -1
- package/dist/lib/api/health/routes.d.ts +26 -0
- package/dist/lib/api/health/routes.d.ts.map +1 -0
- package/dist/lib/api/health/routes.js +1 -2
- package/dist/lib/api/health/routes.js.map +1 -1
- package/dist/lib/api/token/controller/token.d.ts +16 -0
- package/dist/lib/api/token/controller/token.d.ts.map +1 -0
- package/dist/lib/api/token/controller/token.js +69 -105
- package/dist/lib/api/token/controller/token.js.map +1 -1
- package/dist/lib/api/token/routes.d.ts +179 -0
- package/dist/lib/api/token/routes.d.ts.map +1 -0
- package/dist/lib/api/token/routes.js +1 -2
- package/dist/lib/api/token/routes.js.map +1 -1
- package/dist/lib/api/tool/controller/tool.d.ts +3 -0
- package/dist/lib/api/tool/controller/tool.d.ts.map +1 -0
- package/dist/lib/api/tool/controller/tool.js +8 -22
- package/dist/lib/api/tool/controller/tool.js.map +1 -1
- package/dist/lib/api/tool/routes.d.ts +26 -0
- package/dist/lib/api/tool/routes.d.ts.map +1 -0
- package/dist/lib/api/tool/routes.js +1 -2
- package/dist/lib/api/tool/routes.js.map +1 -1
- package/dist/lib/api/users/controller/user.d.ts +12 -0
- package/dist/lib/api/users/controller/user.d.ts.map +1 -0
- package/dist/lib/api/users/controller/user.js +59 -112
- package/dist/lib/api/users/controller/user.js.map +1 -1
- package/dist/lib/api/users/routes.d.ts +173 -0
- package/dist/lib/api/users/routes.d.ts.map +1 -0
- package/dist/lib/api/users/routes.js +1 -2
- package/dist/lib/api/users/routes.js.map +1 -1
- package/dist/lib/apollo/context.d.ts +6 -0
- package/dist/lib/apollo/context.d.ts.map +1 -0
- package/dist/lib/apollo/context.js +2 -16
- package/dist/lib/apollo/context.js.map +1 -1
- package/dist/lib/apollo/resolvers.d.ts +8 -0
- package/dist/lib/apollo/resolvers.d.ts.map +1 -0
- package/dist/lib/apollo/resolvers.js +1 -2
- package/dist/lib/apollo/resolvers.js.map +1 -1
- package/dist/lib/apollo/type-defs.d.ts +3 -0
- package/dist/lib/apollo/type-defs.d.ts.map +1 -0
- package/dist/lib/apollo/type-defs.js +1 -2
- package/dist/lib/apollo/type-defs.js.map +1 -1
- package/dist/lib/config/general.d.ts +12 -0
- package/dist/lib/config/general.d.ts.map +1 -0
- package/dist/lib/config/general.js +1 -2
- package/dist/lib/config/general.js.map +1 -1
- package/dist/lib/config/plugins.d.ts +25 -0
- package/dist/lib/config/plugins.d.ts.map +1 -0
- package/dist/lib/config/plugins.js +1 -2
- package/dist/lib/config/plugins.js.map +1 -1
- package/dist/lib/config/roles.d.ts +7 -0
- package/dist/lib/config/roles.d.ts.map +1 -0
- package/dist/lib/config/roles.js +1 -2
- package/dist/lib/config/roles.js.map +1 -1
- package/dist/lib/config/tracking.d.ts +10 -0
- package/dist/lib/config/tracking.d.ts.map +1 -0
- package/dist/lib/config/tracking.js +1 -2
- package/dist/lib/config/tracking.js.map +1 -1
- package/dist/lib/hooks/onError.d.ts +3 -0
- package/dist/lib/hooks/onError.d.ts.map +1 -0
- package/dist/lib/hooks/onError.js +2 -12
- package/dist/lib/hooks/onError.js.map +1 -1
- package/dist/lib/hooks/onRequest.d.ts +3 -0
- package/dist/lib/hooks/onRequest.d.ts.map +1 -0
- package/dist/lib/hooks/onRequest.js +24 -35
- package/dist/lib/hooks/onRequest.js.map +1 -1
- package/dist/lib/hooks/onResponse.d.ts +3 -0
- package/dist/lib/hooks/onResponse.d.ts.map +1 -0
- package/dist/lib/hooks/onResponse.js +2 -12
- package/dist/lib/hooks/onResponse.js.map +1 -1
- package/dist/lib/hooks/preHandler.d.ts +3 -0
- package/dist/lib/hooks/preHandler.d.ts.map +1 -0
- package/dist/lib/hooks/preHandler.js +3 -47
- package/dist/lib/hooks/preHandler.js.map +1 -1
- package/dist/lib/hooks/preSerialization.d.ts +3 -0
- package/dist/lib/hooks/preSerialization.d.ts.map +1 -0
- package/dist/lib/hooks/preSerialization.js +6 -53
- package/dist/lib/hooks/preSerialization.js.map +1 -1
- package/dist/lib/loader/general.d.ts +3 -0
- package/dist/lib/loader/general.d.ts.map +1 -0
- package/dist/lib/loader/general.js +15 -13
- package/dist/lib/loader/general.js.map +1 -1
- package/dist/lib/loader/hooks.d.ts +2 -0
- package/dist/lib/loader/hooks.d.ts.map +1 -0
- package/dist/lib/loader/hooks.js +19 -18
- package/dist/lib/loader/hooks.js.map +1 -1
- package/dist/lib/loader/plugins.d.ts +2 -0
- package/dist/lib/loader/plugins.d.ts.map +1 -0
- package/dist/lib/loader/plugins.js +11 -12
- package/dist/lib/loader/plugins.js.map +1 -1
- package/dist/lib/loader/roles.d.ts +3 -0
- package/dist/lib/loader/roles.d.ts.map +1 -0
- package/dist/lib/loader/roles.js +11 -12
- package/dist/lib/loader/roles.js.map +1 -1
- package/dist/lib/loader/router.d.ts +2 -0
- package/dist/lib/loader/router.d.ts.map +1 -0
- package/dist/lib/loader/router.js +111 -129
- package/dist/lib/loader/router.js.map +1 -1
- package/dist/lib/loader/schedules.d.ts +3 -0
- package/dist/lib/loader/schedules.d.ts.map +1 -0
- package/dist/lib/loader/schedules.js +18 -25
- package/dist/lib/loader/schedules.js.map +1 -1
- package/dist/lib/loader/schemas.d.ts +2 -0
- package/dist/lib/loader/schemas.d.ts.map +1 -0
- package/dist/lib/loader/schemas.js +26 -22
- package/dist/lib/loader/schemas.js.map +1 -1
- package/dist/lib/loader/tracking.d.ts +6 -0
- package/dist/lib/loader/tracking.d.ts.map +1 -0
- package/dist/lib/loader/tracking.js +17 -19
- package/dist/lib/loader/tracking.js.map +1 -1
- package/dist/lib/loader/translation.d.ts +2 -0
- package/dist/lib/loader/translation.d.ts.map +1 -0
- package/dist/lib/loader/translation.js +11 -10
- package/dist/lib/loader/translation.js.map +1 -1
- package/dist/lib/middleware/dispatchForgotPasswordLink.d.ts +3 -0
- package/dist/lib/middleware/dispatchForgotPasswordLink.d.ts.map +1 -0
- package/dist/lib/middleware/dispatchForgotPasswordLink.js +2 -16
- package/dist/lib/middleware/dispatchForgotPasswordLink.js.map +1 -1
- package/dist/lib/middleware/isAdmin.d.ts +3 -0
- package/dist/lib/middleware/isAdmin.d.ts.map +1 -0
- package/dist/lib/middleware/isAdmin.js +1 -4
- package/dist/lib/middleware/isAdmin.js.map +1 -1
- package/dist/lib/middleware/isAuthenticated.d.ts +3 -0
- package/dist/lib/middleware/isAuthenticated.d.ts.map +1 -0
- package/dist/lib/middleware/isAuthenticated.js +2 -6
- package/dist/lib/middleware/isAuthenticated.js.map +1 -1
- package/dist/lib/middleware/postAuth.d.ts +3 -0
- package/dist/lib/middleware/postAuth.d.ts.map +1 -0
- package/dist/lib/middleware/postAuth.js +2 -16
- package/dist/lib/middleware/postAuth.js.map +1 -1
- package/dist/lib/middleware/preAuth.d.ts +3 -0
- package/dist/lib/middleware/preAuth.d.ts.map +1 -0
- package/dist/lib/middleware/preAuth.js +1 -15
- package/dist/lib/middleware/preAuth.js.map +1 -1
- package/dist/lib/middleware/preForgotPasswordHandler.d.ts +3 -0
- package/dist/lib/middleware/preForgotPasswordHandler.d.ts.map +1 -0
- package/dist/lib/middleware/preForgotPasswordHandler.js +1 -15
- package/dist/lib/middleware/preForgotPasswordHandler.js.map +1 -1
- package/dist/lib/schedules/test.job.d.ts +4 -0
- package/dist/lib/schedules/test.job.d.ts.map +1 -0
- package/dist/lib/schedules/test.job.js +3 -18
- package/dist/lib/schedules/test.job.js.map +1 -1
- package/dist/lib/schemas/auth.d.ts +175 -0
- package/dist/lib/schemas/auth.d.ts.map +1 -0
- package/dist/lib/schemas/auth.js +9 -12
- package/dist/lib/schemas/auth.js.map +1 -1
- package/dist/lib/schemas/common.d.ts +81 -0
- package/dist/lib/schemas/common.d.ts.map +1 -0
- package/dist/lib/schemas/common.js +6 -9
- package/dist/lib/schemas/common.js.map +1 -1
- package/dist/lib/schemas/global.d.ts +29 -0
- package/dist/lib/schemas/global.d.ts.map +1 -0
- package/dist/lib/schemas/global.js +2 -5
- package/dist/lib/schemas/global.js.map +1 -1
- package/dist/lib/schemas/token.d.ts +68 -0
- package/dist/lib/schemas/token.d.ts.map +1 -0
- package/dist/lib/schemas/token.js +3 -6
- package/dist/lib/schemas/token.js.map +1 -1
- package/dist/lib/schemas/user.d.ts +120 -0
- package/dist/lib/schemas/user.d.ts.map +1 -0
- package/dist/lib/schemas/user.js +5 -8
- package/dist/lib/schemas/user.js.map +1 -1
- package/dist/lib/util/common.d.ts +5 -0
- package/dist/lib/util/common.d.ts.map +1 -0
- package/dist/lib/util/common.js +4 -8
- package/dist/lib/util/common.js.map +1 -1
- package/dist/lib/util/errors.d.ts +15 -0
- package/dist/lib/util/errors.d.ts.map +1 -0
- package/dist/lib/util/errors.js +7 -7
- package/dist/lib/util/errors.js.map +1 -1
- package/dist/lib/util/generate.d.ts +2 -0
- package/dist/lib/util/generate.d.ts.map +1 -0
- package/dist/lib/util/generate.js +2 -5
- package/dist/lib/util/generate.js.map +1 -1
- package/dist/lib/util/logger.d.ts +35 -0
- package/dist/lib/util/logger.d.ts.map +1 -0
- package/dist/lib/util/logger.js +8 -12
- package/dist/lib/util/logger.js.map +1 -1
- package/dist/lib/util/mark.d.ts +2 -0
- package/dist/lib/util/mark.d.ts.map +1 -0
- package/dist/lib/util/mark.js +2 -4
- package/dist/lib/util/mark.js.map +1 -1
- package/dist/lib/util/path.d.ts +2 -0
- package/dist/lib/util/path.d.ts.map +1 -0
- package/dist/lib/util/path.js +5 -5
- package/dist/lib/util/path.js.map +1 -1
- package/dist/lib/util/regexp.d.ts +12 -0
- package/dist/lib/util/regexp.d.ts.map +1 -0
- package/dist/lib/util/regexp.js +11 -14
- package/dist/lib/util/regexp.js.map +1 -1
- package/dist/lib/util/require.d.ts +3 -0
- package/dist/lib/util/require.d.ts.map +1 -0
- package/dist/lib/util/require.js +4 -0
- package/dist/lib/util/require.js.map +1 -0
- package/dist/lib/util/tracker.d.ts +4 -0
- package/dist/lib/util/tracker.d.ts.map +1 -0
- package/dist/lib/util/tracker.js +63 -86
- package/dist/lib/util/tracker.js.map +1 -1
- package/dist/lib/util/yn.d.ts +2 -0
- package/dist/lib/util/yn.d.ts.map +1 -0
- package/dist/lib/util/yn.js +1 -3
- package/dist/lib/util/yn.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1 -2
- package/dist/server.js.map +1 -1
- package/lib/api/auth/controller/auth.ts +1 -1
- package/lib/api/auth/routes.ts +1 -1
- package/lib/api/health/routes.ts +1 -1
- package/lib/api/token/routes.ts +1 -1
- package/lib/api/tool/routes.ts +1 -1
- package/lib/api/users/controller/user.ts +2 -2
- package/lib/api/users/routes.ts +1 -1
- package/lib/apollo/resolvers.ts +1 -1
- package/lib/config/general.ts +1 -3
- package/lib/config/plugins.ts +1 -3
- package/lib/config/roles.ts +1 -1
- package/lib/config/tracking.ts +1 -1
- package/lib/hooks/onError.ts +1 -1
- package/lib/hooks/onRequest.ts +8 -6
- package/lib/hooks/onResponse.ts +1 -1
- package/lib/hooks/preHandler.ts +2 -2
- package/lib/hooks/preSerialization.ts +2 -2
- package/lib/loader/general.ts +13 -9
- package/lib/loader/hooks.ts +15 -11
- package/lib/loader/plugins.ts +14 -10
- package/lib/loader/roles.ts +14 -9
- package/lib/loader/router.ts +106 -88
- package/lib/loader/schedules.ts +6 -6
- package/lib/loader/schemas.ts +27 -19
- package/lib/loader/tracking.ts +14 -9
- package/lib/loader/translation.ts +9 -14
- package/lib/schedules/test.job.ts +1 -1
- package/lib/util/common.ts +1 -1
- package/lib/util/generate.ts +1 -1
- package/lib/util/logger.ts +1 -1
- package/lib/util/mark.ts +1 -0
- package/lib/util/path.ts +6 -1
- package/lib/util/require.ts +3 -0
- package/lib/util/tracker.ts +1 -1
- package/package.json +24 -15
- package/.dockerignore +0 -6
- package/.mocharc.json +0 -3
- package/.nvmrc +0 -1
- package/.prettierignore +0 -5
- package/.prettierrc +0 -9
- package/DOCKER.md +0 -27
- package/Dockerfile +0 -24
- package/Dockerfile.prod +0 -33
- package/NPM.md +0 -24
- package/TODO.md +0 -14
- package/combine.js +0 -124
- package/dist/lib/locales/en.json +0 -12
- package/dist/lib/locales/it.json +0 -12
- package/dist/nodemon.json +0 -7
- package/dist/package-lock.json +0 -9787
- package/dist/package.json +0 -108
- package/dist/tsconfig.json +0 -32
- package/index.d.ts +0 -16
- package/index.ts +0 -410
- package/logo-dark.png +0 -0
- package/nodemon.json +0 -7
- package/server.ts +0 -5
- package/test/common/api.ts +0 -80
- package/test/common/bootstrap.ts +0 -33
- package/test/demo/demo.ts +0 -9
- package/test/demo/index.ts +0 -14
- package/test/e2e/index.ts +0 -14
- package/test/index.spec.ts +0 -20
- package/test/unit/index.ts +0 -14
- package/test/unit/semver.ts +0 -24
- package/test/unit/translation.ts +0 -77
- package/tsconfig.json +0 -40
- package/types/global.d.ts +0 -225
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { FastifyReply, FastifyRequest } from 'fastify'
|
|
2
|
-
import { AuthenticatedUser } from '../../../../types/global'
|
|
2
|
+
import type { AuthenticatedUser } from '../../../../types/global.js'
|
|
3
3
|
|
|
4
4
|
export async function getRoles(req: FastifyRequest, reply: FastifyReply) {
|
|
5
5
|
const allRoles = Object.keys(roles).map((key) => roles[key])
|
|
6
6
|
return reply.send(allRoles)
|
|
7
7
|
}
|
|
8
|
-
|
|
8
|
+
// ... resto del file invariato ...
|
|
9
9
|
export async function count(req: FastifyRequest, reply: FastifyReply) {
|
|
10
10
|
return req.server['userManager'].countQuery(req.data())
|
|
11
11
|
}
|
package/lib/api/users/routes.ts
CHANGED
package/lib/apollo/resolvers.ts
CHANGED
package/lib/config/general.ts
CHANGED
package/lib/config/plugins.ts
CHANGED
package/lib/config/roles.ts
CHANGED
package/lib/config/tracking.ts
CHANGED
package/lib/hooks/onError.ts
CHANGED
package/lib/hooks/onRequest.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getParams, getData } from '../util/common'
|
|
2
|
-
import { AuthenticatedUser, AuthenticatedToken, Role } from '../../types/global'
|
|
1
|
+
import { getParams, getData } from '../util/common.js'
|
|
2
|
+
import type { AuthenticatedUser, AuthenticatedToken, Role } from '../../types/global.js'
|
|
3
3
|
|
|
4
4
|
const { embedded_auth = true } = global.config?.options || {}
|
|
5
5
|
|
|
@@ -22,7 +22,7 @@ const normalizeRoles = (rolesArray: any[] | undefined): string[] => {
|
|
|
22
22
|
return [roles.public.code]
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
export default async (req, reply) => {
|
|
26
26
|
log.i && (req.startedAt = new Date())
|
|
27
27
|
|
|
28
28
|
// Request enrichment
|
|
@@ -88,9 +88,11 @@ module.exports = async (req, reply) => {
|
|
|
88
88
|
} catch (error) {
|
|
89
89
|
const isRoutePublic = (cfg.requiredRoles || []).some((role: Role) => role.code === roles.public.code)
|
|
90
90
|
if (!isRoutePublic) {
|
|
91
|
-
return reply
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
return reply.status(401).send({
|
|
92
|
+
statusCode: 401,
|
|
93
|
+
code: 'UNAUTHORIZED',
|
|
94
|
+
message: (error as any)?.message || 'Invalid or expired token'
|
|
95
|
+
})
|
|
94
96
|
}
|
|
95
97
|
}
|
|
96
98
|
}
|
package/lib/hooks/onResponse.ts
CHANGED
package/lib/hooks/preHandler.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import sizeof from 'object-sizeof'
|
|
2
|
-
import * as tracking from '../util/tracker'
|
|
2
|
+
import * as tracking from '../util/tracker.js'
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default async (req, reply, payload) => {
|
|
5
5
|
if (log.t) {
|
|
6
6
|
req.payloadSize = sizeof(req.body) + sizeof(req.params) + sizeof(req.query)
|
|
7
7
|
reply.payloadSize = sizeof(payload)
|
package/lib/loader/general.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { GeneralConfig } from '../../types/global'
|
|
2
|
-
import { normalizePatterns } from '../util/path'
|
|
3
|
-
|
|
1
|
+
import type { GeneralConfig } from '../../types/global.js'
|
|
2
|
+
import { normalizePatterns } from '../util/path.js'
|
|
3
|
+
import { globSync } from 'glob'
|
|
4
4
|
|
|
5
|
-
export function load() {
|
|
5
|
+
export async function load() {
|
|
6
6
|
const generalConfig: GeneralConfig = {
|
|
7
7
|
name: 'general',
|
|
8
8
|
enable: true,
|
|
@@ -15,10 +15,14 @@ export function load() {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
const patterns = normalizePatterns(['..', 'config', 'general.{ts,js}'], ['src', 'config', 'general.{ts,js}'])
|
|
18
|
-
|
|
18
|
+
|
|
19
|
+
for (const pattern of patterns) {
|
|
19
20
|
log.t && log.trace('Looking for ' + pattern)
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
const files = globSync(pattern, { windowsPathsNoEscape: true })
|
|
22
|
+
|
|
23
|
+
for (const f of files) {
|
|
24
|
+
const module = await import(f)
|
|
25
|
+
const config: GeneralConfig = module.default || module
|
|
22
26
|
|
|
23
27
|
if (config.name === generalConfig.name) {
|
|
24
28
|
generalConfig.enable = config.enable
|
|
@@ -27,8 +31,8 @@ export function load() {
|
|
|
27
31
|
...(config.options || {})
|
|
28
32
|
}
|
|
29
33
|
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
32
36
|
|
|
33
37
|
log.d && log.debug('General configuration loaded')
|
|
34
38
|
return generalConfig
|
package/lib/loader/hooks.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { normalizePatterns } from '../util/path'
|
|
1
|
+
import { normalizePatterns } from '../util/path.js'
|
|
2
|
+
import { globSync } from 'glob'
|
|
3
|
+
import path from 'path'
|
|
2
4
|
|
|
3
5
|
const hooks = [
|
|
4
6
|
'onRequest',
|
|
@@ -16,27 +18,29 @@ const hooks = [
|
|
|
16
18
|
'preHandler'
|
|
17
19
|
]
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
const path = require('path')
|
|
21
|
-
|
|
22
|
-
export function apply(server: any): void {
|
|
21
|
+
export async function apply(server: any): Promise<void> {
|
|
23
22
|
const patterns = normalizePatterns(['..', 'hooks', '*.{ts,js}'], ['src', 'hooks', '*.{ts,js}'])
|
|
24
23
|
const allHooks: any = hooks.reduce((acc, v) => ({ ...acc, [v]: [] as Function[] }), {})
|
|
25
24
|
|
|
26
|
-
|
|
25
|
+
for (const pattern of patterns) {
|
|
27
26
|
log.t && log.trace('Looking for ' + pattern)
|
|
28
|
-
|
|
27
|
+
const files = globSync(pattern, { windowsPathsNoEscape: true })
|
|
28
|
+
|
|
29
|
+
for (const f of files) {
|
|
30
|
+
if (f.endsWith('.d.ts')) continue
|
|
31
|
+
|
|
29
32
|
const hookName = path.basename(f, path.extname(f))
|
|
30
|
-
const
|
|
33
|
+
const module = await import(f)
|
|
34
|
+
const fn = module.default || module
|
|
31
35
|
|
|
32
|
-
if (fn != null) {
|
|
36
|
+
if (fn != null && typeof fn === 'function') {
|
|
33
37
|
if (allHooks[hookName] == null) {
|
|
34
38
|
allHooks[hookName] = [] as Function[]
|
|
35
39
|
}
|
|
36
40
|
allHooks[hookName].push((...args) => fn(...args))
|
|
37
41
|
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
40
44
|
|
|
41
45
|
hooks.map((hookName) => {
|
|
42
46
|
const fns: Function[] = allHooks[hookName]
|
package/lib/loader/plugins.ts
CHANGED
|
@@ -1,22 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { normalizePatterns } from '../util/path.js'
|
|
2
|
+
import { globSync } from 'glob'
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export function load() {
|
|
4
|
+
export async function load() {
|
|
7
5
|
const plugins: any = {}
|
|
8
6
|
|
|
9
7
|
const patterns = normalizePatterns(['..', 'config', 'plugins.{ts,js}'], ['src', 'config', 'plugins.{ts,js}'])
|
|
10
|
-
|
|
8
|
+
|
|
9
|
+
for (const pattern of patterns) {
|
|
11
10
|
log.t && log.trace('Looking for ' + pattern)
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
const files = globSync(pattern, { windowsPathsNoEscape: true })
|
|
12
|
+
|
|
13
|
+
for (const f of files) {
|
|
14
|
+
const module = await import(f)
|
|
15
|
+
const configPlugins = module.default || module
|
|
16
|
+
|
|
14
17
|
configPlugins.forEach((plugin) => {
|
|
15
18
|
plugins[plugin.name] = plugin.enable ? plugin.options : false
|
|
16
19
|
log.t && log.trace(`* Plugin ${plugin.name} ${plugin.enable ? 'enabled' : 'disabled'}`)
|
|
17
20
|
})
|
|
18
|
-
}
|
|
19
|
-
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
20
24
|
const enabledPulgins = Object.keys(plugins).filter((p) => !!plugins[p])
|
|
21
25
|
log.d && log.debug(`Plugins loaded: ${enabledPulgins.length > 0 ? enabledPulgins.join(', ') : 0}`)
|
|
22
26
|
return plugins
|
package/lib/loader/roles.ts
CHANGED
|
@@ -1,21 +1,26 @@
|
|
|
1
|
-
import { Role, Roles } from '../../types/global'
|
|
2
|
-
import { normalizePatterns } from '../util/path'
|
|
3
|
-
|
|
1
|
+
import type { Role, Roles } from '../../types/global.js'
|
|
2
|
+
import { normalizePatterns } from '../util/path.js'
|
|
3
|
+
import { globSync } from 'glob'
|
|
4
4
|
|
|
5
|
-
export function load() {
|
|
5
|
+
export async function load() {
|
|
6
6
|
const roles: Roles = {}
|
|
7
7
|
|
|
8
8
|
const patterns = normalizePatterns(['..', 'config', 'roles.{ts,js}'], ['src', 'config', 'roles.{ts,js}'])
|
|
9
|
-
|
|
9
|
+
|
|
10
|
+
for (const pattern of patterns) {
|
|
10
11
|
log.t && log.trace('Looking for ' + pattern)
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
const files = globSync(pattern, { windowsPathsNoEscape: true })
|
|
13
|
+
|
|
14
|
+
for (const f of files) {
|
|
15
|
+
const module = await import(f)
|
|
16
|
+
const configRoles = module.default || module
|
|
13
17
|
|
|
14
18
|
configRoles.forEach((role: Role) => {
|
|
15
19
|
roles[role.code] = role
|
|
16
20
|
})
|
|
17
|
-
}
|
|
18
|
-
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
19
24
|
log.d && log.debug('Roles loaded: ' + Object.keys(roles).join(', '))
|
|
20
25
|
return roles
|
|
21
26
|
}
|
package/lib/loader/router.ts
CHANGED
|
@@ -1,26 +1,89 @@
|
|
|
1
|
-
import yn from '../util/yn'
|
|
2
|
-
import { Role, Route, ConfiguredRoute, RouteConfig } from '../../types/global'
|
|
1
|
+
import yn from '../util/yn.js'
|
|
2
|
+
import type { Role, Route, ConfiguredRoute, RouteConfig } from '../../types/global.js'
|
|
3
3
|
import { FastifyReply, FastifyRequest } from 'fastify'
|
|
4
|
-
import { normalizePatterns } from '../util/path'
|
|
4
|
+
import { normalizePatterns } from '../util/path.js'
|
|
5
|
+
import { globSync } from 'glob'
|
|
6
|
+
import path from 'path'
|
|
7
|
+
import { fileURLToPath } from 'url'
|
|
8
|
+
import require from '../util/require.js'
|
|
9
|
+
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
11
|
+
const __dirname = path.dirname(__filename)
|
|
5
12
|
|
|
6
|
-
const glob = require('glob')
|
|
7
|
-
const path = require('path')
|
|
8
13
|
const methods = ['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'PATCH', 'OPTIONS']
|
|
9
14
|
|
|
10
|
-
|
|
15
|
+
async function tryToLoadFile(fileName: string) {
|
|
16
|
+
try {
|
|
17
|
+
const module = await import(fileName)
|
|
18
|
+
return module.default || module
|
|
19
|
+
} catch (err) {
|
|
20
|
+
return null
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async function loadMiddleware(base: string, middleware: string = '') {
|
|
25
|
+
const key = 'global.'
|
|
26
|
+
const isGlobal = middleware.indexOf(key) > -1
|
|
27
|
+
let loadedModule: any = null
|
|
28
|
+
|
|
29
|
+
if (isGlobal) {
|
|
30
|
+
const name = middleware.substring(key.length)
|
|
31
|
+
// Prova path locali (es. src/middleware/auth.ts)
|
|
32
|
+
const localPath = path.resolve(process.cwd() + '/src/middleware/' + name + '.ts') // Prova TS
|
|
33
|
+
const localPathJs = path.resolve(process.cwd() + '/src/middleware/' + name + '.js') // Prova JS (dist)
|
|
34
|
+
|
|
35
|
+
loadedModule = await tryToLoadFile(localPath)
|
|
36
|
+
if (!loadedModule) loadedModule = await tryToLoadFile(localPathJs)
|
|
37
|
+
|
|
38
|
+
// Se non trova locale, prova interno alla lib
|
|
39
|
+
if (!loadedModule) {
|
|
40
|
+
const libPath = path.resolve(__dirname + '/../middleware/' + name + '.js')
|
|
41
|
+
loadedModule = await tryToLoadFile(libPath)
|
|
42
|
+
}
|
|
43
|
+
} else {
|
|
44
|
+
// Middleware locale alla route
|
|
45
|
+
const routeMiddPath = path.resolve(base + '/middleware/' + middleware)
|
|
46
|
+
// Qui è difficile indovinare l'estensione se non fornita, assumiamo che il loader sappia cosa fa o proviamo entrambe
|
|
47
|
+
loadedModule = await tryToLoadFile(routeMiddPath + '.ts')
|
|
48
|
+
if (!loadedModule) loadedModule = await tryToLoadFile(routeMiddPath + '.js')
|
|
49
|
+
if (!loadedModule) loadedModule = await tryToLoadFile(routeMiddPath) // Magari ha già estensione
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (!loadedModule) {
|
|
53
|
+
log.error(`Middleware ${middleware} not loaded`)
|
|
54
|
+
throw new Error(`Middleware ${middleware} not loaded`)
|
|
55
|
+
}
|
|
56
|
+
return loadedModule
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function loadMiddlewares(base: string, middlewares: string[] = []) {
|
|
60
|
+
const midds = {}
|
|
61
|
+
for (const m of middlewares) {
|
|
62
|
+
const middleware = await loadMiddleware(base, m)
|
|
63
|
+
// I middleware possono esportare più funzioni (preHandler, preSerialization, ecc.)
|
|
64
|
+
Object.keys(middleware).map((name) => (midds[name] = [...(midds[name] || []), middleware[name]]))
|
|
65
|
+
}
|
|
66
|
+
return midds
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function load(): Promise<ConfiguredRoute[]> {
|
|
11
70
|
const validRoutes: ConfiguredRoute[] = []
|
|
12
71
|
const patterns = normalizePatterns(['..', 'api', '**', 'routes.{ts,js}'], ['src', 'api', '**', 'routes.{ts,js}'])
|
|
13
72
|
const authMiddlewares = ['global.isAuthenticated', 'global.isAdmin']
|
|
14
73
|
|
|
15
|
-
|
|
74
|
+
for (const pattern of patterns) {
|
|
16
75
|
log.t && log.trace('Looking for ' + pattern)
|
|
17
|
-
|
|
76
|
+
const files = globSync(pattern, { windowsPathsNoEscape: true })
|
|
77
|
+
|
|
78
|
+
for (const f of files) {
|
|
79
|
+
if (f.endsWith('.d.ts')) continue
|
|
80
|
+
|
|
18
81
|
const base = path.dirname(f)
|
|
19
82
|
const dir = path.basename(base)
|
|
20
83
|
const file = path.join(dir, path.basename(f))
|
|
21
84
|
|
|
22
|
-
|
|
23
|
-
const routesjs =
|
|
85
|
+
const module = await import(f)
|
|
86
|
+
const routesjs = module.default || module
|
|
24
87
|
const { routes = [], config: defaultConfig = {} } = routesjs || {}
|
|
25
88
|
|
|
26
89
|
log.t && log.trace(`* Add ${routes.length} routes from ${file}`)
|
|
@@ -41,7 +104,7 @@ export function load(): ConfiguredRoute[] {
|
|
|
41
104
|
let requiredRoles: Role[] = []
|
|
42
105
|
|
|
43
106
|
try {
|
|
44
|
-
requiredRoles = rsp.some((r) => r.code === roles.admin.code) ? rsp : [...rsp, roles.admin]
|
|
107
|
+
requiredRoles = rsp.some((r) => r.code === roles.admin.code) ? rsp : [...rsp, roles.admin]
|
|
45
108
|
} catch (err) {
|
|
46
109
|
log.e && log.error(`Error in loading roles for ${methodCase} ${pathName} (${handler})`)
|
|
47
110
|
log.t && log.trace(err)
|
|
@@ -56,7 +119,6 @@ export function load(): ConfiguredRoute[] {
|
|
|
56
119
|
config.security = 'bearer'
|
|
57
120
|
}
|
|
58
121
|
|
|
59
|
-
// specific route config
|
|
60
122
|
const {
|
|
61
123
|
title = '',
|
|
62
124
|
description = '',
|
|
@@ -73,24 +135,15 @@ export function load(): ConfiguredRoute[] {
|
|
|
73
135
|
rawBody = false
|
|
74
136
|
} = config || {}
|
|
75
137
|
|
|
76
|
-
// adjust something
|
|
77
138
|
const endpoint = `${dir}${pathName.replace(/\/+$/, '')}`
|
|
78
139
|
const method = methodCase.toUpperCase()
|
|
79
140
|
const num = index + 1
|
|
80
141
|
const handlerParts = handler.split('.')
|
|
81
142
|
|
|
82
143
|
if (enable) {
|
|
83
|
-
if (!pathName.startsWith('/')) {
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (!methods.includes(method)) {
|
|
88
|
-
errors.push(`Error in [${file}] bad method [${method}] at route n. ${num}`)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (handlerParts.length !== 2) {
|
|
92
|
-
errors.push(`Error in [${file}] bad handler [${handler}] at route n. ${num}`)
|
|
93
|
-
}
|
|
144
|
+
if (!pathName.startsWith('/')) errors.push(`Error in [${file}] bad path [${pathName}] at route n. ${num}`)
|
|
145
|
+
if (!methods.includes(method)) errors.push(`Error in [${file}] bad method [${method}] at route n. ${num}`)
|
|
146
|
+
if (handlerParts.length !== 2) errors.push(`Error in [${file}] bad handler [${handler}] at route n. ${num}`)
|
|
94
147
|
|
|
95
148
|
const key = method + endpoint + version
|
|
96
149
|
if (validRoutes.some((r) => `${r.method}${r.path}${r.doc?.version}` === key)) {
|
|
@@ -121,19 +174,7 @@ export function load(): ConfiguredRoute[] {
|
|
|
121
174
|
version,
|
|
122
175
|
security: security === 'bearer' ? [{ Bearer: [] }] : security,
|
|
123
176
|
response
|
|
124
|
-
} as
|
|
125
|
-
summary: string
|
|
126
|
-
description: string
|
|
127
|
-
deprecated: boolean
|
|
128
|
-
tags: string[]
|
|
129
|
-
version: string
|
|
130
|
-
security: any
|
|
131
|
-
response: any
|
|
132
|
-
querystring: any | undefined
|
|
133
|
-
params: any | undefined
|
|
134
|
-
body: any | undefined
|
|
135
|
-
consumes: any | undefined
|
|
136
|
-
}
|
|
177
|
+
} as any
|
|
137
178
|
|
|
138
179
|
if (query) doc.querystring = query
|
|
139
180
|
if (params) doc.params = params
|
|
@@ -152,67 +193,26 @@ export function load(): ConfiguredRoute[] {
|
|
|
152
193
|
base,
|
|
153
194
|
file: path.join(base, defaultConfig.controller || 'controller', handlerParts[0]),
|
|
154
195
|
func: handlerParts[1],
|
|
155
|
-
doc: doc
|
|
196
|
+
doc: doc
|
|
156
197
|
})
|
|
157
198
|
}
|
|
158
199
|
})
|
|
159
|
-
}
|
|
160
|
-
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
161
202
|
|
|
162
203
|
log.d && log.debug(`Routes loaded: ${validRoutes.length}`)
|
|
163
204
|
return validRoutes
|
|
164
205
|
}
|
|
165
206
|
|
|
166
|
-
async function
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
resolve(required)
|
|
171
|
-
} catch (err) {
|
|
172
|
-
reject(err)
|
|
173
|
-
}
|
|
174
|
-
})
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
async function loadMiddleware(base: string, middleware: string = '') {
|
|
178
|
-
const key = 'global.'
|
|
179
|
-
const isGlobal = middleware.indexOf(key) > -1
|
|
180
|
-
let required: any = null
|
|
181
|
-
|
|
182
|
-
if (isGlobal) {
|
|
183
|
-
const name = middleware.substring(key.length)
|
|
184
|
-
required = await tryToLoadFile(path.resolve(process.cwd() + '/src/middleware/' + name)).catch(async () => {
|
|
185
|
-
return await tryToLoadFile(path.resolve(__dirname + '/../middleware/' + name))
|
|
186
|
-
})
|
|
187
|
-
} else {
|
|
188
|
-
required = await tryToLoadFile(path.resolve(base + '/middleware/' + middleware))
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
if (!required) {
|
|
192
|
-
log.error(`Middleware ${middleware} not loaded`)
|
|
193
|
-
throw new Error(`Middleware ${middleware} not loaded`)
|
|
207
|
+
async function applyRoutes(server: any, routes: ConfiguredRoute[]): Promise<void> {
|
|
208
|
+
if (!routes || routes.length === 0) {
|
|
209
|
+
log.w && log.warn('No routes to apply to server')
|
|
210
|
+
return
|
|
194
211
|
}
|
|
195
|
-
return required
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
async function loadMiddlewares(base: string, middlewares: string[] = []) {
|
|
199
|
-
const midds = {}
|
|
200
|
-
await Promise.all(
|
|
201
|
-
middlewares.map(async (m) => {
|
|
202
|
-
const middleware = await loadMiddleware(base, m)
|
|
203
|
-
Object.keys(middleware).map((name) => (midds[name] = [...(midds[name] || []), middleware[name]]))
|
|
204
|
-
})
|
|
205
|
-
)
|
|
206
|
-
// log.debug(base + ' middleware ' + middlewares.length + ' -> ' + Object.keys(midds))
|
|
207
|
-
return midds
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// preParsing, preValidation, preHandler, preSerialization, ..
|
|
211
212
|
|
|
212
|
-
export function apply(server: any, routes: ConfiguredRoute[]): void {
|
|
213
213
|
log.t && log.trace(`Apply ${routes.length} routes to server with pid ${process.pid}`)
|
|
214
214
|
|
|
215
|
-
|
|
215
|
+
for (const route of routes) {
|
|
216
216
|
if (route?.enable) {
|
|
217
217
|
const { handler, method, path, middlewares, roles, rawBody, rateLimit, base, file, func, doc } = route
|
|
218
218
|
|
|
@@ -231,7 +231,20 @@ export function apply(server: any, routes: ConfiguredRoute[]): void {
|
|
|
231
231
|
},
|
|
232
232
|
handler: async function (req: FastifyRequest, reply: FastifyReply) {
|
|
233
233
|
try {
|
|
234
|
-
|
|
234
|
+
// Import dinamico del controller
|
|
235
|
+
// Dobbiamo assicurarci che 'file' abbia l'estensione corretta o che il resolver la trovi
|
|
236
|
+
// In ESM strict, meglio provare ad aggiungere .js se manca, o lasciare che Node risolva se è un path assoluto
|
|
237
|
+
let module
|
|
238
|
+
try {
|
|
239
|
+
module = await import(file + '.js')
|
|
240
|
+
} catch {
|
|
241
|
+
try {
|
|
242
|
+
module = await import(file + '.ts')
|
|
243
|
+
} catch {
|
|
244
|
+
module = await import(file)
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
235
248
|
return await module[func](req, reply)
|
|
236
249
|
} catch (err) {
|
|
237
250
|
log.e && log.error(`Cannot find ${file} or method ${func}: ${err}`)
|
|
@@ -240,5 +253,10 @@ export function apply(server: any, routes: ConfiguredRoute[]): void {
|
|
|
240
253
|
}
|
|
241
254
|
})
|
|
242
255
|
}
|
|
243
|
-
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export async function apply(server: any): Promise<void> {
|
|
260
|
+
const routes = await load()
|
|
261
|
+
return await applyRoutes(server, routes)
|
|
244
262
|
}
|
package/lib/loader/schedules.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import _ from 'lodash'
|
|
2
|
-
import { JobSchedule } from '../../types/global'
|
|
3
|
-
import { normalizePatterns } from '../util/path'
|
|
2
|
+
import type { JobSchedule } from '../../types/global.js'
|
|
3
|
+
import { normalizePatterns } from '../util/path.js'
|
|
4
4
|
import { CronJob, SimpleIntervalJob, Task, AsyncTask } from 'toad-scheduler'
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import { globSync } from 'glob'
|
|
6
|
+
import path from 'path'
|
|
7
|
+
import require from '../util/require.js'
|
|
8
8
|
|
|
9
9
|
export function load(): any[] {
|
|
10
10
|
const patterns = normalizePatterns(['..', 'schedules', '*.job.{ts,js}'], ['src', 'schedules', '*.job.{ts,js}'])
|
|
@@ -33,7 +33,7 @@ export function load(): any[] {
|
|
|
33
33
|
|
|
34
34
|
patterns.forEach((pattern) => {
|
|
35
35
|
log.t && log.trace('Looking for ' + pattern)
|
|
36
|
-
|
|
36
|
+
globSync(pattern, { windowsPathsNoEscape: true }).forEach((f: string) => {
|
|
37
37
|
log.t && log.trace(`* Add job schedule from ${f}`)
|
|
38
38
|
|
|
39
39
|
const jobName = path.basename(f, path.extname(f))
|