@volcanicminds/backend 2.2.7 → 2.2.9
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 +85 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -51
- package/dist/index.js.map +1 -1
- package/dist/lib/api/auth/controller/auth.d.ts +10 -0
- package/dist/lib/api/auth/controller/auth.d.ts.map +1 -1
- package/dist/lib/api/auth/controller/auth.js +26 -4
- package/dist/lib/api/auth/controller/auth.js.map +1 -1
- package/dist/lib/api/token/controller/token.d.ts +1 -1
- package/dist/lib/api/token/controller/token.d.ts.map +1 -1
- package/dist/lib/api/token/controller/token.js +7 -5
- package/dist/lib/api/token/controller/token.js.map +1 -1
- package/dist/lib/api/users/controller/user.d.ts +2 -2
- package/dist/lib/api/users/controller/user.d.ts.map +1 -1
- package/dist/lib/api/users/controller/user.js +14 -4
- package/dist/lib/api/users/controller/user.js.map +1 -1
- package/dist/lib/apollo/resolvers.d.ts +1 -1
- package/dist/lib/apollo/resolvers.d.ts.map +1 -1
- package/dist/lib/apollo/resolvers.js +1 -1
- package/dist/lib/apollo/resolvers.js.map +1 -1
- package/dist/lib/config/general.d.ts +1 -0
- package/dist/lib/config/general.d.ts.map +1 -1
- package/dist/lib/config/general.js +2 -1
- package/dist/lib/config/general.js.map +1 -1
- package/dist/lib/hooks/onError.d.ts +1 -1
- package/dist/lib/hooks/onError.d.ts.map +1 -1
- package/dist/lib/hooks/onError.js +5 -3
- package/dist/lib/hooks/onError.js.map +1 -1
- package/dist/lib/hooks/onRequest.d.ts.map +1 -1
- package/dist/lib/hooks/onRequest.js +18 -2
- package/dist/lib/hooks/onRequest.js.map +1 -1
- package/dist/lib/hooks/onResponse.d.ts.map +1 -1
- package/dist/lib/hooks/onResponse.js +9 -1
- package/dist/lib/hooks/onResponse.js.map +1 -1
- package/dist/lib/loader/general.js +4 -2
- package/dist/lib/loader/general.js.map +1 -1
- package/dist/lib/loader/hooks.d.ts.map +1 -1
- package/dist/lib/loader/hooks.js +8 -4
- package/dist/lib/loader/hooks.js.map +1 -1
- package/dist/lib/loader/plugins.d.ts.map +1 -1
- package/dist/lib/loader/plugins.js +6 -3
- package/dist/lib/loader/plugins.js.map +1 -1
- package/dist/lib/loader/roles.js +4 -2
- package/dist/lib/loader/roles.js.map +1 -1
- package/dist/lib/loader/router.d.ts.map +1 -1
- package/dist/lib/loader/router.js +31 -16
- package/dist/lib/loader/router.js.map +1 -1
- package/dist/lib/loader/schedules.d.ts.map +1 -1
- package/dist/lib/loader/schedules.js +19 -10
- package/dist/lib/loader/schedules.js.map +1 -1
- package/dist/lib/loader/schemas.d.ts.map +1 -1
- package/dist/lib/loader/schemas.js +18 -9
- package/dist/lib/loader/schemas.js.map +1 -1
- package/dist/lib/loader/tracking.d.ts.map +1 -1
- package/dist/lib/loader/tracking.js +6 -3
- package/dist/lib/loader/tracking.js.map +1 -1
- package/dist/lib/loader/translation.d.ts.map +1 -1
- package/dist/lib/loader/translation.js.map +1 -1
- package/dist/lib/middleware/isAdmin.d.ts.map +1 -1
- package/dist/lib/middleware/isAdmin.js +2 -1
- package/dist/lib/middleware/isAdmin.js.map +1 -1
- package/dist/lib/middleware/isAuthenticated.d.ts.map +1 -1
- package/dist/lib/middleware/isAuthenticated.js +3 -2
- package/dist/lib/middleware/isAuthenticated.js.map +1 -1
- package/dist/lib/middleware/preAuth.d.ts +1 -1
- package/dist/lib/middleware/preAuth.d.ts.map +1 -1
- package/dist/lib/middleware/preAuth.js +1 -1
- package/dist/lib/middleware/preAuth.js.map +1 -1
- package/dist/lib/middleware/preForgotPasswordHandler.d.ts +1 -1
- package/dist/lib/middleware/preForgotPasswordHandler.d.ts.map +1 -1
- package/dist/lib/middleware/preForgotPasswordHandler.js +1 -1
- package/dist/lib/middleware/preForgotPasswordHandler.js.map +1 -1
- package/dist/lib/schemas/auth.d.ts +3 -0
- package/dist/lib/schemas/auth.d.ts.map +1 -1
- package/dist/lib/schemas/auth.js +1 -0
- package/dist/lib/schemas/auth.js.map +1 -1
- package/dist/lib/util/common.d.ts.map +1 -1
- package/dist/lib/util/common.js.map +1 -1
- package/dist/lib/util/errors.d.ts.map +1 -1
- package/dist/lib/util/errors.js.map +1 -1
- package/dist/lib/util/logger.js +1 -1
- package/dist/lib/util/logger.js.map +1 -1
- package/dist/lib/util/mark.d.ts.map +1 -1
- package/dist/lib/util/mark.js +34 -17
- package/dist/lib/util/mark.js.map +1 -1
- package/dist/lib/util/regexp.d.ts.map +1 -1
- package/dist/lib/util/regexp.js +3 -3
- package/dist/lib/util/regexp.js.map +1 -1
- package/dist/lib/util/tracker.d.ts +2 -2
- package/dist/lib/util/tracker.d.ts.map +1 -1
- package/dist/lib/util/tracker.js +6 -4
- package/dist/lib/util/tracker.js.map +1 -1
- package/dist/lib/util/yn.d.ts.map +1 -1
- package/dist/lib/util/yn.js.map +1 -1
- package/dist/server.js.map +1 -1
- package/lib/api/auth/controller/auth.ts +36 -4
- package/lib/api/token/controller/token.ts +7 -5
- package/lib/api/users/controller/user.ts +17 -4
- package/lib/apollo/resolvers.ts +2 -1
- package/lib/config/general.ts +2 -1
- package/lib/hooks/onError.ts +4 -3
- package/lib/hooks/onRequest.ts +21 -14
- package/lib/hooks/onResponse.ts +10 -4
- package/lib/loader/general.ts +2 -2
- package/lib/loader/hooks.ts +6 -4
- package/lib/loader/plugins.ts +4 -3
- package/lib/loader/roles.ts +2 -2
- package/lib/loader/router.ts +21 -24
- package/lib/loader/schedules.ts +23 -26
- package/lib/loader/schemas.ts +10 -9
- package/lib/loader/tracking.ts +4 -3
- package/lib/loader/translation.ts +2 -0
- package/lib/middleware/isAdmin.ts +2 -1
- package/lib/middleware/isAuthenticated.ts +3 -2
- package/lib/middleware/preAuth.ts +1 -1
- package/lib/middleware/preForgotPasswordHandler.ts +1 -1
- package/lib/schemas/auth.ts +1 -0
- package/lib/util/common.ts +1 -0
- package/lib/util/errors.ts +1 -0
- package/lib/util/logger.ts +1 -1
- package/lib/util/mark.ts +18 -17
- package/lib/util/regexp.ts +3 -3
- package/lib/util/tracker.ts +6 -4
- package/lib/util/yn.ts +1 -0
- package/package.json +11 -2
package/lib/loader/plugins.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1
2
|
import { normalizePatterns } from '../util/path.js'
|
|
2
3
|
import { globSync } from 'glob'
|
|
3
4
|
|
|
@@ -7,7 +8,7 @@ export async function load() {
|
|
|
7
8
|
const patterns = normalizePatterns(['..', 'config', 'plugins.{ts,js}'], ['src', 'config', 'plugins.{ts,js}'])
|
|
8
9
|
|
|
9
10
|
for (const pattern of patterns) {
|
|
10
|
-
log.t
|
|
11
|
+
if (log.t) log.trace('Looking for ' + pattern)
|
|
11
12
|
const files = globSync(pattern, { windowsPathsNoEscape: true })
|
|
12
13
|
|
|
13
14
|
for (const f of files) {
|
|
@@ -16,12 +17,12 @@ export async function load() {
|
|
|
16
17
|
|
|
17
18
|
configPlugins.forEach((plugin) => {
|
|
18
19
|
plugins[plugin.name] = plugin.enable ? plugin.options : false
|
|
19
|
-
log.t
|
|
20
|
+
if (log.t) log.trace(`* Plugin ${plugin.name} ${plugin.enable ? 'enabled' : 'disabled'}`)
|
|
20
21
|
})
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
const enabledPulgins = Object.keys(plugins).filter((p) => !!plugins[p])
|
|
25
|
-
log.d
|
|
26
|
+
if (log.d) log.debug(`Plugins loaded: ${enabledPulgins.length > 0 ? enabledPulgins.join(', ') : 0}`)
|
|
26
27
|
return plugins
|
|
27
28
|
}
|
package/lib/loader/roles.ts
CHANGED
|
@@ -8,7 +8,7 @@ export async function load() {
|
|
|
8
8
|
const patterns = normalizePatterns(['..', 'config', 'roles.{ts,js}'], ['src', 'config', 'roles.{ts,js}'])
|
|
9
9
|
|
|
10
10
|
for (const pattern of patterns) {
|
|
11
|
-
log.t
|
|
11
|
+
if (log.t) log.trace('Looking for ' + pattern)
|
|
12
12
|
const files = globSync(pattern, { windowsPathsNoEscape: true })
|
|
13
13
|
|
|
14
14
|
for (const f of files) {
|
|
@@ -21,6 +21,6 @@ export async function load() {
|
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
log.d
|
|
24
|
+
if (log.d) log.debug('Roles loaded: ' + Object.keys(roles).join(', '))
|
|
25
25
|
return roles
|
|
26
26
|
}
|
package/lib/loader/router.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1
2
|
import yn from '../util/yn.js'
|
|
2
3
|
import type { Role, Route, ConfiguredRoute, RouteConfig } from '../../types/global.js'
|
|
3
4
|
import { FastifyReply, FastifyRequest } from 'fastify'
|
|
@@ -5,7 +6,6 @@ import { normalizePatterns } from '../util/path.js'
|
|
|
5
6
|
import { globSync } from 'glob'
|
|
6
7
|
import path from 'path'
|
|
7
8
|
import { fileURLToPath } from 'url'
|
|
8
|
-
import require from '../util/require.js'
|
|
9
9
|
|
|
10
10
|
const __filename = fileURLToPath(import.meta.url)
|
|
11
11
|
const __dirname = path.dirname(__filename)
|
|
@@ -16,7 +16,7 @@ async function tryToLoadFile(fileName: string) {
|
|
|
16
16
|
try {
|
|
17
17
|
const module = await import(fileName)
|
|
18
18
|
return module.default || module
|
|
19
|
-
} catch (
|
|
19
|
+
} catch (_err) {
|
|
20
20
|
return null
|
|
21
21
|
}
|
|
22
22
|
}
|
|
@@ -28,25 +28,21 @@ async function loadMiddleware(base: string, middleware: string = '') {
|
|
|
28
28
|
|
|
29
29
|
if (isGlobal) {
|
|
30
30
|
const name = middleware.substring(key.length)
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
const localPathJs = path.resolve(process.cwd() + '/src/middleware/' + name + '.js') // Prova JS (dist)
|
|
31
|
+
const localPath = path.resolve(process.cwd() + '/src/middleware/' + name + '.ts')
|
|
32
|
+
const localPathJs = path.resolve(process.cwd() + '/src/middleware/' + name + '.js')
|
|
34
33
|
|
|
35
34
|
loadedModule = await tryToLoadFile(localPath)
|
|
36
35
|
if (!loadedModule) loadedModule = await tryToLoadFile(localPathJs)
|
|
37
36
|
|
|
38
|
-
// Se non trova locale, prova interno alla lib
|
|
39
37
|
if (!loadedModule) {
|
|
40
38
|
const libPath = path.resolve(__dirname + '/../middleware/' + name + '.js')
|
|
41
39
|
loadedModule = await tryToLoadFile(libPath)
|
|
42
40
|
}
|
|
43
41
|
} else {
|
|
44
|
-
// Middleware locale alla route
|
|
45
42
|
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
43
|
loadedModule = await tryToLoadFile(routeMiddPath + '.ts')
|
|
48
44
|
if (!loadedModule) loadedModule = await tryToLoadFile(routeMiddPath + '.js')
|
|
49
|
-
if (!loadedModule) loadedModule = await tryToLoadFile(routeMiddPath)
|
|
45
|
+
if (!loadedModule) loadedModule = await tryToLoadFile(routeMiddPath)
|
|
50
46
|
}
|
|
51
47
|
|
|
52
48
|
if (!loadedModule) {
|
|
@@ -60,7 +56,6 @@ async function loadMiddlewares(base: string, middlewares: string[] = []) {
|
|
|
60
56
|
const midds = {}
|
|
61
57
|
for (const m of middlewares) {
|
|
62
58
|
const middleware = await loadMiddleware(base, m)
|
|
63
|
-
// I middleware possono esportare più funzioni (preHandler, preSerialization, ecc.)
|
|
64
59
|
Object.keys(middleware).map((name) => (midds[name] = [...(midds[name] || []), middleware[name]]))
|
|
65
60
|
}
|
|
66
61
|
return midds
|
|
@@ -72,7 +67,7 @@ async function load(): Promise<ConfiguredRoute[]> {
|
|
|
72
67
|
const authMiddlewares = ['global.isAuthenticated', 'global.isAdmin']
|
|
73
68
|
|
|
74
69
|
for (const pattern of patterns) {
|
|
75
|
-
log.t
|
|
70
|
+
if (log.t) log.trace('Looking for ' + pattern)
|
|
76
71
|
const files = globSync(pattern, { windowsPathsNoEscape: true })
|
|
77
72
|
|
|
78
73
|
for (const f of files) {
|
|
@@ -86,7 +81,7 @@ async function load(): Promise<ConfiguredRoute[]> {
|
|
|
86
81
|
const routesjs = module.default || module
|
|
87
82
|
const { routes = [], config: defaultConfig = {} } = routesjs || {}
|
|
88
83
|
|
|
89
|
-
log.t
|
|
84
|
+
if (log.t) log.trace(`* Add ${routes.length} routes from ${file}`)
|
|
90
85
|
|
|
91
86
|
routes.forEach((route: Route, index: number) => {
|
|
92
87
|
const errors: string[] = []
|
|
@@ -106,8 +101,8 @@ async function load(): Promise<ConfiguredRoute[]> {
|
|
|
106
101
|
try {
|
|
107
102
|
requiredRoles = rsp.some((r) => r.code === roles.admin.code) ? rsp : [...rsp, roles.admin]
|
|
108
103
|
} catch (err) {
|
|
109
|
-
log.e
|
|
110
|
-
log.t
|
|
104
|
+
if (log.e) log.error(`Error in loading roles for ${methodCase} ${pathName} (${handler})`)
|
|
105
|
+
if (log.t) log.trace(err)
|
|
111
106
|
config.enable = false
|
|
112
107
|
}
|
|
113
108
|
|
|
@@ -151,19 +146,21 @@ async function load(): Promise<ConfiguredRoute[]> {
|
|
|
151
146
|
}
|
|
152
147
|
|
|
153
148
|
if (errors.length > 0) {
|
|
154
|
-
log.e
|
|
149
|
+
if (log.e) errors.forEach((error) => log.error(error))
|
|
155
150
|
}
|
|
156
151
|
}
|
|
157
152
|
|
|
158
153
|
const toAdd = enable && errors.length === 0
|
|
159
|
-
toAdd
|
|
160
|
-
|
|
154
|
+
if (toAdd) {
|
|
155
|
+
if (log.t)
|
|
161
156
|
log.trace(
|
|
162
157
|
`* Method [${method}] path ${endpoint} handler ${handler} enabled with ${
|
|
163
158
|
middlewares?.length || 0
|
|
164
159
|
} middlewares`
|
|
165
160
|
)
|
|
166
|
-
|
|
161
|
+
} else {
|
|
162
|
+
if (log.w) log.warn(`* Method [${method}] path ${endpoint} handler ${handler} disabled. Skip.`)
|
|
163
|
+
}
|
|
167
164
|
|
|
168
165
|
if (toAdd) {
|
|
169
166
|
const doc = {
|
|
@@ -200,23 +197,23 @@ async function load(): Promise<ConfiguredRoute[]> {
|
|
|
200
197
|
}
|
|
201
198
|
}
|
|
202
199
|
|
|
203
|
-
log.d
|
|
200
|
+
if (log.d) log.debug(`Routes loaded: ${validRoutes.length}`)
|
|
204
201
|
return validRoutes
|
|
205
202
|
}
|
|
206
203
|
|
|
207
204
|
async function applyRoutes(server: any, routes: ConfiguredRoute[]): Promise<void> {
|
|
208
205
|
if (!routes || routes.length === 0) {
|
|
209
|
-
log.w
|
|
206
|
+
if (log.w) log.warn('No routes to apply to server')
|
|
210
207
|
return
|
|
211
208
|
}
|
|
212
209
|
|
|
213
|
-
log.t
|
|
210
|
+
if (log.t) log.trace(`Apply ${routes.length} routes to server with pid ${process.pid}`)
|
|
214
211
|
|
|
215
212
|
for (const route of routes) {
|
|
216
213
|
if (route?.enable) {
|
|
217
214
|
const { handler, method, path, middlewares, roles, rawBody, rateLimit, base, file, func, doc } = route
|
|
218
215
|
|
|
219
|
-
log.t
|
|
216
|
+
if (log.t) log.trace(`* Add path ${method} ${path} on handle ${handler}`)
|
|
220
217
|
const midds = await loadMiddlewares(base, middlewares)
|
|
221
218
|
|
|
222
219
|
server.route({
|
|
@@ -242,12 +239,12 @@ async function applyRoutes(server: any, routes: ConfiguredRoute[]): Promise<void
|
|
|
242
239
|
}
|
|
243
240
|
}
|
|
244
241
|
} catch (err) {
|
|
245
|
-
log.e
|
|
242
|
+
if (log.e) log.error(`Cannot load module ${file}: ${err}`)
|
|
246
243
|
return reply.code(500).send(`Invalid handler module ${handler}`)
|
|
247
244
|
}
|
|
248
245
|
|
|
249
246
|
if (!module || typeof module[func] !== 'function') {
|
|
250
|
-
log.e
|
|
247
|
+
if (log.e) log.error(`Method ${func} not found in ${file}`)
|
|
251
248
|
return reply.code(500).send(`Invalid handler method ${handler}`)
|
|
252
249
|
}
|
|
253
250
|
|
package/lib/loader/schedules.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1
2
|
import _ from 'lodash'
|
|
2
3
|
import type { JobSchedule } from '../../types/global.js'
|
|
3
4
|
import { normalizePatterns } from '../util/path.js'
|
|
@@ -11,55 +12,50 @@ export function load(): any[] {
|
|
|
11
12
|
const jobs: any = []
|
|
12
13
|
|
|
13
14
|
const jobScheduleDefaults: JobSchedule = {
|
|
14
|
-
active: false,
|
|
15
|
-
type: 'interval',
|
|
16
|
-
async: true,
|
|
17
|
-
preventOverrun: true,
|
|
15
|
+
active: false,
|
|
16
|
+
type: 'interval',
|
|
17
|
+
async: true,
|
|
18
|
+
preventOverrun: true,
|
|
18
19
|
|
|
19
|
-
cron: {
|
|
20
|
-
// expression: null // required if type = 'cron', use cron syntax (if not specified cron will be disabled)
|
|
21
|
-
// timezone: null // optional, like "Europe/Rome" (to test)
|
|
22
|
-
},
|
|
20
|
+
cron: {},
|
|
23
21
|
|
|
24
22
|
interval: {
|
|
25
|
-
days: 0,
|
|
26
|
-
hours: 0,
|
|
27
|
-
minutes: 0,
|
|
28
|
-
seconds: 0,
|
|
29
|
-
milliseconds: 0,
|
|
30
|
-
runImmediately: false
|
|
23
|
+
days: 0,
|
|
24
|
+
hours: 0,
|
|
25
|
+
minutes: 0,
|
|
26
|
+
seconds: 0,
|
|
27
|
+
milliseconds: 0,
|
|
28
|
+
runImmediately: false
|
|
31
29
|
}
|
|
32
30
|
}
|
|
33
31
|
|
|
34
32
|
patterns.forEach((pattern) => {
|
|
35
|
-
log.t
|
|
33
|
+
if (log.t) log.trace('Looking for ' + pattern)
|
|
36
34
|
globSync(pattern, { windowsPathsNoEscape: true }).forEach((f: string) => {
|
|
37
|
-
log.t
|
|
35
|
+
if (log.t) log.trace(`* Add job schedule from ${f}`)
|
|
38
36
|
|
|
39
37
|
const jobName = path.basename(f, path.extname(f))
|
|
40
|
-
|
|
38
|
+
const { job, schedule: s } = require(f)
|
|
41
39
|
|
|
42
40
|
let isLoadedAndEnabled = false
|
|
43
41
|
if (s && s.active) {
|
|
44
42
|
isLoadedAndEnabled = true
|
|
45
43
|
|
|
46
|
-
// apply defaults
|
|
47
|
-
|
|
48
44
|
let schedule = _.cloneDeep(jobScheduleDefaults)
|
|
49
45
|
schedule = _.merge(schedule, s)
|
|
50
46
|
|
|
51
47
|
if (!job || typeof job !== 'function') {
|
|
52
|
-
log.t
|
|
48
|
+
if (log.t) log.error(`* Job ${jobName} `)
|
|
53
49
|
isLoadedAndEnabled = false
|
|
54
50
|
}
|
|
55
51
|
|
|
56
52
|
if (!schedule.type || !['cron', 'interval'].includes(schedule.type)) {
|
|
57
|
-
log.t
|
|
53
|
+
if (log.t) log.error(`* Job ${jobName}: schedule.type must be cron or interval`)
|
|
58
54
|
isLoadedAndEnabled = false
|
|
59
55
|
}
|
|
60
56
|
|
|
61
57
|
if (schedule.type === 'cron' && !schedule.cron?.expression) {
|
|
62
|
-
log.t
|
|
58
|
+
if (log.t) log.error(`* Job ${jobName}: schedule.cron.expression not defined`)
|
|
63
59
|
isLoadedAndEnabled = false
|
|
64
60
|
}
|
|
65
61
|
|
|
@@ -68,24 +64,25 @@ export function load(): any[] {
|
|
|
68
64
|
const totalIntervalMs = milliseconds + 1000 * (seconds + 60 * (minutes + 60 * (hours + 24 * days)))
|
|
69
65
|
|
|
70
66
|
if (totalIntervalMs < 1000) {
|
|
71
|
-
log.t
|
|
67
|
+
if (log.t) log.error(`* Job ${jobName}: schedule.interval must have a total greater or equal to 1s`)
|
|
72
68
|
isLoadedAndEnabled = false
|
|
73
69
|
}
|
|
74
70
|
}
|
|
75
71
|
|
|
76
|
-
isLoadedAndEnabled
|
|
72
|
+
if (isLoadedAndEnabled) {
|
|
77
73
|
jobs.push({
|
|
78
74
|
jobName,
|
|
79
75
|
schedule,
|
|
80
76
|
job
|
|
81
77
|
})
|
|
78
|
+
}
|
|
82
79
|
}
|
|
83
80
|
|
|
84
|
-
log.t
|
|
81
|
+
if (log.t) log.trace(`* Job schedule ${jobName} ${isLoadedAndEnabled ? 'enabled' : 'disabled'}`)
|
|
85
82
|
})
|
|
86
83
|
})
|
|
87
84
|
|
|
88
|
-
log.d
|
|
85
|
+
if (log.d) log.debug(`Schedule Jobs loaded: ${jobs?.length || 0}`)
|
|
89
86
|
return jobs
|
|
90
87
|
}
|
|
91
88
|
|
package/lib/loader/schemas.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1
2
|
import _ from 'lodash'
|
|
2
3
|
import { normalizePatterns } from '../util/path.js'
|
|
3
4
|
import { globSync } from 'glob'
|
|
@@ -13,7 +14,7 @@ export async function apply(server: any): Promise<void> {
|
|
|
13
14
|
const customSchemaIds = new Set()
|
|
14
15
|
let schemaCount = 0
|
|
15
16
|
|
|
16
|
-
log.t
|
|
17
|
+
if (log.t) log.trace('Looking for custom schemas in ' + customSchemaPath)
|
|
17
18
|
const customFiles = globSync(customSchemaPath, { windowsPathsNoEscape: true })
|
|
18
19
|
|
|
19
20
|
for (const f of customFiles) {
|
|
@@ -31,11 +32,11 @@ export async function apply(server: any): Promise<void> {
|
|
|
31
32
|
}
|
|
32
33
|
})
|
|
33
34
|
} catch (e) {
|
|
34
|
-
log.w
|
|
35
|
+
if (log.w) log.warn(`Could not load custom schema file: ${f}`, e)
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
|
|
38
|
-
log.t
|
|
39
|
+
if (log.t) log.trace('Looking for base schemas in ' + baseSchemaPath)
|
|
39
40
|
const baseFiles = globSync(baseSchemaPath, { windowsPathsNoEscape: true })
|
|
40
41
|
|
|
41
42
|
for (const f of baseFiles) {
|
|
@@ -65,8 +66,8 @@ export async function apply(server: any): Promise<void> {
|
|
|
65
66
|
customSchema.required = mergedRequired
|
|
66
67
|
}
|
|
67
68
|
|
|
68
|
-
log.d
|
|
69
|
-
log.w
|
|
69
|
+
if (log.d) log.debug(`* Schema [${baseSchema.$id}] deeply merged with core definition`)
|
|
70
|
+
if (log.w) log.warn(`* Schema [${baseSchema.$id}] overrided with custom definition`)
|
|
70
71
|
}
|
|
71
72
|
} else {
|
|
72
73
|
log.trace(`* Schema [${baseSchema.$id}] from ${schemaFileName} registeerd`)
|
|
@@ -74,11 +75,11 @@ export async function apply(server: any): Promise<void> {
|
|
|
74
75
|
schemaCount++
|
|
75
76
|
}
|
|
76
77
|
} else if (name !== 'default') {
|
|
77
|
-
log.w
|
|
78
|
+
if (log.w) log.warn(`* Schema with no $id found in ${schemaFileName} (export ${name}), cannot be registered`)
|
|
78
79
|
}
|
|
79
80
|
})
|
|
80
81
|
} catch (e) {
|
|
81
|
-
log.w
|
|
82
|
+
if (log.w) log.warn(`Could not load base schema file: ${f}`, e)
|
|
82
83
|
}
|
|
83
84
|
}
|
|
84
85
|
|
|
@@ -88,9 +89,9 @@ export async function apply(server: any): Promise<void> {
|
|
|
88
89
|
server.addSchema(schema)
|
|
89
90
|
schemaCount++
|
|
90
91
|
} catch (e: any) {
|
|
91
|
-
log.e
|
|
92
|
+
if (log.e) log.error(`Error registering schema ${schema.$id}: ${e.message}`)
|
|
92
93
|
}
|
|
93
94
|
})
|
|
94
95
|
|
|
95
|
-
log.d
|
|
96
|
+
if (log.d) log.debug(`Schemas loaded: ${schemaCount} referenceable by $ref`)
|
|
96
97
|
}
|
package/lib/loader/tracking.ts
CHANGED
|
@@ -11,7 +11,7 @@ export async function load() {
|
|
|
11
11
|
const patterns = normalizePatterns(['..', 'config', 'tracking.{ts,js}'], ['src', 'config', 'tracking.{ts,js}'])
|
|
12
12
|
|
|
13
13
|
for (const pattern of patterns) {
|
|
14
|
-
log.t
|
|
14
|
+
if (log.t) log.trace('Looking for ' + pattern)
|
|
15
15
|
const files = globSync(pattern, { windowsPathsNoEscape: true })
|
|
16
16
|
|
|
17
17
|
for (const f of files) {
|
|
@@ -23,7 +23,7 @@ export async function load() {
|
|
|
23
23
|
|
|
24
24
|
trackConfig = { ...trackConfig, ...config }
|
|
25
25
|
|
|
26
|
-
enableAll
|
|
26
|
+
if (enableAll) {
|
|
27
27
|
changes.forEach((change) => {
|
|
28
28
|
const tc: TrackChanges = { primaryKey: primaryKey, changeEntity: changeEntity, ...change } as TrackChanges
|
|
29
29
|
const code = getCodeBy(tc.method, tc.path)
|
|
@@ -35,11 +35,12 @@ export async function load() {
|
|
|
35
35
|
trackChangesList[code] = tc
|
|
36
36
|
}
|
|
37
37
|
})
|
|
38
|
+
}
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
41
|
|
|
41
42
|
const keys = Object.keys(trackChangesList) || []
|
|
42
|
-
log.d
|
|
43
|
+
if (log.d) log.debug(`Tracking changes loaded: ${keys?.length || 0}`)
|
|
43
44
|
return { tracking: trackChangesList, trackingConfig: trackConfig }
|
|
44
45
|
}
|
|
45
46
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1
2
|
import { FastifyReply, FastifyRequest } from 'fastify'
|
|
2
3
|
|
|
3
4
|
export function preHandler(req: FastifyRequest, res: FastifyReply, done: any) {
|
|
@@ -8,7 +9,7 @@ export function preHandler(req: FastifyRequest, res: FastifyReply, done: any) {
|
|
|
8
9
|
|
|
9
10
|
throw new Error('User without this privilege')
|
|
10
11
|
} catch (err) {
|
|
11
|
-
log.e
|
|
12
|
+
if (log.e) log.error(`Upps, something just happened ${err}`)
|
|
12
13
|
res.code(403).send(new Error('User without this privilege'))
|
|
13
14
|
}
|
|
14
15
|
}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1
2
|
import { FastifyReply, FastifyRequest } from 'fastify'
|
|
2
3
|
|
|
3
4
|
export function preHandler(req: FastifyRequest, res: FastifyReply, done: any) {
|
|
4
5
|
try {
|
|
5
|
-
if (
|
|
6
|
+
if (req.user?.getId()) {
|
|
6
7
|
return done()
|
|
7
8
|
}
|
|
8
9
|
|
|
9
10
|
throw new Error('Unauthorized')
|
|
10
11
|
} catch (err) {
|
|
11
|
-
log.e
|
|
12
|
+
if (log.e) log.error(`Upps, something just happened ${err}`)
|
|
12
13
|
return res.code(401).send(new Error('Unauthorized')) // must be authorized first
|
|
13
14
|
}
|
|
14
15
|
}
|
package/lib/schemas/auth.ts
CHANGED
package/lib/util/common.ts
CHANGED
package/lib/util/errors.ts
CHANGED
package/lib/util/logger.ts
CHANGED
package/lib/util/mark.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1
2
|
import require from './require.js'
|
|
2
3
|
const pkg = require('root-require')('package.json')
|
|
3
4
|
|
|
@@ -6,21 +7,21 @@ const pkg = require('root-require')('package.json')
|
|
|
6
7
|
*/
|
|
7
8
|
|
|
8
9
|
export function print(logg: any = log): void {
|
|
9
|
-
logg.i
|
|
10
|
-
logg.i
|
|
11
|
-
logg.i
|
|
12
|
-
logg.i
|
|
13
|
-
logg.i
|
|
14
|
-
logg.i
|
|
15
|
-
logg.i
|
|
16
|
-
logg.t
|
|
17
|
-
logg.i
|
|
18
|
-
logg.i
|
|
19
|
-
logg.i
|
|
20
|
-
logg.i
|
|
21
|
-
logg.t
|
|
22
|
-
logg.t
|
|
23
|
-
logg.t
|
|
24
|
-
logg.t
|
|
25
|
-
logg.t
|
|
10
|
+
if (logg.i) logg.info('Ciao')
|
|
11
|
+
if (logg.i) logg.info(` ,--. ,--. `)
|
|
12
|
+
if (logg.i) logg.info(`.--. ,--,---.| |,---.,--,--,--,--\\\`--',---. `)
|
|
13
|
+
if (logg.i) logg.info(` \\ '' | .-. | / .--' ,-. | ,--/ .--' `)
|
|
14
|
+
if (logg.i) logg.info(` \\ /' '-' | \\ \`--\\ '-' | || | \\ \`--. `)
|
|
15
|
+
if (logg.i) logg.info(` \`--' \`---'\`--'\`---'\`--\`--\`--''--\`--'\`---' `)
|
|
16
|
+
if (logg.i) logg.info('')
|
|
17
|
+
if (logg.t) logg.trace(`Package ${pkg.name}`)
|
|
18
|
+
if (logg.i) logg.info(`License ${pkg.license}`)
|
|
19
|
+
if (logg.i) logg.info(`Version ${pkg.version}`)
|
|
20
|
+
if (logg.i) logg.info(`Codename ${pkg.codename}`)
|
|
21
|
+
if (logg.i) logg.info(`Environment ${process.env.NODE_ENV}`)
|
|
22
|
+
if (logg.t) logg.trace(`Platform ${process.platform} ${process.arch}`)
|
|
23
|
+
if (logg.t) logg.trace(`Root path ${process.cwd()}`)
|
|
24
|
+
if (logg.t) logg.trace(`Node ${process.version}`)
|
|
25
|
+
if (logg.t) logg.trace(`Release ${JSON.stringify(process.release)}`)
|
|
26
|
+
if (logg.t) logg.trace(`Versions ${JSON.stringify(process.versions)}`)
|
|
26
27
|
}
|
package/lib/util/regexp.ts
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export const username = /(?=^.{3,33}$)^[a-z][a-z0-9]*[._-]?[a-z0-9]+$/gi
|
|
6
6
|
export const emailAlt =
|
|
7
|
-
/^(([^<>()
|
|
7
|
+
/^(([^<>()[\]\\.,;:\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,}))$/
|
|
8
8
|
|
|
9
9
|
/*
|
|
10
10
|
* email can have multiple words
|
|
11
11
|
* email can use . - or + for smart labeling
|
|
12
12
|
*/
|
|
13
|
-
export const email = /^\w+([
|
|
13
|
+
export const email = /^\w+([.+-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$/
|
|
14
14
|
|
|
15
15
|
/*
|
|
16
16
|
* password must contain 1 number (0-9)
|
|
@@ -20,7 +20,7 @@ export const email = /^\w+([\.+-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/
|
|
|
20
20
|
* password is 8-64 characters with no space
|
|
21
21
|
*/
|
|
22
22
|
export const password =
|
|
23
|
-
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%&*()-_
|
|
23
|
+
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%&*()-_=+[\]{}|;:'",.<>?^])[A-Za-z\d!@#$%&*()-_=+[\]{}|;:'",.<>?^]{8,}$/
|
|
24
24
|
export const zipCode = /(^\d{5}$)|(^\d{5}-\d{4}$)/
|
|
25
25
|
export const taxCodePersona =
|
|
26
26
|
/^[a-zA-Z]{6}[0-9]{2}[abcdehlmprstABCDEHLMPRST]{1}[0-9]{2}([a-zA-Z]{1}[0-9]{3})[a-zA-Z]{1}$/
|
package/lib/util/tracker.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1
2
|
import dayjs from 'dayjs'
|
|
2
3
|
import type { FastifyRequest, FastifyReply } from '../../types/global.js'
|
|
3
4
|
|
|
4
|
-
export async function initialize(req: FastifyRequest,
|
|
5
|
+
export async function initialize(req: FastifyRequest, _reply: FastifyReply) {
|
|
5
6
|
if (req.server['dataBaseManager'].isImplemented()) {
|
|
6
7
|
const tc = getTrackingConfigIfEnabled(req)
|
|
7
8
|
const allData = { ...req.parameters(), ...req.data() }
|
|
@@ -11,7 +12,8 @@ export async function initialize(req: FastifyRequest, reply: FastifyReply) {
|
|
|
11
12
|
if (allData && tc.entity && tc.primaryKey && tc.primaryKey in allData) {
|
|
12
13
|
const key = allData[tc.primaryKey]
|
|
13
14
|
req.trackingData = await req.server['dataBaseManager'].retrieveBy(tc.entity, key)
|
|
14
|
-
log.
|
|
15
|
+
if (log.t)
|
|
16
|
+
log.trace(`Tracking changes: found id ${req.trackingData ? req.trackingData[tc.primaryKey] : null}`)
|
|
15
17
|
}
|
|
16
18
|
} catch (error) {
|
|
17
19
|
log.error(`Tracking changes: error on ${tc.code}`)
|
|
@@ -21,7 +23,7 @@ export async function initialize(req: FastifyRequest, reply: FastifyReply) {
|
|
|
21
23
|
}
|
|
22
24
|
}
|
|
23
25
|
|
|
24
|
-
export async function track(req: FastifyRequest,
|
|
26
|
+
export async function track(req: FastifyRequest, _reply: FastifyReply, payload: any) {
|
|
25
27
|
if (req.server['dataBaseManager'].isImplemented()) {
|
|
26
28
|
const tc = getTrackingConfigIfEnabled(req)
|
|
27
29
|
if (tc) {
|
|
@@ -66,7 +68,7 @@ export async function track(req: FastifyRequest, reply: FastifyReply, payload: a
|
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
if (addChange) {
|
|
69
|
-
log.trace(`Tracking changes: add ${changeEntity} for ${entity}, ${id}, ${userId}, ${status}`)
|
|
71
|
+
if (log.t) log.trace(`Tracking changes: add ${changeEntity} for ${entity}, ${id}, ${userId}, ${status}`)
|
|
70
72
|
await req.server['dataBaseManager'].addChange(entity, id, status, userId, contents, changeEntity)
|
|
71
73
|
}
|
|
72
74
|
} catch (error) {
|
package/lib/util/yn.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volcanicminds/backend",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.9",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"codename": "rome",
|
|
6
6
|
"license": "MIT",
|
|
@@ -55,6 +55,10 @@
|
|
|
55
55
|
"test:full": "cross-env PORT=2231 NODE_ENV=memory BROWSER=false mocha --loader=tsx ./test/index.spec.ts -t 100000",
|
|
56
56
|
"reset": "npm install && npm update && npm run build",
|
|
57
57
|
"upgrade-deps": "npx npm-check-updates -u",
|
|
58
|
+
"lint": "eslint .",
|
|
59
|
+
"lint:fix": "eslint . --fix",
|
|
60
|
+
"type-check": "tsc --noEmit",
|
|
61
|
+
"check-all": "npm run lint && npm run type-check",
|
|
58
62
|
"combine": "node combine.js"
|
|
59
63
|
},
|
|
60
64
|
"dependencies": {
|
|
@@ -87,13 +91,18 @@
|
|
|
87
91
|
"toad-scheduler": "^3.1.0"
|
|
88
92
|
},
|
|
89
93
|
"devDependencies": {
|
|
94
|
+
"@eslint/js": "^9.39.1",
|
|
90
95
|
"@types/mocha": "^10.0.10",
|
|
96
|
+
"@types/semver": "^7.7.1",
|
|
91
97
|
"cross-env": "^10.1.0",
|
|
98
|
+
"eslint": "^9.39.1",
|
|
92
99
|
"expect": "^30.2.0",
|
|
100
|
+
"globals": "^16.5.0",
|
|
93
101
|
"mocha": "^11.7.5",
|
|
94
102
|
"npm-upgrade": "^3.1.2",
|
|
95
103
|
"tsx": "^4.19.2",
|
|
96
|
-
"typescript": "^5.9.3"
|
|
104
|
+
"typescript": "^5.9.3",
|
|
105
|
+
"typescript-eslint": "^8.48.0"
|
|
97
106
|
},
|
|
98
107
|
"repository": {
|
|
99
108
|
"type": "git",
|