@ozdao/martyrs 0.2.585 → 0.2.586

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 (386) hide show
  1. package/dist/auth.server.js +161 -96
  2. package/dist/{authJwt-J1csaMWA.js → authJwt-DKbMMjw0.js} +33 -0
  3. package/dist/chats.server.js +2 -2
  4. package/dist/community.server.js +1 -1
  5. package/dist/core.server.js +191 -2
  6. package/dist/{core.websocket-C2FxNmZ1.js → core.websocket-Cl76z2wT.js} +41 -5
  7. package/dist/{crud-q1ye5IhV.js → crud-DpOXTZep.js} +1 -1
  8. package/dist/events.server.js +2 -2
  9. package/dist/files.server.js +1 -1
  10. package/dist/gallery.server.js +1 -1
  11. package/dist/index-kvBwwb0w.js +427 -0
  12. package/dist/inventory.server.js +2 -2
  13. package/dist/{mailing-DuEFRsa3.js → mailing-DT7nbNjZ.js} +16 -3
  14. package/dist/{main-xL-jtBkT.js → main-BIf-WirR.js} +863 -865
  15. package/dist/marketplace.server.js +1 -1
  16. package/dist/martyrs/dist/{main-xL-jtBkT.js → main-BIf-WirR.js} +192 -38
  17. package/dist/martyrs/dist/main-BIf-WirR.js.map +1 -0
  18. package/dist/martyrs/dist/{web-BA6h6Z8P.js → web-O7lXcjg0.js} +2 -2
  19. package/dist/martyrs/dist/{web-BA6h6Z8P.js.map → web-O7lXcjg0.js.map} +1 -1
  20. package/dist/martyrs/src/components/Button/{Button.vue2.js → Button.vue.js} +8 -7
  21. package/dist/martyrs/src/components/Button/Button.vue.js.map +1 -0
  22. package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
  23. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +1 -1
  24. package/dist/martyrs/src/components/Loader/Loader.vue.js +1 -1
  25. package/dist/martyrs/src/components/Loader/Loader.vue.js.map +1 -1
  26. package/dist/martyrs/src/components/Spoiler/{Spoiler.vue2.js → Spoiler.vue.js} +2 -2
  27. package/dist/martyrs/src/components/Spoiler/Spoiler.vue.js.map +1 -0
  28. package/dist/martyrs/src/components/Tooltip/Tooltip.vue2.js +17 -22
  29. package/dist/martyrs/src/components/Tooltip/Tooltip.vue2.js.map +1 -1
  30. package/dist/martyrs/src/modules/auth/auth.client.js +18 -24
  31. package/dist/martyrs/src/modules/auth/auth.client.js.map +1 -1
  32. package/dist/martyrs/src/modules/auth/views/components/blocks/OtpDialog.vue.js +178 -0
  33. package/dist/martyrs/src/modules/auth/views/components/blocks/OtpDialog.vue.js.map +1 -0
  34. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  35. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +53 -45
  36. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js.map +1 -1
  37. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +198 -14
  38. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js.map +1 -1
  39. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
  40. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +70 -29
  41. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js.map +1 -1
  42. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +2 -2
  43. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js.map +1 -1
  44. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +86 -30
  45. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js.map +1 -1
  46. package/dist/martyrs/src/modules/auth/views/plugins/otp.plugin.js +100 -0
  47. package/dist/martyrs/src/modules/auth/views/plugins/otp.plugin.js.map +1 -0
  48. package/dist/martyrs/src/modules/auth/views/router/auth.router.js +2 -31
  49. package/dist/martyrs/src/modules/auth/views/router/auth.router.js.map +1 -1
  50. package/dist/martyrs/src/modules/auth/views/router/users.router.js +0 -14
  51. package/dist/martyrs/src/modules/auth/views/router/users.router.js.map +1 -1
  52. package/dist/martyrs/src/modules/auth/views/store/auth.js +1 -56
  53. package/dist/martyrs/src/modules/auth/views/store/auth.js.map +1 -1
  54. package/dist/martyrs/src/modules/auth/views/store/users.js +5 -1
  55. package/dist/martyrs/src/modules/auth/views/store/users.js.map +1 -1
  56. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +1 -1
  57. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
  58. package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +0 -1
  59. package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js.map +1 -1
  60. package/dist/martyrs/src/modules/core/views/components/blocks/PopupAuth.vue.js +1 -1
  61. package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +1 -1
  62. package/dist/martyrs/src/modules/core/views/components/elements/OnlineIndicator.vue.js +74 -0
  63. package/dist/martyrs/src/modules/core/views/components/elements/OnlineIndicator.vue.js.map +1 -0
  64. package/dist/martyrs/src/modules/core/views/components/layouts/App.vue.js.map +1 -1
  65. package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +63 -47
  66. package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js.map +1 -1
  67. package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +1 -1
  68. package/dist/martyrs/src/modules/core/views/components/partials/Navigation.vue.js +1 -1
  69. package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js +1 -1
  70. package/dist/martyrs/src/modules/core/views/components/sections/{Filters.vue2.js → Filters.vue.js} +2 -2
  71. package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue.js.map +1 -0
  72. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
  73. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
  74. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
  75. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
  76. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
  77. package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +1 -1
  78. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
  79. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +1 -1
  80. package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js +1 -1
  81. package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +1 -1
  82. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +1 -1
  83. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
  84. package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js +1 -1
  85. package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js +1 -1
  86. package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js +1 -1
  87. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +1 -1
  88. package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +1 -1
  89. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +1 -1
  90. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +1 -1
  91. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +1 -1
  92. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
  93. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +1 -1
  94. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +1 -1
  95. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +1 -1
  96. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +1 -1
  97. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +1 -1
  98. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
  99. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +1 -1
  100. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +1 -1
  101. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +1 -1
  102. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +0 -1
  103. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js.map +1 -1
  104. package/dist/martyrs/src/modules/music/components/player/FullscreenPlayer.vue.js +1 -1
  105. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +1 -1
  106. package/dist/martyrs/src/modules/music/components/player/PlayerControls.vue.js +1 -1
  107. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +1 -1
  108. package/dist/martyrs/src/modules/notifications/components/sections/NotificationPreferences.vue.js +1 -1
  109. package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +1 -1
  110. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +1 -1
  111. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +1 -2
  112. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js.map +1 -1
  113. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +1 -1
  114. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
  115. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  116. package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +1 -1
  117. package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +1 -1
  118. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
  119. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +1 -1
  120. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
  121. package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +1 -1
  122. package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +2 -2
  123. package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +1 -1
  124. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +1 -1
  125. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
  126. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -2
  127. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js.map +1 -1
  128. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
  129. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +0 -1
  130. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js.map +1 -1
  131. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +0 -1
  132. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js.map +1 -1
  133. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  134. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +1 -1
  135. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +0 -1
  136. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js.map +1 -1
  137. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +2 -2
  138. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +0 -1
  139. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
  140. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
  141. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +3 -3
  142. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
  143. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
  144. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
  145. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
  146. package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.js +1 -1
  147. package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +1 -1
  148. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +1 -1
  149. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
  150. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
  151. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
  152. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +1 -1
  153. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  154. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
  155. package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js +1 -1
  156. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
  157. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
  158. package/dist/martyrs.css +1 -1
  159. package/dist/martyrs.es.js +1 -1
  160. package/dist/music.server.js +1 -1
  161. package/dist/notifications.server.js +1 -1
  162. package/dist/orders.server.js +7 -6
  163. package/dist/organizations.server.js +2 -2
  164. package/dist/products.server.js +2 -2
  165. package/dist/profile.schema-C31Lynn3.js +21 -0
  166. package/dist/rents.server.js +1 -1
  167. package/dist/sessions.service-COcwjd0f.js +86 -0
  168. package/dist/style.css +178 -108
  169. package/dist/{tickets.controller-B7r0mK-5.js → tickets.controller-DdF85W-i.js} +1 -1
  170. package/dist/visitors.service-B1dhhuSo.js +83 -0
  171. package/dist/wallet.server.js +2 -2
  172. package/dist/{web-BA6h6Z8P.js → web-O7lXcjg0.js} +1 -1
  173. package/package.json +5 -1
  174. package/src/cli/commands/create.js +106 -0
  175. package/src/cli/index.js +25 -0
  176. package/src/cli/templates/app/.env.development.mustache +14 -0
  177. package/src/cli/templates/app/.env.production.mustache +14 -0
  178. package/src/cli/templates/app/Dockerfile +36 -0
  179. package/src/cli/templates/app/babel.config.js +14 -0
  180. package/src/cli/templates/app/env.js +3 -0
  181. package/src/cli/templates/app/index.js +46 -0
  182. package/src/cli/templates/app/mongodb.config.js +18 -0
  183. package/src/cli/templates/app/package.json.mustache +65 -0
  184. package/src/cli/templates/app/src/client.js +22 -0
  185. package/src/cli/templates/app/src/components/pages/Index.vue +11 -0
  186. package/src/cli/templates/app/src/configs/global.config.js.mustache +40 -0
  187. package/src/cli/templates/app/src/localization/extensions.js +2 -0
  188. package/src/cli/templates/app/src/localization/index.js +44 -0
  189. package/src/cli/templates/app/src/localization/overrides.js +2 -0
  190. package/src/cli/templates/app/src/localization/translations.js +10 -0
  191. package/src/cli/templates/app/src/models/index.js +9 -0
  192. package/src/cli/templates/app/src/router/index.js +48 -0
  193. package/src/cli/templates/app/src/scss/theme.scss +18 -0
  194. package/src/cli/templates/app/src/server.js +68 -0
  195. package/src/cli/templates/app/src/store/index.js +9 -0
  196. package/src/cli/templates/docker-compose.yaml.mustache +47 -0
  197. package/src/cli/templates/nginx/Dockerfile +5 -0
  198. package/src/cli/templates/nginx/default.conf.mustache +55 -0
  199. package/src/cli/templates/public/favicon/.gitkeep +0 -0
  200. package/src/cli/templates/start-dev.sh.mustache +131 -0
  201. package/src/cli/templates/start-prod.sh.mustache +12 -0
  202. package/src/components/Button/Button.vue +61 -15
  203. package/src/components/Loader/Loader.vue +1 -1
  204. package/src/components/Tooltip/Tooltip.vue +31 -23
  205. package/src/modules/TASKS.MD +30 -1
  206. package/src/modules/auth/CLAUDE.md +381 -0
  207. package/src/modules/auth/FIXES.md +0 -38
  208. package/src/modules/auth/auth.client.js +4 -6
  209. package/src/modules/auth/auth.server.js +4 -15
  210. package/src/modules/auth/controllers/middlewares/authJwt.js +59 -17
  211. package/src/modules/auth/controllers/middlewares/index.js +4 -1
  212. package/src/modules/auth/controllers/middlewares/otp.middleware.js +166 -0
  213. package/src/modules/auth/controllers/middlewares/verifySignUp.js +0 -1
  214. package/src/modules/auth/controllers/middlewares/verifyUser.js +58 -11
  215. package/src/modules/auth/controllers/routes/auth.routes.js +48 -6
  216. package/src/modules/auth/controllers/routes/users.routes.js +29 -8
  217. package/src/modules/auth/controllers/services/auth.service.js +62 -12
  218. package/src/modules/auth/controllers/services/otp.service.js +109 -0
  219. package/src/modules/auth/controllers/services/users.service.js +46 -6
  220. package/src/modules/auth/models/otp.model.js +20 -0
  221. package/src/modules/auth/views/components/blocks/OtpDialog.vue +168 -0
  222. package/src/modules/auth/views/components/pages/Profile.vue +18 -13
  223. package/src/modules/auth/views/components/pages/ProfileEditAccount.vue +199 -45
  224. package/src/modules/auth/views/components/pages/ResetPassword.vue +170 -132
  225. package/src/modules/auth/views/components/pages/SignIn.vue +2 -1
  226. package/src/modules/auth/views/components/pages/SignUp.vue +203 -147
  227. package/src/modules/auth/views/plugins/otp.plugin.js +104 -0
  228. package/src/modules/auth/views/router/auth.router.js +1 -24
  229. package/src/modules/auth/views/router/users.router.js +1 -12
  230. package/src/modules/auth/views/store/auth.js +0 -68
  231. package/src/modules/auth/views/store/users.js +6 -2
  232. package/src/modules/core/controllers/classes/core.websocket.js +57 -6
  233. package/src/modules/core/controllers/middlewares/visitor.logger.js +49 -0
  234. package/src/modules/core/controllers/services/requests.service.js +53 -0
  235. package/src/modules/core/controllers/services/sessions.service.js +98 -0
  236. package/src/modules/core/controllers/services/visitors.service.js +102 -0
  237. package/src/modules/core/controllers/utils/mailing.js +16 -3
  238. package/src/modules/core/core.server.js +45 -3
  239. package/src/modules/core/models/request.model.js +30 -0
  240. package/src/modules/core/models/session.model.js +43 -0
  241. package/src/modules/core/models/visitor.model.js +28 -0
  242. package/src/modules/core/views/components/elements/OnlineIndicator.vue +115 -0
  243. package/src/modules/core/views/components/layouts/App.vue +2 -2
  244. package/src/modules/core/views/components/layouts/Client.vue +443 -477
  245. package/src/modules/orders/controllers/orders.controller.js +3 -3
  246. package/src/modules/products/components/pages/Products.vue +1 -1
  247. package/dist/_virtual/alignment-pattern.js +0 -5
  248. package/dist/_virtual/alignment-pattern.js.map +0 -1
  249. package/dist/_virtual/browser.js +0 -8
  250. package/dist/_virtual/browser.js.map +0 -1
  251. package/dist/_virtual/browser2.js +0 -5
  252. package/dist/_virtual/browser2.js.map +0 -1
  253. package/dist/_virtual/canvas.js +0 -5
  254. package/dist/_virtual/canvas.js.map +0 -1
  255. package/dist/_virtual/dijkstra.js +0 -5
  256. package/dist/_virtual/dijkstra.js.map +0 -1
  257. package/dist/_virtual/error-correction-code.js +0 -5
  258. package/dist/_virtual/error-correction-code.js.map +0 -1
  259. package/dist/_virtual/error-correction-level.js +0 -5
  260. package/dist/_virtual/error-correction-level.js.map +0 -1
  261. package/dist/_virtual/finder-pattern.js +0 -5
  262. package/dist/_virtual/finder-pattern.js.map +0 -1
  263. package/dist/_virtual/format-info.js +0 -5
  264. package/dist/_virtual/format-info.js.map +0 -1
  265. package/dist/_virtual/galois-field.js +0 -5
  266. package/dist/_virtual/galois-field.js.map +0 -1
  267. package/dist/_virtual/mask-pattern.js +0 -5
  268. package/dist/_virtual/mask-pattern.js.map +0 -1
  269. package/dist/_virtual/mode.js +0 -5
  270. package/dist/_virtual/mode.js.map +0 -1
  271. package/dist/_virtual/polynomial.js +0 -5
  272. package/dist/_virtual/polynomial.js.map +0 -1
  273. package/dist/_virtual/qrcode.js +0 -5
  274. package/dist/_virtual/qrcode.js.map +0 -1
  275. package/dist/_virtual/regex.js +0 -5
  276. package/dist/_virtual/regex.js.map +0 -1
  277. package/dist/_virtual/segments.js +0 -5
  278. package/dist/_virtual/segments.js.map +0 -1
  279. package/dist/_virtual/svg-tag.js +0 -5
  280. package/dist/_virtual/svg-tag.js.map +0 -1
  281. package/dist/_virtual/utils.js +0 -5
  282. package/dist/_virtual/utils.js.map +0 -1
  283. package/dist/_virtual/utils2.js +0 -5
  284. package/dist/_virtual/utils2.js.map +0 -1
  285. package/dist/_virtual/version-check.js +0 -5
  286. package/dist/_virtual/version-check.js.map +0 -1
  287. package/dist/_virtual/version.js +0 -5
  288. package/dist/_virtual/version.js.map +0 -1
  289. package/dist/index-_Edcmck_.js +0 -170
  290. package/dist/martyrs/dist/main-xL-jtBkT.js.map +0 -1
  291. package/dist/martyrs/node_modules/.pnpm/bignumber.js@9.1.2/node_modules/bignumber.js/bignumber.js +0 -1336
  292. package/dist/martyrs/node_modules/.pnpm/bignumber.js@9.1.2/node_modules/bignumber.js/bignumber.js.map +0 -1
  293. package/dist/martyrs/src/components/Button/Button.vue2.js.map +0 -1
  294. package/dist/martyrs/src/components/Spoiler/Spoiler.vue2.js.map +0 -1
  295. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +0 -166
  296. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js.map +0 -1
  297. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +0 -118
  298. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js.map +0 -1
  299. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +0 -360
  300. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js.map +0 -1
  301. package/dist/martyrs/src/modules/auth/views/store/twofa.js +0 -40
  302. package/dist/martyrs/src/modules/auth/views/store/twofa.js.map +0 -1
  303. package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js.map +0 -1
  304. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardBalanceReplenished.vue.js +0 -43
  305. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardBalanceReplenished.vue.js.map +0 -1
  306. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js +0 -47
  307. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js.map +0 -1
  308. package/dist/martyrs/src/modules/wallet/views/components/blocks/CashDeposit.vue.js +0 -29
  309. package/dist/martyrs/src/modules/wallet/views/components/blocks/CashDeposit.vue.js.map +0 -1
  310. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +0 -89
  311. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js.map +0 -1
  312. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDepositProcessing.vue.js +0 -136
  313. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDepositProcessing.vue.js.map +0 -1
  314. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +0 -238
  315. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js.map +0 -1
  316. package/dist/martyrs/src/modules/wallet/views/localization/wallet.json.js +0 -9
  317. package/dist/martyrs/src/modules/wallet/views/localization/wallet.json.js.map +0 -1
  318. package/dist/martyrs/src/modules/wallet/views/store/wallet.store.js +0 -134
  319. package/dist/martyrs/src/modules/wallet/views/store/wallet.store.js.map +0 -1
  320. package/dist/node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js +0 -106
  321. package/dist/node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js.map +0 -1
  322. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js +0 -79
  323. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js.map +0 -1
  324. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js +0 -14
  325. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js.map +0 -1
  326. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js +0 -43
  327. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js.map +0 -1
  328. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -85
  329. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js.map +0 -1
  330. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js +0 -40
  331. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js.map +0 -1
  332. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js +0 -34
  333. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js.map +0 -1
  334. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js +0 -36
  335. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js.map +0 -1
  336. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js +0 -367
  337. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js.map +0 -1
  338. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js +0 -52
  339. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js.map +0 -1
  340. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js +0 -25
  341. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js.map +0 -1
  342. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js +0 -24
  343. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js.map +0 -1
  344. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js +0 -38
  345. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js.map +0 -1
  346. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js +0 -46
  347. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js.map +0 -1
  348. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js +0 -149
  349. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js.map +0 -1
  350. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js +0 -90
  351. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js.map +0 -1
  352. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js +0 -41
  353. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js.map +0 -1
  354. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js +0 -44
  355. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js.map +0 -1
  356. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js +0 -279
  357. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js.map +0 -1
  358. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -38
  359. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js.map +0 -1
  360. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js +0 -33
  361. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js.map +0 -1
  362. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js +0 -201
  363. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js.map +0 -1
  364. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js +0 -84
  365. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js.map +0 -1
  366. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js +0 -14
  367. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js.map +0 -1
  368. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js +0 -107
  369. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js.map +0 -1
  370. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js +0 -61
  371. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js.map +0 -1
  372. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js +0 -64
  373. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js.map +0 -1
  374. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js +0 -87
  375. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js.map +0 -1
  376. package/dist/profile.schema-CjLOfG7b.js +0 -92
  377. package/src/modules/auth/controllers/middlewares/visitor.logger.js +0 -75
  378. package/src/modules/auth/controllers/routes/twofa.routes.js +0 -8
  379. package/src/modules/auth/controllers/services/twofa.service.js +0 -30
  380. package/src/modules/auth/models/request.model.js +0 -14
  381. package/src/modules/auth/models/visitor.model.js +0 -11
  382. package/src/modules/auth/views/components/pages/EnterCode.vue +0 -204
  383. package/src/modules/auth/views/components/pages/EnterPassword.vue +0 -123
  384. package/src/modules/auth/views/components/sections/ProfileEditCredentials.vue +0 -329
  385. package/src/modules/auth/views/store/twofa.js +0 -70
  386. package/src/modules/auth//320/220/320/240/320/245/320/230/320/242/320/225/320/232/320/242/320/243/320/240/320/220.md +0 -445
