@ozdao/martyrs 0.2.584 → 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.
- package/dist/auth.server.js +161 -96
- package/dist/{authJwt-J1csaMWA.js → authJwt-DKbMMjw0.js} +33 -0
- package/dist/builder.js +2 -0
- package/dist/chats.server.js +2 -2
- package/dist/community.server.js +1 -1
- package/dist/core.server.js +191 -2
- package/dist/{core.websocket-C2FxNmZ1.js → core.websocket-Cl76z2wT.js} +41 -5
- package/dist/{crud-q1ye5IhV.js → crud-DpOXTZep.js} +1 -1
- package/dist/events.server.js +2 -2
- package/dist/files.server.js +1 -1
- package/dist/gallery.server.js +1 -1
- package/dist/index-kvBwwb0w.js +427 -0
- package/dist/inventory.server.js +2 -2
- package/dist/{mailing-DuEFRsa3.js → mailing-DT7nbNjZ.js} +16 -3
- package/dist/{main-fmp55tJF.js → main-BIf-WirR.js} +864 -865
- package/dist/marketplace.server.js +1 -1
- package/dist/martyrs/dist/{main-fmp55tJF.js → main-BIf-WirR.js} +193 -38
- package/dist/martyrs/dist/main-BIf-WirR.js.map +1 -0
- package/dist/martyrs/dist/{web-BDuQSQKS.js → web-O7lXcjg0.js} +2 -2
- package/dist/martyrs/dist/{web-BDuQSQKS.js.map → web-O7lXcjg0.js.map} +1 -1
- package/dist/martyrs/src/components/Button/{Button.vue2.js → Button.vue.js} +8 -7
- package/dist/martyrs/src/components/Button/Button.vue.js.map +1 -0
- package/dist/martyrs/src/components/EditImages/{EditImages.vue2.js → EditImages.vue.js} +2 -2
- package/dist/martyrs/src/components/EditImages/EditImages.vue.js.map +1 -0
- package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +1 -1
- package/dist/martyrs/src/components/Loader/Loader.vue.js +1 -1
- package/dist/martyrs/src/components/Loader/Loader.vue.js.map +1 -1
- package/dist/martyrs/src/components/Spoiler/{Spoiler.vue2.js → Spoiler.vue.js} +2 -2
- package/dist/martyrs/src/components/Spoiler/Spoiler.vue.js.map +1 -0
- package/dist/martyrs/src/components/Tab/{Tab.vue.js → Tab.vue2.js} +2 -2
- package/dist/martyrs/src/components/Tab/Tab.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Tooltip/Tooltip.vue2.js +17 -22
- package/dist/martyrs/src/components/Tooltip/Tooltip.vue2.js.map +1 -1
- package/dist/martyrs/src/modules/auth/auth.client.js +18 -24
- package/dist/martyrs/src/modules/auth/auth.client.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/blocks/OtpDialog.vue.js +178 -0
- package/dist/martyrs/src/modules/auth/views/components/blocks/OtpDialog.vue.js.map +1 -0
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +104 -77
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +198 -14
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +71 -30
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +3 -3
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +87 -31
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/plugins/otp.plugin.js +100 -0
- package/dist/martyrs/src/modules/auth/views/plugins/otp.plugin.js.map +1 -0
- package/dist/martyrs/src/modules/auth/views/router/auth.router.js +2 -31
- package/dist/martyrs/src/modules/auth/views/router/auth.router.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/router/users.router.js +0 -14
- package/dist/martyrs/src/modules/auth/views/router/users.router.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.js +1 -56
- package/dist/martyrs/src/modules/auth/views/store/auth.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/store/users.js +5 -1
- package/dist/martyrs/src/modules/auth/views/store/users.js.map +1 -1
- package/dist/martyrs/src/modules/backoffice/backoffice.client.js +3 -15
- package/dist/martyrs/src/modules/backoffice/backoffice.client.js.map +1 -1
- package/dist/martyrs/src/modules/backoffice/configs/navigation.backoffice.config.js +99 -0
- package/dist/martyrs/src/modules/backoffice/configs/navigation.backoffice.config.js.map +1 -0
- package/dist/martyrs/src/modules/backoffice/{backoffice.router.js → router/backoffice.router.js} +9 -7
- package/dist/martyrs/src/modules/backoffice/router/backoffice.router.js.map +1 -0
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +7 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/core/core.client.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/classes/core.app.js +5 -1
- package/dist/martyrs/src/modules/core/views/classes/core.app.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +0 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupAuth.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/elements/OnlineIndicator.vue.js +74 -0
- package/dist/martyrs/src/modules/core/views/components/elements/OnlineIndicator.vue.js.map +1 -0
- package/dist/martyrs/src/modules/core/views/components/layouts/App.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +77 -67
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/pages/404.vue.js +76 -7
- package/dist/martyrs/src/modules/core/views/components/pages/404.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Navigation.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/{Filters.vue2.js → Filters.vue.js} +2 -2
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue.js.map +1 -0
- package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/store/core.store.js +1 -0
- package/dist/martyrs/src/modules/core/views/store/core.store.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js +2 -1
- package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +2 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +0 -1
- package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/FullscreenPlayer.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/PlayerControls.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +1 -1
- package/dist/martyrs/src/modules/notifications/components/sections/NotificationPreferences.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +1 -2
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +4 -3
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -2
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -2
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js.map +1 -1
- package/dist/martyrs/src/modules/pages/pages.router.js +7 -5
- package/dist/martyrs/src/modules/pages/pages.router.js.map +1 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +0 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js.map +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +0 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +1 -2
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +4 -4
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +2 -2
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +2 -2
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/music.server.js +1 -1
- package/dist/notifications.server.js +1 -1
- package/dist/orders.server.js +7 -6
- package/dist/organizations.server.js +2 -2
- package/dist/products.server.js +2 -2
- package/dist/profile.schema-C31Lynn3.js +21 -0
- package/dist/rents.server.js +1 -1
- package/dist/sessions.service-COcwjd0f.js +86 -0
- package/dist/style.css +183 -108
- package/dist/{tickets.controller-B7r0mK-5.js → tickets.controller-DdF85W-i.js} +1 -1
- package/dist/visitors.service-B1dhhuSo.js +83 -0
- package/dist/wallet.server.js +2 -2
- package/dist/{web-BDuQSQKS.js → web-O7lXcjg0.js} +1 -1
- package/package.json +5 -1
- package/src/builder/modes/ssr.rspack.dev.js +2 -0
- package/src/cli/commands/create.js +106 -0
- package/src/cli/index.js +25 -0
- package/src/cli/templates/app/.env.development.mustache +14 -0
- package/src/cli/templates/app/.env.production.mustache +14 -0
- package/src/cli/templates/app/Dockerfile +36 -0
- package/src/cli/templates/app/babel.config.js +14 -0
- package/src/cli/templates/app/env.js +3 -0
- package/src/cli/templates/app/index.js +46 -0
- package/src/cli/templates/app/mongodb.config.js +18 -0
- package/src/cli/templates/app/package.json.mustache +65 -0
- package/src/cli/templates/app/src/client.js +22 -0
- package/src/cli/templates/app/src/components/pages/Index.vue +11 -0
- package/src/cli/templates/app/src/configs/global.config.js.mustache +40 -0
- package/src/cli/templates/app/src/localization/extensions.js +2 -0
- package/src/cli/templates/app/src/localization/index.js +44 -0
- package/src/cli/templates/app/src/localization/overrides.js +2 -0
- package/src/cli/templates/app/src/localization/translations.js +10 -0
- package/src/cli/templates/app/src/models/index.js +9 -0
- package/src/cli/templates/app/src/router/index.js +48 -0
- package/src/cli/templates/app/src/scss/theme.scss +18 -0
- package/src/cli/templates/app/src/server.js +68 -0
- package/src/cli/templates/app/src/store/index.js +9 -0
- package/src/cli/templates/docker-compose.yaml.mustache +47 -0
- package/src/cli/templates/nginx/Dockerfile +5 -0
- package/src/cli/templates/nginx/default.conf.mustache +55 -0
- package/src/cli/templates/public/favicon/.gitkeep +0 -0
- package/src/cli/templates/start-dev.sh.mustache +131 -0
- package/src/cli/templates/start-prod.sh.mustache +12 -0
- package/src/components/Button/Button.vue +61 -15
- package/src/components/Loader/Loader.vue +1 -1
- package/src/components/Tooltip/Tooltip.vue +31 -23
- package/src/modules/TASKS.MD +30 -1
- package/src/modules/auth/CLAUDE.md +381 -0
- package/src/modules/auth/FIXES.md +0 -38
- package/src/modules/auth/auth.client.js +4 -6
- package/src/modules/auth/auth.server.js +4 -15
- package/src/modules/auth/controllers/middlewares/authJwt.js +59 -17
- package/src/modules/auth/controllers/middlewares/index.js +4 -1
- package/src/modules/auth/controllers/middlewares/otp.middleware.js +166 -0
- package/src/modules/auth/controllers/middlewares/verifySignUp.js +0 -1
- package/src/modules/auth/controllers/middlewares/verifyUser.js +58 -11
- package/src/modules/auth/controllers/routes/auth.routes.js +48 -6
- package/src/modules/auth/controllers/routes/users.routes.js +29 -8
- package/src/modules/auth/controllers/services/auth.service.js +62 -12
- package/src/modules/auth/controllers/services/otp.service.js +109 -0
- package/src/modules/auth/controllers/services/users.service.js +46 -6
- package/src/modules/auth/models/otp.model.js +20 -0
- package/src/modules/auth/views/components/blocks/OtpDialog.vue +168 -0
- package/src/modules/auth/views/components/pages/Profile.vue +51 -18
- package/src/modules/auth/views/components/pages/ProfileEditAccount.vue +199 -45
- package/src/modules/auth/views/components/pages/ResetPassword.vue +170 -132
- package/src/modules/auth/views/components/pages/SignIn.vue +2 -1
- package/src/modules/auth/views/components/pages/SignUp.vue +203 -147
- package/src/modules/auth/views/plugins/otp.plugin.js +104 -0
- package/src/modules/auth/views/router/auth.router.js +1 -24
- package/src/modules/auth/views/router/users.router.js +1 -12
- package/src/modules/auth/views/store/auth.js +0 -68
- package/src/modules/auth/views/store/users.js +6 -2
- package/src/modules/backoffice/backoffice.client.js +1 -25
- package/src/modules/backoffice/configs/navigation.backoffice.config.js +99 -0
- package/src/modules/backoffice/router/backoffice.router.js +8 -7
- package/src/modules/community/components/pages/BlogPost.vue +9 -1
- package/src/modules/core/controllers/classes/core.websocket.js +57 -6
- package/src/modules/core/controllers/middlewares/visitor.logger.js +49 -0
- package/src/modules/core/controllers/services/requests.service.js +53 -0
- package/src/modules/core/controllers/services/sessions.service.js +98 -0
- package/src/modules/core/controllers/services/visitors.service.js +102 -0
- package/src/modules/core/controllers/utils/mailing.js +16 -3
- package/src/modules/core/core.client.js +1 -0
- package/src/modules/core/core.server.js +45 -3
- package/src/modules/core/models/request.model.js +30 -0
- package/src/modules/core/models/session.model.js +43 -0
- package/src/modules/core/models/visitor.model.js +28 -0
- package/src/modules/core/views/classes/core.app.js +8 -3
- package/src/modules/core/views/components/elements/OnlineIndicator.vue +115 -0
- package/src/modules/core/views/components/layouts/App.vue +2 -2
- package/src/modules/core/views/components/layouts/Client.vue +444 -479
- package/src/modules/core/views/components/pages/404.vue +55 -3
- package/src/modules/core/views/store/core.store.js +1 -0
- package/src/modules/core/views/utils/vue-app-renderer.js +9 -1
- package/src/modules/orders/controllers/orders.controller.js +3 -3
- package/src/modules/pages/pages.router.js +4 -2
- package/src/modules/pages/views/router/pages.backoffice.router.js +4 -3
- package/src/modules/products/components/pages/Products.vue +1 -1
- package/dist/_virtual/alignment-pattern.js +0 -5
- package/dist/_virtual/alignment-pattern.js.map +0 -1
- package/dist/_virtual/browser.js +0 -8
- package/dist/_virtual/browser.js.map +0 -1
- package/dist/_virtual/browser2.js +0 -5
- package/dist/_virtual/browser2.js.map +0 -1
- package/dist/_virtual/canvas.js +0 -5
- package/dist/_virtual/canvas.js.map +0 -1
- package/dist/_virtual/dijkstra.js +0 -5
- package/dist/_virtual/dijkstra.js.map +0 -1
- package/dist/_virtual/error-correction-code.js +0 -5
- package/dist/_virtual/error-correction-code.js.map +0 -1
- package/dist/_virtual/error-correction-level.js +0 -5
- package/dist/_virtual/error-correction-level.js.map +0 -1
- package/dist/_virtual/finder-pattern.js +0 -5
- package/dist/_virtual/finder-pattern.js.map +0 -1
- package/dist/_virtual/format-info.js +0 -5
- package/dist/_virtual/format-info.js.map +0 -1
- package/dist/_virtual/galois-field.js +0 -5
- package/dist/_virtual/galois-field.js.map +0 -1
- package/dist/_virtual/mask-pattern.js +0 -5
- package/dist/_virtual/mask-pattern.js.map +0 -1
- package/dist/_virtual/mode.js +0 -5
- package/dist/_virtual/mode.js.map +0 -1
- package/dist/_virtual/polynomial.js +0 -5
- package/dist/_virtual/polynomial.js.map +0 -1
- package/dist/_virtual/qrcode.js +0 -5
- package/dist/_virtual/qrcode.js.map +0 -1
- package/dist/_virtual/regex.js +0 -5
- package/dist/_virtual/regex.js.map +0 -1
- package/dist/_virtual/segments.js +0 -5
- package/dist/_virtual/segments.js.map +0 -1
- package/dist/_virtual/svg-tag.js +0 -5
- package/dist/_virtual/svg-tag.js.map +0 -1
- package/dist/_virtual/utils.js +0 -5
- package/dist/_virtual/utils.js.map +0 -1
- package/dist/_virtual/utils2.js +0 -5
- package/dist/_virtual/utils2.js.map +0 -1
- package/dist/_virtual/version-check.js +0 -5
- package/dist/_virtual/version-check.js.map +0 -1
- package/dist/_virtual/version.js +0 -5
- package/dist/_virtual/version.js.map +0 -1
- package/dist/index-_Edcmck_.js +0 -170
- package/dist/martyrs/dist/main-fmp55tJF.js.map +0 -1
- package/dist/martyrs/node_modules/.pnpm/bignumber.js@9.1.2/node_modules/bignumber.js/bignumber.js +0 -1336
- package/dist/martyrs/node_modules/.pnpm/bignumber.js@9.1.2/node_modules/bignumber.js/bignumber.js.map +0 -1
- package/dist/martyrs/src/components/Button/Button.vue2.js.map +0 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Spoiler/Spoiler.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Tab/Tab.vue.js.map +0 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +0 -166
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js.map +0 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +0 -118
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js.map +0 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +0 -360
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js.map +0 -1
- package/dist/martyrs/src/modules/auth/views/store/twofa.js +0 -40
- package/dist/martyrs/src/modules/auth/views/store/twofa.js.map +0 -1
- package/dist/martyrs/src/modules/backoffice/backoffice.router.js.map +0 -1
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js +0 -150
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js.map +0 -1
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardBalanceReplenished.vue.js +0 -43
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardBalanceReplenished.vue.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js +0 -47
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CashDeposit.vue.js +0 -29
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CashDeposit.vue.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +0 -89
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDepositProcessing.vue.js +0 -136
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDepositProcessing.vue.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +0 -238
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/localization/wallet.json.js +0 -9
- package/dist/martyrs/src/modules/wallet/views/localization/wallet.json.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/store/wallet.store.js +0 -134
- package/dist/martyrs/src/modules/wallet/views/store/wallet.store.js.map +0 -1
- package/dist/node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js +0 -106
- package/dist/node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js +0 -79
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js +0 -14
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js +0 -43
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -85
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js +0 -40
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js +0 -34
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js +0 -36
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js +0 -367
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js +0 -52
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js +0 -25
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js +0 -24
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js +0 -38
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js +0 -46
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js +0 -149
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js +0 -90
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js +0 -41
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js +0 -44
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js +0 -279
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -38
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js +0 -33
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js +0 -201
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js +0 -84
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js +0 -14
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js +0 -107
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js +0 -61
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js +0 -64
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js +0 -87
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js.map +0 -1
- package/dist/profile.schema-CjLOfG7b.js +0 -92
- package/src/modules/auth/controllers/middlewares/visitor.logger.js +0 -75
- package/src/modules/auth/controllers/routes/twofa.routes.js +0 -8
- package/src/modules/auth/controllers/services/twofa.service.js +0 -30
- package/src/modules/auth/models/request.model.js +0 -14
- package/src/modules/auth/models/visitor.model.js +0 -11
- package/src/modules/auth/views/components/pages/EnterCode.vue +0 -204
- package/src/modules/auth/views/components/pages/EnterPassword.vue +0 -123
- package/src/modules/auth/views/components/sections/ProfileEditCredentials.vue +0 -329
- package/src/modules/auth/views/store/twofa.js +0 -70
- 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
- package/src/modules/backoffice/backoffice.router.js +0 -69
- package/src/modules/backoffice/components/partials/Sidebar.vue +0 -165
|
@@ -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
|
|
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
|
|
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.
|
|
18
|
-
|
|
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
|
|