@ozdao/martyrs 0.2.518 → 0.2.520
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/_virtual/index.cjs +4 -4
- package/dist/_virtual/index.js +4 -4
- package/dist/_virtual/index2.cjs +4 -4
- package/dist/_virtual/index2.js +4 -4
- package/dist/{abac-Cf_9lCSh.js → abac-CnJsrv8S.js} +3 -3
- package/dist/{abac-6LjoG9u-.cjs → abac-DOyUjhee.cjs} +3 -3
- package/dist/builder.cjs +27 -25
- package/dist/builder.js +27 -25
- package/dist/chats.server.cjs +198 -1
- package/dist/chats.server.js +198 -1
- package/dist/{crud-sE7GLPbj.js → crud-BIFl1W1i.js} +6 -6
- package/dist/{crud-JN_LFj01.cjs → crud-CC6k6yY5.cjs} +6 -6
- package/dist/{globals.logger-CZMgIMlM.cjs → globals.logger-BuW7JHMY.cjs} +63 -53
- package/dist/{globals.logger-Bf6rRU7j.js → globals.logger-VRHh-WUW.js} +63 -53
- package/dist/{globals.observer-CV2wCzzh.cjs → globals.observer-C_FYclgV.cjs} +36 -1
- package/dist/{globals.observer-CDqUjVU5.js → globals.observer-MZsqaE6F.js} +36 -1
- package/dist/globals.server.cjs +1 -1
- package/dist/globals.server.js +1 -1
- package/dist/inventory.server.cjs +276 -376
- package/dist/inventory.server.js +276 -376
- package/dist/main-BM3GslOO.cjs +11 -0
- package/dist/{main-wmEhGVvD.js → main-Qcn7YlTx.js} +1834 -1830
- package/dist/martyrs/src/components/Address/{Address.vue2.cjs → Address.vue.cjs} +2 -2
- package/dist/martyrs/src/components/Address/{Address.vue2.js.map → Address.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/Address/{Address.vue2.js → Address.vue.js} +2 -2
- package/dist/martyrs/src/components/Address/Address.vue.js.map +1 -0
- package/dist/martyrs/src/components/Button/Button.vue.cjs +1 -1
- package/dist/martyrs/src/components/Button/Button.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/Button/Button.vue.js +1 -1
- package/dist/martyrs/src/components/Button/Button.vue.js.map +1 -1
- package/dist/martyrs/src/components/Chips/{Chips.vue.cjs → Chips.vue2.cjs} +2 -2
- package/dist/martyrs/src/components/Chips/Chips.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/Chips/{Chips.vue.js → Chips.vue2.js} +2 -2
- package/dist/martyrs/src/components/Chips/Chips.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.cjs → Dropdown.vue2.cjs} +2 -2
- package/dist/martyrs/src/components/Dropdown/Dropdown.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.js → Dropdown.vue2.js} +2 -2
- package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.cjs.map → Dropdown.vue2.js.map} +1 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue.cjs +0 -93
- package/dist/martyrs/src/components/EditImages/EditImages.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue.js +1 -94
- package/dist/martyrs/src/components/EditImages/EditImages.vue.js.map +1 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.cjs +93 -0
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.cjs.map +1 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.js +94 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.js.map +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs +2 -3
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js +2 -3
- package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
- package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +1 -1
- package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +1 -1
- package/dist/martyrs/src/components/Loader/Loader.vue2.cjs +1 -1
- package/dist/martyrs/src/components/Loader/Loader.vue2.cjs.map +1 -1
- package/dist/martyrs/src/components/Loader/Loader.vue2.js +1 -1
- package/dist/martyrs/src/components/Loader/Loader.vue2.js.map +1 -1
- package/dist/martyrs/src/components/LocationMarker/{LocationMarker.vue2.cjs → LocationMarker.vue.cjs} +2 -2
- package/dist/martyrs/src/components/LocationMarker/{LocationMarker.vue2.js.map → LocationMarker.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/LocationMarker/{LocationMarker.vue2.js → LocationMarker.vue.js} +2 -2
- package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue.js.map +1 -0
- package/dist/martyrs/src/components/Select/{Select.vue2.cjs → Select.vue.cjs} +2 -2
- package/dist/martyrs/src/components/Select/{Select.vue2.js.map → Select.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/Select/{Select.vue2.js → Select.vue.js} +2 -2
- package/dist/martyrs/src/components/Select/Select.vue.js.map +1 -0
- package/dist/martyrs/src/modules/auth/views/components/blocks/CardUser.vue.cjs +2 -2
- package/dist/martyrs/src/modules/auth/views/components/blocks/CardUser.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +4 -4
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +41 -51
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +59 -69
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.cjs +11 -13
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.js +11 -13
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.cjs +10 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.js +10 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.js.map +1 -1
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.cjs +6 -0
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js +6 -0
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.cjs +27 -11
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.js +28 -12
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.js.map +1 -1
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.cjs +62 -0
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.js +63 -1
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.js.map +1 -1
- package/dist/martyrs/src/modules/chats/store/chat.store.cjs +60 -1
- package/dist/martyrs/src/modules/chats/store/chat.store.cjs.map +1 -1
- package/dist/martyrs/src/modules/chats/store/chat.store.js +60 -1
- package/dist/martyrs/src/modules/chats/store/chat.store.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.cjs +1 -1
- package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.cjs +3 -3
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +3 -3
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +2 -2
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +2 -2
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.cjs +50 -368
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.js +53 -371
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +2 -3
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +2 -3
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.cjs +2 -2
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.js.map +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +3 -3
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +3 -3
- package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +2 -2
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +2 -2
- package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.cjs +2 -2
- package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.js +2 -2
- package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.js.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/LocationSelection.vue.cjs +2 -2
- package/dist/martyrs/src/modules/globals/views/components/partials/LocationSelection.vue.js +2 -2
- package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Sidebar.vue.cjs +16 -3
- package/dist/martyrs/src/modules/globals/views/components/partials/Sidebar.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Sidebar.vue.js +17 -4
- package/dist/martyrs/src/modules/globals/views/components/partials/Sidebar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/sections/Walkthrough.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/mixins/mixins.cjs +7 -0
- package/dist/martyrs/src/modules/globals/views/mixins/mixins.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/mixins/mixins.js +7 -0
- package/dist/martyrs/src/modules/globals/views/mixins/mixins.js.map +1 -1
- package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.cjs +67 -43
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +68 -44
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.cjs +22 -7
- package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js +23 -8
- package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.cjs +47 -32
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +48 -33
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.cjs +47 -26
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +48 -27
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs +42 -52
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js +43 -53
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs +18 -18
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/store/{ inventory.store.cjs → inventory.store.cjs} +46 -2
- package/dist/martyrs/src/modules/inventory/store/inventory.store.cjs.map +1 -0
- package/dist/martyrs/src/modules/inventory/store/{ inventory.store.js → inventory.store.js} +46 -2
- package/dist/martyrs/src/modules/inventory/store/inventory.store.js.map +1 -0
- package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.cjs +180 -19
- package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.js +181 -20
- package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.cjs +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.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs +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.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +1 -1
- package/dist/martyrs/src/modules/music/router/music.cjs +1 -2
- package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/router/music.js +1 -2
- package/dist/martyrs/src/modules/music/router/music.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.cjs +2 -2
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.cjs +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.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +3 -4
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +3 -4
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/orders.client.cjs +2 -2
- package/dist/martyrs/src/modules/orders/orders.client.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/orders.client.js +2 -2
- package/dist/martyrs/src/modules/orders/orders.client.js.map +1 -1
- package/dist/martyrs/src/modules/orders/router/customers.router.cjs +1 -1
- package/dist/martyrs/src/modules/orders/router/customers.router.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/router/customers.router.js +1 -1
- package/dist/martyrs/src/modules/orders/router/customers.router.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.cjs +2 -24
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +5 -27
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Socials.vue.cjs +4 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Socials.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Socials.vue.js +4 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Socials.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.cjs +3 -3
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +3 -3
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.cjs +195 -0
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +195 -0
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.cjs +402 -0
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +402 -0
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.cjs +86 -0
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +86 -0
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.cjs +10 -10
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +11 -11
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +279 -191
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +285 -197
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +7 -7
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +7 -7
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +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.cjs +3 -3
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +3 -3
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Publics.vue.cjs +4 -4
- package/dist/martyrs/src/modules/organizations/components/sections/Publics.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Publics.vue.js +4 -4
- package/dist/martyrs/src/modules/organizations/components/sections/Publics.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.cjs +42 -41
- package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.js +53 -52
- package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/organizations.client.cjs +23 -16
- package/dist/martyrs/src/modules/organizations/organizations.client.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/organizations.client.js +35 -28
- package/dist/martyrs/src/modules/organizations/organizations.client.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/router/departments.router.cjs +0 -18
- package/dist/martyrs/src/modules/organizations/router/departments.router.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/router/departments.router.js +0 -18
- package/dist/martyrs/src/modules/organizations/router/departments.router.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/store/departments.store.cjs +6 -0
- package/dist/martyrs/src/modules/organizations/store/departments.store.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/departments.store.js +6 -0
- package/dist/martyrs/src/modules/organizations/store/departments.store.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/invites.store.cjs +6 -0
- package/dist/martyrs/src/modules/organizations/store/invites.store.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/invites.store.js +6 -0
- package/dist/martyrs/src/modules/organizations/store/invites.store.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/memberships.store.cjs +20 -0
- package/dist/martyrs/src/modules/organizations/store/memberships.store.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/memberships.store.js +20 -0
- package/dist/martyrs/src/modules/organizations/store/memberships.store.js.map +1 -0
- package/dist/martyrs/src/modules/products/components/blocks/ProductDiscounts.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/ProductDiscounts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +3 -4
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +3 -4
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +2 -2
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.cjs +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.cjs +2 -2
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +2 -2
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.cjs +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.cjs +3 -3
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js +3 -3
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +3 -3
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.cjs +60 -272
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js +62 -274
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.cjs +4 -4
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +4 -4
- package/dist/martyrs.cjs.js +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/music.server.cjs +9 -9
- package/dist/music.server.js +9 -9
- package/dist/notifications.server.cjs +0 -24
- package/dist/notifications.server.js +0 -24
- package/dist/orders.server.cjs +3 -6
- package/dist/orders.server.js +3 -6
- package/dist/organizations.server.cjs +119 -43
- package/dist/organizations.server.js +119 -43
- package/dist/products.server.cjs +5 -5
- package/dist/products.server.js +5 -5
- package/dist/rents.server.cjs +3 -3
- package/dist/rents.server.js +3 -3
- package/dist/style.css +16 -17
- package/dist/wallet.server.cjs +2 -2
- package/dist/wallet.server.js +2 -2
- package/dist/{web-B5wZTKbK.cjs → web-B0cfxzgu.cjs} +1 -1
- package/dist/{web-520xCgXy.js → web-DVR8m2fm.js} +1 -1
- package/package.json +1 -1
- package/src/builder/modes/ssr.rspack.dev.js +20 -12
- package/src/builder/rspack/rspack.config.base.js +16 -15
- package/src/components/Button/Button.vue +1 -1
- package/src/components/Feed/Feed.old.vue +0 -1
- package/src/components/Feed/Feed.vue +1 -31
- package/src/components/Loader/Loader.vue +1 -1
- package/src/modules/auth/FIXES.md +61 -0
- package/src/modules/auth/PROMT.md +33 -0
- package/src/modules/auth/auth.server.js +1 -0
- package/src/modules/auth/views/components/blocks/CardUser.vue +2 -2
- package/src/modules/auth/views/components/layouts/Auth.vue +1 -1
- package/src/modules/auth/views/components/pages/Invite.vue +2 -2
- package/src/modules/auth/views/components/pages/Profile.vue +33 -48
- package/src/modules/auth/views/components/sections/SliderFeatures.vue +5 -7
- package/src/modules/auth/views/store/auth.js +16 -1
- 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 +445 -0
- package/src/modules/backoffice/components/partials/Sidebar.vue +6 -0
- package/src/modules/chats/CLAUDE.md +137 -0
- package/src/modules/chats/components/blocks/ChatMessage.vue +12 -0
- package/src/modules/chats/components/sections/ChatWindow.vue +84 -2
- package/src/modules/chats/controllers/chats.controller.js +187 -0
- package/src/modules/chats/models/chat.model.js +21 -0
- package/src/modules/chats/routes/chats.routes.js +46 -0
- package/src/modules/chats/store/chat.store.js +67 -0
- package/src/modules/community/components/layouts/Community.vue +2 -2
- package/src/modules/community/components/pages/Posts.vue +3 -328
- package/src/modules/events/components/pages/EditEventTickets.vue +1 -1
- package/src/modules/events/components/pages/Events.vue +2 -2
- package/src/modules/globals/controllers/classes/globals.cache.js +64 -55
- package/src/modules/globals/controllers/classes/globals.logger.js +40 -4
- package/src/modules/globals/controllers/classes/globals.observer.js +54 -4
- package/src/modules/globals/views/components/partials/Header.vue +1 -1
- package/src/modules/globals/views/components/partials/Sidebar.vue +17 -13
- package/src/modules/globals/views/mixins/mixins.js +7 -0
- package/src/modules/inventory/CLAUDE.md +330 -0
- package/src/modules/inventory/PROMT.md +25 -0
- package/src/modules/inventory/components/forms/AdjustmentForm.vue +53 -36
- package/src/modules/inventory/components/forms/ColumnSettingsMenu.vue +11 -6
- package/src/modules/inventory/components/forms/HistoryView.vue +21 -9
- package/src/modules/inventory/components/forms/StockAlertsForm.vue +33 -22
- package/src/modules/inventory/components/pages/Inventory.vue +40 -40
- package/src/modules/inventory/components/pages/InventoryEdit.vue +1 -1
- package/src/modules/inventory/docs/01-intro.md +126 -0
- package/src/modules/inventory/docs/02-architecture.md +266 -0
- package/src/modules/inventory/docs/03-components-and-relationships.md +338 -0
- package/src/modules/inventory/docs/04-business-logic-and-algorithms.md +376 -0
- package/src/modules/inventory/docs/05-api-specification.md +356 -0
- package/src/modules/inventory/docs/06-access-control.md +320 -0
- package/src/modules/inventory/inventory.server.js +6 -2
- package/src/modules/inventory/{services → middlewares}/inventory.verifier.js +5 -16
- package/src/modules/inventory/models/stock.availability.model.js +20 -7
- package/src/modules/inventory/routes/inventory.routes.js +14 -17
- package/src/modules/inventory/services/adjustment.service.js +137 -0
- package/src/modules/inventory/services/audit.service.js +160 -0
- package/src/modules/inventory/services/availability.service.js +323 -0
- package/src/modules/inventory/services/inventory.helpers.old.js +217 -0
- package/src/modules/inventory/store/{ inventory.store.js → inventory.store.js} +0 -14
- package/src/modules/inventory/workers/inventory.availability.worker.js +29 -30
- package/src/modules/marketplace/views/components/layouts/Marketplace.vue +160 -8
- package/src/modules/notifications/controllers/notifications.controller.js +0 -6
- package/src/modules/notifications/services/notification.service.js +1 -17
- package/src/modules/notifications/services/web-push.service.js +0 -2
- package/src/modules/orders/components/blocks/CardOrderBackoffice.vue +2 -2
- package/src/modules/orders/components/blocks/CardOrderVar1.vue +1 -1
- package/src/modules/orders/controllers/orders.controller.js +2 -4
- package/src/modules/orders/orders.client.js +2 -2
- package/src/modules/orders/router/customers.router.js +1 -1
- package/src/modules/organizations/CLAUDE.md +259 -0
- package/src/modules/organizations/components/blocks/CardDepartment.vue +1 -22
- package/src/modules/organizations/components/blocks/Socials.vue +1 -1
- package/src/modules/organizations/components/elements/ButtonToggleMembership.vue +3 -3
- package/src/modules/organizations/components/forms/AddExistingMembersForm.vue +191 -0
- package/src/modules/organizations/components/forms/DepartmentForm.vue +390 -0
- package/src/modules/organizations/components/forms/InviteForm.vue +81 -0
- package/src/modules/organizations/components/pages/Department.vue +10 -10
- package/src/modules/organizations/components/pages/DepartmentEdit.vue +8 -8
- package/src/modules/organizations/components/pages/Members.vue +265 -171
- package/src/modules/organizations/components/pages/Organization.new.vue +172 -183
- package/src/modules/organizations/components/pages/Organization.vue +6 -6
- package/src/modules/organizations/components/pages/OrganizationEdit.vue +1 -1
- package/src/modules/organizations/components/pages/Organizations.vue +1 -1
- package/src/modules/organizations/components/sections/Organizations.vue +2 -2
- package/src/modules/organizations/components/sections/Publics.vue +4 -4
- package/src/modules/organizations/configs/navigation.organization.config.js +40 -39
- package/src/modules/organizations/controllers/departments.controller.js +53 -34
- package/src/modules/organizations/controllers/invites.controller.js +44 -5
- package/src/modules/organizations/controllers/memberships.controller.js +43 -4
- package/src/modules/organizations/organizations.client.js +24 -15
- package/src/modules/organizations/router/departments.router.js +0 -18
- package/src/modules/organizations/routes/departments.routes.js +6 -8
- package/src/modules/organizations/routes/invites.routes.js +6 -4
- package/src/modules/organizations/routes/memberships.routes.js +6 -5
- package/src/modules/organizations/routes/organizations.routes.js +1 -1
- package/src/modules/organizations/store/departments.store.js +5 -0
- package/src/modules/organizations/store/invites.store.js +5 -0
- package/src/modules/organizations/store/memberships.store.js +23 -0
- package/src/modules/products/components/pages/Products.vue +0 -1
- package/src/modules/spots/components/blocks/CardSpot.vue +1 -1
- package/src/modules/spots/components/pages/Spots.vue +3 -203
- package/src/styles/base/all.scss +0 -15
- package/src/styles/responsive.scss +1 -31
- package/src/styles/typography.scss +20 -5
- package/dist/main-CSzPfQYR.cjs +0 -11
- package/dist/martyrs/src/components/Address/Address.vue2.cjs.map +0 -1
- package/dist/martyrs/src/components/Chips/Chips.vue.cjs.map +0 -1
- package/dist/martyrs/src/components/Chips/Chips.vue.js.map +0 -1
- package/dist/martyrs/src/components/Dropdown/Dropdown.vue.js.map +0 -1
- package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue2.cjs.map +0 -1
- package/dist/martyrs/src/components/Select/Select.vue2.cjs.map +0 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.cjs +0 -76
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.cjs.map +0 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.js +0 -76
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.js.map +0 -1
- package/dist/martyrs/src/modules/inventory/store/ inventory.store.cjs.map +0 -1
- package/dist/martyrs/src/modules/inventory/store/ inventory.store.js.map +0 -1
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +0 -280
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs.map +0 -1
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +0 -280
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/departments.cjs +0 -121
- package/dist/martyrs/src/modules/organizations/store/departments.cjs.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/departments.js +0 -121
- package/dist/martyrs/src/modules/organizations/store/departments.js.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/invites.cjs +0 -64
- package/dist/martyrs/src/modules/organizations/store/invites.cjs.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/invites.js +0 -64
- package/dist/martyrs/src/modules/organizations/store/invites.js.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/memberships.cjs +0 -87
- package/dist/martyrs/src/modules/organizations/store/memberships.cjs.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/memberships.js +0 -87
- package/dist/martyrs/src/modules/organizations/store/memberships.js.map +0 -1
- package/src/modules/globals/controllers/classes/globals.websocket.ws.js +0 -102
- package/src/modules/globals/views/components/blocks/BlockFilter.vue +0 -60
- package/src/modules/inventory/docs/README.md +0 -291
- package/src/modules/inventory/models/stock.balance.model.js +0 -43
- package/src/modules/inventory/services/inventory.crud.js +0 -710
- package/src/modules/inventory/tests/inventory.test.js +0 -281
- package/src/modules/organizations/store/departments.js +0 -137
- package/src/modules/organizations/store/invites.js +0 -76
- package/src/modules/organizations/store/memberships.js +0 -110
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
# Модуль Auth - Техническая архитектура
|
|
2
|
+
|
|
3
|
+
## 1. Назначение модуля
|
|
4
|
+
|
|
5
|
+
Модуль `auth` представляет собой изоморфное решение для аутентификации и управления пользователями в приложении OZDAO Martyrs. Модуль обеспечивает:
|
|
6
|
+
|
|
7
|
+
- **Аутентификацию пользователей** через email, телефон или Apple ID
|
|
8
|
+
- **Регистрацию новых пользователей** с поддержкой приглашений
|
|
9
|
+
- **Двухфакторную аутентификацию** (2FA) для повышения безопасности
|
|
10
|
+
- **Управление профилями пользователей** (CRUD операции)
|
|
11
|
+
- **Восстановление паролей** через email или SMS
|
|
12
|
+
- **Ролевую модель доступа** с поддержкой различных ролей
|
|
13
|
+
- **JWT-токены** для безопасной авторизации
|
|
14
|
+
- **Логирование посетителей** для аналитики
|
|
15
|
+
|
|
16
|
+
## 2. Архитектура взаимодействия клиент ⇄ сервер
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
┌─────────────────────────────────┐ ┌──────────────────────────────────┐
|
|
20
|
+
│ КЛИЕНТ (Vue) │ │ СЕРВЕР (Express) │
|
|
21
|
+
├─────────────────────────────────┤ ├──────────────────────────────────┤
|
|
22
|
+
│ Views/Components │ │ Routes │
|
|
23
|
+
│ ├─ SignIn/SignUp │◄────────┤ ├─ /api/auth/signin │
|
|
24
|
+
│ ├─ Profile/ProfileEdit │ │ ├─ /api/auth/signup │
|
|
25
|
+
│ ├─ ResetPassword │ │ ├─ /api/auth/reset-password │
|
|
26
|
+
│ └─ EnterCode/EnterPassword │ │ └─ /api/auth/update-password │
|
|
27
|
+
│ │ │ │
|
|
28
|
+
│ Stores (State Management) │ │ Services (Controllers) │
|
|
29
|
+
│ ├─ auth.js (login/signup) │◄────────┤ ├─ auth.service.js │
|
|
30
|
+
│ ├─ twofa.js (2FA codes) │ │ ├─ twofa.service.js │
|
|
31
|
+
│ └─ users.js (CRUD operations) │ │ └─ users.service.js │
|
|
32
|
+
│ │ │ │
|
|
33
|
+
│ Router + Middleware │ │ Middleware │
|
|
34
|
+
│ ├─ auth.validation.js │ │ ├─ authJwt.js (токены) │
|
|
35
|
+
│ └─ ownership.validation.js │ │ ├─ verifySignUp.js │
|
|
36
|
+
│ │ │ └─ verifyUser.js │
|
|
37
|
+
│ │ │ │
|
|
38
|
+
│ Cookie/Storage Management │ │ Models (MongoDB) │
|
|
39
|
+
│ ├─ JWT tokens │ │ ├─ User │
|
|
40
|
+
│ ├─ User data │ │ ├─ Role │
|
|
41
|
+
│ └─ Capacitor support │ │ └─ Visitor │
|
|
42
|
+
└─────────────────────────────────┘ └──────────────────────────────────┘
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 3. Точки входа и инициализация
|
|
46
|
+
|
|
47
|
+
### 3.1 Клиентская инициализация
|
|
48
|
+
|
|
49
|
+
**Файл**: `auth.client.js:34`
|
|
50
|
+
|
|
51
|
+
```javascript
|
|
52
|
+
function initializeAuth(app, store, router, options = {}) {
|
|
53
|
+
const route = options.route || 'Home';
|
|
54
|
+
|
|
55
|
+
// Регистрация локализации
|
|
56
|
+
i18nManager.register('auth', locales);
|
|
57
|
+
|
|
58
|
+
// Добавление маршрутов
|
|
59
|
+
router.addRoute(route, routerAuth);
|
|
60
|
+
router.addRoute(route, routerUsers);
|
|
61
|
+
|
|
62
|
+
// Регистрация хранилищ
|
|
63
|
+
store.addStore('auth', storeAuth);
|
|
64
|
+
store.addStore('twofa', storeTwofa);
|
|
65
|
+
store.addStore('users', storeUsers);
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 3.2 Серверная инициализация
|
|
70
|
+
|
|
71
|
+
**Файл**: `auth.server.js:12`
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
function initializeAuth(app, db, origins, publicPath) {
|
|
75
|
+
// Настройка моделей
|
|
76
|
+
db.role = RoleModel(db);
|
|
77
|
+
db.user = UserModel(db);
|
|
78
|
+
db.visitor = VisitorModel(db);
|
|
79
|
+
db.request = RequestModel(db);
|
|
80
|
+
|
|
81
|
+
// Подключение маршрутов
|
|
82
|
+
authRoutes(app, db, origins, publicPath);
|
|
83
|
+
twofaRoutes(app, db, origins, publicPath);
|
|
84
|
+
usersRoutes(app, db, origins, publicPath);
|
|
85
|
+
|
|
86
|
+
// Логирование посетителей
|
|
87
|
+
const visitorModule = visitors(db);
|
|
88
|
+
app.use(visitorModule.visitorLogger);
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## 4. Потоки аутентификации
|
|
93
|
+
|
|
94
|
+
### 4.1 Поток входа (Login)
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
1. Пользователь → SignIn.vue
|
|
98
|
+
2. Ввод email/phone + пароль
|
|
99
|
+
3. store/auth.js:login() → POST /api/auth/signin
|
|
100
|
+
4. Сервер:
|
|
101
|
+
├─ Проверка пользователя в БД
|
|
102
|
+
├─ Валидация пароля (bcrypt)
|
|
103
|
+
├─ Генерация JWT токена (10 дней)
|
|
104
|
+
└─ Возврат данных пользователя + токен
|
|
105
|
+
5. Клиент:
|
|
106
|
+
├─ Сохранение в cookie/storage
|
|
107
|
+
├─ Установка токена в axios
|
|
108
|
+
└─ GET /api/organizations/check-accesses для прав доступа
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 4.2 Поток регистрации (Signup)
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
1. Пользователь → SignUp.vue
|
|
115
|
+
2. Ввод данных + опциональный invite код
|
|
116
|
+
3. store/auth.js:signup() → POST /api/auth/signup
|
|
117
|
+
4. Сервер:
|
|
118
|
+
├─ Проверка дублирования (middleware)
|
|
119
|
+
├─ Хеширование пароля (bcrypt, salt:8)
|
|
120
|
+
├─ Создание пользователя
|
|
121
|
+
├─ Присвоение роли 'user'
|
|
122
|
+
├─ Обработка приглашения (если есть)
|
|
123
|
+
└─ Генерация JWT токена
|
|
124
|
+
5. Клиент: как при входе
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 4.3 Поток 2FA и восстановления пароля
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
1. Запрос сброса → ResetPassword.vue
|
|
131
|
+
2. store/auth.js:resetPassword() → POST /api/auth/reset-password
|
|
132
|
+
3. Сервер:
|
|
133
|
+
├─ Проверка существования пользователя
|
|
134
|
+
├─ Генерация 4-значного кода
|
|
135
|
+
└─ Отправка email/SMS
|
|
136
|
+
4. Клиент → EnterCode.vue
|
|
137
|
+
5. Ввод кода → EnterPassword.vue
|
|
138
|
+
6. store/auth.js:updatePassword() → POST /api/auth/update-password
|
|
139
|
+
7. Сервер: обновление пароля + новый JWT
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 4.4 Поток проверки доступов
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
1. Инициализация → store/auth.js:initialize()
|
|
146
|
+
2. GET /api/organizations/check-accesses (в модуле organizations!)
|
|
147
|
+
3. Сервер:
|
|
148
|
+
├─ Проверка JWT токена
|
|
149
|
+
├─ Поиск департаментов пользователя
|
|
150
|
+
├─ Поиск организаций в собственности
|
|
151
|
+
└─ Формирование массива прав доступа
|
|
152
|
+
4. Клиент: сохранение в state.accesses
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## 5. Структура файлов и их связи
|
|
156
|
+
|
|
157
|
+
### 5.1 Клиентская часть
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
views/
|
|
161
|
+
├── components/
|
|
162
|
+
│ ├── layouts/Auth.vue # Общий layout для auth страниц
|
|
163
|
+
│ ├── pages/ # Страницы аутентификации
|
|
164
|
+
│ │ ├── SignIn.vue # Вход в систему
|
|
165
|
+
│ │ ├── SignUp.vue # Регистрация
|
|
166
|
+
│ │ ├── ResetPassword.vue # Сброс пароля
|
|
167
|
+
│ │ ├── EnterCode.vue # Ввод 2FA кода
|
|
168
|
+
│ │ ├── EnterPassword.vue # Новый пароль
|
|
169
|
+
│ │ ├── Invite.vue # Регистрация по приглашению
|
|
170
|
+
│ │ ├── Profile.vue # Профиль пользователя
|
|
171
|
+
│ │ └── ProfileEdit.vue # Редактирование профиля
|
|
172
|
+
│ └── sections/ # Переиспользуемые секции
|
|
173
|
+
├── store/ # Vuex-подобные хранилища
|
|
174
|
+
│ ├── auth.js # Основная аутентификация
|
|
175
|
+
│ ├── twofa.js # Двухфакторная аутентификация
|
|
176
|
+
│ └── users.js # Управление пользователями
|
|
177
|
+
├── router/ # Маршрутизация
|
|
178
|
+
│ ├── auth.js # Маршруты аутентификации
|
|
179
|
+
│ └── users.js # Маршруты пользователей
|
|
180
|
+
├── middlewares/ # Валидация на клиенте
|
|
181
|
+
│ ├── auth.validation.js # Проверка аутентификации
|
|
182
|
+
│ └── ownership.validation.js # Проверка прав доступа
|
|
183
|
+
└── validations/
|
|
184
|
+
└── inputs.validation.js # Валидация форм
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 5.2 Серверная часть
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
controllers/
|
|
191
|
+
├── services/ # Бизнес-логика
|
|
192
|
+
│ ├── auth.service.js # Аутентификация
|
|
193
|
+
│ ├── twofa.service.js # 2FA коды
|
|
194
|
+
│ └── users.service.js # CRUD пользователей
|
|
195
|
+
├── routes/ # API маршруты
|
|
196
|
+
│ ├── auth.routes.js # /api/auth/*
|
|
197
|
+
│ ├── twofa.routes.js # /api/twofa/*
|
|
198
|
+
│ └── users.routes.js # /api/users/*
|
|
199
|
+
├── middlewares/ # Серверные middleware
|
|
200
|
+
│ ├── authJwt.js # JWT валидация
|
|
201
|
+
│ ├── verifySignUp.js # Валидация регистрации
|
|
202
|
+
│ ├── verifyUser.js # Проверка пользователей
|
|
203
|
+
│ └── visitor.logger.js # Логирование посещений
|
|
204
|
+
└── utils/
|
|
205
|
+
└── verifyAppleIdToken.js # Apple ID интеграция
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### 5.3 Модели данных
|
|
209
|
+
|
|
210
|
+
```
|
|
211
|
+
models/
|
|
212
|
+
├── user.model.js # Пользователи
|
|
213
|
+
├── role.model.js # Роли
|
|
214
|
+
├── visitor.model.js # Логи посещений
|
|
215
|
+
└── request.model.js # Запросы
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## 6. API Endpoints
|
|
219
|
+
|
|
220
|
+
### 6.1 Аутентификация (/api/auth/*)
|
|
221
|
+
|
|
222
|
+
| Endpoint | Method | Middleware | Описание |
|
|
223
|
+
|----------|---------|------------|----------|
|
|
224
|
+
| `/api/auth/signin` | POST | - | Вход в систему |
|
|
225
|
+
| `/api/auth/signup` | POST | `checkDuplicateUsernameOrEmail` | Регистрация |
|
|
226
|
+
| `/api/auth/reset-password` | POST | `checkUserExist` | Сброс пароля |
|
|
227
|
+
| `/api/auth/update-password` | POST | - | Обновление пароля |
|
|
228
|
+
|
|
229
|
+
### 6.2 Двухфакторная аутентификация (/api/twofa/*)
|
|
230
|
+
|
|
231
|
+
| Endpoint | Method | Описание |
|
|
232
|
+
|----------|---------|----------|
|
|
233
|
+
| `/api/twofa/sendcode` | POST | Отправка кода при регистрации |
|
|
234
|
+
| `/api/twofa/sendcodereset` | POST | Отправка кода для сброса пароля |
|
|
235
|
+
|
|
236
|
+
### 6.3 Пользователи (/api/users/*)
|
|
237
|
+
|
|
238
|
+
| Endpoint | Method | Middleware | Описание |
|
|
239
|
+
|----------|---------|------------|----------|
|
|
240
|
+
| `/api/users` | GET | - | Получение пользователей |
|
|
241
|
+
| `/api/users` | POST | `verifyToken, checkDuplicateUsername` | Создание |
|
|
242
|
+
| `/api/users/:_id` | PUT | `verifyToken, checkDuplicateUsername` | Обновление |
|
|
243
|
+
| `/api/users/:_id` | DELETE | `verifyToken` | Удаление |
|
|
244
|
+
|
|
245
|
+
### 6.4 Проверка доступов
|
|
246
|
+
|
|
247
|
+
| Endpoint | Method | Middleware | Модуль | Описание |
|
|
248
|
+
|----------|---------|------------|---------|----------|
|
|
249
|
+
| `/api/organizations/check-accesses` | GET | `verifyToken` | **organizations** | Получение прав доступа |
|
|
250
|
+
|
|
251
|
+
## 7. Безопасность
|
|
252
|
+
|
|
253
|
+
### 7.1 Хеширование паролей
|
|
254
|
+
|
|
255
|
+
**Файл**: `auth.service.js:93, 164`
|
|
256
|
+
|
|
257
|
+
- Библиотека: `bcrypt`
|
|
258
|
+
- Salt rounds: 8
|
|
259
|
+
- Асинхронное хеширование при обновлении
|
|
260
|
+
|
|
261
|
+
### 7.2 JWT Токены
|
|
262
|
+
|
|
263
|
+
**Конфигурация**:
|
|
264
|
+
- Секретный ключ: `process.env.SECRET_KEY`
|
|
265
|
+
- Время жизни: 864000 секунд (10 дней)
|
|
266
|
+
- Содержит: `{ _id: userId, organization: orgId }`
|
|
267
|
+
|
|
268
|
+
### 7.3 Middleware безопасности
|
|
269
|
+
|
|
270
|
+
**authJwt.js**:
|
|
271
|
+
- `verifyToken(continueOnFail)` - проверка JWT
|
|
272
|
+
- Поддержка сервисных ключей (`x-service-key`)
|
|
273
|
+
- Извлечение токенов из headers или cookies
|
|
274
|
+
- Роли: `isAdmin`, `isModerator`
|
|
275
|
+
|
|
276
|
+
### 7.4 CORS и Cookie
|
|
277
|
+
|
|
278
|
+
**Настройки cookie**:
|
|
279
|
+
```javascript
|
|
280
|
+
development: { secure: false, expires: 7, sameSite: 'Lax' }
|
|
281
|
+
production: {
|
|
282
|
+
expires: 7,
|
|
283
|
+
domain: process.env.DOMAIN_URL,
|
|
284
|
+
sameSite: 'strict',
|
|
285
|
+
secure: true
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## 8. Интеграция в проект
|
|
290
|
+
|
|
291
|
+
### 8.1 Основная инициализация
|
|
292
|
+
|
|
293
|
+
```javascript
|
|
294
|
+
// Клиент
|
|
295
|
+
import ModuleAuth from '@martyrs/src/modules/auth/auth.client.js';
|
|
296
|
+
ModuleAuth.initialize(app, store, router, { route: 'Home' });
|
|
297
|
+
|
|
298
|
+
// Сервер
|
|
299
|
+
import AuthModule from '@martyrs/src/modules/auth/auth.server.js';
|
|
300
|
+
AuthModule.initialize(app, db, origins, publicPath);
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### 8.2 Использование в компонентах
|
|
304
|
+
|
|
305
|
+
```javascript
|
|
306
|
+
// Аутентификация
|
|
307
|
+
import * as auth from '@martyrs/src/modules/auth/views/store/auth.js';
|
|
308
|
+
await auth.actions.login({ email: 'user@example.com', password: '123' }, 'email');
|
|
309
|
+
|
|
310
|
+
// Управление пользователями
|
|
311
|
+
import * as users from '@martyrs/src/modules/auth/views/store/users.js';
|
|
312
|
+
const users = await users.actions.read();
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### 8.3 Защищенные маршруты
|
|
316
|
+
|
|
317
|
+
```javascript
|
|
318
|
+
// Клиент
|
|
319
|
+
import * as authValidation from '@martyrs/src/modules/auth/views/middlewares/auth.validation.js';
|
|
320
|
+
|
|
321
|
+
{
|
|
322
|
+
path: '/profile',
|
|
323
|
+
beforeEnter: [authValidation.requiresAuth]
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Сервер
|
|
327
|
+
import middlewareFactory from '@martyrs/src/modules/auth/controllers/middlewares/index.js';
|
|
328
|
+
const { authJwt } = middlewareFactory(db);
|
|
329
|
+
|
|
330
|
+
app.get('/api/protected', [authJwt.verifyToken()], controller);
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
## 9. Расширение и конфигурация
|
|
334
|
+
|
|
335
|
+
### 9.1 Добавление новой роли
|
|
336
|
+
|
|
337
|
+
1. **База данных**:
|
|
338
|
+
```javascript
|
|
339
|
+
db.role.create({ name: 'editor' })
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
2. **Middleware**:
|
|
343
|
+
```javascript
|
|
344
|
+
const isEditor = middlewareFactory(db).authJwt.checkRole('editor');
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
3. **Маршрут**:
|
|
348
|
+
```javascript
|
|
349
|
+
app.post('/api/content', [authJwt.verifyToken(), isEditor], controller);
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### 9.2 Добавление провайдера аутентификации
|
|
353
|
+
|
|
354
|
+
1. **Сервер** (`auth.service.js`):
|
|
355
|
+
```javascript
|
|
356
|
+
if (type === 'google' && authorization.id_token) {
|
|
357
|
+
payload = await verifyGoogleIdToken(authorization.id_token);
|
|
358
|
+
// ...
|
|
359
|
+
}
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
2. **Клиент** (`auth.js`):
|
|
363
|
+
```javascript
|
|
364
|
+
await auth.actions.login({ authorization: googleToken }, 'google');
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### 9.3 Переменные окружения
|
|
368
|
+
|
|
369
|
+
```bash
|
|
370
|
+
SECRET_KEY=your-jwt-secret # JWT секрет
|
|
371
|
+
DOMAIN_URL=example.com # Домен для cookies
|
|
372
|
+
SERVICE_KEY=service-secret # Сервисные запросы
|
|
373
|
+
NODE_ENV=production # Окружение
|
|
374
|
+
MOBILE_APP=true # Мобильное приложение
|
|
375
|
+
APP_NAME=MyApp # Название в письмах
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### 9.4 Мобильная поддержка
|
|
379
|
+
|
|
380
|
+
Модуль поддерживает Capacitor через `@capacitor/preferences`:
|
|
381
|
+
- Автоматическое переключение между cookies и Capacitor storage
|
|
382
|
+
- Определение через `process.env.MOBILE_APP`
|
|
383
|
+
|
|
384
|
+
## 10. Ключевые сценарии использования
|
|
385
|
+
|
|
386
|
+
### 10.1 Полный цикл аутентификации
|
|
387
|
+
|
|
388
|
+
```javascript
|
|
389
|
+
// 1. Инициализация приложения
|
|
390
|
+
const cookie = await getCookie('user');
|
|
391
|
+
await auth.actions.initialize(cookie);
|
|
392
|
+
|
|
393
|
+
// 2. Вход пользователя
|
|
394
|
+
await auth.actions.login({
|
|
395
|
+
email: 'user@example.com',
|
|
396
|
+
password: 'password123'
|
|
397
|
+
}, 'email');
|
|
398
|
+
|
|
399
|
+
// 3. Проверка прав доступа происходит автоматически
|
|
400
|
+
// state.accesses теперь содержит права пользователя
|
|
401
|
+
|
|
402
|
+
// 4. Выход
|
|
403
|
+
await auth.actions.logout();
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
### 10.2 Регистрация с приглашением
|
|
407
|
+
|
|
408
|
+
```javascript
|
|
409
|
+
// 1. Переход по приглашению → /auth/invite?code=INVITE123
|
|
410
|
+
// 2. Заполнение формы
|
|
411
|
+
await auth.actions.signup({
|
|
412
|
+
email: 'newuser@example.com',
|
|
413
|
+
password: 'password123'
|
|
414
|
+
}, 'email', 'INVITE123');
|
|
415
|
+
|
|
416
|
+
// 3. Автоматическое создание membership в организации
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### 10.3 Восстановление пароля
|
|
420
|
+
|
|
421
|
+
```javascript
|
|
422
|
+
// 1. Запрос сброса
|
|
423
|
+
await auth.actions.resetPassword({ email: 'user@example.com' }, 'email');
|
|
424
|
+
|
|
425
|
+
// 2. Отправка кода → state.twofa.code.isSended = true
|
|
426
|
+
|
|
427
|
+
// 3. Новый пароль
|
|
428
|
+
state.user.password = 'newpassword123';
|
|
429
|
+
state.user.passwordRepeat = 'newpassword123';
|
|
430
|
+
await auth.actions.updatePassword({ email: 'user@example.com' }, 'email');
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### 10.4 Управление профилем
|
|
434
|
+
|
|
435
|
+
```javascript
|
|
436
|
+
// Получение данных профиля
|
|
437
|
+
await users.actions.read({ _id: userId });
|
|
438
|
+
|
|
439
|
+
// Обновление профиля
|
|
440
|
+
await users.actions.update({
|
|
441
|
+
_id: userId,
|
|
442
|
+
profile: { name: 'New Name' },
|
|
443
|
+
socials: { twitter: '@username' }
|
|
444
|
+
});
|
|
445
|
+
```
|
|
@@ -112,6 +112,12 @@ const menuItems = [
|
|
|
112
112
|
routeName: 'Backoffice Gallery',
|
|
113
113
|
icon: IconGallery
|
|
114
114
|
},
|
|
115
|
+
{
|
|
116
|
+
name: 'applications',
|
|
117
|
+
title: 'Applications',
|
|
118
|
+
routeName: 'BackofficeApplications',
|
|
119
|
+
icon: IconEvents
|
|
120
|
+
},
|
|
115
121
|
{
|
|
116
122
|
name: 'events',
|
|
117
123
|
title: 'Events',
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Модуль чатов
|
|
2
|
+
|
|
3
|
+
## Обзор архитектуры
|
|
4
|
+
|
|
5
|
+
Модуль реализует real-time чат с использованием WebSocket и MongoDB для хранения истории сообщений.
|
|
6
|
+
|
|
7
|
+
### Структура файлов
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
chats/
|
|
11
|
+
├── chats.client.js # Точка входа клиентской части
|
|
12
|
+
├── chats.server.js # Точка входа серверной части
|
|
13
|
+
├── components/
|
|
14
|
+
│ ├── pages/
|
|
15
|
+
│ │ └── ChatPage.vue # Главная страница чата
|
|
16
|
+
│ ├── sections/
|
|
17
|
+
│ │ └── ChatWindow.vue # Окно чата с сообщениями
|
|
18
|
+
│ └── blocks/
|
|
19
|
+
│ └── ChatMessage.vue # Компонент отдельного сообщения
|
|
20
|
+
├── controllers/
|
|
21
|
+
│ └── chats.controller.js # Бизнес-логика (сохранение/получение сообщений)
|
|
22
|
+
├── models/
|
|
23
|
+
│ └── chat.model.js # MongoDB модель сообщения
|
|
24
|
+
├── routes/
|
|
25
|
+
│ └── chats.routes.js # HTTP маршруты и WebSocket обработчики
|
|
26
|
+
└── store/
|
|
27
|
+
└── chat.store.js # Управление состоянием на клиенте
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Ключевые компоненты
|
|
31
|
+
|
|
32
|
+
### WebSocket интеграция
|
|
33
|
+
|
|
34
|
+
Модуль использует глобальный WebSocket класс из `@martyrs/src/modules/globals/views/classes/globals.websocket.js`:
|
|
35
|
+
|
|
36
|
+
- Подключение: `globalWebSocket.connect(userId)`
|
|
37
|
+
- Подписка на модуль: `globalWebSocket.subscribeModule('chat')`
|
|
38
|
+
- Отправка сообщений: `globalWebSocket.send({ type: 'message', module: 'chat', ... })`
|
|
39
|
+
|
|
40
|
+
### Store (chat.store.js)
|
|
41
|
+
|
|
42
|
+
Управляет состоянием чата на клиенте:
|
|
43
|
+
- `state.messages` - массив сообщений текущего чата
|
|
44
|
+
- `state.currentChatId` - ID активного чата
|
|
45
|
+
- `state.username` - имя текущего пользователя
|
|
46
|
+
|
|
47
|
+
Основные методы:
|
|
48
|
+
- `connectWebSocket(userId)` - подключение к WebSocket
|
|
49
|
+
- `setCurrentChat(chatId)` - переключение чата и загрузка истории
|
|
50
|
+
- `addMessage(message)` - отправка нового сообщения
|
|
51
|
+
|
|
52
|
+
### Серверные обработчики
|
|
53
|
+
|
|
54
|
+
WebSocket обработчики регистрируются через `wss.registerModule('chat', handler)`:
|
|
55
|
+
|
|
56
|
+
1. `joinChat` - присоединение к чату (добавление chatId в ws.activeChats)
|
|
57
|
+
2. `message` - обработка входящего сообщения:
|
|
58
|
+
- Сохранение в БД
|
|
59
|
+
- Рассылка всем участникам чата через `broadcastToModuleWithFilter`
|
|
60
|
+
|
|
61
|
+
REST API:
|
|
62
|
+
- `GET /messages/:chatId` - получение истории сообщений
|
|
63
|
+
|
|
64
|
+
## Модель данных
|
|
65
|
+
|
|
66
|
+
```javascript
|
|
67
|
+
ChatMessageSchema = {
|
|
68
|
+
username: String, // Имя отправителя
|
|
69
|
+
chatId: String, // ID чата
|
|
70
|
+
text: String, // Текст сообщения
|
|
71
|
+
createdAt: Date // Время создания (автоматически)
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Проблемы и TODO
|
|
76
|
+
|
|
77
|
+
### Критические проблемы
|
|
78
|
+
|
|
79
|
+
1. **Нет авторизации** в WebSocket обработчиках
|
|
80
|
+
- Любой может отправлять сообщения от имени любого пользователя
|
|
81
|
+
- Нет проверки прав доступа к чату
|
|
82
|
+
|
|
83
|
+
3. **Отсутствует валидация данных**
|
|
84
|
+
- Нет проверки обязательных полей
|
|
85
|
+
- Нет санитизации входящих данных
|
|
86
|
+
|
|
87
|
+
### Улучшения
|
|
88
|
+
|
|
89
|
+
1. **Обработка ошибок**
|
|
90
|
+
- Добавить try/catch в компоненты
|
|
91
|
+
- Показывать уведомления об ошибках пользователю
|
|
92
|
+
|
|
93
|
+
2. **Оптимизация**
|
|
94
|
+
- Пагинация для истории сообщений
|
|
95
|
+
- Виртуальный скроллинг для больших чатов
|
|
96
|
+
|
|
97
|
+
3. **Функциональность**
|
|
98
|
+
- Индикатор набора текста
|
|
99
|
+
- Статусы доставки сообщений
|
|
100
|
+
- Поддержка файлов/изображений
|
|
101
|
+
- Уведомления о новых сообщениях
|
|
102
|
+
|
|
103
|
+
## Использование
|
|
104
|
+
|
|
105
|
+
### Инициализация на клиенте
|
|
106
|
+
|
|
107
|
+
```javascript
|
|
108
|
+
import ModuleChats from '@martyrs/src/modules/chats/chats.client.js';
|
|
109
|
+
|
|
110
|
+
// В главном приложении
|
|
111
|
+
ModuleChats.initialize(app, store, router);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Использование в компоненте
|
|
115
|
+
|
|
116
|
+
```vue
|
|
117
|
+
<ChatPage
|
|
118
|
+
:username="currentUser.name"
|
|
119
|
+
:user="currentUser.id"
|
|
120
|
+
:chatID="selectedChatId"
|
|
121
|
+
/>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Инициализация на сервере
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
import { initialize } from '@martyrs/src/modules/chats/chats.server.js';
|
|
128
|
+
|
|
129
|
+
// При старте сервера
|
|
130
|
+
initialize(app, db, wss, origins, publicPath);
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Зависимости
|
|
134
|
+
|
|
135
|
+
- `globals.websocket.js` - глобальный WebSocket класс
|
|
136
|
+
- `auth/controllers/middlewares` - middleware для авторизации (не используется)
|
|
137
|
+
- `globals/controllers/utils/mailing.js` - отправка уведомлений (импортирован, но не используется)
|
|
@@ -2,22 +2,34 @@
|
|
|
2
2
|
<div
|
|
3
3
|
class="pd-small"
|
|
4
4
|
:class="{'bg-main-nano': message.username === 'Support'}"
|
|
5
|
+
:data-message-id="message._id"
|
|
5
6
|
>
|
|
6
7
|
<p class="flex-v-center gap-thin flex-nowrap flex w-100 p-small">
|
|
7
8
|
<!-- <img loading="lazy" v-if="message.username === 'Weeder Support'" src="/logo/logo.png" class="i-medium"> -->
|
|
8
9
|
<strong class="mn-r-auto"><span class="t-semi">{{ message.username }}</span> <span class="t-transp">{{formatDate(message.createdAt)}}</span></strong>
|
|
10
|
+
<IconCheckmark v-if="isMessageRead" class="i-small t-main" />
|
|
9
11
|
</p>
|
|
10
12
|
<p>{{ message.text }}</p>
|
|
11
13
|
</div>
|
|
12
14
|
</template>
|
|
13
15
|
|
|
14
16
|
<script>
|
|
17
|
+
import IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';
|
|
18
|
+
|
|
15
19
|
export default {
|
|
20
|
+
components: {
|
|
21
|
+
IconCheckmark
|
|
22
|
+
},
|
|
16
23
|
props: {
|
|
17
24
|
message: {
|
|
18
25
|
type: Object,
|
|
19
26
|
required: true
|
|
20
27
|
}
|
|
28
|
+
},
|
|
29
|
+
computed: {
|
|
30
|
+
isMessageRead() {
|
|
31
|
+
return this.message.readBy && this.message.readBy.length > 0;
|
|
32
|
+
}
|
|
21
33
|
}
|
|
22
34
|
};
|
|
23
35
|
</script>
|