@axiumine/koa-utils 3.7.3 → 3.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/README.md +183 -0
  2. package/dist/dataSources/MariaDB.mjs +1 -0
  3. package/dist/dataSources/MariaDB.mjs.map +1 -1
  4. package/dist/dataSources/MongoDB.mjs +1 -0
  5. package/dist/dataSources/MongoDB.mjs.map +1 -1
  6. package/dist/dataSources/PostgreSQL.mjs +4 -2
  7. package/dist/dataSources/PostgreSQL.mjs.map +1 -1
  8. package/dist/dataSources/Redis.mjs +15 -13
  9. package/dist/dataSources/Redis.mjs.map +1 -1
  10. package/dist/email/SocketLabsLib.mjs +7 -10
  11. package/dist/email/SocketLabsLib.mjs.map +1 -1
  12. package/dist/files/IUploadTemp.mjs.map +1 -1
  13. package/dist/files/checkForNSFW.mjs.map +1 -1
  14. package/dist/files/fileConst.mjs.map +1 -1
  15. package/dist/files/moveFileStaticDomain.mjs.map +1 -1
  16. package/dist/files/moveImageFile.mjs.map +1 -1
  17. package/dist/files/moveTempFile.mjs.map +1 -1
  18. package/dist/files/reEncodeToJpeg.mjs.map +1 -1
  19. package/dist/files/reEncodeToPng.mjs.map +1 -1
  20. package/dist/files/reEncodeToWebp.mjs.map +1 -1
  21. package/dist/files/scanVirus.mjs.map +1 -1
  22. package/dist/files/storeUploadAsTemp.mjs +2 -0
  23. package/dist/files/storeUploadAsTemp.mjs.map +1 -1
  24. package/dist/files/uploadTempImage.mjs.map +1 -1
  25. package/dist/files/uploadTempPdf.mjs.map +1 -1
  26. package/dist/files/validateExtension.mjs.map +1 -1
  27. package/dist/files/validateJpgPngExtension.mjs.map +1 -1
  28. package/dist/files/validateMimeType.mjs.map +1 -1
  29. package/dist/files/validateMimeTypeImages.mjs.map +1 -1
  30. package/dist/files/validateMimeTypePdf.mjs.map +1 -1
  31. package/dist/files/validatePdfExtension.mjs.map +1 -1
  32. package/dist/graphQL/models/MongoDB/UserBase.mjs.map +1 -1
  33. package/dist/graphQL/models/MongoDB/log/DevStatsGraphQLCalls.mjs.map +1 -1
  34. package/dist/graphQL/models/MongoDB/log/LogGlobalError.mjs.map +1 -1
  35. package/dist/graphQL/models/MongoDB/log/LogStatsGraphql.mjs.map +1 -1
  36. package/dist/graphQL/models/MongoDB/log/LogThrow.mjs.map +1 -1
  37. package/dist/graphQL/schema/GraphQLInput/GraphQLInputLogin.mjs.map +1 -1
  38. package/dist/graphQL/schema/context/IContextAuthenticatedResource.mjs.map +1 -1
  39. package/dist/graphQL/schema/context/IContextKoaErrorHandler.mjs.map +1 -1
  40. package/dist/graphQL/schema/context/IContextLogin.mjs.map +1 -1
  41. package/dist/graphQL/schema/context/IContextLogout.mjs.map +1 -1
  42. package/dist/graphQL/schema/context/IContextRefresh.mjs.map +1 -1
  43. package/dist/graphQL/schema/context/TCommonHeaders.mjs.map +1 -1
  44. package/dist/graphQL/schema/interfaces/IFindAndUpdate.mjs.map +1 -1
  45. package/dist/graphQL/schema/mutations/emailChangeHashVerify.mjs.map +1 -1
  46. package/dist/graphQL/schema/mutations/login4Ever.mjs.map +1 -1
  47. package/dist/graphQL/schema/mutations/loginAdmin.mjs.map +1 -1
  48. package/dist/graphQL/schema/mutations/loginRememberme.mjs.map +1 -1
  49. package/dist/graphQL/schema/mutations/logout.mjs.map +1 -1
  50. package/dist/graphQL/schema/mutations/refresh.mjs +1 -4
  51. package/dist/graphQL/schema/mutations/refresh.mjs.map +1 -1
  52. package/dist/graphQL/schema/mutations/resetPwd.mjs +2 -3
  53. package/dist/graphQL/schema/mutations/resetPwd.mjs.map +1 -1
  54. package/dist/graphQL/schema/mutations/signUp.mjs.map +1 -1
  55. package/dist/graphQL/schema/mutations/updatePassword.mjs +2 -1
  56. package/dist/graphQL/schema/mutations/updatePassword.mjs.map +1 -1
  57. package/dist/graphQL/schema/types/DeleteType.mjs.map +1 -1
  58. package/dist/graphQL/schema/types/DoneType.mjs.map +1 -1
  59. package/dist/graphQL/schema/types/FindOneAndUpdateType.mjs.map +1 -1
  60. package/dist/graphQL/schema/types/LoginAppType.mjs.map +1 -1
  61. package/dist/graphQL/schema/types/LoginType.mjs.map +1 -1
  62. package/dist/graphQL/schema/types/MidNameType.mjs.map +1 -1
  63. package/dist/graphQL/schema/types/OnlyIdType.mjs.map +1 -1
  64. package/dist/graphQL/schema/types/RefreshType.mjs.map +1 -1
  65. package/dist/graphQL/schema/types/RetStatusMexType.mjs.map +1 -1
  66. package/dist/graphQL/schema/types/RetStatusType.mjs.map +1 -1
  67. package/dist/graphQL/schema/types/SaveType.mjs.map +1 -1
  68. package/dist/graphQL/schema/types/SidNameType.mjs.map +1 -1
  69. package/dist/graphQL/schema/types/SidNomeType.mjs.map +1 -1
  70. package/dist/graphQL/schema/types/UpdateResultType.mjs.map +1 -1
  71. package/dist/graphQL/status.mjs.map +1 -1
  72. package/dist/graphQL/throw/throwAccessTokenExpiredOrDeleted.mjs.map +1 -1
  73. package/dist/graphQL/throw/throwAccessTokenRequired.mjs.map +1 -1
  74. package/dist/graphQL/throw/throwAlreadyDone.mjs.map +1 -1
  75. package/dist/graphQL/throw/throwAlreadyTakenError.mjs.map +1 -1
  76. package/dist/graphQL/throw/throwConflictError.mjs.map +1 -1
  77. package/dist/graphQL/throw/throwErrorWrongUserInput.mjs.map +1 -1
  78. package/dist/graphQL/throw/throwForbiddenError.mjs.map +1 -1
  79. package/dist/graphQL/throw/throwGoneError.mjs.map +1 -1
  80. package/dist/graphQL/throw/throwGraphQLError.mjs +1 -6
  81. package/dist/graphQL/throw/throwGraphQLError.mjs.map +1 -1
  82. package/dist/graphQL/throw/throwInternalError.mjs.map +1 -1
  83. package/dist/graphQL/throw/throwMethodNotAllowedError.mjs.map +1 -1
  84. package/dist/graphQL/throw/throwMissingMalformedInvalidToken.mjs.map +1 -1
  85. package/dist/graphQL/throw/throwNotAcceptableError.mjs.map +1 -1
  86. package/dist/graphQL/throw/throwNotFoundError.mjs.map +1 -1
  87. package/dist/graphQL/throw/throwNotImplementedError.mjs.map +1 -1
  88. package/dist/graphQL/throw/throwPaymentRequiredError.mjs.map +1 -1
  89. package/dist/graphQL/throw/throwPreconditionFailedNoAuthCookie.mjs.map +1 -1
  90. package/dist/graphQL/throw/throwPreconditionFailedNoAuthHeader.mjs.map +1 -1
  91. package/dist/graphQL/throw/throwRefreshTokenExpiredOrDeleted.mjs.map +1 -1
  92. package/dist/graphQL/throw/throwRefreshTokenRequired.mjs.map +1 -1
  93. package/dist/graphQL/throw/throwRefreshTokenSignatureRequired.mjs.map +1 -1
  94. package/dist/graphQL/throw/throwTooManyRequestsError.mjs.map +1 -1
  95. package/dist/graphQL/throw/throwUnauthorizedError.mjs.map +1 -1
  96. package/dist/graphQL/throw/throwUnprocessableContentError.mjs.map +1 -1
  97. package/dist/graphQL/throw/throwUnsupportedMediaTypeError.mjs.map +1 -1
  98. package/dist/koa/IFileUpload.mjs.map +1 -1
  99. package/dist/koa/IKoaError.mjs.map +1 -1
  100. package/dist/koa/customFormatErrorFn.mjs.map +1 -1
  101. package/dist/koa/logRequestToDb.mjs.map +1 -1
  102. package/dist/koa/middleware/authenticatedAuthorizationHandler/TCookieRefreshToken.mjs.map +1 -1
  103. package/dist/koa/middleware/authenticatedAuthorizationHandler/index.mjs.map +1 -1
  104. package/dist/koa/middleware/authenticatedAuthorizationHandler/verifySignedRefreshToken.mjs.map +1 -1
  105. package/dist/koa/middleware/authenticatedLogoutHandler/index.mjs.map +1 -1
  106. package/dist/koa/middleware/authenticatedResourceHandler/index.mjs +1 -2
  107. package/dist/koa/middleware/authenticatedResourceHandler/index.mjs.map +1 -1
  108. package/dist/koa/middleware/debug/index.mjs.map +1 -1
  109. package/dist/koa/router/verifyEmail.mjs +2 -0
  110. package/dist/koa/router/verifyEmail.mjs.map +1 -1
  111. package/dist/koa/tdwKoaErrorHandler.mjs.map +1 -1
  112. package/dist/lib/ArrayLib.mjs +3 -4
  113. package/dist/lib/ArrayLib.mjs.map +1 -1
  114. package/dist/lib/Constants.mjs.map +1 -1
  115. package/dist/lib/DateLib.mjs +2 -3
  116. package/dist/lib/DateLib.mjs.map +1 -1
  117. package/dist/lib/IAuthorizationDisDel.mjs.map +1 -1
  118. package/dist/lib/ICookies.mjs.map +1 -1
  119. package/dist/lib/MariaDB/IMariaDBErr.mjs.map +1 -1
  120. package/dist/lib/MariaDB/MariaDBErrType.mjs.map +1 -1
  121. package/dist/lib/MariaDB/throwSqlErrors.mjs +3 -5
  122. package/dist/lib/MariaDB/throwSqlErrors.mjs.map +1 -1
  123. package/dist/lib/MongoDB/IMongoDBError.mjs.map +1 -1
  124. package/dist/lib/MongoDB/IOnboarding.mjs.map +1 -1
  125. package/dist/lib/MongoDB/MongoDBErrType.mjs.map +1 -1
  126. package/dist/lib/MongoDB/throwIfMongoErr.mjs +2 -5
  127. package/dist/lib/MongoDB/throwIfMongoErr.mjs.map +1 -1
  128. package/dist/lib/MongoDB/throwMongoErrors.mjs.map +1 -1
  129. package/dist/lib/NumLib.mjs +2 -3
  130. package/dist/lib/NumLib.mjs.map +1 -1
  131. package/dist/lib/PostgreSQL/IPostgresError.mjs.map +1 -1
  132. package/dist/lib/PostgreSQL/IPostgresErrorCodes.mjs.map +1 -1
  133. package/dist/lib/PostgreSQL/makePostgreSqlLogError.mjs.map +1 -1
  134. package/dist/lib/Redis/RedisBoolean.mjs.map +1 -1
  135. package/dist/lib/Redis/fromRedisBooleanValue.mjs.map +1 -1
  136. package/dist/lib/Redis/toRedisBooleanValue.mjs.map +1 -1
  137. package/dist/lib/StringLib.mjs +3 -4
  138. package/dist/lib/StringLib.mjs.map +1 -1
  139. package/dist/lib/checkEmailLen.mjs +1 -1
  140. package/dist/lib/checkEmailLen.mjs.map +1 -1
  141. package/dist/lib/checkPwdLen.mjs.map +1 -1
  142. package/dist/lib/db/log/hitStat.mjs +1 -5
  143. package/dist/lib/db/log/hitStat.mjs.map +1 -1
  144. package/dist/lib/db/log/logGlobalError.mjs.map +1 -1
  145. package/dist/lib/db/log/logGraphql.mjs.map +1 -1
  146. package/dist/lib/db/log/logThrow.mjs.map +1 -1
  147. package/dist/lib/db/login/ILoginSet.mjs.map +1 -1
  148. package/dist/lib/db/login/ILoginUnset.mjs.map +1 -1
  149. package/dist/lib/db/registerNewUser.mjs.map +1 -1
  150. package/dist/lib/db/userExist.mjs +1 -3
  151. package/dist/lib/db/userExist.mjs.map +1 -1
  152. package/dist/lib/emailHash.mjs.map +1 -1
  153. package/dist/lib/encryptPassword.mjs.map +1 -1
  154. package/dist/lib/hash.mjs +2 -2
  155. package/dist/lib/hash.mjs.map +1 -1
  156. package/dist/lib/makeOnboardingData.mjs.map +1 -1
  157. package/dist/lib/setLoginCookies.mjs.map +1 -1
  158. package/dist/lib/sleepMs.mjs +1 -1
  159. package/dist/lib/sleepMs.mjs.map +1 -1
  160. package/dist/lib/throwIfNotValidEnumValue.mjs.map +1 -1
  161. package/dist/lib/tokenOptions.mjs +1 -1
  162. package/dist/lib/tokenOptions.mjs.map +1 -1
  163. package/dist/lib/tokens.mjs.map +1 -1
  164. package/dist/lib/tryCatchRethrow.mjs.map +1 -1
  165. package/dist/private/files/_validateMimeType.mjs.map +1 -1
  166. package/dist/private/files/reEncode.mjs +4 -20
  167. package/dist/private/files/reEncode.mjs.map +1 -1
  168. package/dist/private/graphQL/Consts.mjs.map +1 -1
  169. package/dist/private/graphQL/models/MongoDB/private/UserAdminKoaUtils.mjs.map +1 -1
  170. package/dist/private/graphQL/schema/context/IContextLog.mjs.map +1 -1
  171. package/dist/private/graphQL/schema/context/IContextVerifyEmail.mjs.map +1 -1
  172. package/dist/private/graphQL/schema/mutations/_buildLoginStatsUpdate.d.mts +19 -0
  173. package/dist/private/graphQL/schema/mutations/_buildLoginStatsUpdate.mjs +26 -0
  174. package/dist/private/graphQL/schema/mutations/_buildLoginStatsUpdate.mjs.map +1 -0
  175. package/dist/private/graphQL/schema/mutations/_finalizeLoginCheck.d.mts +19 -0
  176. package/dist/private/graphQL/schema/mutations/_finalizeLoginCheck.mjs +28 -0
  177. package/dist/private/graphQL/schema/mutations/_finalizeLoginCheck.mjs.map +1 -0
  178. package/dist/private/graphQL/schema/mutations/checkUserAdminLoginAuthorization.mjs +2 -25
  179. package/dist/private/graphQL/schema/mutations/checkUserAdminLoginAuthorization.mjs.map +1 -1
  180. package/dist/private/graphQL/schema/mutations/checkUserLoginAuthorization.mjs +2 -26
  181. package/dist/private/graphQL/schema/mutations/checkUserLoginAuthorization.mjs.map +1 -1
  182. package/dist/private/graphQL/schema/mutations/infoUserAdminForLogin.mjs +1 -2
  183. package/dist/private/graphQL/schema/mutations/infoUserAdminForLogin.mjs.map +1 -1
  184. package/dist/private/graphQL/schema/mutations/infoUserForLogin.mjs +1 -2
  185. package/dist/private/graphQL/schema/mutations/infoUserForLogin.mjs.map +1 -1
  186. package/dist/private/graphQL/schema/mutations/infoUserForLoginSQL.mjs +1 -1
  187. package/dist/private/graphQL/schema/mutations/infoUserForLoginSQL.mjs.map +1 -1
  188. package/dist/private/graphQL/schema/mutations/setLastLoginSQL.mjs.map +1 -1
  189. package/dist/private/graphQL/schema/mutations/setRedisLoginSession.mjs +2 -8
  190. package/dist/private/graphQL/schema/mutations/setRedisLoginSession.mjs.map +1 -1
  191. package/dist/private/graphQL/schema/mutations/updateAdminLoginStats.mjs +2 -22
  192. package/dist/private/graphQL/schema/mutations/updateAdminLoginStats.mjs.map +1 -1
  193. package/dist/private/graphQL/schema/mutations/updateLoginStats4ever.mjs.map +1 -1
  194. package/dist/private/graphQL/schema/mutations/updateLoginStatsRememberme.mjs +2 -22
  195. package/dist/private/graphQL/schema/mutations/updateLoginStatsRememberme.mjs.map +1 -1
  196. package/dist/private/lib/access/Constants.mjs.map +1 -1
  197. package/dist/private/lib/access/db/confirmNewEmail.mjs.map +1 -1
  198. package/dist/private/lib/access/db/deleteUserByEmail.mjs.map +1 -1
  199. package/dist/private/lib/access/db/enableEmailAccess.mjs.map +1 -1
  200. package/dist/private/lib/access/db/getResetPwd.mjs.map +1 -1
  201. package/dist/private/lib/access/db/incReqTimes.mjs.map +1 -1
  202. package/dist/private/lib/access/db/removeResetReq.mjs.map +1 -1
  203. package/dist/private/lib/access/db/saveResetReq.mjs.map +1 -1
  204. package/dist/private/lib/access/db/setEmailHash.mjs.map +1 -1
  205. package/dist/private/lib/access/db/updatePasswordDb.mjs.map +1 -1
  206. package/dist/private/lib/access/db/userData4VerifyEmail.mjs.map +1 -1
  207. package/dist/private/lib/access/handleBadDB.mjs.map +1 -1
  208. package/dist/private/lib/access/handleIfAccountDeleted.mjs.map +1 -1
  209. package/dist/private/lib/access/handleIfAccountDisabled.mjs.map +1 -1
  210. package/dist/private/lib/access/handleIfEmailAlreadyValid.mjs.map +1 -1
  211. package/dist/private/lib/access/handleIfHashBad.mjs.map +1 -1
  212. package/dist/private/lib/access/handleIfMoreThan3DaysPassed.mjs.map +1 -1
  213. package/dist/private/lib/access/handleIfTooMuchRequestsTimes.mjs.map +1 -1
  214. package/dist/private/lib/makeBodyJson.mjs.map +1 -1
  215. package/package.json +18 -1
