@opengis/fastify-table 2.3.5 → 2.4.0

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 (291) hide show
  1. package/dist/errors.d.ts +38 -0
  2. package/dist/errors.d.ts.map +1 -0
  3. package/dist/errors.js +10 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +30 -9
  6. package/dist/server/plugins/access/funcs/getAdminAccess.d.ts +1 -4
  7. package/dist/server/plugins/access/funcs/getAdminAccess.d.ts.map +1 -1
  8. package/dist/server/plugins/access/funcs/getAdminAccess.js +3 -2
  9. package/dist/server/plugins/auth/funcs/getQuery.d.ts.map +1 -1
  10. package/dist/server/plugins/auth/funcs/getQuery.js +2 -1
  11. package/dist/server/plugins/auth/funcs/loginFile.d.ts +1 -4
  12. package/dist/server/plugins/auth/funcs/loginFile.d.ts.map +1 -1
  13. package/dist/server/plugins/auth/funcs/loginFile.js +10 -5
  14. package/dist/server/plugins/auth/funcs/loginUser.d.ts.map +1 -1
  15. package/dist/server/plugins/auth/funcs/loginUser.js +25 -18
  16. package/dist/server/plugins/auth/index.d.ts.map +1 -1
  17. package/dist/server/plugins/auth/index.js +3 -4
  18. package/dist/server/plugins/crud/funcs/dataInsert.js +1 -1
  19. package/dist/server/plugins/extra/extraData.d.ts.map +1 -1
  20. package/dist/server/plugins/extra/extraData.js +3 -2
  21. package/dist/server/plugins/extra/extraDataGet.d.ts +1 -4
  22. package/dist/server/plugins/extra/extraDataGet.d.ts.map +1 -1
  23. package/dist/server/plugins/extra/extraDataGet.js +4 -6
  24. package/dist/server/plugins/file/uploadMultiPart.js +1 -1
  25. package/dist/server/plugins/grpc/utils/html2doc.d.ts +0 -6
  26. package/dist/server/plugins/grpc/utils/html2doc.d.ts.map +1 -1
  27. package/dist/server/plugins/grpc/utils/html2doc.js +3 -8
  28. package/dist/server/plugins/grpc/utils/html2img.d.ts +0 -6
  29. package/dist/server/plugins/grpc/utils/html2img.d.ts.map +1 -1
  30. package/dist/server/plugins/grpc/utils/html2img.js +3 -8
  31. package/dist/server/plugins/grpc/utils/html2pdf.d.ts +0 -6
  32. package/dist/server/plugins/grpc/utils/html2pdf.d.ts.map +1 -1
  33. package/dist/server/plugins/grpc/utils/html2pdf.js +7 -12
  34. package/dist/server/plugins/grpc/utils/mergePdf.d.ts +0 -7
  35. package/dist/server/plugins/grpc/utils/mergePdf.d.ts.map +1 -1
  36. package/dist/server/plugins/grpc/utils/mergePdf.js +4 -9
  37. package/dist/server/plugins/logger/checkUserAccess.d.ts +1 -4
  38. package/dist/server/plugins/logger/checkUserAccess.d.ts.map +1 -1
  39. package/dist/server/plugins/logger/checkUserAccess.js +4 -6
  40. package/dist/server/plugins/logger/errorMessage.d.ts +1 -1
  41. package/dist/server/plugins/logger/errorMessage.d.ts.map +1 -1
  42. package/dist/server/plugins/logger/errorMessage.js +7 -8
  43. package/dist/server/plugins/logger/errorStatus.d.ts.map +1 -1
  44. package/dist/server/plugins/logger/errorStatus.js +6 -0
  45. package/dist/server/plugins/logger/index.d.ts +2 -2
  46. package/dist/server/plugins/logger/index.d.ts.map +1 -1
  47. package/dist/server/plugins/logger/index.js +16 -18
  48. package/dist/server/plugins/pg/funcs/getMeta.d.ts.map +1 -1
  49. package/dist/server/plugins/pg/funcs/getMeta.js +5 -3
  50. package/dist/server/plugins/policy/funcs/checkJWT.d.ts +0 -9
  51. package/dist/server/plugins/policy/funcs/checkJWT.d.ts.map +1 -1
  52. package/dist/server/plugins/policy/funcs/checkJWT.js +6 -5
  53. package/dist/server/plugins/policy/funcs/checkPermissions.d.ts +1 -4
  54. package/dist/server/plugins/policy/funcs/checkPermissions.d.ts.map +1 -1
  55. package/dist/server/plugins/policy/funcs/checkPermissions.js +2 -1
  56. package/dist/server/plugins/policy/funcs/checkPolicy.d.ts +1 -4
  57. package/dist/server/plugins/policy/funcs/checkPolicy.d.ts.map +1 -1
  58. package/dist/server/plugins/policy/funcs/checkPolicy.js +8 -7
  59. package/dist/server/plugins/policy/index.d.ts.map +1 -1
  60. package/dist/server/plugins/policy/index.js +2 -11
  61. package/dist/server/plugins/table/funcs/getFilterSQL/index.d.ts +1 -15
  62. package/dist/server/plugins/table/funcs/getFilterSQL/index.d.ts.map +1 -1
  63. package/dist/server/plugins/table/funcs/getFilterSQL/index.js +6 -4
  64. package/dist/server/plugins/table/funcs/gisIRColumn.d.ts +0 -22
  65. package/dist/server/plugins/table/funcs/gisIRColumn.d.ts.map +1 -1
  66. package/dist/server/plugins/table/funcs/gisIRColumn.js +5 -3
  67. package/dist/server/plugins/upload/index.d.ts.map +1 -1
  68. package/dist/server/plugins/upload/index.js +7 -0
  69. package/dist/server/plugins/upload/s3.d.ts +7 -1
  70. package/dist/server/plugins/upload/s3.d.ts.map +1 -1
  71. package/dist/server/plugins/upload/s3.js +54 -10
  72. package/dist/server/plugins/upload/s3minio.d.ts +59 -0
  73. package/dist/server/plugins/upload/s3minio.d.ts.map +1 -0
  74. package/dist/server/plugins/upload/s3minio.js +199 -0
  75. package/dist/server/plugins/upload/startUpload.d.ts.map +1 -1
  76. package/dist/server/plugins/upload/startUpload.js +16 -8
  77. package/dist/server/plugins/upload/uploadChunk.d.ts.map +1 -1
  78. package/dist/server/plugins/upload/uploadChunk.js +14 -9
  79. package/dist/server/plugins/usercls/index.js +1 -1
  80. package/dist/server/routes/access/controllers/access.group.d.ts.map +1 -1
  81. package/dist/server/routes/access/controllers/access.group.js +3 -5
  82. package/dist/server/routes/access/controllers/access.group.post.d.ts.map +1 -1
  83. package/dist/server/routes/access/controllers/access.group.post.js +3 -5
  84. package/dist/server/routes/access/controllers/access.interface.d.ts.map +1 -1
  85. package/dist/server/routes/access/controllers/access.interface.js +1 -4
  86. package/dist/server/routes/access/controllers/access.user.d.ts +5 -1
  87. package/dist/server/routes/access/controllers/access.user.d.ts.map +1 -1
  88. package/dist/server/routes/access/controllers/access.user.js +4 -5
  89. package/dist/server/routes/access/controllers/access.user.post.d.ts.map +1 -1
  90. package/dist/server/routes/access/controllers/access.user.post.js +4 -5
  91. package/dist/server/routes/access/index.d.ts.map +1 -1
  92. package/dist/server/routes/access/index.js +10 -6
  93. package/dist/server/routes/auth/controllers/2factor/providers/totp.d.ts.map +1 -1
  94. package/dist/server/routes/auth/controllers/2factor/providers/totp.js +4 -3
  95. package/dist/server/routes/auth/controllers/2factor/qrcode.d.ts.map +1 -1
  96. package/dist/server/routes/auth/controllers/2factor/qrcode.js +6 -10
  97. package/dist/server/routes/auth/controllers/2factor/recovery.d.ts.map +1 -1
  98. package/dist/server/routes/auth/controllers/2factor/recovery.js +14 -23
  99. package/dist/server/routes/auth/controllers/2factor/reset.d.ts.map +1 -1
  100. package/dist/server/routes/auth/controllers/2factor/reset.js +3 -5
  101. package/dist/server/routes/auth/controllers/2factor/verify.d.ts.map +1 -1
  102. package/dist/server/routes/auth/controllers/2factor/verify.js +30 -43
  103. package/dist/server/routes/auth/controllers/core/login.d.ts +1 -4
  104. package/dist/server/routes/auth/controllers/core/login.d.ts.map +1 -1
  105. package/dist/server/routes/auth/controllers/core/passwordRecovery.d.ts.map +1 -1
  106. package/dist/server/routes/auth/controllers/core/passwordRecovery.js +7 -8
  107. package/dist/server/routes/auth/controllers/core/registration.d.ts +1 -4
  108. package/dist/server/routes/auth/controllers/core/registration.d.ts.map +1 -1
  109. package/dist/server/routes/auth/controllers/core/registration.js +10 -24
  110. package/dist/server/routes/auth/controllers/core/updateUserInfo.d.ts +1 -2
  111. package/dist/server/routes/auth/controllers/core/updateUserInfo.d.ts.map +1 -1
  112. package/dist/server/routes/auth/controllers/core/updateUserInfo.js +3 -2
  113. package/dist/server/routes/auth/controllers/euSign/authByData.d.ts.map +1 -1
  114. package/dist/server/routes/auth/controllers/euSign/authByData.js +4 -7
  115. package/dist/server/routes/auth/controllers/jwt/authorize.d.ts.map +1 -1
  116. package/dist/server/routes/auth/controllers/jwt/authorize.js +6 -9
  117. package/dist/server/routes/auth/controllers/jwt/token.d.ts.map +1 -1
  118. package/dist/server/routes/auth/controllers/jwt/token.js +9 -12
  119. package/dist/server/routes/auth/controllers/page/login2faTemplate.d.ts.map +1 -1
  120. package/dist/server/routes/auth/controllers/page/login2faTemplate.js +3 -2
  121. package/dist/server/routes/auth/index.d.ts +1 -2
  122. package/dist/server/routes/auth/index.d.ts.map +1 -1
  123. package/dist/server/routes/auth/index.js +4 -3
  124. package/dist/server/routes/cron/controllers/cronApi.d.ts.map +1 -1
  125. package/dist/server/routes/cron/controllers/cronApi.js +3 -4
  126. package/dist/server/routes/cron/index.js +1 -1
  127. package/dist/server/routes/crud/controllers/deleteCrud.d.ts.map +1 -1
  128. package/dist/server/routes/crud/controllers/deleteCrud.js +11 -33
  129. package/dist/server/routes/crud/controllers/insert.d.ts +1 -1
  130. package/dist/server/routes/crud/controllers/insert.d.ts.map +1 -1
  131. package/dist/server/routes/crud/controllers/insert.js +17 -31
  132. package/dist/server/routes/crud/controllers/table.d.ts.map +1 -1
  133. package/dist/server/routes/crud/controllers/table.js +14 -18
  134. package/dist/server/routes/crud/controllers/update.d.ts.map +1 -1
  135. package/dist/server/routes/crud/controllers/update.js +16 -28
  136. package/dist/server/routes/crud/index.d.ts.map +1 -1
  137. package/dist/server/routes/crud/index.js +14 -4
  138. package/dist/server/routes/dblist/controllers/setItem.d.ts +0 -6
  139. package/dist/server/routes/dblist/controllers/setItem.d.ts.map +1 -1
  140. package/dist/server/routes/dblist/controllers/setItem.js +3 -2
  141. package/dist/server/routes/dblist/index.d.ts.map +1 -1
  142. package/dist/server/routes/dblist/index.js +5 -3
  143. package/dist/server/routes/file/controllers/delete.d.ts +4 -1
  144. package/dist/server/routes/file/controllers/delete.d.ts.map +1 -1
  145. package/dist/server/routes/file/controllers/delete.js +8 -8
  146. package/dist/server/routes/file/controllers/download.d.ts.map +1 -1
  147. package/dist/server/routes/file/controllers/download.js +5 -8
  148. package/dist/server/routes/file/controllers/export.d.ts.map +1 -1
  149. package/dist/server/routes/file/controllers/export.js +8 -8
  150. package/dist/server/routes/file/controllers/files.d.ts.map +1 -1
  151. package/dist/server/routes/file/controllers/files.js +6 -8
  152. package/dist/server/routes/file/controllers/resize.d.ts.map +1 -1
  153. package/dist/server/routes/file/controllers/resize.js +4 -12
  154. package/dist/server/routes/file/index.d.ts.map +1 -1
  155. package/dist/server/routes/file/index.js +10 -7
  156. package/dist/server/routes/grpc/controllers/file2geojson.d.ts.map +1 -1
  157. package/dist/server/routes/grpc/controllers/file2geojson.js +7 -7
  158. package/dist/server/routes/grpc/controllers/filePreview.d.ts.map +1 -1
  159. package/dist/server/routes/grpc/controllers/filePreview.js +5 -4
  160. package/dist/server/routes/grpc/index.d.ts.map +1 -1
  161. package/dist/server/routes/grpc/index.js +3 -2
  162. package/dist/server/routes/logger/controllers/logger.file.d.ts +1 -1
  163. package/dist/server/routes/logger/controllers/logger.file.d.ts.map +1 -1
  164. package/dist/server/routes/logger/controllers/logger.file.js +4 -5
  165. package/dist/server/routes/logger/controllers/logger.metrics.d.ts.map +1 -1
  166. package/dist/server/routes/logger/controllers/logger.metrics.js +1 -4
  167. package/dist/server/routes/logger/index.d.ts.map +1 -1
  168. package/dist/server/routes/logger/index.js +4 -2
  169. package/dist/server/routes/menu/controllers/getMenu.d.ts.map +1 -1
  170. package/dist/server/routes/menu/controllers/getMenu.js +2 -1
  171. package/dist/server/routes/menu/index.d.ts.map +1 -1
  172. package/dist/server/routes/menu/index.js +9 -2
  173. package/dist/server/routes/notifications/controllers/addUserNotification.d.ts +1 -2
  174. package/dist/server/routes/notifications/controllers/addUserNotification.d.ts.map +1 -1
  175. package/dist/server/routes/notifications/controllers/addUserNotification.js +5 -6
  176. package/dist/server/routes/notifications/controllers/deleteUserNotification.d.ts +1 -2
  177. package/dist/server/routes/notifications/controllers/deleteUserNotification.d.ts.map +1 -1
  178. package/dist/server/routes/notifications/controllers/deleteUserNotification.js +5 -6
  179. package/dist/server/routes/notifications/controllers/editUserNotification.d.ts +1 -2
  180. package/dist/server/routes/notifications/controllers/editUserNotification.d.ts.map +1 -1
  181. package/dist/server/routes/notifications/controllers/editUserNotification.js +6 -9
  182. package/dist/server/routes/notifications/controllers/readNotifications.d.ts +4 -2
  183. package/dist/server/routes/notifications/controllers/readNotifications.d.ts.map +1 -1
  184. package/dist/server/routes/notifications/controllers/readNotifications.js +4 -3
  185. package/dist/server/routes/notifications/controllers/userNotifications.d.ts +5 -2
  186. package/dist/server/routes/notifications/controllers/userNotifications.d.ts.map +1 -1
  187. package/dist/server/routes/notifications/controllers/userNotifications.js +4 -5
  188. package/dist/server/routes/notifications/index.d.ts +1 -2
  189. package/dist/server/routes/notifications/index.d.ts.map +1 -1
  190. package/dist/server/routes/notifications/index.js +3 -1
  191. package/dist/server/routes/properties/controllers/properties.get.d.ts +5 -2
  192. package/dist/server/routes/properties/controllers/properties.get.d.ts.map +1 -1
  193. package/dist/server/routes/properties/controllers/properties.get.js +6 -5
  194. package/dist/server/routes/properties/controllers/properties.post.d.ts +1 -1
  195. package/dist/server/routes/properties/controllers/properties.post.d.ts.map +1 -1
  196. package/dist/server/routes/properties/controllers/properties.post.js +7 -6
  197. package/dist/server/routes/properties/index.d.ts.map +1 -1
  198. package/dist/server/routes/properties/index.js +4 -7
  199. package/dist/server/routes/table/controllers/card.d.ts +1 -1
  200. package/dist/server/routes/table/controllers/card.d.ts.map +1 -1
  201. package/dist/server/routes/table/controllers/card.js +9 -7
  202. package/dist/server/routes/table/controllers/cardData.d.ts.map +1 -1
  203. package/dist/server/routes/table/controllers/cardData.js +4 -6
  204. package/dist/server/routes/table/controllers/cardTabData.d.ts.map +1 -1
  205. package/dist/server/routes/table/controllers/cardTabData.js +3 -2
  206. package/dist/server/routes/table/controllers/dataInfo.d.ts.map +1 -1
  207. package/dist/server/routes/table/controllers/dataInfo.js +4 -3
  208. package/dist/server/routes/table/controllers/filter.d.ts.map +1 -1
  209. package/dist/server/routes/table/controllers/filter.js +3 -2
  210. package/dist/server/routes/table/controllers/form.d.ts +1 -1
  211. package/dist/server/routes/table/controllers/form.d.ts.map +1 -1
  212. package/dist/server/routes/table/controllers/form.js +7 -5
  213. package/dist/server/routes/table/controllers/getFormByTable.d.ts.map +1 -1
  214. package/dist/server/routes/table/controllers/getFormByTable.js +12 -12
  215. package/dist/server/routes/table/controllers/suggest.d.ts +1 -1
  216. package/dist/server/routes/table/controllers/suggest.d.ts.map +1 -1
  217. package/dist/server/routes/table/controllers/suggest.js +14 -29
  218. package/dist/server/routes/table/controllers/tableInfo.d.ts +1 -2
  219. package/dist/server/routes/table/controllers/tableInfo.d.ts.map +1 -1
  220. package/dist/server/routes/table/controllers/tableInfo.js +9 -8
  221. package/dist/server/routes/table/controllers/tokenInfo.d.ts.map +1 -1
  222. package/dist/server/routes/table/controllers/tokenInfo.js +2 -1
  223. package/dist/server/routes/table/functions/getData.d.ts.map +1 -1
  224. package/dist/server/routes/table/functions/getData.js +19 -25
  225. package/dist/server/routes/table/index.d.ts.map +1 -1
  226. package/dist/server/routes/table/index.js +15 -13
  227. package/dist/server/routes/templates/controllers/getTemplate.d.ts.map +1 -1
  228. package/dist/server/routes/templates/controllers/getTemplate.js +9 -5
  229. package/dist/server/routes/templates/index.d.ts.map +1 -1
  230. package/dist/server/routes/templates/index.js +2 -1
  231. package/dist/server/routes/upload/index.d.ts.map +1 -1
  232. package/dist/server/routes/upload/index.js +31 -20
  233. package/dist/server/routes/usercls/controllers/addUserCls.d.ts.map +1 -1
  234. package/dist/server/routes/usercls/controllers/addUserCls.js +2 -1
  235. package/dist/server/routes/usercls/controllers/deleteUserCls.d.ts.map +1 -1
  236. package/dist/server/routes/usercls/controllers/deleteUserCls.js +2 -1
  237. package/dist/server/routes/usercls/controllers/editUserCls.d.ts.map +1 -1
  238. package/dist/server/routes/usercls/controllers/editUserCls.js +2 -1
  239. package/dist/server/routes/usercls/controllers/getUserCls.d.ts +1 -1
  240. package/dist/server/routes/usercls/controllers/getUserCls.d.ts.map +1 -1
  241. package/dist/server/routes/usercls/controllers/getUserCls.js +4 -3
  242. package/dist/server/routes/usercls/index.d.ts.map +1 -1
  243. package/dist/server/routes/usercls/index.js +12 -5
  244. package/dist/server/routes/util/controllers/api.list.d.ts +19 -0
  245. package/dist/server/routes/util/controllers/api.list.d.ts.map +1 -0
  246. package/dist/server/routes/util/controllers/api.list.js +58 -0
  247. package/dist/server/routes/util/controllers/code.generator.d.ts.map +1 -1
  248. package/dist/server/routes/util/controllers/code.generator.js +7 -6
  249. package/dist/server/routes/util/controllers/user.tokens.d.ts +1 -2
  250. package/dist/server/routes/util/controllers/user.tokens.d.ts.map +1 -1
  251. package/dist/server/routes/util/controllers/user.tokens.js +6 -5
  252. package/dist/server/routes/util/index.d.ts.map +1 -1
  253. package/dist/server/routes/util/index.js +8 -7
  254. package/dist/server/routes/widget/controllers/file.edit.d.ts.map +1 -1
  255. package/dist/server/routes/widget/controllers/file.edit.js +5 -4
  256. package/dist/server/routes/widget/controllers/widget.del.d.ts.map +1 -1
  257. package/dist/server/routes/widget/controllers/widget.del.js +6 -7
  258. package/dist/server/routes/widget/controllers/widget.get.d.ts.map +1 -1
  259. package/dist/server/routes/widget/controllers/widget.get.js +4 -3
  260. package/dist/server/routes/widget/controllers/widget.set.d.ts.map +1 -1
  261. package/dist/server/routes/widget/controllers/widget.set.js +5 -4
  262. package/dist/server/routes/widget/index.d.ts.map +1 -1
  263. package/dist/server/routes/widget/index.js +3 -2
  264. package/package.json +3 -1
  265. package/dist/module/core/cls/constraint_type.json +0 -14
  266. package/dist/module/core/cls/constraint_type_table.json +0 -18
  267. package/dist/server/migrations/oauth.sql.sql +0 -77
  268. package/dist/server/plugins/auth/funcs/getUserPermissions.d.ts +0 -2
  269. package/dist/server/plugins/auth/funcs/getUserPermissions.d.ts.map +0 -1
  270. package/dist/server/plugins/auth/funcs/getUserPermissions.js +0 -24
  271. package/dist/server/plugins/auth/onRequest.d.ts +0 -4
  272. package/dist/server/plugins/auth/onRequest.d.ts.map +0 -1
  273. package/dist/server/plugins/auth/onRequest.js +0 -104
  274. package/dist/server/plugins/migration/index.d.ts +0 -3
  275. package/dist/server/plugins/migration/index.d.ts.map +0 -1
  276. package/dist/server/plugins/migration/index.js +0 -5
  277. package/dist/server/plugins/policy/funcs/checkAuth.d.ts +0 -4
  278. package/dist/server/plugins/policy/funcs/checkAuth.d.ts.map +0 -1
  279. package/dist/server/plugins/policy/funcs/checkAuth.js +0 -104
  280. package/dist/server/routes/access/controllers/access.resources.d.ts +0 -6
  281. package/dist/server/routes/access/controllers/access.resources.d.ts.map +0 -1
  282. package/dist/server/routes/access/controllers/access.resources.js +0 -14
  283. package/dist/server/routes/access/controllers/resources.d.ts +0 -11
  284. package/dist/server/routes/access/controllers/resources.d.ts.map +0 -1
  285. package/dist/server/routes/access/controllers/resources.js +0 -14
  286. package/dist/server/routes/access/functions/resources.d.ts +0 -6
  287. package/dist/server/routes/access/functions/resources.d.ts.map +0 -1
  288. package/dist/server/routes/access/functions/resources.js +0 -11
  289. package/dist/server/types/errors.d.ts +0 -14
  290. package/dist/server/types/errors.d.ts.map +0 -1
  291. package/dist/server/types/errors.js +0 -4