@@ -0,0 +1,381 @@
1
+ # Auth Module
2
+
3
+ Аутентификация пользователей: JWT + Sessions, OTP-верификация для критичных операций.
4
+
5
+ ## Quick Start
6
+
7
+ ### Клиент
8
+
9
+ ```javascript
10
+ import auth from '@ozdao/martyrs/modules/auth/client'
11
+ auth.initialize(app, store, router)
12
+ ```
13
+
14
+ Запрос с OTP-верификацией:
15
+
16
+ ```javascript
17
+ import { withOtp } from '@ozdao/martyrs/modules/auth/client'
18
+
19
+ const result = await withOtp(
20
+ (data) => axios.post('/api/auth/signup', data),
21
+ { email: 'user@example.com', password: '...' }
22
+ )
23
+ ```
24
+
25
+ ### Сервер
26
+
27
+ ```javascript
28
+ import auth from '@ozdao/martyrs/modules/auth/server'
29
+ auth.initialize(app, db, origins, publicPath)
30
+ ```
31
+
32
+ Защита роута OTP-верификацией:
33
+
34
+ ```javascript
35
+ import otpMiddleware from '@ozdao/martyrs/modules/auth/server'
36
+ const { stepUp } = otpMiddleware(db)
37
+
38
+ app.post('/api/sensitive',
39
+ stepUp('action-name', req => ({ identifier: req.body.email, type: 'email' })),
40
+ controller
41
+ )
42
+ ```
43
+
44
+ ## Architecture
45
+
46
+ ### Структура модуля
47
+
48
+ ```
49
+ auth/
50
+ ├── auth.server.js # Server entry point
51
+ ├── auth.client.js # Client entry point
52
+ ├── models/
53
+ │ ├── user.model.js # User schema
54
+ │ ├── otp.model.js # OTP challenges
55
+ │ └── role.model.js # Roles (user/admin/moderator)
56
+ ├── controllers/
57
+ │ ├── routes/
58
+ │ │ ├── auth.routes.js # /api/auth/* (signin, signup, reset-password)
59
+ │ │ └── users.routes.js # /api/users/* (profile, email, phone)
60
+ │ ├── services/
61
+ │ │ ├── auth.service.js # signin, signup, updatePassword
62
+ │ │ ├── users.service.js # CRUD пользователей
63
+ │ │ └── otp.service.js # OTP отправка/верификация (Singleton)
64
+ │ └── middlewares/
65
+ │ ├── authJwt.js # JWT verification, role checks
66
+ │ ├── otp.middleware.js # stepUp(), dualVerify()
67
+ │ ├── verifySignUp.js # Проверка дублей при регистрации
68
+ │ └── verifyUser.js # Ownership, duplicate checks
69
+ └── views/
70
+ ├── store/
71
+ │ ├── auth.js # Auth state (login, logout, initialize)
72
+ │ └── users.js # Users CRUD
73
+ ├── plugins/
74
+ │ └── otp.plugin.js # withOtp() + OtpDialog
75
+ ├── router/
76
+ │ ├── auth.router.js # /auth/signin, /auth/signup
77
+ │ └── users.router.js # /users/:_id/*
78
+ └── middlewares/
79
+ └── auth.validation.js # requiresAuth, requiresNoAuth guards
80
+ ```
81
+
82
+ ### JWT + Session Flow
83
+
84
+ ```
85
+ ┌─────────────────┐ ┌─────────────────┐
86
+ │ Client │ │ Server │
87
+ ├─────────────────┤ ├─────────────────┤
88
+ │ │ POST /api/auth/signin │ │
89
+ │ login() ───────┼────────────────────────►│ bcrypt.compare │
90
+ │ │ │ │ │
91
+ │ │ │ ▼ │
92
+ │ │ │ createSession │
93
+ │ │ │ │ │
94
+ │ │◄─ { accessToken, ... } ─│ ▼ │
95
+ │ │ │ jwt.sign() │
96
+ │ setCookie() ◄──┤ │ │
97
+ │ setAuthToken() │ │ │
98
+ │ │ │ │
99
+ │ │ GET /api/protected │ │
100
+ │ request ───────┼─ X-Access-Token: jwt ──►│ verifyToken() │
101
+ │ │ │ │ │
102
+ │ │ │ ▼ │
103
+ │ │ │ validateSession│
104
+ │ │◄────── response ────────│ │ │
105
+ │ │ │ ▼ │
106
+ │ │ │ controller │
107
+ └─────────────────┘ └─────────────────┘
108
+ ```
109
+
110
+ **Ключевые моменты:**
111
+ - Каждый login создаёт новую сессию в базе
112
+ - JWT содержит `{ _id, session_id }`
113
+ - `verifyToken()` валидирует и JWT, и сессию
114
+ - При смене пароля все сессии деактивируются
115
+
116
+ ### OTP Challenge Flow
117
+
118
+ ```
119
+ ┌─────────────────┐ ┌─────────────────┐
120
+ │ Клиент │ │ Сервер │
121
+ ├─────────────────┤ ├─────────────────┤
122
+ │ │ 1. POST /signup │ │
123
+ │ withOtp() ────┼───────────────────►│ stepUp() │
124
+ │ │ │ │ │
125
+ │ │◄─ requires_otp ────│ ▼ │
126
+ │ │ + challengeId │ sendOtp() │
127
+ │ OtpDialog ◄───┤ │ │
128
+ │ │ │ │ │
129
+ │ ▼ │ 2. POST + otp │ │
130
+ │ [код] ─────────┼───────────────────►│ verifyOtp() │
131
+ │ │ │ │ │
132
+ │ │◄─── success ───────│ ▼ │
133
+ │ │ │ controller │
134
+ └─────────────────┘ └─────────────────┘
135
+ ```
136
+
137
+ **Почему challenge-based:** OTP привязан к `challengeId`, а не к сессии. Это верифицирует операцию, а не пользователя — защита от CSRF и replay-атак.
138
+
139
+ ## API Reference
140
+
141
+ ### Server Middleware
142
+
143
+ #### stepUp(purpose, getCredentials)
144
+
145
+ Одиночная OTP-верификация. Используйте для: регистрации, сброса пароля, опасных действий.
146
+
147
+ ```javascript
148
+ stepUp('signup', req => ({
149
+ identifier: req.body.email, // куда слать код
150
+ type: 'email', // 'email' | 'phone'
151
+ target: req.userId // опционально, привязка к пользователю
152
+ }))
153
+ ```
154
+
155
+ #### dualVerify(field)
156
+
157
+ Двойная верификация при смене контакта. Код отправляется и на старый, и на новый контакт.
158
+
159
+ ```javascript
160
+ app.put('/api/users/:_id/email',
161
+ authJwt.verifyToken(),
162
+ dualVerify('email'),
163
+ controller
164
+ )
165
+ ```
166
+
167
+ #### authJwt.verifyToken(options?)
168
+
169
+ Проверяет JWT из header `X-Access-Token` или cookie.
170
+
171
+ ```javascript
172
+ // Обязательная авторизация
173
+ app.get('/api/protected', authJwt.verifyToken(), controller)
174
+
175
+ // Опциональная (не выбрасывает ошибку)
176
+ app.get('/api/public', authJwt.verifyToken({ continueOnFail: true }), controller)
177
+ ```
178
+
179
+ После проверки устанавливает `req.userId` и `req.sessionId`.
180
+
181
+ #### authJwt.loadUser
182
+
183
+ Загружает полный объект пользователя в `req.user`.
184
+
185
+ ```javascript
186
+ app.put('/api/users/:_id',
187
+ authJwt.verifyToken(),
188
+ authJwt.loadUser, // req.user теперь доступен
189
+ controller
190
+ )
191
+ ```
192
+
193
+ #### authJwt.isAdmin / isModerator
194
+
195
+ Проверяет роль пользователя.
196
+
197
+ ```javascript
198
+ app.delete('/api/users/:_id',
199
+ authJwt.verifyToken(),
200
+ authJwt.isAdmin, // 403 если не admin
201
+ controller
202
+ )
203
+ ```
204
+
205
+ ### Client API
206
+
207
+ #### withOtp(makeRequest, data)
208
+
209
+ Wrapper для запросов с OTP. Автоматически показывает диалог при `requires_otp`.
210
+
211
+ ```javascript
212
+ import { withOtp } from '@ozdao/martyrs/modules/auth/client'
213
+
214
+ // Single OTP
215
+ const result = await withOtp(
216
+ (data) => axios.post('/api/auth/signup', data),
217
+ { email, password }
218
+ )
219
+
220
+ // Dual OTP (смена контакта) — обрабатывается автоматически
221
+ const result = await withOtp(
222
+ (data) => axios.put(`/api/users/${_id}/email`, data),
223
+ { email: newEmail }
224
+ )
225
+ ```
226
+
227
+ #### store.auth
228
+
229
+ ```javascript
230
+ import { auth } from '@ozdao/martyrs/modules/auth/client'
231
+
232
+ // State
233
+ auth.state.user // { _id, email, phone, avatar, ... }
234
+ auth.state.access // { roles, token, status }
235
+
236
+ // Actions
237
+ await auth.initialize() // Загрузка из cookie при старте
238
+ await auth.login(credentials, 'email') // POST /api/auth/signin
239
+ await auth.signup(data, 'email', invite?) // POST /api/auth/signup с OTP
240
+ auth.logout() // Очистка + disconnect WebSocket
241
+ ```
242
+
243
+ #### store.users
244
+
245
+ ```javascript
246
+ import { users } from '@ozdao/martyrs/modules/auth/client'
247
+
248
+ // State
249
+ users.state.current // Текущий просматриваемый профиль
250
+ users.state.all // Список пользователей
251
+
252
+ // Actions
253
+ await users.read({ _id }) // GET /api/users?_id=...
254
+ await users.read({ search: 'query' }) // Поиск
255
+ await users.update(userData) // PUT /api/users/:_id (с OTP для email/phone)
256
+ await users.create(userData) // POST /api/users (admin)
257
+ ```
258
+
259
+ #### Route Guards
260
+
261
+ ```javascript
262
+ import { requiresAuth, requiresNoAuth } from '@ozdao/martyrs/modules/auth/client'
263
+
264
+ // Защищённый роут
265
+ {
266
+ path: '/dashboard',
267
+ component: Dashboard,
268
+ beforeEnter: requiresAuth // Редирект на /auth/signin если не авторизован
269
+ }
270
+
271
+ // Только для неавторизованных
272
+ {
273
+ path: '/auth/signin',
274
+ component: SignIn,
275
+ beforeEnter: requiresNoAuth // Редирект на /users/:_id если уже авторизован
276
+ }
277
+ ```
278
+
279
+ ## Integration
280
+
281
+ ### Зависимости от других модулей
282
+
283
+ ```
284
+ auth ──► core
285
+ ├── sessions.service # Создание/валидация сессий
286
+ ├── mailing # Отправка email/sms для OTP
287
+ └── ws.manager # Переподключение WebSocket при login
288
+
289
+ auth ──► organizations
290
+ └── check-accesses # Загрузка прав пользователя
291
+ ```
292
+
293
+ ### Использование auth в других модулях
294
+
295
+ ```javascript
296
+ // Защита роута с JWT
297
+ import { authJwt } from '@ozdao/martyrs/modules/auth/server'
298
+ app.post('/api/orders', authJwt.verifyToken(), createOrder)
299
+
300
+ // Защита с OTP
301
+ import { otp } from '@ozdao/martyrs/modules/auth/server'
302
+ app.post('/api/wallet/withdraw',
303
+ authJwt.verifyToken(),
304
+ otp.stepUp('withdraw', req => ({ identifier: req.user.email, type: 'email' })),
305
+ withdraw
306
+ )
307
+
308
+ // Клиент: проверка авторизации
309
+ import { auth } from '@ozdao/martyrs/modules/auth/client'
310
+ if (auth.state.access.status) {
311
+ // Пользователь авторизован
312
+ }
313
+ ```
314
+
315
+ ## Error Handling
316
+
317
+ | Код | Значение | Действие |
318
+ |-----|----------|----------|
319
+ | `RATE_LIMITED` | Слишком частые запросы | Показать таймер `retryAfter` сек |
320
+ | `INVALID_CODE` | Неверный код | Показать "Осталось попыток: `attemptsLeft`" |
321
+ | `CODE_NOT_FOUND` | OTP истёк или не найден | Запросить новый код |
322
+ | `ALREADY_USED` | Код уже использован | Запросить новый код |
323
+
324
+ ```javascript
325
+ try {
326
+ await withOtp(request, data)
327
+ } catch (error) {
328
+ if (error.response?.data?.errorCode === 'RATE_LIMITED') {
329
+ const seconds = error.response.data.retryAfter
330
+ showMessage(`Подождите ${seconds} секунд`)
331
+ }
332
+ }
333
+ ```
334
+
335
+ ## Security
336
+
337
+ | Параметр | Значение |
338
+ |----------|----------|
339
+ | Rate limit | 30 сек между запросами на один identifier |
340
+ | Попытки | Максимум 3 на один код |
341
+ | TTL | Код живёт 10 минут |
342
+ | Атомарность | `findOneAndUpdate` исключает race conditions |
343
+
344
+ ## Troubleshooting
345
+
346
+ ### JWT invalid или сессия не найдена
347
+
348
+ **Симптом:** 401 Unauthorized на защищённых роутах
349
+
350
+ **Причины:**
351
+ 1. Токен истёк (24 часа по умолчанию)
352
+ 2. Сессия деактивирована (например, после смены пароля)
353
+ 3. Cookie не передаётся (проблемы с CORS/credentials)
354
+
355
+ **Решение:**
356
+ ```javascript
357
+ // Клиент должен обрабатывать 401 и делать logout
358
+ axios.interceptors.response.use(
359
+ response => response,
360
+ error => {
361
+ if (error.response?.status === 401) {
362
+ auth.logout()
363
+ router.push('/auth/signin')
364
+ }
365
+ return Promise.reject(error)
366
+ }
367
+ )
368
+ ```
369
+
370
+ ### OTP не приходит
371
+
372
+ **Проверьте:**
373
+ 1. Rate limit — подождите 30 секунд
374
+ 2. Конфигурация mailing в core модуле
375
+ 3. Логи сервера на ошибки отправки
376
+
377
+ ### Dual OTP показывает только одно поле
378
+
379
+ **Причина:** У пользователя нет старого контакта (первое добавление email/phone)
380
+
381
+ **Это нормально:** При первом добавлении контакта верифицируется только новый.
@@ -1,41 +1,3 @@
1
- ### 1. **Нет OTP-сервиса — дублирование логики**
2
- - Сейчас генерация и отправка кодов реализована **в разных частях**: часть в `auth.service.js`, часть в `twofa.service.js`.
3
- - В будущем при добавлении новых каналов (WhatsApp, push и т.д.) это вызовет **хаос и дублирование**.
4
-
5
- 📌 **Решение:**
6
- Выделить `otp.service.js`, который:
7
- - генерирует код (общая логика),
8
- - сохраняет код (в временную коллекцию),
9
- - проверяет код,
10
- - можно вызывать для любого действия и вставлять мидллвар в ручки с проверкой на ввод кода иначе отказ
11
- - поддерживает каналы доставки (email, SMS и т.д.).
12
-
13
- ---
14
-
15
- ### 2. **Отсутствие полноценной сессии — только JWT**
16
- - Используются только JWT и куки, но нет **отвязки токенов от состояния на сервере**.
17
- - Нет поддержки:
18
- - logout с **ревокацией токена**,
19
- - множественных сессий (разные устройства),
20
- - деактивации токенов при смене пароля.
21
-
22
- 📌 **Решение:**
23
- Добавить:
24
- - Модель `Session` в базе,
25
- - Привязку JWT к `sessionId`,
26
- - Проверку `session.isActive === true` при валидации токена,
27
- - Хендлер `logout` — деактивация сессии,
28
- - Использовать вебсокеты для отображения онлайн, был в сети 15 секунд назад и так далее.
29
- - Очистку всех сессий при сбросе пароля.
30
-
31
- ---
32
-
33
- ### 3. **Логгер посетителей — лишний в auth**
34
- - `visitor.logger` — это **технический middleware**, но подключается прямо в `auth.server.js`. Модуль auth отвечает не только за аутентификацию и авторизацию, но и за учёт посетителей — ведь до входа в систему пользователь тоже считается «субъектом». Поэтому модели Visitor и Request логично оставлять внутри auth. Однако вместо простого подключения middleware логирования, нужно выделить отдельный сервис visitors.service, который будет управлять логикой работы с визитами и запросами: записью, обновлением, анализом. Модуль auth должен не только учитывать посетителей и их запросы через модели Visitor и Request, но и связывать эти данные с сессиями пользователей и их навигацией по приложению. Для этого сервис visitors.service обязан отслеживать пользовательские сессии, фиксировать последовательность посещённых страниц и действий (пользовательский путь), связывая это с конкретным посетителем или авторизованным пользователем. Такая связь позволит не просто собирать сырые логи, а анализировать поведение пользователей и состояние сессий в единой модели, что существенно расширит возможности аутентификации и безопасности без усложнения архитектуры.
35
-
36
- ---
37
-
38
-
39
1
  ### 5. **Непрозрачная интеграция с внешними провайдерами**