package/README.md ADDED
@@ -0,0 +1,183 @@
1
+ # @axiumine/koa-utils
2
+
3
+ TypeScript utility library for Koa + GraphQL backends. Ships authentication middleware, GraphQL error helpers, data-source connectors (MongoDB, MariaDB, PostgreSQL, Redis), file upload pipeline (ClamAV + sharp re-encode), and transactional email via SocketLabs.
4
+
5
+ - **Module format:** ESM only (`.mjs` + `.d.mts`)
6
+ - **Node:** `^24.14.0`
7
+ - **TypeScript:** `5.9`
8
+ - **License:** GPL-3.0-or-later
9
+ - **Maintainer:** [Giovanni Manzoni](https://www.giovannimanzoni.com)
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ yarn add @axiumine/koa-utils
15
+ # or
16
+ npm install @axiumine/koa-utils
17
+ ```
18
+
19
+ All runtime dependencies are declared as **peer dependencies**. Install the ones you use:
20
+
21
+ ```bash
22
+ yarn add @node-rs/bcrypt @sentry/node @socketlabs/email clamscan dotenv \
23
+ file-type fs-extra graphql keygrip koa koa-logger mongoose pg redis \
24
+ reflect-metadata sequelize sequelize-typescript sharp uuid
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ No barrel — import each helper from its explicit subpath.
30
+
31
+ ### Data sources
32
+
33
+ ```ts
34
+ import { MongoDBConnect, MongoDBDisconnect } from '@axiumine/koa-utils/dataSources/MongoDB'
35
+ import { redisClient, RedisConnect } from '@axiumine/koa-utils/dataSources/Redis'
36
+ import { pgPool, PostgreSQLClientConnect } from '@axiumine/koa-utils/dataSources/PostgreSQL'
37
+ import { sequelize, MariaDBConnect } from '@axiumine/koa-utils/dataSources/MariaDB'
38
+
39
+ await MongoDBConnect()
40
+ await RedisConnect()
41
+ ```
42
+
43
+ ### Koa middleware
44
+
45
+ ```ts
46
+ import Koa from 'koa'
47
+ import Keygrip from 'keygrip'
48
+ import { tdwKoaErrorHandler } from '@axiumine/koa-utils/koa/tdwKoaErrorHandler'
49
+ import { authenticatedResourceHandler } from '@axiumine/koa-utils/koa/middleware/authenticatedResourceHandler'
50
+ import { authenticatedAuthorizationHandler } from '@axiumine/koa-utils/koa/middleware/authenticatedAuthorizationHandler'
51
+
52
+ const app = new Koa()
53
+ const keys = new Keygrip([process.env.COOKIE_KEY!])
54
+
55
+ app.use(tdwKoaErrorHandler)
56
+ app.use(authenticatedResourceHandler()) // resource endpoints
57
+ app.use(authenticatedAuthorizationHandler(keys)) // refresh endpoint
58
+ ```
59
+
60
+ ### GraphQL mutations
61
+
62
+ Plain mutation definitions ready to drop into a `GraphQLObjectType`:
63
+
64
+ ```ts
65
+ import { GraphQLObjectType } from 'graphql'
66
+ import { signUp } from '@axiumine/koa-utils/graphQL/schema/mutations/signUp'
67
+ import { loginRememberme } from '@axiumine/koa-utils/graphQL/schema/mutations/loginRememberme'
68
+ import { logout } from '@axiumine/koa-utils/graphQL/schema/mutations/logout'
69
+ import { refresh } from '@axiumine/koa-utils/graphQL/schema/mutations/refresh'
70
+ import { resetPwd } from '@axiumine/koa-utils/graphQL/schema/mutations/resetPwd'
71
+ import { updatePassword } from '@axiumine/koa-utils/graphQL/schema/mutations/updatePassword'
72
+
73
+ const Mutation = new GraphQLObjectType({
74
+ name: 'Mutation',
75
+ fields: { signUp, loginRememberme, logout, refresh, resetPwd, updatePassword }
76
+ })
77
+ ```
78
+
79
+ ### GraphQL error helpers
80
+
81
+ ```ts
82
+ import { throwForbiddenError } from '@axiumine/koa-utils/graphQL/throw/throwForbiddenError'
83
+ import { throwNotFoundError } from '@axiumine/koa-utils/graphQL/throw/throwNotFoundError'
84
+ import { throwTooManyRequestsError } from '@axiumine/koa-utils/graphQL/throw/throwTooManyRequestsError'
85
+
86
+ if (!user) throw throwNotFoundError()
87
+ ```
88
+
89
+ All `throw*` helpers wrap `throwGraphQLError(status, title, description)` and yield a `GraphQLError` carrying `extensions.http.status` so `tdwKoaErrorHandler` maps it to the right HTTP code.
90
+
91
+ ### File uploads
92
+
93
+ ```ts
94
+ import { initClamScan } from '@axiumine/koa-utils/files/scanVirus'
95
+ import { uploadTemp } from '@axiumine/koa-utils/files/uploadTempImage'
96
+ import { uploadTempPdf } from '@axiumine/koa-utils/files/uploadTempPdf'
97
+
98
+ await initClamScan() // once at boot
99
+ const { tempFile, ext } = await uploadTemp(filePromise) // jpg/png → webp
100
+ ```
101
+
102
+ Pipeline: stream to `/tmp` (5 MB cap) → extension + magic-number MIME check → ClamAV → sharp re-encode (strips EXIF). PDF path scans only (no re-encode).
103
+
104
+ ### Email
105
+
106
+ ```ts
107
+ import { SocketLabsLib } from '@axiumine/koa-utils/email/SocketlabsLib'
108
+
109
+ const mailer = new SocketLabsLib()
110
+ await mailer.sendEmailVerify('user@example.com', hash)
111
+ ```
112
+
113
+ > Note: copy is Italian. Subclass / replace template methods for other locales.
114
+
115
+ ### Helpers
116
+
117
+ ```ts
118
+ import { encryptPassword } from '@axiumine/koa-utils/lib/encryptPassword'
119
+ import { compareHashAsync } from '@axiumine/koa-utils/lib/hash'
120
+ import { checkEmailLen } from '@axiumine/koa-utils/lib/checkEmailLen'
121
+ import { checkPwdLen } from '@axiumine/koa-utils/lib/checkPwdLen'
122
+ import { generateAccessToken, generateRefreshToken, accessTokenExpiry, REFRESH_TOKEN_EXPIRY } from '@axiumine/koa-utils/lib/tokens'
123
+ import { setLoginCookies } from '@axiumine/koa-utils/lib/setLoginCookies'
124
+ import { DateLib } from '@axiumine/koa-utils/lib/DateLib'
125
+ import { StringLib } from '@axiumine/koa-utils/lib/StringLib'
126
+ ```
127
+
128
+ ## Auth flow
129
+
130
+ 1. `signUp` — creates a user with `account.email.valid=false`, sends verify email.
131
+ 2. `routerVerifyEmail` — Koa router validating the email + hash, enabling the account.
132
+ 3. `loginRememberme` / `login4Ever` / `loginAdmin` — bcrypt compare, generate uuid `access:<uuid>` + `refresh:<uuid>` in Redis, set signed `refresh_token` cookie (90 d), return access token in body.
133
+ 4. `authenticatedResourceHandler` — middleware reading `Authorization: Bearer access:<uuid>`.
134
+ 5. `authenticatedAuthorizationHandler(keys)` — middleware verifying signed refresh cookie via Keygrip; mount before the `refresh` endpoint.
135
+ 6. `refresh` — rotates both tokens, random access TTL in [30, 90] minutes, fixed 90-day refresh TTL.
136
+ 7. `logout` + `authenticatedLogoutHandler` — clears Redis keys and cookie.
137
+
138
+ ## Environment variables
139
+
140
+ | Var | Purpose |
141
+ | --- | --- |
142
+ | `MONGODB_URI` | Mongo connection string |
143
+ | `MARIADB_DBNAME`, `_USER`, `_PWD`, `_IP`, `_PORT`, `_RETRY`, `_TIMEOUT`, `_LOGGING` | MariaDB |
144
+ | `POSTGRESQL_USER`, `_PWD`, `_HOST`, `_PORT`, `_DBNAME`, `_POOL_MAX`, `_IDLE_TIMEOUT` | PostgreSQL |
145
+ | `REDIS_URL` or `REDIS_IS_CLUSTER` + `REDIS_DB{1,2,3}_HOST/PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD` | Redis |
146
+ | `REDIS_KEY` | Prefix for all keys (e.g. `myapp:`) |
147
+ | `INTROSPECTION_CODE` | Bypass header `x-introspectioncode` for schema introspection |
148
+ | `SOCKETLABS_SERVER_ID`, `SOCKETLABS_SERVER_APIKEY` | SocketLabs auth |
149
+ | `PLATFORM_NAME`, `APP_DOMAIN`, `EMAIL_FROM`, `DEV_TEAM_EMAIL` | Email templating |
150
+ | `STATIC_FOLDER` | Destination for `moveFileStaticDomain` |
151
+ | `NODE_ENV` | `development` enables extra Sentry capture in the error handler |
152
+
153
+ Each module calls `dotenv.config()` at import time.
154
+
155
+ ## TLS / cookies
156
+
157
+ `tokenOptions` sets `secure: false` by design. Flip it at the reverse proxy (Nginx / Caddy / CloudFront), not in source.
158
+
159
+ ## Build (contributors only)
160
+
161
+ ```bash
162
+ yarn install
163
+ yarn build # ESM only — production output
164
+ yarn build:all # ESM + CJS dual output
165
+ yarn lint # eslint --fix + prettier --write
166
+ yarn clean
167
+ ```
168
+
169
+ Source files are `.mts`. Imports use `.mjs` extension explicitly (NodeNext). Path aliases (`@lib/*`, `@throw/*`, `@models/*`, `@context/*`, `@stypes/*`, `@private/*`, `@email/*`, `@dataSources/*`) are rewritten to relative paths in emitted code via `typescript-transform-paths` (run through `tspc`, the `ts-patch` wrapper).
170
+
171
+ Adding a new public symbol requires both:
172
+ 1. Creating `src/<area>/<Name>.mts`
173
+ 2. Adding the matching entry under `exports` in `package.json`
174
+
175
+ There is no barrel and no `main` / `module` field.
176
+
177
+ ## Repository
178
+
179
+ <https://github.com/Axiumine/koa-utils>
180
+
181
+ ## License
182
+
183
+ GPL-3.0-or-later © Giovanni Manzoni
@@ -33,6 +33,7 @@ export const sequelize = new Sequelize(`${process.env.MARIADB_DBNAME}`, `${proce
33
33
  requestTimeout: parseInt(`${process.env.MARIADB_TIMEOUT}`) || 5000
34
34
  },
35
35
  port: parseInt(`${process.env.MARIADB_PORT}`, 10),
36
+ /* c8 ignore next -- env-dependent boot config; covered only when MARIADB_LOGGING='false' */
36
37
  logging: process.env.MARIADB_LOGGING === 'false' ? false : undefined // disable print queries in console
37
38
  });
38
39
  // Setting up a connection
@@ -1 +1 @@
1
- {"version":3,"file":"MariaDB.mjs","sourceRoot":"","sources":["../../../src/dataSources/MariaDB.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAEhD,MAAM,CAAC,MAAM,EAAE,CAAA;AAGf,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,CACrC,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EAC/B,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,EAC7B,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,EAC5B;IACC,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE;IACjC,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;IACpB,IAAI,EAAE;QACL,2BAA2B;QAC3B,GAAG,EAAE,EAAE;QACP,GAAG,EAAE,CAAC;QACN,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,KAAK;KACd;IACD,KAAK,EAAE;QACN;;;;;aAKK;QACL,WAAW,EAAE,GAAG;QAChB,eAAe,EAAE,GAAG;QACpB,OAAO,EAAE,IAAI;QACb,aAAa,EAAE,GAAG,EAAE,6BAA6B;QACjD,GAAG,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC;KAClD;IACD,cAAc,EAAE;QACf,MAAM,EAAE,IAAI;QACZ,eAAe,EAAE,IAAI;QACrB,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,IAAI,IAAI;KAClE;IACD,IAAI,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAE,mCAAmC;CACzG,CACD,CAAA;AAED,0BAA0B;AAC1B,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;IACxC,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;IACrD,IAAI,CAAC;QACJ,MAAM,SAAS,CAAC,YAAY,EAAE,CAAA;QAC9B,OAAO,CAAC,IAAI,CACX,qEAAqE,CACrE,CAAA;IACF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,mDAAmD,CAAA;QACpE,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE;YAC1B,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;SAC3B,CAAC,CAAA;QACF,MAAM;YACL,OAAO,EAAE,QAAQ;YACjB,QAAQ,EAAE,IAAI;SACd,CAAA;IACF,CAAC;IACD,OAAO,SAAS,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,IAAI,EAAE;IAC3C,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;IAC9D,IAAI,CAAC;QACJ,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;QACvB,OAAO,CAAC,IAAI,CACX,gEAAgE,CAChE,CAAA;IACF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,2DAA2D,CAAA;QAC5E,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE;YAC1B,KAAK,EAAE,EAAE,MAAM,EAAE,qCAAqC,EAAE;SACxD,CAAC,CAAA;QACF,MAAM;YACL,OAAO,EAAE,QAAQ;YACjB,QAAQ,EAAE,IAAI;SACd,CAAA;IACF,CAAC;AACF,CAAC,CAAA"}
1
+ {"version":3,"file":"MariaDB.mjs","sourceRoot":"","sources":["../../../src/dataSources/MariaDB.mts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from '@sentry/node'\nimport * as dotenv from 'dotenv'\nimport { Sequelize } from 'sequelize-typescript'\n\ndotenv.config()\n\nexport const sequelize = new Sequelize(\n\t`${process.env.MARIADB_DBNAME}`,\n\t`${process.env.MARIADB_USER}`,\n\t`${process.env.MARIADB_PWD}`,\n\t{\n\t\thost: `${process.env.MARIADB_IP}`,\n\t\tdialect: 'mariadb',\n\t\tquery: { raw: true },\n\t\tpool: {\n\t\t\t// handleDisconnects: true,\n\t\t\tmax: 13,\n\t\t\tmin: 1,\n\t\t\tidle: 10000,\n\t\t\tacquire: 20000\n\t\t},\n\t\tretry: {\n\t\t\t/* match: [\n\t\t\t\tSequelize.ConnectionError,\n\t\t\t\tSequelize.ConnectionTimedOutError,\n\t\t\t\tSequelize.TimeoutError,\n\t\t\t\t/Deadlock/i,\n\t\t\t], */\n\t\t\tbackoffBase: 100,\n\t\t\tbackoffExponent: 1.1,\n\t\t\ttimeout: 3000,\n\t\t\tbackoffJitter: 0.1, // Add this required property\n\t\t\tmax: parseInt(`${process.env.MARIADB_RETRY}`) || 5\n\t\t},\n\t\tdialectOptions: {\n\t\t\tuseUTC: true,\n\t\t\tskipSetTimezone: true,\n\t\t\tcompress: true,\n\t\t\trequestTimeout: parseInt(`${process.env.MARIADB_TIMEOUT}`) || 5000\n\t\t},\n\t\tport: parseInt(`${process.env.MARIADB_PORT}`, 10),\n\t\t/* c8 ignore next -- env-dependent boot config; covered only when MARIADB_LOGGING='false' */\n\t\tlogging: process.env.MARIADB_LOGGING === 'false' ? false : undefined // disable print queries in console\n\t}\n)\n\n// Setting up a connection\nexport const MariaDBConnect = async () => {\n\tconsole.info('[MariaDB] Try connect to database... ')\n\ttry {\n\t\tawait sequelize.authenticate()\n\t\tconsole.info('[MariaDB] OK: MariaDB connection has been established successfully.')\n\t} catch (e) {\n\t\tconst catchMex = '[MariaDB] FAIL: Unable to connect to the database'\n\t\tSentry.captureException(e, {\n\t\t\textra: { detail: catchMex }\n\t\t})\n\t\tthrow {\n\t\t\tmessage: catchMex,\n\t\t\tshutdown: true\n\t\t}\n\t}\n\treturn sequelize\n}\n\nexport const MariaDBDisconnect = async () => {\n\tconsole.info('[MariaDB] Try close connection to database... ')\n\ttry {\n\t\tawait sequelize.close()\n\t\tconsole.info('[MariaDB] OK: MariaDB connection has been closed successfully.')\n\t} catch (e) {\n\t\tconst catchMex = '[MariaDB] FAIL: Unable to close the database connection: '\n\t\tSentry.captureException(e, {\n\t\t\textra: { detail: 'Error during database disconnection' }\n\t\t})\n\t\tthrow {\n\t\t\tmessage: catchMex,\n\t\t\tshutdown: true\n\t\t}\n\t}\n}\n"]}
@@ -25,6 +25,7 @@ export async function MongoDBConnect() {
25
25
  mongoose.set('sanitizeFilter', true);
26
26
  mongoose.set('strictQuery', false); // will be done in mongose 7
27
27
  await mongoose.connect(`${process.env.MONGODB_URI}`, options);
28
+ /* c8 ignore next 2 -- success log + closing brace; covered only with live MongoDB */
28
29
  console.info('[MongoDB] OK: MongoDB connection has been established successfully. ');
29
30
  }
30
31
  export async function MongoDBDisconnect() {
@@ -1 +1 @@
1
- {"version":3,"file":"MongoDB.mjs","sourceRoot":"","sources":["../../../src/dataSources/MongoDB.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAChC,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AAEpC,MAAM,CAAC,MAAM,EAAE,CAAA;AAEf,sFAAsF;AACtF,wCAAwC;AAExC,MAAM,CAAC,KAAK,UAAU,cAAc;IACnC,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;IAErD,MAAM,OAAO,GAA4B;QACxC,kBAAkB;QAClB,wBAAwB;QACxB,yBAAyB;QACzB,MAAM,EAAE,CAAC,EAAE,OAAO;QAClB,2BAA2B;QAC3B,4BAA4B;QAC5B,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB;QAErB,kBAAkB;QAClB,SAAS,EAAE,IAAI;QACf,wEAAwE;QACxE,8DAA8D;QAC9D,uBAAuB;QACvB,mBAAmB;QACnB,gCAAgC;KAChC,CAAA;IACD,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;IACpC,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA,CAAC,4BAA4B;IAC/D,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAA;IAC7D,OAAO,CAAC,IAAI,CACX,sEAAsE,CACtE,CAAA;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACtC,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;IAC9D,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;IAC3B,OAAO,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAA;AAC/E,CAAC"}
1
+ {"version":3,"file":"MongoDB.mjs","sourceRoot":"","sources":["../../../src/dataSources/MongoDB.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAChC,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AAEpC,MAAM,CAAC,MAAM,EAAE,CAAA;AAEf,sFAAsF;AACtF,wCAAwC;AAExC,MAAM,CAAC,KAAK,UAAU,cAAc;IACnC,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;IAErD,MAAM,OAAO,GAA4B;QACxC,kBAAkB;QAClB,wBAAwB;QACxB,yBAAyB;QACzB,MAAM,EAAE,CAAC,EAAE,OAAO;QAClB,2BAA2B;QAC3B,4BAA4B;QAC5B,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB;QAErB,kBAAkB;QAClB,SAAS,EAAE,IAAI;QACf,wEAAwE;QACxE,8DAA8D;QAC9D,uBAAuB;QACvB,mBAAmB;QACnB,gCAAgC;KAChC,CAAA;IACD,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;IACpC,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA,CAAC,4BAA4B;IAC/D,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAA;IAC7D,qFAAqF;IACrF,OAAO,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAA;AACrF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACtC,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;IAC9D,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;IAC3B,OAAO,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAA;AAC/E,CAAC","sourcesContent":["import * as dotenv from 'dotenv'\nimport * as mongoose from 'mongoose'\n\ndotenv.config()\n\n// DeprecationWarning: collection.ensureIndex is deprecated.Use createIndexes instead.\n// mongoose.set('useCreateIndex', true);\n\nexport async function MongoDBConnect() {\n\tconsole.info('[MongoDB] Try connect to database... ')\n\n\tconst options: mongoose.ConnectOptions = {\n\t\t// prime direttive\n\t\t// useCreateIndex: true,\n\t\t// useNewUrlParser: true,\n\t\tfamily: 4, // ipv4\n\t\t// useFindAndModify: false,\n\t\t// useUnifiedTopology: true,\n\t\tserverSelectionTimeoutMS: 5000,\n\t\t// retryWrites: true,\n\n\t\t// nuove direttive\n\t\tautoIndex: true\n\t\t// reconnectTries: Number.MAX_VALUE, // conflitto con useUnifiedTopology\n\t\t// reconnectInterval: 500, // conflitto con useUnifiedTopology\n\t\t// bufferMaxEntries: 0,\n\t\t// keepAlive: true,\n\t\t// keepAliveInitialDelay: 300000\n\t}\n\tmongoose.set('sanitizeFilter', true)\n\tmongoose.set('strictQuery', false) // will be done in mongose 7\n\tawait mongoose.connect(`${process.env.MONGODB_URI}`, options)\n\t/* c8 ignore next 2 -- success log + closing brace; covered only with live MongoDB */\n\tconsole.info('[MongoDB] OK: MongoDB connection has been established successfully. ')\n}\n\nexport async function MongoDBDisconnect() {\n\tconsole.info('[MongoDB] Try close connection to database... ')\n\tawait mongoose.disconnect()\n\tconsole.info('[MongoDB] OK: MongoDB connection has been closed successfully.')\n}\n"]}
@@ -21,10 +21,12 @@ export const pgPool = new Pool({
21
21
  });
22
22
  // the pool will emit an error on behalf of any idle clients
23
23
  // it contains if a backend error or network partition happens
24
+ /* c8 ignore start -- idle-client error path: requires live pg backend partition, not unit-testable */
24
25
  pgPool.on('error', (err) => {
25
26
  console.error('Unexpected error on idle client', err);
26
27
  process.exit(-1);
27
28
  });
29
+ /* c8 ignore stop */
28
30
  /*************************
29
31
  * Client, for transaction and single connection
30
32
  */
@@ -50,8 +52,8 @@ export const PostgreSQLClientConnect = async () => {
50
52
  Sentry.captureMessage(`[PostgreSQL Client] notification: ${msg}`, {
51
53
  level: 'warning',
52
54
  extra: {
53
- 'channel': msg.channel,
54
- 'payload': msg.payload
55
+ channel: msg.channel,
56
+ payload: msg.payload
55
57
  }
56
58
  });
57
59
  });
@@ -1 +1 @@
1
- {"version":3,"file":"PostgreSQL.mjs","sourceRoot":"","sources":["../../../src/dataSources/PostgreSQL.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PostgreSQL.mjs","sourceRoot":"","sources":["../../../src/dataSources/PostgreSQL.mts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from '@sentry/node'\nimport * as dotenv from 'dotenv'\nimport pg from 'pg'\n\nconst { Client, Pool } = pg\n\ndotenv.config()\n\nexport const pgClient = new Client({\n\tuser: `${process.env.POSTGRESQL_USER}`,\n\tpassword: `${process.env.POSTGRESQL_PWD}`,\n\thost: `${process.env.POSTGRESQL_HOST}`,\n\tport: parseInt(`${process.env.POSTGRESQL_PORT}`, 10),\n\tdatabase: `${process.env.POSTGRESQL_DBNAME}`\n})\n\nexport const pgPool = new Pool({\n\tuser: `${process.env.POSTGRESQL_USER}`,\n\tpassword: `${process.env.POSTGRESQL_PWD}`,\n\thost: `${process.env.POSTGRESQL_HOST}`,\n\tport: parseInt(`${process.env.POSTGRESQL_PORT}`, 10),\n\tdatabase: `${process.env.POSTGRESQL_DBNAME}`,\n\tmax: parseInt(`${process.env.POSTGRESQL_POOL_MAX}`, 10),\n\tidleTimeoutMillis: parseInt(`${process.env.POSTGRESQL_IDLE_TIMEOUT}`, 10)\n})\n\n// the pool will emit an error on behalf of any idle clients\n// it contains if a backend error or network partition happens\n/* c8 ignore start -- idle-client error path: requires live pg backend partition, not unit-testable */\npgPool.on('error', (err) => {\n\tconsole.error('Unexpected error on idle client', err)\n\tprocess.exit(-1)\n})\n/* c8 ignore stop */\n\n/*************************\n * Client, for transaction and single connection\n */\n\n// Setting up a connection\nexport const PostgreSQLClientConnect = async () => {\n\tconsole.info('[PostgreSQL Client] Try connect to database... ')\n\n\ttry {\n\t\tawait pgClient.connect()\n\n\t\t// Attach an error listener only once\n\t\tif (!pgClient.listenerCount('error')) {\n\t\t\tpgClient.on('error', (e) => {\n\t\t\t\tconst catchMex = '[PostgreSQL Client] something bad has happened!'\n\t\t\t\tSentry.captureException(e, {\n\t\t\t\t\textra: { detail: catchMex }\n\t\t\t\t})\n\t\t\t\tconsole.error(catchMex)\n\t\t\t})\n\t\t}\n\t\tif (!pgClient.listenerCount('notification')) {\n\t\t\tpgClient.on('notification', (msg) => {\n\t\t\t\tconsole.info('[PostgreSQL Client]', msg.channel)\n\t\t\t\tconsole.info('[PostgreSQL Client]', msg.payload)\n\t\t\t\tSentry.captureMessage(`[PostgreSQL Client] notification: ${msg}`, {\n\t\t\t\t\tlevel: 'warning',\n\t\t\t\t\textra: {\n\t\t\t\t\t\tchannel: msg.channel,\n\t\t\t\t\t\tpayload: msg.payload\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t\t// https://www.postgresql.org/docs/9.6/static/plpgsql-errors-and-messages.html\n\t\tif (!pgClient.listenerCount('notice')) {\n\t\t\tpgClient.on('notice', (msg) => {\n\t\t\t\tSentry.captureMessage(`[PostgreSQL Client] notice: ${msg}`, 'warning')\n\t\t\t})\n\t\t}\n\t\tconsole.info('[PostgreSQL Client] OK: PostgreSQL connection has been established successfully.')\n\t} catch (error) {\n\t\tthrow {\n\t\t\tmessage: '[PostgreSQL Client] FAIL: Unable to connect to the database: ' + error,\n\t\t\tshutdown: true\n\t\t}\n\t}\n}\n\nexport const PostgreSQLClientDisconnect = async () => {\n\tconsole.info('[PostgreSQL Client] Try close connection to database... ')\n\ttry {\n\t\tawait pgClient.end()\n\t\tconsole.info('[PostgreSQL Client] OK: PostgreSQL connection has been closed successfully.')\n\t} catch (error) {\n\t\tthrow {\n\t\t\tmessage: '[PostgreSQL Client] FAIL: Unable to close the database connection: ' + error,\n\t\t\tshutdown: true\n\t\t}\n\t}\n}\n\n/*************************\n * Pool\n *\n * -- USE WITH --\n *\n * const pgPoolClient = await pgPool.connect()\n * your queries.. await client.query('YOUR_QUERY')\n * pgPoolClient.release()\n */\n\nexport const PostgreSQLPoolDisconnect = async () => {\n\tconsole.log('[PostgreSQL Pool] Try close connection to database... ')\n\ttry {\n\t\tawait pgPool.end()\n\t\tconsole.info('[PostgreSQL Pool] OK: PostgreSQL connection has been closed successfully.')\n\t} catch (error) {\n\t\tthrow {\n\t\t\tmessage: '[PostgreSQL Pool] FAIL: Unable to close the database connection: ' + error,\n\t\t\tshutdown: true\n\t\t}\n\t}\n}\n"]}
@@ -3,21 +3,23 @@ import * as dotenv from 'dotenv';
3
3
  import { createClient, createCluster } from 'redis';
4
4
  dotenv.config();
5
5
  export const redisClient = process.env.REDIS_IS_CLUSTER === '1'
6
- ? createCluster({
7
- rootNodes: [
8
- { url: `redis://${process.env.REDIS_DB1_HOST}:${process.env.REDIS_DB1_PORT}` },
9
- { url: `redis://${process.env.REDIS_DB2_HOST}:${process.env.REDIS_DB2_PORT}` },
10
- { url: `redis://${process.env.REDIS_DB3_HOST}:${process.env.REDIS_DB3_PORT}` }
11
- ],
12
- defaults: {
13
- username: process.env.REDIS_USERNAME,
14
- password: process.env.REDIS_PASSWORD
15
- }
16
- })
17
- : createClient({ url: process.env.REDIS_URL });
6
+ ? /* c8 ignore start -- cluster branch: requires REDIS_IS_CLUSTER=1 + 3 redis nodes, not in unit env */
7
+ createCluster({
8
+ rootNodes: [
9
+ { url: `redis://${process.env.REDIS_DB1_HOST}:${process.env.REDIS_DB1_PORT}` },
10
+ { url: `redis://${process.env.REDIS_DB2_HOST}:${process.env.REDIS_DB2_PORT}` },
11
+ { url: `redis://${process.env.REDIS_DB3_HOST}:${process.env.REDIS_DB3_PORT}` }
12
+ ],
13
+ defaults: {
14
+ username: process.env.REDIS_USERNAME,
15
+ password: process.env.REDIS_PASSWORD
16
+ }
17
+ })
18
+ : /* c8 ignore stop */
19
+ createClient({ url: process.env.REDIS_URL });
18
20
  export const RedisConnect = async () => {
19
21
  console.info('[Redis] Try connect to database... ');
20
- redisClient.on('error', e => {
22
+ redisClient.on('error', (e) => {
21
23
  console.error('Redis Client Error');
22
24
  Sentry.captureException(e);
23
25
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Redis.mjs","sourceRoot":"","sources":["../../../src/dataSources/Redis.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAEnD,MAAM,CAAC,MAAM,EAAE,CAAA;AAEf,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,GAAG;IAC9D,CAAC,CAAC,aAAa,CAAC;QACf,SAAS,EAAE;YACV,EAAE,GAAG,EAAE,WAAW,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE;YAC9E,EAAE,GAAG,EAAE,WAAW,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE;YAC9E,EAAE,GAAG,EAAE,WAAW,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE;SAC9E;QACD,QAAQ,EAAE;YACT,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;YACpC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;SACpC;KACD,CAAC;IACF,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;AAE/C,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;IACtC,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IAEnD,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE;QAC3B,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;QACnC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IACF,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;IAC3B,OAAO,CAAC,IAAI,CACX,kEAAkE,CAClE,CAAA;AACF,CAAC,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACpC,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;IAC5D,IAAI,CAAC;QACJ,MAAM,WAAW,CAAC,IAAI,EAAE,CAAA,CAAC,kDAAkD;QAC3E,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;IAC3E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,sBAAsB,EAAE,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;YACjD,OAAM,CAAC,iDAAiD;QACzD,CAAC;QACD,yCAAyC;QACzC,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAA;QACnD,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;QAC1B,MAAM,CAAC,CAAA;IACR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"Redis.mjs","sourceRoot":"","sources":["../../../src/dataSources/Redis.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAEnD,MAAM,CAAC,MAAM,EAAE,CAAA;AAEf,MAAM,CAAC,MAAM,WAAW,GACvB,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,GAAG;IACnC,CAAC,CAAC,qGAAqG;QACtG,aAAa,CAAC;YACb,SAAS,EAAE;gBACV,EAAE,GAAG,EAAE,WAAW,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE;gBAC9E,EAAE,GAAG,EAAE,WAAW,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE;gBAC9E,EAAE,GAAG,EAAE,WAAW,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE;aAC9E;YACD,QAAQ,EAAE;gBACT,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;gBACpC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;aACpC;SACD,CAAC;IACH,CAAC,CAAC,oBAAoB;QACrB,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;AAE/C,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;IACtC,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IAEnD,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QAC7B,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;QACnC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IACF,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;IAC3B,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAA;AACjF,CAAC,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACpC,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;IAC5D,IAAI,CAAC;QACJ,MAAM,WAAW,CAAC,IAAI,EAAE,CAAA,CAAC,kDAAkD;QAC3E,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;IAC3E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,sBAAsB,EAAE,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;YACjD,OAAM,CAAC,iDAAiD;QACzD,CAAC;QACD,yCAAyC;QACzC,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAA;QACnD,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;QAC1B,MAAM,CAAC,CAAA;IACR,CAAC;AACF,CAAC","sourcesContent":["import * as Sentry from '@sentry/node'\nimport * as dotenv from 'dotenv'\nimport { createClient, createCluster } from 'redis'\n\ndotenv.config()\n\nexport const redisClient =\n\tprocess.env.REDIS_IS_CLUSTER === '1'\n\t\t? /* c8 ignore start -- cluster branch: requires REDIS_IS_CLUSTER=1 + 3 redis nodes, not in unit env */\n\t\t\tcreateCluster({\n\t\t\t\trootNodes: [\n\t\t\t\t\t{ url: `redis://${process.env.REDIS_DB1_HOST}:${process.env.REDIS_DB1_PORT}` },\n\t\t\t\t\t{ url: `redis://${process.env.REDIS_DB2_HOST}:${process.env.REDIS_DB2_PORT}` },\n\t\t\t\t\t{ url: `redis://${process.env.REDIS_DB3_HOST}:${process.env.REDIS_DB3_PORT}` }\n\t\t\t\t],\n\t\t\t\tdefaults: {\n\t\t\t\t\tusername: process.env.REDIS_USERNAME,\n\t\t\t\t\tpassword: process.env.REDIS_PASSWORD\n\t\t\t\t}\n\t\t\t})\n\t\t: /* c8 ignore stop */\n\t\t\tcreateClient({ url: process.env.REDIS_URL })\n\nexport const RedisConnect = async () => {\n\tconsole.info('[Redis] Try connect to database... ')\n\n\tredisClient.on('error', (e) => {\n\t\tconsole.error('Redis Client Error')\n\t\tSentry.captureException(e)\n\t})\n\tawait redisClient.connect()\n\tconsole.info('[Redis] OK: Redis connection has been established successfully. ')\n}\n\nexport async function RedisDisconnect() {\n\tconsole.info('[Redis] Try close connection to database... ')\n\ttry {\n\t\tawait redisClient.quit() // Gracefully close a client's connection to Redis\n\t\tconsole.info('[Redis] OK: Redis connection has been closed successfully.')\n\t} catch (e) {\n\t\tif (e instanceof Error && e.message === 'The client is closed') {\n\t\t\tconsole.info('[Redis] Client was already closed')\n\t\t\treturn // Continue execution if client is already closed\n\t\t}\n\t\t// For any other errors, log and re-throw\n\t\tconsole.error('[Redis] Error during disconnection')\n\t\tSentry.captureException(e)\n\t\tthrow e\n\t}\n}\n"]}
@@ -15,15 +15,15 @@ export class SocketLabsLib {
15
15
  emailHtmlHeader2;
16
16
  emailHtmlFooter;
17
17
  constructor(htmlHeader1 = '', htmlHeader2 = '', htmlFooter = '') {
18
- this.client = new SocketLabsClient(parseInt(process.env.SOCKETLABS_SERVER_ID || '0'), `${process.env.SOCKETLABS_SERVER_APIKEY}`, { requestTimeout: 120, numberOfRetries: 3 });
18
+ this.client = new SocketLabsClient(
19
+ /* c8 ignore next -- env fallback '0' covered only when SOCKETLABS_SERVER_ID is unset */
20
+ parseInt(process.env.SOCKETLABS_SERVER_ID || '0'), `${process.env.SOCKETLABS_SERVER_APIKEY}`, { requestTimeout: 120, numberOfRetries: 3 });
19
21
  this.StringObj = new StringLib();
20
22
  this.platformName = `${process.env.PLATFORM_NAME}`;
21
23
  this.linkBase = `${process.env.APP_DOMAIN}`;
22
24
  this.emailFrom = `${process.env.EMAIL_FROM}`;
23
- this.emailHtmlHeader1 =
24
- htmlHeader1 === '' ? this.htmlHeader1() : htmlHeader1;
25
- this.emailHtmlHeader2 =
26
- htmlHeader2 === '' ? this.htmlHeader2() : htmlHeader2;
25
+ this.emailHtmlHeader1 = htmlHeader1 === '' ? this.htmlHeader1() : htmlHeader1;
26
+ this.emailHtmlHeader2 = htmlHeader2 === '' ? this.htmlHeader2() : htmlHeader2;
27
27
  this.emailHtmlFooter = htmlFooter === '' ? this.htmlFooter() : htmlFooter;
28
28
  }
29
29
  async sendEmailVerify(emailTo, hash, name = '') {
@@ -391,6 +391,7 @@ SendResponse {
391
391
  Sentry.captureException(e);
392
392
  ret = null;
393
393
  }
394
+ /* c8 ignore next -- ret is always null in this function */
394
395
  return ret ? ret : null; // se invio va a buon fine, ritorna l'hash, altrimenti null
395
396
  }
396
397
  async sendEmailPostSegnalato(infoUtente, idPost) {
@@ -450,11 +451,7 @@ SendResponse {
450
451
  basicMessage.setFromAddress(emailFrom, emailFromName);
451
452
  basicMessage.setSubject(subject);
452
453
  basicMessage.setTextBody(textBody);
453
- basicMessage.setHtmlBody(this.emailHtmlHeader1 +
454
- subject +
455
- this.emailHtmlHeader2 +
456
- htmlBody +
457
- this.emailHtmlFooter);
454
+ basicMessage.setHtmlBody(this.emailHtmlHeader1 + subject + this.emailHtmlHeader2 + htmlBody + this.emailHtmlFooter);
458
455
  basicMessage.setTo(emailTo);
459
456
  return this.client.send(basicMessage).then(() => {
460
457
  //Handle successful API call
@@ -1 +1 @@
1
- {"version":3,"file":"SocketLabsLib.mjs","sourceRoot":"","sources":["../../../src/email/SocketLabsLib.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SocketLabsLib.mjs","sourceRoot":"","sources":["../../../src/email/SocketLabsLib.mts"],"names":[],"mappings":"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","sourcesContent":["import { StringLib } from '@lib/StringLib.mjs'\nimport * as Sentry from '@sentry/node'\nimport { BasicMessage, SocketLabsClient } from '@socketlabs/email'\nimport { throwInternalError } from '@throw/throwInternalError.mjs'\nimport * as dotenv from 'dotenv'\n\ndotenv.config()\n\ninterface ISendEmail {\n\temailFrom: string\n\temailFromName: string\n\temailTo: string\n\tsubject: string\n\ttextBody: string\n\thtmlBody: string\n}\n\ninterface IInfoUtente {\n\t_id: string\n\tpersonalData: {\n\t\tname: string\n\t\tsurname: string\n\t}\n}\n\nexport class SocketLabsLib {\n\tprivate StringObj: StringLib\n\tprivate readonly platformName: string\n\tprivate readonly linkBase: string\n\tprivate readonly emailFrom: string\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tprivate client: any\n\tprivate readonly emailHtmlHeader1: string\n\tprivate readonly emailHtmlHeader2: string\n\tprivate readonly emailHtmlFooter: string\n\n\tconstructor(htmlHeader1: string = '', htmlHeader2: string = '', htmlFooter: string = '') {\n\t\tthis.client = new SocketLabsClient(\n\t\t\t/* c8 ignore next -- env fallback '0' covered only when SOCKETLABS_SERVER_ID is unset */\n\t\t\tparseInt(process.env.SOCKETLABS_SERVER_ID || '0'),\n\t\t\t`${process.env.SOCKETLABS_SERVER_APIKEY}`,\n\t\t\t{ requestTimeout: 120, numberOfRetries: 3 }\n\t\t)\n\t\tthis.StringObj = new StringLib()\n\t\tthis.platformName = `${process.env.PLATFORM_NAME}`\n\t\tthis.linkBase = `${process.env.APP_DOMAIN}`\n\t\tthis.emailFrom = `${process.env.EMAIL_FROM}`\n\n\t\tthis.emailHtmlHeader1 = htmlHeader1 === '' ? this.htmlHeader1() : htmlHeader1\n\t\tthis.emailHtmlHeader2 = htmlHeader2 === '' ? this.htmlHeader2() : htmlHeader2\n\t\tthis.emailHtmlFooter = htmlFooter === '' ? this.htmlFooter() : htmlFooter\n\t}\n\n\tasync sendEmailVerify(emailTo: string, hash: string, name: string = '') {\n\t\tconst subject = `Conferma l'email per ${this.platformName}`\n\t\tconst encodedEmail = encodeURI(emailTo)\n\t\tconst nameFixed = this.fixName(name)\n\t\tconst link = `${this.linkBase}/check/verify-email/${encodedEmail}/${hash}`\n\t\tconst linkHtml = this.StringObj.makeLink(link)\n\n\t\tconst messaggioTxt = `Ciao${nameFixed}, tu o qualcuno ti sta registrando su ${this.platformName}.\n Puoi confermare la registrazione copiando questo link ${link} nel browser. Lo staff`\n\t\tconst messaggioHtml = `Ciao${nameFixed},<br>tu o qualcuno ti sta registrando su ${this.platformName}.<br><br>\n Puoi confermare la registrazione visitando questo link ${linkHtml}<br><br>\n <br><br>Lo staff`\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo,\n\t\t\tsubject,\n\t\t\ttextBody: messaggioTxt,\n\t\t\thtmlBody: messaggioHtml\n\t\t}\n\t\treturn await this.sendEmail(message)\n\t}\n\n\t/*\n async sendEmailPostSegnalato(infoUtente, idPost) {\n const subject = 'Post ' + idPost + ' segnalato'\n\n const messaggioTxt =\n 'Ciao, il post ' +\n idPost +\n ' è stato segnalato da ' +\n infoUtente.personalData.name +\n ' ' +\n infoUtente.personalData.surname +\n ' (id: ' +\n infoUtente._id +\n ').'\n\n const messaggioHtml =\n this.getHtmlHeader(subject) +\n 'Ciao, il post ' +\n idPost +\n ' è stato segnalato da ' +\n infoUtente.personalData.name +\n ' ' +\n infoUtente.personalData.surname +\n ' (id: ' +\n infoUtente._id +\n ').' +\n this.getHtmlFooter()\n\n const message = {\n emailFrom: this.emailFrom,\n emailFromName: this.platformName,\n emailTo: 'giovannimanzoni87@gmail.com',\n subject,\n textBody: messaggioTxt,\n htmlBody: messaggioHtml\n }\n return await this.sendEmail(message)\n }\n*/\n\t/**\n\t * @fixme gestire retry\n\t *\nstatusCode: ECONNABORTED\nError in sending the email\nSendResponse {\n transactionReceipt: null,\n addressResults: null,\n result: {\n name: 'Timeout',\n value: 1,\n message: 'A timeout occurred sending the message'\n },\n responseMessage: 'A timeout occurred sending the message'\n}\n\t */\n\n\tasync sendEmailChangeVerify(emailTo: string, hash: string, name: string = '') {\n\t\tconst encodedEmail = encodeURI(emailTo)\n\t\tconst subject = `Conferma l'email per ${this.platformName}`\n\t\tconst nameFixed = this.fixName(name)\n\t\tconst link = `${this.linkBase}/check/verify-change-email/${encodedEmail}/${hash}`\n\t\tconst linkHtml = this.StringObj.makeLink(link)\n\n\t\tconst messaggioTxt = `Ciao${nameFixed}, tu o qualcuno ha modificato l'email con cui accedi.\n Puoi confermare copiando questo link ${link} nel browser. Lo staff.`\n\n\t\tconst messaggioHtml = `Ciao${nameFixed},<br>tu o qualcuno ha modificato l'email con cui accedi.<br><br>\" +\n 'Puoi confermare la registrazione visitando questo link ${linkHtml}\n <br><br>Lo staff.`\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo,\n\t\t\tsubject,\n\t\t\ttextBody: messaggioTxt,\n\t\t\thtmlBody: messaggioHtml\n\t\t}\n\t\treturn await this.sendEmail(message)\n\t}\n\n\tasync sendWelcome(emailTo: string) {\n\t\tconst subject = `Benvenuto su ${this.platformName}`\n\t\tconst linkHtml = this.StringObj.makeLink(this.linkBase, this.platformName)\n\t\tconst messaggioTxt = `Benvenuto su ${this.platformName}`\n\t\tconst messaggioHtml = `Benvenuto su ${linkHtml}`\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo,\n\t\t\tsubject,\n\t\t\ttextBody: messaggioTxt,\n\t\t\thtmlBody: messaggioHtml\n\t\t}\n\t\treturn await this.sendEmail(message)\n\t}\n\n\t/**\n\t * Send account disabled notification\n\t * @param emailTo\n\t */\n\tasync accountDisabled(emailTo: string) {\n\t\tconst subject = 'Il tuo account è stato disabilitato'\n\t\tconst textBody = 'Ciao, ci spiace ma il tuo account è stato disabilitato. Contattaci per maggiori informazioni.'\n\t\tconst htmlBody = `<p>${textBody}</p>`\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo,\n\t\t\tsubject,\n\t\t\ttextBody,\n\t\t\thtmlBody\n\t\t}\n\n\t\treturn await this.sendEmail(message)\n\t}\n\n\t/**\n\t * Send account disabled notification\n\t * @param emailTo\n\t */\n\tasync accountBanned(emailTo: string) {\n\t\tconst subject = 'Il tuo account è stato bannato'\n\t\tconst textBody = 'Ciao, ci spiace ma il tuo account è stato bannato. Contattaci per maggiori informazioni.'\n\t\tconst htmlBody = `<p>${textBody}</p>`\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo,\n\t\t\tsubject,\n\t\t\ttextBody,\n\t\t\thtmlBody\n\t\t}\n\n\t\treturn await this.sendEmail(message)\n\t}\n\n\t/**\n\t * alertDevTeam\n\t * @param err\n\t */\n\tasync alertDevTeam(err: string) {\n\t\tconst textBody = 'errore 500 ' + err\n\t\tconst htmlBody = '<p>errore 500 <br><br>' + err + '</p>'\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo: `${process.env.DEV_TEAM_EMAIL}`,\n\t\t\tsubject: `${this.platformName} errore 500`,\n\t\t\ttextBody,\n\t\t\thtmlBody\n\t\t}\n\n\t\treturn await this.sendEmail(message)\n\t}\n\n\t/**\n\t *\n\t * @param emailTo\n\t * @param times\n\t */\n\tasync wrongHash(emailTo: string, times: number) {\n\t\tif (times > 5) throwInternalError()\n\t\tconst remainingTimes = 5 - times\n\n\t\tconst subject = 'Link di attivazione errato'\n\t\tconst textBody = `Ciao, tu o qualcuno sta cercando di verificare la tua email con un link errato. Ti rimangono altri ${remainingTimes} tentativi.`\n\t\tconst htmlBody = `<p>${textBody}</p>`\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo,\n\t\t\tsubject,\n\t\t\ttextBody,\n\t\t\thtmlBody\n\t\t}\n\n\t\treturn await this.sendEmail(message)\n\t}\n\n\t/*****************\n\t * Too much verify requests\n\t * @param emailTo\n\t * @returns {Promise<string|null>}\n\t */\n\tasync tooMuchVerifyRequests(emailTo: string) {\n\t\tconst subject = 'Troppi tentativi di verifica della tua email'\n\t\tconst textBody =\n\t\t\t'Ciao, hai fatto più di 5 o più tentativi di verifica della tua email. Devi ripetere la richiesta di registrazione.'\n\t\tconst htmlBody =\n\t\t\t'<p>Ciao, hai fatto 5 o più tentativi di verifica della tua email. Devi ripetere la richiesta di registrazione.</p>'\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo,\n\t\t\tsubject,\n\t\t\ttextBody,\n\t\t\thtmlBody\n\t\t}\n\n\t\treturn await this.sendEmail(message)\n\t}\n\n\t/*****************\n\t * @param emailTo\n\t * @returns {Promise<string|null>}\n\t */\n\tasync hashReqTooOld(emailTo: string) {\n\t\tconst subject = 'Link di attivazione scaduto'\n\t\tconst textBody =\n\t\t\t'Ciao, il link di attivazione che stai tentando di usare è più vecchio di 3 giorni ed è scaduto. Devi ripetere la richiesta di registrazione.'\n\t\tconst htmlBody =\n\t\t\t'<p>Ciao, il link di attivazione che stai tentando di usare è più vecchio di 3 giorni ed è scaduto. Devi ripetere la richiesta di registrazione.</p>'\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo,\n\t\t\tsubject,\n\t\t\ttextBody,\n\t\t\thtmlBody\n\t\t}\n\n\t\treturn await this.sendEmail(message)\n\t}\n\n\t/*****************\n\t * @param emailTo\n\t * @returns {Promise<string|null>}\n\t */\n\tasync emailAlreadyValid(emailTo: string) {\n\t\tconst subject = 'Account già valido'\n\t\tconst textBody = 'Ciao, il tuo account è già valido, puoi eseguire il login.'\n\t\tconst htmlBody = `<p>${textBody}</p>`\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo,\n\t\t\tsubject,\n\t\t\ttextBody,\n\t\t\thtmlBody\n\t\t}\n\t\treturn await this.sendEmail(message)\n\t}\n\n\t/**\n\t * Send subscription email\n\t * @param emailTo\n\t * @param otp\n\t */\n\tasync sendSubscriptionEmail(emailTo: string, otp: string) {\n\t\tconst subject = `Attiva il tuo account ${this.platformName}}`\n\t\tconst url = `${this.linkBase}'/x/emailVerify`\n\t\tconst urlHtml = this.StringObj.makeLink(url)\n\t\tconst linkHomeHtml = this.StringObj.makeLink(this.linkBase, this.platformName)\n\n\t\tconst textBody = `Per confermare la tua iscrizione su ${this.platformName}, apri nel browser il seguente link\n ${url} ed inserisci il seguente codice di attivazione: ${otp}`\n\n\t\tconst htmlBody = `<p>Per confermare la tua iscrizione su ${linkHomeHtml}, apri nel browser il seguente link\n ${urlHtml} ed inserisci il seguente codice di attivazione: ${otp}</p>`\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo,\n\t\t\tsubject,\n\t\t\ttextBody,\n\t\t\thtmlBody\n\t\t}\n\t\treturn await this.sendEmail(message)\n\t}\n\n\tasync sendConfermaResetPwd(emailTo: string, name: string = '') {\n\t\tconst subject = `Reset della password per ${this.platformName}`\n\t\tconst link = this.linkBase\n\t\tconst linkHtml = this.StringObj.makeLink(link, this.platformName)\n\t\tconst nameFixed = this.fixName(name)\n\n\t\tconst textBody = `Ciao${nameFixed}, hai confermato la nuova password. Ora puoi accedere a: ${link}. Lo Staff.`\n\t\tconst htmlBody = `Ciao${nameFixed},<br>hai confermato la nuova password.<br><br>Ora puoi accedere a:<br>${linkHtml}<br><br>Lo staff.`\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo,\n\t\t\tsubject,\n\t\t\ttextBody,\n\t\t\thtmlBody\n\t\t}\n\t\treturn await this.sendEmail(message)\n\t}\n\n\tasync sendConfermaResetPwdHash(email: string, name: string, hash: string) {\n\t\tconst encodedEmail = encodeURI(email)\n\t\tconst subject = 'Reset della password per Polis24.it'\n\t\tconst linkReset = this.linkBase + '/index.php?q=reset&hash=' + hash + '&email=' + encodedEmail\n\n\t\tconst textBody = 'Ciao ' + name + ', hai confermato la nuova password. Ora puoi accedere a: ' + this.linkBase + ' . '\n\t\tconst htmlBody =\n\t\t\tthis.getHtmlHeader(subject) +\n\t\t\t'Ciao ' +\n\t\t\tname +\n\t\t\t',<br>hai confermato la nuova password.<br><br>Ora puoi accedere a:<br> ' +\n\t\t\tthis.StringObj.makeLink(linkReset) +\n\t\t\t'<br><br>Lo staff' +\n\t\t\tthis.getHtmlFooter()\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo: email,\n\t\t\tsubject: 'Conferma cambio password per Polis24.it',\n\t\t\ttextBody: textBody,\n\t\t\thtmlBody: htmlBody\n\t\t}\n\n\t\tlet ret: boolean | null\n\t\ttry {\n\t\t\tret = await this.sendEmail(message)\n\t\t} catch (e) {\n\t\t\tSentry.captureException(e)\n\t\t\tret = null\n\t\t}\n\t\treturn ret ? ret : null // se invio va a buon fine, ritorna l'hash, altrimenti null\n\t}\n\n\tasync sendEmailReset(emailTo: string, hash: string, name: string = '') {\n\t\tconst subject = `Reset della password per ${this.platformName}`\n\t\tconst encodedEmail = encodeURI(emailTo)\n\t\tconst link = `${this.linkBase}/x/reset/${encodedEmail}/${hash}`\n\t\tconst linkHtml = this.StringObj.makeLink(link)\n\t\tconst nameFixed = this.fixName(name)\n\n\t\tconst textBody = `Ciao${nameFixed}, tu o qualcuno ha richiesto un reset della password. Puoi cambiare la password di accesso\n copiando questo link ${link} nel browser. Lo staff.`\n\t\tconst htmlBody = `Ciao${nameFixed},<br>tu o qualcuno ha richiesto un reset della password.<br><br>\n Puoi cambiare la password cliccando il link:<br>${linkHtml}\n <br><br>Lo staff.`\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo,\n\t\t\tsubject,\n\t\t\ttextBody,\n\t\t\thtmlBody\n\t\t}\n\n\t\treturn await this.sendEmail(message)\n\t}\n\n\t/**\n\t * fallback footer\n\t */\n\thtmlFooter() {\n\t\treturn '</p></td>' + ' </tr>' + ' </table>' + '</body>'\n\t}\n\n\t/**\n\t * send OTP\n\t * @param emailTo\n\t * @param otp\n\t */\n\tasync sendOTP(emailTo: string, otp: string) {\n\t\tlet textBody = 'Per confermare la tua iscrizione su Polis24, inserisci il seguente codice OTP: ' + otp\n\t\tlet htmlBody = '<p>Per confermare la tua iscrizione su Polis24, inserisci il seguente codice OTP: ' + otp + '</p>'\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo: emailTo,\n\t\t\tsubject: 'Codice OTP per Polis24',\n\t\t\ttextBody: textBody,\n\t\t\thtmlBody: htmlBody\n\t\t}\n\n\t\tlet ret: string | null\n\t\ttry {\n\t\t\tawait this.sendEmail(message)\n\t\t\tret = null\n\t\t} catch (e) {\n\t\t\tSentry.captureException(e)\n\t\t\tret = null\n\t\t}\n\t\t/* c8 ignore next -- ret is always null in this function */\n\t\treturn ret ? ret : null // se invio va a buon fine, ritorna l'hash, altrimenti null\n\t}\n\n\tasync sendEmailPostSegnalato(infoUtente: IInfoUtente, idPost: number | string) {\n\t\tconst subject = 'Post ' + idPost + ' segnalato'\n\n\t\tconst messaggioTxt =\n\t\t\t'Ciao, il post ' +\n\t\t\tidPost +\n\t\t\t' è stato segnalato da ' +\n\t\t\tinfoUtente.personalData.name +\n\t\t\t' ' +\n\t\t\tinfoUtente.personalData.surname +\n\t\t\t' (id: ' +\n\t\t\tinfoUtente._id +\n\t\t\t').'\n\n\t\tconst messaggioHtml =\n\t\t\tthis.getHtmlHeader(subject) +\n\t\t\t'Ciao, il post ' +\n\t\t\tidPost +\n\t\t\t' è stato segnalato da ' +\n\t\t\tinfoUtente.personalData.name +\n\t\t\t' ' +\n\t\t\tinfoUtente.personalData.surname +\n\t\t\t' (id: ' +\n\t\t\tinfoUtente._id +\n\t\t\t').' +\n\t\t\tthis.getHtmlFooter()\n\n\t\tconst message = {\n\t\t\temailFrom: this.emailFrom,\n\t\t\temailFromName: this.platformName,\n\t\t\temailTo: 'giovannimanzoni87@gmail.com',\n\t\t\tsubject,\n\t\t\ttextBody: messaggioTxt,\n\t\t\thtmlBody: messaggioHtml\n\t\t}\n\t\treturn await this.sendEmail(message)\n\t}\n\n\tgetHtmlHeader(title: string) {\n\t\treturn (\n\t\t\t'<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">' +\n\t\t\t'<html xmlns=\"http://www.w3.org/1999/xhtml\">' +\n\t\t\t' <head>' +\n\t\t\t' <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />' +\n\t\t\t' <title>' +\n\t\t\ttitle +\n\t\t\t'</title>' +\n\t\t\t' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>' +\n\t\t\t'</head>' +\n\t\t\t'</html>' +\n\t\t\t'<body style=\"margin: 0; padding: 0;\">' +\n\t\t\t' <table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"600\">' +\n\t\t\t' <tr>' +\n\t\t\t' <td bgcolor=\"#ffffff\" style=\"padding: 40px 30px 40px 30px;\"><p style=\"color: #000000; font-family: Verdana, sans-serif; font-size: 12pt;\">'\n\t\t)\n\t}\n\n\tgetHtmlFooter() {\n\t\treturn '</p></td>' + ' </tr>' + ' </table>' + '</body>'\n\t}\n\n\tprivate async sendEmail(args: ISendEmail): Promise<boolean> {\n\t\tconst { emailFrom, emailFromName, emailTo, subject, textBody, htmlBody } = args\n\t\tconst basicMessage = new BasicMessage()\n\t\tbasicMessage.setFromAddress(emailFrom, emailFromName)\n\t\tbasicMessage.setSubject(subject)\n\t\tbasicMessage.setTextBody(textBody)\n\t\tbasicMessage.setHtmlBody(this.emailHtmlHeader1 + subject + this.emailHtmlHeader2 + htmlBody + this.emailHtmlFooter)\n\t\tbasicMessage.setTo(emailTo)\n\n\t\treturn this.client.send(basicMessage).then(\n\t\t\t() => {\n\t\t\t\t//Handle successful API call\n\t\t\t\t// console.debug('[sendEmail] Email sent correctly')\n\t\t\t\t//console.\t\t\t\t// console.debug('[sendEmail] Email sent correctly')(res);\n\t\t\t\treturn true\n\t\t\t},\n\t\t\t(e: Error) => {\n\t\t\t\tSentry.captureException(e, {\n\t\t\t\t\textra: { detail: 'Error in sending the email' }\n\t\t\t\t})\n\t\t\t\treturn false\n\t\t\t}\n\t\t)\n\t}\n\n\t/**\n\t * fallback header\n\t * @private\n\t */\n\tprivate htmlHeader1() {\n\t\treturn (\n\t\t\t'<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">' +\n\t\t\t'<html lang=\"it\" xmlns=\"http://www.w3.org/1999/xhtml\">' +\n\t\t\t' <head>' +\n\t\t\t' <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />' +\n\t\t\t' <title>'\n\t\t)\n\t}\n\n\t/**\n\t * fallback header\n\t * @private\n\t */\n\tprivate htmlHeader2() {\n\t\treturn (\n\t\t\t'</title>' +\n\t\t\t' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>' +\n\t\t\t'</head>' +\n\t\t\t'</html>' +\n\t\t\t'<body style=\"margin: 0; padding: 0;\">' +\n\t\t\t' <table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"600\">' +\n\t\t\t' <tr>' +\n\t\t\t' <td bgcolor=\"#ffffff\" style=\"padding: 40px 30px 40px 30px;\"><p style=\"color: #000000; font-family: Verdana, sans-serif; font-size: 12pt;\">'\n\t\t)\n\t}\n\n\tprivate fixName(name: string) {\n\t\treturn name !== '' ? ` ${name}` : ''\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IUploadTemp.mjs","sourceRoot":"","sources":["../../../src/files/IUploadTemp.mts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"IUploadTemp.mjs","sourceRoot":"","sources":["../../../src/files/IUploadTemp.mts"],"names":[],"mappings":"","sourcesContent":["export interface IUploadTemp {\n\ttempFile: string\n\text: string\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"checkForNSFW.mjs","sourceRoot":"","sources":["../../../src/files/checkForNSFW.mts"],"names":[],"mappings":"AAAA,kFAAkF;;AAElF;;;;;;;;;;;;;;;;;;EAkBE"}
1
+ {"version":3,"file":"checkForNSFW.mjs","sourceRoot":"","sources":["../../../src/files/checkForNSFW.mts"],"names":[],"mappings":"AAAA,kFAAkF;;AAElF;;;;;;;;;;;;;;;;;;EAkBE","sourcesContent":["// const Sightengine = require('sightengine')('your-api-user', 'your-api-secret');\n\n/*\n// https://sightengine.com/ ma ci sono anche altri servizi\nexport async function checkForNSFW(imageUrl: string) {\n\ttry {\n const result = await Sightengine.check(['nudity', 'wad']).set_url(imageUrl)\n\n if (result.nudity.safe < 0.9) {\n console.debug('NSFW content detected in the image')\n return false\n }\n\n console.debug('No NSFW content detected in the image')\n return true\n } catch (err) {\n console.error('Error during content moderation:', err)\n return false\n }\n}\n*/\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"fileConst.mjs","sourceRoot":"","sources":["../../../src/files/fileConst.mts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAA;AAC/C,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAA"}
1
+ {"version":3,"file":"fileConst.mjs","sourceRoot":"","sources":["../../../src/files/fileConst.mts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAA;AAC/C,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAA","sourcesContent":["import path from 'path'\n\nexport const UPLOAD_TEMP_DIRECTORY_URL = '/tmp'\nexport const UPLOAD_IMG_DIRECTORY_URL = path.join(process.cwd(), 'upload/uimg')\n\nexport interface IStoreFile {\n\toriginalFilename: string\n\tfileName: string\n\tfilePath: string\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"moveFileStaticDomain.mjs","sourceRoot":"","sources":["../../../src/files/moveFileStaticDomain.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,cAAsB,EACtB,MAAc,EACd,YAAoB,EACpB,YAAoB;IAEpB,MAAM,cAAc,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,IAAI,YAAY,EAAE,CAAA;IAE/E,MAAM,YAAY,CAAC,cAAc,EAAE,YAAY,EAAE,cAAc,CAAC,CAAA;AACjE,CAAC"}
1
+ {"version":3,"file":"moveFileStaticDomain.mjs","sourceRoot":"","sources":["../../../src/files/moveFileStaticDomain.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,cAAsB,EAAE,MAAc,EAAE,YAAoB,EAAE,YAAoB;IAC5H,MAAM,cAAc,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,IAAI,YAAY,EAAE,CAAA;IAE/E,MAAM,YAAY,CAAC,cAAc,EAAE,YAAY,EAAE,cAAc,CAAC,CAAA;AACjE,CAAC","sourcesContent":["import { moveTempFile } from './moveTempFile.mjs'\n\n/**\n * read .env STATIC_FOLDER path\n * @param sourceFilePath\n * @param folder\n * @param secondFolder\n * @param destFilename\n */\nexport async function moveFileStaticDomain(sourceFilePath: string, folder: string, secondFolder: string, destFilename: string) {\n\tconst destinationDir = `${process.env.STATIC_FOLDER}/${folder}/${secondFolder}`\n\n\tawait moveTempFile(sourceFilePath, destFilename, destinationDir)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"moveImageFile.mjs","sourceRoot":"","sources":["../../../src/files/moveImageFile.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,cAAsB,EACtB,MAAc,EACd,YAAoB,EACpB,YAAoB;IAEpB,MAAM,cAAc,GAAG,GAAG,wBAAwB,IAAI,MAAM,IAAI,YAAY,EAAE,CAAA;IAE9E,MAAM,YAAY,CAAC,cAAc,EAAE,YAAY,EAAE,cAAc,CAAC,CAAA;AACjE,CAAC"}
1
+ {"version":3,"file":"moveImageFile.mjs","sourceRoot":"","sources":["../../../src/files/moveImageFile.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,cAAsB,EAAE,MAAc,EAAE,YAAoB,EAAE,YAAoB;IACrH,MAAM,cAAc,GAAG,GAAG,wBAAwB,IAAI,MAAM,IAAI,YAAY,EAAE,CAAA;IAE9E,MAAM,YAAY,CAAC,cAAc,EAAE,YAAY,EAAE,cAAc,CAAC,CAAA;AACjE,CAAC","sourcesContent":["import { UPLOAD_IMG_DIRECTORY_URL } from './fileConst.mjs'\nimport { moveTempFile } from './moveTempFile.mjs'\n\nexport async function moveImageFile(sourceFilePath: string, folder: string, secondFolder: string, destFilename: string) {\n\tconst destinationDir = `${UPLOAD_IMG_DIRECTORY_URL}/${folder}/${secondFolder}`\n\n\tawait moveTempFile(sourceFilePath, destFilename, destinationDir)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"moveTempFile.mjs","sourceRoot":"","sources":["../../../src/files/moveTempFile.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,cAAsB,EACtB,YAAoB,EACpB,cAAsB;IAGtB,0CAA0C;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IAElC,8BAA8B;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IACxC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,YAAY,GAAG,GAAG,EAAE,CAAC,CAAA;IAE1E,gBAAgB;IAChB,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAA;AAC/C,CAAC"}
1
+ {"version":3,"file":"moveTempFile.mjs","sourceRoot":"","sources":["../../../src/files/moveTempFile.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,cAAsB,EAAE,YAAoB,EAAE,cAAsB;IACtG,0CAA0C;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IAElC,8BAA8B;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IACxC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,YAAY,GAAG,GAAG,EAAE,CAAC,CAAA;IAE1E,gBAAgB;IAChB,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAA;AAC/C,CAAC","sourcesContent":["import fs from 'fs-extra'\nimport path from 'path'\n\n/**\n *\n * @param sourceFilePath\n * @param destFilename\n * @param destinationDir\n */\nexport async function moveTempFile(sourceFilePath: string, destFilename: string, destinationDir: string) {\n\t// Ensure the destination directory exists\n\tawait fs.ensureDir(destinationDir)\n\n\t// Define the destination path\n\tconst ext = path.extname(sourceFilePath)\n\tconst destinationPath = path.join(destinationDir, `${destFilename}${ext}`)\n\n\t// Move the file\n\tawait fs.move(sourceFilePath, destinationPath)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"reEncodeToJpeg.mjs","sourceRoot":"","sources":["../../../src/files/reEncodeToJpeg.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,sCAAmC;AAEtD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAO,GAAG,GAAG;IACnE,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;AACjD,CAAC"}
1
+ {"version":3,"file":"reEncodeToJpeg.mjs","sourceRoot":"","sources":["../../../src/files/reEncodeToJpeg.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,sCAAmC;AAEtD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAO,GAAG,GAAG;IACnE,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;AACjD,CAAC","sourcesContent":["import { reEncode } from '@private/files/reEncode.mjs'\n\nexport async function reEncodeToJpeg(filename: string, quality = 100) {\n\treturn await reEncode(filename, 'jpeg', quality)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"reEncodeToPng.mjs","sourceRoot":"","sources":["../../../src/files/reEncodeToPng.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,sCAAmC;AAEtD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAO,GAAG,GAAG;IAClE,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;AAChD,CAAC"}
1
+ {"version":3,"file":"reEncodeToPng.mjs","sourceRoot":"","sources":["../../../src/files/reEncodeToPng.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,sCAAmC;AAEtD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAO,GAAG,GAAG;IAClE,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;AAChD,CAAC","sourcesContent":["import { reEncode } from '@private/files/reEncode.mjs'\n\nexport async function reEncodeToPng(filename: string, quality = 100) {\n\treturn await reEncode(filename, 'png', quality)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"reEncodeToWebp.mjs","sourceRoot":"","sources":["../../../src/files/reEncodeToWebp.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,sCAAmC;AAEtD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAO,GAAG,GAAG;IACnE,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;AACjD,CAAC"}
1
+ {"version":3,"file":"reEncodeToWebp.mjs","sourceRoot":"","sources":["../../../src/files/reEncodeToWebp.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,sCAAmC;AAEtD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAO,GAAG,GAAG;IACnE,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;AACjD,CAAC","sourcesContent":["import { reEncode } from '@private/files/reEncode.mjs'\n\nexport async function reEncodeToWebp(filename: string, quality = 100) {\n\treturn await reEncode(filename, 'webp', quality)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"scanVirus.mjs","sourceRoot":"","sources":["../../../src/files/scanVirus.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AACtC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,IAAI,gBAAgB,GAAoB,IAAI,CAAA;AAE5C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAmC;IACrE,MAAM,cAAc,GAAqB;QACxC,cAAc,EAAE,IAAI;QACpB,kBAAkB,EAAE,KAAK;QACzB,SAAS,EAAE;YACV,MAAM,EAAE,2BAA2B;YACnC,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,KAAK;SACpB;QACD,SAAS,EAAE,KAAK;KAChB,CAAA;IACD,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IAElC,IAAI,CAAC;QACJ,MAAM,aAAa,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAA;QACvD,gBAAgB,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAC3D,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAA;QACzE,OAAO,gBAAgB,CAAA;IACxB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACjC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;QAC1B,MAAM,CAAC,CAAA;IACR,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB;IAC/C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAC/E,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAEzE,IAAI,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC1B,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;gBAC9B,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;gBACrE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;gBACzB,MAAM,CAAC,cAAc,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAA;YAC7D,CAAC,CAAC,CAAA;QACH,CAAC;aAAM,CAAC;YACP,+CAA+C;QAChD,CAAC;IACF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE;YAC1B,KAAK,EAAE,EAAE,MAAM,EAAE,iCAAiC,QAAQ,EAAE,EAAE;SAC9D,CAAC,CAAA;IACH,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"scanVirus.mjs","sourceRoot":"","sources":["../../../src/files/scanVirus.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AACtC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,IAAI,gBAAgB,GAAoB,IAAI,CAAA;AAE5C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAmC;IACrE,MAAM,cAAc,GAAqB;QACxC,cAAc,EAAE,IAAI;QACpB,kBAAkB,EAAE,KAAK;QACzB,SAAS,EAAE;YACV,MAAM,EAAE,2BAA2B;YACnC,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,KAAK;SACpB;QACD,SAAS,EAAE,KAAK;KAChB,CAAA;IACD,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IAElC,IAAI,CAAC;QACJ,MAAM,aAAa,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAA;QACvD,gBAAgB,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAC3D,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAA;QACzE,OAAO,gBAAgB,CAAA;IACxB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACjC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;QAC1B,MAAM,CAAC,CAAA;IACR,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB;IAC/C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAC/E,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAEzE,IAAI,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC1B,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;gBAC9B,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;gBACrE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;gBACzB,MAAM,CAAC,cAAc,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAA;YAC7D,CAAC,CAAC,CAAA;QACH,CAAC;aAAM,CAAC;YACP,+CAA+C;QAChD,CAAC;IACF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE;YAC1B,KAAK,EAAE,EAAE,MAAM,EAAE,iCAAiC,QAAQ,EAAE,EAAE;SAC9D,CAAC,CAAA;IACH,CAAC;AACF,CAAC","sourcesContent":["import * as Sentry from '@sentry/node'\nimport NodeClam from 'clamscan'\n\nlet clamScanInstance: NodeClam | null = null\n\n/**********\n * Call inside koa initialization\n */\nexport async function initClamScan(options?: Partial<NodeClam.Options>) {\n\tconst defaultOptions: NodeClam.Options = {\n\t\tremoveInfected: true,\n\t\tquarantineInfected: false,\n\t\tclamdscan: {\n\t\t\tsocket: '/var/run/clamav/clamd.ctl',\n\t\t\ttimeout: 60000,\n\t\t\tmultiscan: true,\n\t\t\tlocalFallback: false\n\t\t},\n\t\tdebugMode: false\n\t}\n\tconsole.info('[ClamScan] init...')\n\n\ttry {\n\t\tconst mergedOptions = { ...defaultOptions, ...options }\n\t\tclamScanInstance = await new NodeClam().init(mergedOptions)\n\t\tconsole.info('[ClamScan] OK: ClamScan has been initialized successfully')\n\t\treturn clamScanInstance\n\t} catch (e) {\n\t\tconsole.error('[ClamScan] Error')\n\t\tSentry.captureException(e)\n\t\tthrow e\n\t}\n}\n\nexport async function scanVirus(filePath: string) {\n\tif (!clamScanInstance) {\n\t\tthrow new Error('ClamScan has not been initialized. Call initClamScan first.')\n\t}\n\n\ttry {\n\t\tconst { isInfected, viruses } = await clamScanInstance.scanFile(filePath)\n\n\t\tif (isInfected) {\n\t\t\tSentry.withScope((scope) => {\n\t\t\t\tscope.setTag('file', filePath)\n\t\t\t\tscope.setContext('viruses', { list: viruses, count: viruses.length })\n\t\t\t\tscope.setLevel('warning')\n\t\t\t\tSentry.captureMessage(`Infected file detected: ${filePath}`)\n\t\t\t})\n\t\t} else {\n\t\t\t//console.log(`The file ${filePath} is clean.`)\n\t\t}\n\t} catch (e) {\n\t\tSentry.captureException(e, {\n\t\t\textra: { detail: `Error while scanning the file ${filePath}` }\n\t\t})\n\t}\n}\n"]}
@@ -28,6 +28,7 @@ export async function storeUploadAsTemp(upload, maxFileSize = MAX_FILE_SIZE) {
28
28
  writeStream.on('close', () => resolve(undefined));
29
29
  // If there's an error writing the file, remove the partially written file
30
30
  // and reject the promise.
31
+ /* c8 ignore start -- race-condition error path, not reachable in deterministic tests */
31
32
  writeStream.on('error', (e) => {
32
33
  unlink(storedFileUrl, (unlinkError) => {
33
34
  if (unlinkError) {
@@ -39,6 +40,7 @@ export async function storeUploadAsTemp(upload, maxFileSize = MAX_FILE_SIZE) {
39
40
  reject(new Error('File size exceeds the limit.'));
40
41
  });
41
42
  });
43
+ /* c8 ignore stop */
42
44
  // In Node.js <= v13, errors are not automatically propagated between piped streams. If there is an error receiving the upload, destroy the write stream with the corresponding error.
43
45
  stream.on('error', (error) => writeStream.destroy(error));
44
46
  // Pipe the upload into the write stream.
@@ -1 +1 @@
1
- {"version":3,"file":"storeUploadAsTemp.mjs","sourceRoot":"","sources":["../../../src/files/storeUploadAsTemp.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEnD,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AACtC,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAA;AAGnC,OAAO,EAAc,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,2CAA2C;AAC3C,kCAAkC;AAClC,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA,CAAC,iBAAiB;AAGvD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAA4B,EAAE,cAAsB,aAAa;IACxG,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAA;IACnD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;IACjC,MAAM,cAAc,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;IACtE,MAAM,aAAa,GAAG,GAAG,yBAAyB,IAAI,cAAc,EAAE,CAAA;IACtE,IAAI,QAAQ,GAAG,CAAC,CAAA,CAAC,8BAA8B;IAE/C,oCAAoC;IACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,uDAAuD;QACvD,MAAM,WAAW,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAA;QAEpD,mCAAmC;QACnC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACnC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAA;YACxB,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;gBAC5B,WAAW,CAAC,OAAO,EAAE,CAAA,CAAC,kBAAkB;gBACxC,MAAM,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC,CAAA;YACjG,CAAC;QACF,CAAC,CAAC,CAAA;QAEF,gEAAgE;QAChE,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;QAEjD,0EAA0E;QAC1E,0BAA0B;QAC1B,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YAC7B,MAAM,CAAC,aAAa,EAAE,CAAC,WAAW,EAAE,EAAE;gBACrC,IAAI,WAAW,EAAE,CAAC;oBACjB,6CAA6C;oBAC7C,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE;wBAC1B,KAAK,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE;qBACjC,CAAC,CAAA;gBACH,CAAC;gBACD,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAA;YAClD,CAAC,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,sLAAsL;QACtL,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAEhE,yCAAyC;QACzC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IAEF,iDAAiD;IAEjD,OAAO;QACN,gBAAgB,EAAE,QAAQ;QAC1B,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,aAAa;KACvB,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"storeUploadAsTemp.mjs","sourceRoot":"","sources":["../../../src/files/storeUploadAsTemp.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEnD,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AACtC,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAA;AAGnC,OAAO,EAAc,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,2CAA2C;AAC3C,kCAAkC;AAClC,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA,CAAC,iBAAiB;AAEvD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAA4B,EAAE,cAAsB,aAAa;IACxG,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAA;IACnD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;IACjC,MAAM,cAAc,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;IACtE,MAAM,aAAa,GAAG,GAAG,yBAAyB,IAAI,cAAc,EAAE,CAAA;IACtE,IAAI,QAAQ,GAAG,CAAC,CAAA,CAAC,8BAA8B;IAE/C,oCAAoC;IACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,uDAAuD;QACvD,MAAM,WAAW,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAA;QAEpD,mCAAmC;QACnC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACnC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAA;YACxB,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;gBAC5B,WAAW,CAAC,OAAO,EAAE,CAAA,CAAC,kBAAkB;gBACxC,MAAM,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC,CAAA;YACjG,CAAC;QACF,CAAC,CAAC,CAAA;QAEF,gEAAgE;QAChE,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;QAEjD,0EAA0E;QAC1E,0BAA0B;QAC1B,wFAAwF;QACxF,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YAC7B,MAAM,CAAC,aAAa,EAAE,CAAC,WAAW,EAAE,EAAE;gBACrC,IAAI,WAAW,EAAE,CAAC;oBACjB,6CAA6C;oBAC7C,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE;wBAC1B,KAAK,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE;qBACjC,CAAC,CAAA;gBACH,CAAC;gBACD,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAA;YAClD,CAAC,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;QACF,oBAAoB;QAEpB,sLAAsL;QACtL,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAEhE,yCAAyC;QACzC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IAEF,iDAAiD;IAEjD,OAAO;QACN,gBAAgB,EAAE,QAAQ;QAC1B,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,aAAa;KACvB,CAAA;AACF,CAAC","sourcesContent":["import { createWriteStream, unlink } from 'node:fs'\n\nimport * as Sentry from '@sentry/node'\nimport path from 'path'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport { IFileUpload } from '../koa/IFileUpload.mjs'\nimport { IStoreFile, UPLOAD_TEMP_DIRECTORY_URL } from './fileConst.mjs'\n\n// Simulating __dirname using process.cwd()\n// const __dirname = process.cwd()\nconst MAX_FILE_SIZE = 5 * 1024 * 1024 // 5MB size limit\n\nexport async function storeUploadAsTemp(upload: Promise<IFileUpload>, maxFileSize: number = MAX_FILE_SIZE): Promise<IStoreFile> {\n\tconst { createReadStream, filename } = await upload\n\tconst stream = createReadStream()\n\tconst storedFileName = uuidv4() + path.extname(filename).toLowerCase()\n\tconst storedFileUrl = `${UPLOAD_TEMP_DIRECTORY_URL}/${storedFileName}`\n\tlet fileSize = 0 // Variable to track file size\n\n\t// Store the file in the filesystem.\n\tawait new Promise((resolve, reject) => {\n\t\t// Create a stream to which the upload will be written.\n\t\tconst writeStream = createWriteStream(storedFileUrl)\n\n\t\t// Check file size during streaming\n\t\tstream.on('data', (chunk: Buffer) => {\n\t\t\tfileSize += chunk.length\n\t\t\tif (fileSize > maxFileSize) {\n\t\t\t\twriteStream.destroy() // Stop the stream\n\t\t\t\tunlink(storedFileUrl, () => reject(new Error(`File size exceeds the limit of {maxFileSize}MB`)))\n\t\t\t}\n\t\t})\n\n\t\t// Resolve the Promise only once the file handle is fully closed\n\t\twriteStream.on('close', () => resolve(undefined))\n\n\t\t// If there's an error writing the file, remove the partially written file\n\t\t// and reject the promise.\n\t\t/* c8 ignore start -- race-condition error path, not reachable in deterministic tests */\n\t\twriteStream.on('error', (e) => {\n\t\t\tunlink(storedFileUrl, (unlinkError) => {\n\t\t\t\tif (unlinkError) {\n\t\t\t\t\t// Log or handle the unlink error in some way\n\t\t\t\t\tSentry.captureException(e, {\n\t\t\t\t\t\textra: { detail: 'unlink error' }\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\treject(new Error('File size exceeds the limit.'))\n\t\t\t})\n\t\t})\n\t\t/* c8 ignore stop */\n\n\t\t// In Node.js <= v13, errors are not automatically propagated between piped streams. If there is an error receiving the upload, destroy the write stream with the corresponding error.\n\t\tstream.on('error', (error: Error) => writeStream.destroy(error))\n\n\t\t// Pipe the upload into the write stream.\n\t\tstream.pipe(writeStream)\n\t})\n\n\t//console.debug('storedFileName', storedFileName)\n\n\treturn {\n\t\toriginalFilename: filename,\n\t\tfileName: storedFileName,\n\t\tfilePath: storedFileUrl\n\t}\n}\n"]}