@@ -5,14 +5,18 @@ import accessUserPost from "./controllers/access.user.post.js";
5
5
  import accessInterface from "./controllers/access.interface.js";
6
6
  import { publicResourcesList } from "../../plugins/access/funcs/getResources.js";
7
7
  import { accessGroupPostSchema, accessGroupSchema, accessInterfaceSchema, accessUserPostSchema, accessUserSchema, } from "./schema.js";
8
+ const tags = ["core", "access"];
8
9
  export default async function route(fastify, opt = {}) {
9
- fastify.get("/access-group/:id", { schema: accessGroupSchema }, accessGroup);
10
- fastify.post("/access-group/:id", { schema: accessGroupPostSchema }, accessGroupPost);
11
- fastify.get("/access-user/:id", { config: { permission: "admin.users.read" }, schema: accessUserSchema }, accessUser);
10
+ fastify.get("/access-group/:id", { config: { tags }, schema: accessGroupSchema }, accessGroup);
11
+ fastify.post("/access-group/:id", { config: { tags }, schema: accessGroupPostSchema }, accessGroupPost);
12
+ fastify.get("/access-user/:id", {
13
+ config: { tags, permission: "admin.users.read" },
14
+ schema: accessUserSchema,
15
+ }, accessUser);
12
16
  fastify.post("/access-user/:id", {
13
- config: { permission: "admin.users.update" },
17
+ config: { tags, permission: "admin.users.update" },
14
18
  schema: accessUserPostSchema,
15
19
  }, accessUserPost);
16
- fastify.get("/access-interface/:name", { schema: accessInterfaceSchema }, accessInterface);
17
- fastify.get("/resources", { config: { policy: "L0" } }, async () => publicResourcesList);
20
+ fastify.get("/access-interface/:name", { config: { tags }, schema: accessInterfaceSchema }, accessInterface);
21
+ fastify.get("/resources", { config: { tags, policy: "L0" } }, async () => publicResourcesList);
18
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"totp.d.ts","sourceRoot":"","sources":["../../../../../../../server/routes/auth/controllers/2factor/providers/totp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAU1D,UAAU,OAAO;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,UAAU,CAAC;CAChB;AAED,UAAU,KAAK;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAuBD,QAAA,MAAM,YAAY,GAAU,aAAa,OAAO,kBAK/C,CAAC;AAEF,QAAA,MAAM,YAAY,GAAU,aAAa,OAAO,kBAK/C,CAAC;AAEF,QAAA,MAAM,SAAS,GAAU,aAAa,OAAO;;;;EAc5C,CAAC;AAuBF,QAAA,MAAM,QAAQ,GAAU,aAAa,OAAO;;;;;;;;;;;;EA0D3C,CAAC;AAEF,QAAA,MAAM,MAAM,GAAU,0BAA0B,KAAK;;;EAiBpD,CAAC;AAKF,QAAA,MAAM,MAAM,GAAU,2BAA2B,KAAK,iBAqBrD,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;;AAE3E,wBAAoB"}
1
+ {"version":3,"file":"totp.d.ts","sourceRoot":"","sources":["../../../../../../../server/routes/auth/controllers/2factor/providers/totp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAW1D,UAAU,OAAO;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,UAAU,CAAC;CAChB;AAED,UAAU,KAAK;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAuBD,QAAA,MAAM,YAAY,GAAU,aAAa,OAAO,kBAK/C,CAAC;AAEF,QAAA,MAAM,YAAY,GAAU,aAAa,OAAO,kBAK/C,CAAC;AAEF,QAAA,MAAM,SAAS,GAAU,aAAa,OAAO;;;;EAc5C,CAAC;AAuBF,QAAA,MAAM,QAAQ,GAAU,aAAa,OAAO;;;;;;;;;;;;EA0D3C,CAAC;AAEF,QAAA,MAAM,MAAM,GAAU,0BAA0B,KAAK;;;EAiBpD,CAAC;AAKF,QAAA,MAAM,MAAM,GAAU,2BAA2B,KAAK,iBAqBrD,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;;AAE3E,wBAAoB"}
@@ -2,6 +2,7 @@ import crypto from "node:crypto";
2
2
  import qrcode from "qrcode";
3
3
  import * as authenticator from "otplib";
4
4
  import config from "../../../../../../config.js";
5
+ import { BadRequestError, ForbiddenError } from "../../../../../../errors.js";
5
6
  const TYPE = "TOTP";
6
7
  // equivalent to otplib@12.0.1 authenticator.keyuri(id,prefix,secret)
7
8
  // "otpauth://totp/SOFTPRO:777?secret=secret&period=30&digits=6&algorithm=SHA1&issuer=SOFTPRO"
@@ -87,12 +88,12 @@ const verify = async ({ uid, code: token, pg }) => {
87
88
  const { secret, enabled, recoveryCodes } = await getSecret({ uid, pg });
88
89
  // console.debug('secret', secret, 'enabled', enabled, 'verification', 'token', authenticator.generate(secret), authenticator.verify({ token: authenticator.generate(secret), secret }));
89
90
  if (!secret) {
90
- throw new Error("Включіть двофакторну аутентифікацію");
91
+ throw new BadRequestError("Включіть двофакторну аутентифікацію");
91
92
  }
92
93
  const isValid = authenticator.verify({ token, secret }) ||
93
94
  recoveryCodes.reduce((result, recoveryCode) => result || recoveryCode === token, false);
94
95
  if (!isValid) {
95
- throw new Error("Невірний код");
96
+ throw new ForbiddenError("Невірний код");
96
97
  }
97
98
  return { enabled, recoveryCodes };
98
99
  };
@@ -106,7 +107,7 @@ const toggle = async ({ uid, code, pg, enable }) => {
106
107
  pg,
107
108
  });
108
109
  if (enabled === enable) {
109
- throw new Error("Вже знаходиться у даному стані");
110
+ throw new BadRequestError("Вже знаходиться у даному стані");
110
111
  }
111
112
  if (enable) {
112
113
  await enableSecret({
@@ -1 +1 @@
1
- {"version":3,"file":"qrcode.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/qrcode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAa5D,wBAA8B,MAAM,CAClC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,YAAY,kBAoDpB"}
1
+ {"version":3,"file":"qrcode.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/qrcode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAkB5D,wBAA8B,MAAM,CAClC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,YAAY,kBAiDpB"}
@@ -2,6 +2,7 @@ import qr from "qrcode";
2
2
  import config from "../../../../../config.js";
3
3
  import pgClients from "../../../../plugins/pg/pgClients.js";
4
4
  import { getSecret, generate } from "./providers/totp.js";
5
+ import { BadRequestError, NotFoundError, UnauthorizedError, } from "../../../../../errors.js";
5
6
  const headers = {
6
7
  "Content-Type": "image/png",
7
8
  };
@@ -9,19 +10,16 @@ export default async function qrCode(req, reply) {
9
10
  const { pg = pgClients.client } = req;
10
11
  const { uid } = req.user || {};
11
12
  if (!uid) {
12
- return reply.status(401).send({ error: "unauthorized", code: 401 });
13
+ throw UnauthorizedError("unauthorized");
13
14
  }
14
15
  if (!pg || !pg?.pk?.["admin.users"] || !pg?.pk?.["admin.users_social_auth"]) {
15
- return reply.status(400).send({
16
- error: "db connection / users/users_social_auth tables are required",
17
- code: 400,
18
- });
16
+ throw BadRequestError("db connection / users/users_social_auth tables are required");
19
17
  }
20
18
  const userExists = await pg
21
19
  .query(`select uid from admin.users where uid=$1`, [uid])
22
20
  .then((el) => el.rows?.[0]?.uid);
23
21
  if (!userExists) {
24
- return reply.status(404).send({ error: "invalid user", code: 404 });
22
+ throw NotFoundError("invalid user");
25
23
  }
26
24
  const { enabled, secret } = await getSecret({ pg, uid });
27
25
  const { otp } = secret
@@ -32,12 +30,10 @@ export default async function qrCode(req, reply) {
32
30
  : await generate({ uid, pg });
33
31
  const base64 = otp ? await qr.toDataURL(otp) : undefined;
34
32
  if (enabled && !config.local && !config.debug) {
35
- return reply
36
- .status(400)
37
- .send({ error: "2factor already enabled", code: 400 });
33
+ throw BadRequestError("2factor already enabled");
38
34
  }
39
35
  if (!otp || !base64) {
40
- return reply.status(500).send({ error: "generation error", code: 500 });
36
+ throw Error("generation error");
41
37
  }
42
38
  // substring to exclude data:image/png;base64,
43
39
  return reply
@@ -1 +1 @@
1
- {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAiBvC;;;;;;;;;;;;;;;;GAgBG;AAEH,wBAA8B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAqFnE"}
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAsBvC;;;;;;;;;;;;;;;;GAgBG;AAEH,wBAA8B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBA4EnE"}
@@ -7,6 +7,7 @@ import pgClients from "../../../../plugins/pg/pgClients.js";
7
7
  import { handlebars } from "../../../../helpers/index.js";
8
8
  import { verify, deleteSecret } from "./providers/totp.js";
9
9
  import sendNotification from "../../../../plugins/auth/funcs/sendNotification.js";
10
+ import { BadRequestError, NotFoundError, UnauthorizedError, } from "../../../../../errors.js";
10
11
  const template = "recovery-codes-email-template";
11
12
  const dirname = path.dirname(fileURLToPath(import.meta.url));
12
13
  /**
@@ -29,23 +30,20 @@ const dirname = path.dirname(fileURLToPath(import.meta.url));
29
30
  export default async function recovery(req, reply) {
30
31
  const { pg = pgClients.client, user, body = {}, method } = req;
31
32
  if (!user?.uid) {
32
- return reply.status(401).send({ error: "unauthorized", code: 401 });
33
+ throw UnauthorizedError("unauthorized");
33
34
  }
34
35
  if (!user.twofa) {
35
- return reply.status(400).send({ error: "2fa not enabled", code: 400 });
36
+ throw BadRequestError("2fa not enabled");
36
37
  }
37
38
  if (!config.pg) {
38
- return reply.status(400).send({ error: "empty pg", code: 400 });
39
+ throw Error("empty pg");
39
40
  }
40
41
  const { code } = body;
41
42
  const { uid, email } = user || {};
42
43
  if (!code) {
43
44
  if (!email) {
44
- return reply
45
- .status(404)
46
- .send({ error: "user recovery email not set", code: 404 });
45
+ throw NotFoundError("user recovery email not set");
47
46
  }
48
- // return reply.status(400).send('not enough params');
49
47
  const customPt = await getTemplate("pt", template);
50
48
  const pt = customPt ||
51
49
  (await readFile(path.join(dirname, `../../../../../templates/pt/${template}.html`), "utf8"));
@@ -54,9 +52,7 @@ export default async function recovery(req, reply) {
54
52
  where uid = $1 and social_auth_type = $2`, [uid, "TOTP"])
55
53
  .then((el) => el.rows?.[0]?.recoveryCodes || []);
56
54
  if (!recoveryCodes?.length) {
57
- return reply
58
- .status(404)
59
- .send({ error: "user recovery code not found", code: 404 });
55
+ throw NotFoundError("user recovery code not found");
60
56
  }
61
57
  const html = await handlebars.compile(pt)({
62
58
  recoveryCodes: [recoveryCodes[0]],
@@ -74,18 +70,13 @@ export default async function recovery(req, reply) {
74
70
  }
75
71
  return reply.redirect("/2factor?recovery=1");
76
72
  }
77
- try {
78
- // validate recovery code
79
- await verify({ uid, code, pg });
80
- // delete old secret
81
- await deleteSecret({ pg, uid });
82
- const redirectUrl = config.auth?.link?.["2fa"]?.login || "/2factor";
83
- if (method === "POST") {
84
- return reply.status(200).send({ redirectUrl });
85
- }
86
- return reply.redirect(redirectUrl);
87
- }
88
- catch (err) {
89
- return reply.status(500).send({ error: err.toString(), code: 500 });
73
+ // validate recovery code
74
+ await verify({ uid, code, pg });
75
+ // delete old secret
76
+ await deleteSecret({ pg, uid });
77
+ const redirectUrl = config.auth?.link?.["2fa"]?.login || "/2factor";
78
+ if (method === "POST") {
79
+ return reply.status(200).send({ redirectUrl });
90
80
  }
81
+ return reply.redirect(redirectUrl);
91
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/reset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAOvC,wBAA8B,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAiBhE"}
1
+ {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/reset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAQvC,wBAA8B,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAchE"}
@@ -1,16 +1,14 @@
1
1
  import config from "../../../../../config.js";
2
2
  import pgClients from "../../../../plugins/pg/pgClients.js";
3
3
  import { deleteSecret } from "./providers/totp.js";
4
+ import { BadRequestError } from "../../../../../errors.js";
4
5
  export default async function reset(req, reply) {
5
6
  const { pg = pgClients.client, query } = req;
6
7
  if (!query?.uid) {
7
- return reply.status(400).send({
8
- error: "not enough query params: uid",
9
- code: 400,
10
- });
8
+ throw BadRequestError("not enough query params: uid");
11
9
  }
12
10
  if (!config.pg) {
13
- return reply.status(400).send({ error: "empty pg", code: 400 });
11
+ throw Error("empty pg");
14
12
  }
15
13
  await deleteSecret({ pg, uid: query.uid });
16
14
  return reply.status(200).send({ ok: true });
@@ -1 +1 @@
1
- {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA0BvC;;;;;;;;;;;;;;;;GAgBG;AAEH,wBAA8B,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAwEzE"}
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA2BvC;;;;;;;;;;;;;;;;GAgBG;AAEH,wBAA8B,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAyDzE"}
@@ -7,6 +7,7 @@ import pgClients from "../../../../plugins/pg/pgClients.js";
7
7
  import { handlebars } from "../../../../helpers/index.js";
8
8
  import { verify, enableSecret } from "./providers/totp.js";
9
9
  import sendNotification from "../../../../plugins/auth/funcs/sendNotification.js";
10
+ import { BadRequestError } from "../../../../../errors.js";
10
11
  const template = "recovery-codes-email-template";
11
12
  const dirname = path.dirname(fileURLToPath(import.meta.url));
12
13
  const defaultPt = existsSync(path.join(dirname, `../../../../templates/pt/${template}.hbs`))
@@ -34,54 +35,40 @@ export default async function verifyFunction(req, reply) {
34
35
  const { uid, twofa, email } = user || {};
35
36
  const { code } = body;
36
37
  if (!twofa) {
37
- return reply.status(400).send({ error: "2fa not enabled", code: 400 });
38
+ throw BadRequestError("2fa not enabled");
38
39
  }
39
40
  if (!config.pg) {
40
- return reply.status(400).send({ error: "empty pg", code: 400 });
41
+ throw Error("empty pg");
41
42
  }
42
43
  if (!code) {
43
- return reply
44
- .status(400)
45
- .send({ error: "not enough body params: code", code: 400 });
44
+ throw BadRequestError("not enough body params: code");
46
45
  }
47
- try {
48
- const { enabled } = await verify({ uid, code, pg });
49
- await enableSecret({ pg, uid });
50
- req.session.secondFactorPassed = true;
51
- if (!enabled && email) {
52
- const { recoveryCodes } = await pg
53
- .query(`select social_auth_obj->'codesArray' as "recoveryCodes"
46
+ const { enabled } = await verify({ uid, code, pg });
47
+ await enableSecret({ pg, uid });
48
+ req.session.secondFactorPassed = true;
49
+ if (!enabled && email) {
50
+ const { recoveryCodes } = await pg
51
+ .query(`select social_auth_obj->'codesArray' as "recoveryCodes"
54
52
  from admin.users_social_auth where uid=$1 and social_auth_type='TOTP'`, [uid])
55
- ?.then((el) => el.rows?.[0] || {});
56
- const customPt = await getTemplate("pt", template);
57
- const pt = customPt || defaultPt;
58
- const html = await handlebars.compile(pt)({
59
- recoveryCodes,
60
- code: recoveryCodes,
61
- domain: `${req.protocol || "https"}://${req.hostname}`,
62
- });
63
- await sendNotification({
64
- pg,
65
- to: email,
66
- template: html,
67
- title: `Recovery codes for ${req.hostname} 2-factor authentication`,
68
- nocache: config.local || config.debug || user?.user_type?.includes?.("admin"),
69
- });
70
- }
71
- const redirectUrl = req.headers?.referer?.match?.(/[?&]redirect=([^&]+)/)?.[1] || "/";
72
- // return reply.redirect(redirectUrl.startsWith("/") ? redirectUrl : "/");
73
- return reply
74
- .status(200)
75
- .send({ redirectUrl: redirectUrl.startsWith("/") ? redirectUrl : "/" });
76
- }
77
- catch (err) {
78
- if ([
79
- "Невірний код",
80
- "Вже знаходиться у даному стані",
81
- "Включіть двофакторну аутентифікацію",
82
- ].includes(err.message)) {
83
- return reply.status(400).send({ error: err.message, code: 400 });
84
- }
85
- return reply.status(500).send(err.toString());
53
+ ?.then((el) => el.rows?.[0] || {});
54
+ const customPt = await getTemplate("pt", template);
55
+ const pt = customPt || defaultPt;
56
+ const html = await handlebars.compile(pt)({
57
+ recoveryCodes,
58
+ code: recoveryCodes,
59
+ domain: `${req.protocol || "https"}://${req.hostname}`,
60
+ });
61
+ await sendNotification({
62
+ pg,
63
+ to: email,
64
+ template: html,
65
+ title: `Recovery codes for ${req.hostname} 2-factor authentication`,
66
+ nocache: config.local || config.debug || user?.user_type?.includes?.("admin"),
67
+ });
86
68
  }
69
+ const redirectUrl = req.headers?.referer?.match?.(/[?&]redirect=([^&]+)/)?.[1] || "/";
70
+ // return reply.redirect(redirectUrl.startsWith("/") ? redirectUrl : "/");
71
+ return reply
72
+ .status(200)
73
+ .send({ redirectUrl: redirectUrl.startsWith("/") ? redirectUrl : "/" });
87
74
  }
@@ -6,8 +6,5 @@ import { FastifyReply } from "fastify";
6
6
  * @summary Авторизація користувача за логіном і паролем
7
7
  *
8
8
  */
9
- export default function login(req: any, reply: FastifyReply): Promise<{
10
- error: string;
11
- status: number;
12
- }>;
9
+ export default function login(req: any, reply: FastifyReply): Promise<never>;
13
10
  //# sourceMappingURL=login.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/login.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;GAMG;AAEH,wBAA8B,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY;;;GAUhE"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/login.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;GAMG;AAEH,wBAA8B,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAUhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"passwordRecovery.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/passwordRecovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAoCvC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,wBAA8B,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAmI3E"}
1
+ {"version":3,"file":"passwordRecovery.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/passwordRecovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAqCvC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,wBAA8B,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAiI3E"}
@@ -8,6 +8,7 @@ import logger from "../../../../plugins/logger/getLogger.js";
8
8
  import pgClients from "../../../../plugins/pg/pgClients.js";
9
9
  import getTemplate from "../../../../plugins/table/funcs/getTemplate.js";
10
10
  import sendNotification from "../../../../plugins/auth/funcs/sendNotification.js";
11
+ import { BadRequestError } from "../../../../../errors.js";
11
12
  const rclient = getRedis();
12
13
  const template = "recovery-password-email-template";
13
14
  const dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -48,10 +49,10 @@ export default async function passwordRecovery(req, reply) {
48
49
  const { pg = pgClients.client, query = {}, body = {}, hostname, unittest, } = req;
49
50
  const { nocache = config.local } = query;
50
51
  if (!query.code && !body.email) {
51
- return reply.status(400).send('Parameter "email" is required.');
52
+ throw BadRequestError('Parameter "email" is required.');
52
53
  }
53
54
  if (query.code && !body.password) {
54
- return reply.status(400).send('Param "password" is required.');
55
+ throw BadRequestError('Param "password" is required.');
55
56
  }
56
57
  // step 1 - send email code
57
58
  async function sendEmailToChangePassword() {
@@ -71,9 +72,7 @@ export default async function passwordRecovery(req, reply) {
71
72
  ? await rclient.get(keyCacheTimeout)
72
73
  : false;
73
74
  if (checkCodeTimeout && !nocache) {
74
- return reply
75
- .status(400)
76
- .send(`Код вже відправлено на пошту ${body.email}. Перевірте або спробуйте через 1 хвилину`);
75
+ throw BadRequestError(`Код вже відправлено на пошту ${body.email}. Перевірте або спробуйте через 1 хвилину`);
77
76
  }
78
77
  const q = "update admin.users set user_personal_code=$1 where $2 in (login,email)";
79
78
  if (config.pg) {
@@ -81,11 +80,11 @@ export default async function passwordRecovery(req, reply) {
81
80
  }
82
81
  const userQuery = `select coalesce(sur_name,'')|| coalesce(' '||user_name,'')||coalesce(' '||father_name,'') as user
83
82
  from admin.users where $1 in (login,email) limit 1`;
84
- const { user: userName } = config.pg
83
+ const userName = config.pg
85
84
  ? await pg
86
85
  .query(userQuery, [body.email])
87
- .then((el) => el.rows?.[0] || {})
88
- : {};
86
+ .then((el) => el.rows?.[0]?.user)
87
+ : null;
89
88
  try {
90
89
  const customPt = await getTemplate("pt", template);
91
90
  const pt = customPt ||
@@ -17,8 +17,5 @@ import { FastifyReply } from "fastify";
17
17
  * @returns {String|Object} error Опис помилки
18
18
  * @returns {String|Object} message Повідомлення про успішну реєстрацію
19
19
  */
20
- export default function registration(req: any, reply: FastifyReply): Promise<{
21
- message: string;
22
- status: number;
23
- }>;
20
+ export default function registration(req: any, reply: FastifyReply): Promise<never>;
24
21
  //# sourceMappingURL=registration.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAavC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAA8B,YAAY,CACxC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,YAAY;;;GA2HpB"}
1
+ {"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAcvC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAA8B,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBA4GvE"}
@@ -6,6 +6,7 @@ import config from "../../../../../config.js";
6
6
  import dataInsert from "../../../../plugins/crud/funcs/dataInsert.js";
7
7
  import pgClients from "../../../../plugins/pg/pgClients.js";
8
8
  import authorizeUser from "../../../../plugins/auth/funcs/authorizeUser.js";
9
+ import { BadRequestError, ConflictError } from "../../../../../errors.js";
9
10
  /**
10
11
  * АПІ призначене для реєстрації нового користувача на сайті
11
12
  *
@@ -28,38 +29,23 @@ export default async function registration(req, reply) {
28
29
  const { pg = pgClients.client, body = {} } = req;
29
30
  const { password, email } = body;
30
31
  if (!password || (!email && !body.login)) {
31
- return reply.status(400).send({
32
- error: "Недостатньо параметрів",
33
- code: 400,
34
- });
32
+ throw BadRequestError("Недостатньо параметрів");
35
33
  }
36
34
  const regularExp = /^([a-z0-9_-]+\.)*[a-z0-9_-]+@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.[a-z]{2,6}$/;
37
35
  if (email && !regularExp.test(email)) {
38
- return reply.status(400).send({
39
- error: "Параметр E-mail невалідний",
40
- code: 400,
41
- });
36
+ throw BadRequestError("Параметр E-mail невалідний");
42
37
  }
43
38
  if (body?.first_name &&
44
39
  !/[А-Яа-яA-Za-zёЁЇїІіЄєҐґ '-]+/.test(body?.first_name)) {
45
- return reply.status(400).send({
46
- error: "Параметр Ім'я невалідний",
47
- code: 400,
48
- });
40
+ throw BadRequestError("Параметр Ім'я невалідний");
49
41
  }
50
42
  if (body?.last_name &&
51
43
  !/[А-Яа-яA-Za-zёЁЇїІіЄєҐґ '-]+/.test(body?.last_name)) {
52
- return reply.status(400).send({
53
- error: "Параметр Прізвище невалідний",
54
- code: 400,
55
- });
44
+ throw BadRequestError("Параметр Прізвище невалідний");
56
45
  }
57
46
  if (body?.phone &&
58
47
  !/^\+\d{3}\s?\d{2}\s?\d{3}\s?\d{2}\s?\d{2}$/.test(body?.phone)) {
59
- return reply.status(400).send({
60
- error: "Параметр Телефон невалідний",
61
- code: 400,
62
- });
48
+ throw BadRequestError("Параметр Телефон невалідний");
63
49
  }
64
50
  const login = body.login || email;
65
51
  const data = {
@@ -76,12 +62,12 @@ export default async function registration(req, reply) {
76
62
  };
77
63
  const { userExists } = config.pg
78
64
  ? await pg.query(q1, [login]).then((el) => el.rows?.[0] || {})
79
- : {};
65
+ : { userExists: false };
80
66
  if (userExists) {
81
67
  const txt = !body.login
82
68
  ? "Даний адрес електронної пошти вже прив'язаний до іншого облікового запису"
83
69
  : "Даний логін вже використовується";
84
- return reply.status(409).send({ error: txt, code: 409 });
70
+ throw ConflictError(txt);
85
71
  }
86
72
  if (pg.pk?.["crm_acc.crm_contact"]) {
87
73
  // insert crm contact
@@ -92,7 +78,7 @@ export default async function registration(req, reply) {
92
78
  const txt = !body.login
93
79
  ? "Користувача за даною адресою вже зареєстровано"
94
80
  : "Даний логін вже використовується";
95
- return reply.status(409).send({ error: txt, code: 409 });
81
+ throw ConflictError(txt);
96
82
  }
97
83
  await dataInsert({ pg, table: "crm_acc.crm_contact", data });
98
84
  const { uid } = await pg
@@ -114,7 +100,7 @@ export default async function registration(req, reply) {
114
100
  .query(qUser, [login])
115
101
  .then((res) => res.rows?.[0]);
116
102
  if (!newUser) {
117
- return { message: "Помилка завершення реєстрації, спробуйте увійти", status: 500 };
103
+ throw BadRequestError("Помилка завершення реєстрації, спробуйте увійти");
118
104
  }
119
105
  const authType = "creds-" + (newUser.user_type === "admin" ? "admin" : "user");
120
106
  const result = await authorizeUser(newUser, req, authType);
@@ -1,4 +1,3 @@
1
- import { FastifyReply } from "fastify";
2
1
  import { ExtendedRequest } from "../../../../types/core.js";
3
- export default function updateUserInfo(req: ExtendedRequest, reply: FastifyReply): Promise<any>;
2
+ export default function updateUserInfo(req: ExtendedRequest): Promise<any>;
4
3
  //# sourceMappingURL=updateUserInfo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"updateUserInfo.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/updateUserInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAK5D,wBAA8B,cAAc,CAC1C,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,YAAY,gBAuBpB"}
1
+ {"version":3,"file":"updateUserInfo.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/updateUserInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAM5D,wBAA8B,cAAc,CAAC,GAAG,EAAE,eAAe,gBAsBhE"}
@@ -1,9 +1,10 @@
1
1
  import pgClients from "../../../../plugins/pg/pgClients.js";
2
2
  import dataUpdate from "../../../../plugins/crud/funcs/dataUpdate.js";
3
- export default async function updateUserInfo(req, reply) {
3
+ import { UnauthorizedError } from "../../../../../errors.js";
4
+ export default async function updateUserInfo(req) {
4
5
  const { body: payload, pg = pgClients.client } = req;
5
6
  if (!req.user?.uid) {
6
- return reply.code(401).send({ error: "Unauthorized", code: 401 });
7
+ throw UnauthorizedError("unauthorized");
7
8
  }
8
9
  const userInfo = Object.fromEntries(Object.entries(payload || {}).filter(([key]) => !["salt", "user_type"].includes(key)));
9
10
  const result = await dataUpdate({
@@ -1 +1 @@
1
- {"version":3,"file":"authByData.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/euSign/authByData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAcvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA0B5D,wBAA8B,UAAU,CACtC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,YAAY,kBAoIpB"}
1
+ {"version":3,"file":"authByData.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/euSign/authByData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAcvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA2B5D,wBAA8B,UAAU,CACtC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,YAAY,kBA8HpB"}
@@ -7,6 +7,7 @@ import checkReferer from "../../../../plugins/auth/funcs/checkReferer.js";
7
7
  import getQuery from "../../../../plugins/auth/funcs/getQuery.js";
8
8
  import logAuth from "../../../../plugins/auth/funcs/logAuth.js";
9
9
  import authorizeUser from "../../../../plugins/auth/funcs/authorizeUser.js";
10
+ import { BadRequestError, ForbiddenError, NotImplementedError } from "../../../../../errors.js";
10
11
  function fetchWithoutSSL(url, options) {
11
12
  const httpsAgent = new Agent({
12
13
  connect: {
@@ -48,7 +49,7 @@ export default async function authByData(req, reply) {
48
49
  authType,
49
50
  hostOauth,
50
51
  });
51
- return reply.status(400).send("Невалідний парметр тип авторизації");
52
+ throw BadRequestError("Невалідний парметр тип авторизації");
52
53
  }
53
54
  // referer + token check
54
55
  const invalidReferer = await checkReferer({
@@ -62,9 +63,7 @@ export default async function authByData(req, reply) {
62
63
  referer,
63
64
  code,
64
65
  });
65
- return reply
66
- .status(403)
67
- .send("Параметри data / code / state мають невірний формат, або Ви перейшли за прямим посиланням.");
66
+ throw ForbiddenError("Параметри data / code / state мають невірний формат, або Ви перейшли за прямим посиланням.");
68
67
  }
69
68
  const url = authType === "govid"
70
69
  ? `${hostOauth}/api-user/auth_data?token=${code}`
@@ -122,8 +121,6 @@ export default async function authByData(req, reply) {
122
121
  error: err.toString(),
123
122
  stack: err.stack,
124
123
  });
125
- return reply
126
- .status(500)
127
- .send(`Помилка авторизації через ${authType === "govid" ? "id.gov.ua" : "google"}. Зверніться до Адміністратора!`);
124
+ throw NotImplementedError(`Помилка авторизації через ${authType === "govid" ? "id.gov.ua" : "google"}. Зверніться до Адміністратора!`);
128
125
  }
129
126
  }
@@ -1 +1 @@
1
- {"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/jwt/authorize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAyBvC,wBAA8B,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAuHpE"}
1
+ {"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/jwt/authorize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA0BvC,wBAA8B,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAmHpE"}
@@ -3,6 +3,7 @@ import pgClients from "../../../../plugins/pg/pgClients.js";
3
3
  import dataInsert from "../../../../plugins/crud/funcs/dataInsert.js";
4
4
  import { sign, scryptHash } from "../../../../plugins/auth/funcs/jwt.js";
5
5
  import authorizeUser from "../../../../plugins/auth/funcs/authorizeUser.js";
6
+ import { BadRequestError, NotFoundError } from "../../../../../errors.js";
6
7
  const getIp = (req) => (req.headers?.["x-real-ip"] ||
7
8
  req.headers?.["x-forwarded-for"] ||
8
9
  req.ip ||
@@ -18,14 +19,10 @@ export default async function authorize(req, reply) {
18
19
  const payload = req.method === "POST" ? body : query;
19
20
  const { response_type, client_id, redirect_uri, scope } = payload;
20
21
  if (response_type !== "code") {
21
- return reply
22
- .code(400)
23
- .send({ error: "unsupported response_type", code: 400 });
22
+ throw BadRequestError("unsupported response_type");
24
23
  }
25
24
  if (!client_id) {
26
- return reply
27
- .code(400)
28
- .send({ error: "not enough query params: client_id", code: 400 });
25
+ throw BadRequestError("not enough query params: client_id");
29
26
  }
30
27
  const ip = getIp(req);
31
28
  const q = `select * from oauth.clients where client_id=$1 and token_endpoint_auth_method=$2 and (allowed_ips is null or $3=any(allowed_ips)) and ${scope ? "$4=any(scopes)" : "1=1"} order by allowed_ips nulls last limit 1`;
@@ -35,12 +32,12 @@ export default async function authorize(req, reply) {
35
32
  .then((el) => el.rows?.[0] || {})
36
33
  : {};
37
34
  if (!userId) {
38
- return reply.code(400).send({ error: "invalid client id", code: 400 });
35
+ throw BadRequestError("invalid client id");
39
36
  }
40
37
  if (redirect_uri &&
41
38
  Array.isArray(redirect_uris) &&
42
39
  !redirect_uris.includes(redirect_uri)) {
43
- return reply.code(400).send({ error: "invalid redirect_uri", code: 400 });
40
+ throw BadRequestError("invalid redirect_uri");
44
41
  }
45
42
  const user = pg.pk?.["admin.users"]
46
43
  ? await pg
@@ -50,7 +47,7 @@ export default async function authorize(req, reply) {
50
47
  .then((el) => el.rows[0])
51
48
  : null;
52
49
  if (!user) {
53
- return reply.code(404).send({ error: "user not found", code: 404 });
50
+ throw NotFoundError("user not found");
54
51
  }
55
52
  const href1 = req.method === "POST"
56
53
  ? null
@@ -1 +1 @@
1
- {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/jwt/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAsB5D,wBAA8B,UAAU,CACtC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,YAAY,kBAwEpB"}
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/jwt/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA2B5D,wBAA8B,UAAU,CACtC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,YAAY,kBAmEpB"}