40
2
  - В `auth.service.js` логика Apple/Google логина встроена в `if`-блоки,
41
3
  - Нет абстракции: невозможно быстро подключить нового провайдера (напр. Discord, Telegram).
@@ -4,8 +4,8 @@ console.log('[LOADING 36] Auth module import started...');
4
4
 
5
5
  // Functional imports (needed for initialize function)
6
6
  import * as storeAuth from './views/store/auth.js';
7
- import * as storeTwofa from './views/store/twofa.js';
8
7
  import * as storeUsers from './views/store/users.js';
8
+ import otpPlugin from './views/plugins/otp.plugin.js';
9
9
 
10
10
  performance.mark('loading-36-stores-end');
11
11
  const storesTime = performance.measure('loading-36-stores', 'loading-36-start', 'loading-36-stores-end');
@@ -29,8 +29,6 @@ console.log(`[LOADING 36] Router/middleware/locales imports completed in ${impor
29
29
 
30
30
  // Component re-exports (enables tree shaking)
31
31
  export { default as Auth } from './views/components/layouts/Auth.vue';
32
- export { default as EnterCode } from './views/components/pages/EnterCode.vue';
33
- export { default as EnterPassword } from './views/components/pages/EnterPassword.vue';
34
32
  export { default as Invite } from './views/components/pages/Invite.vue';
35
33
  export { default as Profile } from './views/components/pages/Profile.vue';
36
34
  export { default as ProfileEdit } from './views/components/pages/ProfileEdit.vue';
@@ -51,9 +49,11 @@ function initializeAuth(app, store, router, options = {}) {
51
49
  addRoutes(router, { ...usersRoute.config, parentName: usersRoute.parentName });
52
50
 
53
51
  store.addStore('auth', storeAuth);
54
- store.addStore('twofa', storeTwofa);
55
52
  store.addStore('users', storeUsers);
56
53
 
54
+ // OTP plugin для challenge-response
55
+ app.use(otpPlugin);
56
+
57
57
  app.provide('store', store);
58
58
  }
59
59
 
@@ -62,7 +62,6 @@ const ModuleAuth = {
62
62
  views: {
63
63
  store: {
64
64
  storeAuth,
65
- storeTwofa,
66
65
  storeUsers,
67
66
  },
68
67
  router: {
@@ -78,7 +77,6 @@ const ModuleAuth = {
78
77
  // Functional exports
79
78
  export {
80
79
  storeAuth,
81
- storeTwofa,
82
80
  storeUsers,
83
81
  getAuthRoutes,
84
82
  getUsersRoutes,
@@ -1,43 +1,32 @@
1
- import visitors from '@martyrs/src/modules/auth/controllers/middlewares/visitor.logger.js';
2
1
  import authRoutes from './controllers/routes/auth.routes.js';
3
- import twofaRoutes from './controllers/routes/twofa.routes.js';
4
2
  import usersRoutes from './controllers/routes/users.routes.js';
5
3
  import AuthController from './controllers/services/auth.service.js';
6
- import TwoFaController from './controllers/services/twofa.service.js';
4
+ import { initOtpService } from './controllers/services/otp.service.js';
7
5
  import UsersController from './controllers/services/users.service.js';
8
- import RequestModel from './models/request.model.js';
9
6
  import RoleModel from './models/role.model.js';
10
7
  import UserModel from './models/user.model.js';
11
- import VisitorModel from './models/visitor.model.js';
8
+ import OtpModel from './models/otp.model.js';
12
9
 
13
10
  function initializeAuth(app, db, origins, publicPath) {
14
- // Настраиваем модели в объекте базы данных
15
11
  db.role = RoleModel(db);
16
12
  db.user = UserModel(db);
17
- db.visitor = VisitorModel(db);
18
- db.request = RequestModel(db);
19
- // Настраиваем маршруты, если объект приложения передан
13
+ db.otp = OtpModel(db);
14
+ initOtpService(db);
20
15
  if (app) {
21
16
  authRoutes(app, db, origins, publicPath);
22
- twofaRoutes(app, db, origins, publicPath);
23
17
  usersRoutes(app, db, origins, publicPath);
24
- const visitorModule = visitors(db);
25
- app.use(visitorModule.visitorLogger);
26
18
  }
27
19
  }
28
20
  export const models = {
29
21
  RoleModel,
30
22
  UserModel,
31
- VisitorModel,
32
23
  };
33
24
  export const routes = {
34
25
  authRoutes,
35
- twofaRoutes,
36
26
  usersRoutes,
37
27
  };
38
28
  export const controllers = {
39
29
  AuthController,
40
- TwoFaController,
41
30
  UsersController,
42
31
  };
43
32
  export { initializeAuth as initialize };
@@ -1,55 +1,77 @@
1
1
  import jwt from 'jsonwebtoken';
2
+ import { getSessionsService } from '@martyrs/src/modules/core/controllers/services/sessions.service.js';
2
3
 
3
4
  const middlewareFactory = db => {
4
-
5
+
5
6
  const User = db.user;
6
7
  const Role = db.role;
7
-
8
+
8
9
  const verifyToken = (continueOnFail = false) => {
9
-
10
+
10
11
  return async (req, res, next) => {
11
-
12
+
12
13
  try {
13
14
  let token = req.headers['x-access-token'];
14
-
15
+
15
16
  if (!token && req.cookies && req.cookies.user) {
16
17
  let user = JSON.parse(req.cookies.user);
17
18
  token = user.accessToken;
18
19
  }
19
-
20
+
20
21
  if (req.headers['x-service-key']) {
21
22
  const serviceKey = req.headers['x-service-key'];
22
23
  const validServiceKey = process.env.SERVICE_KEY;
23
-
24
+
24
25
  if (serviceKey !== validServiceKey) {
25
26
  return res.status(403).send({ message: 'Unauthorized: Invalid service key' });
26
27
  }
27
-
28
+
28
29
  req.isServiceRequest = true;
29
30
  return next();
30
31
  }
31
-
32
+
32
33
  if (!token) {
33
34
  req.userId = null;
34
-
35
+
35
36
  if (continueOnFail) {
36
37
  return next();
37
38
  } else {
38
39
  return res.status(401).send({ message: 'Unauthorized: No token provided' });
39
40
  }
40
41
  }
41
-
42
+
42
43
  const decoded = jwt.verify(token, process.env.SECRET_KEY);
43
-
44
+
45
+ // Validate session
46
+ if (decoded.session_id) {
47
+ const sessionsService = getSessionsService();
48
+ const session = await sessionsService.validateSession({
49
+ sessionId: decoded.session_id,
50
+ userId: decoded._id,
51
+ });
52
+
53
+ if (!session) {
54
+ req.userId = null;
55
+ if (continueOnFail) {
56
+ return next();
57
+ } else {
58
+ return res.status(401).send({ message: 'Unauthorized: Session expired or revoked' });
59
+ }
60
+ }
61
+
62
+ req.sessionId = decoded.session_id;
63
+ }
64
+
44
65
  req.userId = decoded._id;
66
+
45
67
  req.user = {
46
68
  _id: decoded._id,
47
69
  };
48
-
70
+
49
71
  next();
50
72
  } catch (err) {
51
73
  req.userId = null;
52
-
74
+
53
75
  if (continueOnFail) {
54
76
  next();
55
77
  } else {
@@ -58,11 +80,29 @@ const middlewareFactory = db => {
58
80
  }
59
81
  };
60
82
  };
83
+
84
+ const loadUser = async (req, res, next) => {
85
+ try {
86
+ if (!req.userId) {
87
+ return res.status(401).json({ errorCode: 'AUTH_REQUIRED' });
88
+ }
89
+ const user = await User.findById(req.userId).exec();
90
+ if (!user) {
91
+ return res.status(404).json({ errorCode: 'USER_NOT_FOUND' });
92
+ }
93
+ req.user = user;
94
+ next();
95
+ } catch (err) {
96
+ res.status(500).send({ message: err.message });
97
+ }
98
+ };
99
+
61
100
 
62
101
  const checkRole = roleToCheck => async (req, res, next) => {
63
102
 
64
103
  try {
65
104
  const user = await User.findById(req.userId).exec();
105
+
66
106
  if (!user) {
67
107
  console.log('[CheckRole] User not found');
68
108
  return res.status(404).send({ message: 'User Not found.' });
@@ -84,13 +124,15 @@ const middlewareFactory = db => {
84
124
 
85
125
  const isAdmin = checkRole('admin');
86
126
  const isModerator = checkRole('moderator');
87
-
127
+
128
+
88
129
  const authJwt = {
89
130
  verifyToken,
131
+ loadUser,
90
132
  isAdmin,
91
- isModerator,
133
+ isModerator
92
134
  };
93
-
135
+
94
136
  return authJwt;
95
137
  };
96
138
 
@@ -4,6 +4,7 @@ import authSecretModule from './authSecret.js';
4
4
  import verifySignUpModule from './verifySignUp.js';
5
5
  import verifyUserModule from './verifyUser.js';
6
6
  import verifyInvitesModule from './verifyInvites.js';
7
+ import otpModule from './otp.middleware.js';
7
8
 
8
9
  const middlewareIndexFactory = db => {
9
10
  const authJwt = authJwtModule(db);
@@ -11,13 +12,15 @@ const middlewareIndexFactory = db => {
11
12
  const verifySignUp = verifySignUpModule(db);
12
13
  const verifyUser = verifyUserModule(db);
13
14
  const verifyInvites = verifyInvitesModule(db);
14
-
15
+ const otp = otpModule();
16
+
15
17
  return {
16
18
  authJwt,
17
19
  authSecret,
18
20
  verifySignUp,
19
21
  verifyUser,
20
22
  verifyInvites,
23
+ otp,
21
24
  };
22
25
  };
23
26