@ozdao/martyrs 0.2.492 → 0.2.493
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/builder.cjs +52 -45
- package/dist/builder.js +53 -46
- package/dist/{crud-B-kQw3Z5.cjs → crud-JN_LFj01.cjs} +3 -0
- package/dist/{crud-Cwx5VlSm.js → crud-sE7GLPbj.js} +3 -0
- package/dist/globals.server.cjs +322 -3
- package/dist/globals.server.js +303 -1
- package/dist/{globals.verifier-D68mHEBl.cjs → globals.verifier-C0zj_LLo.cjs} +8 -1
- package/dist/{globals.verifier-CWFz5Gh2.js → globals.verifier-DFqKQ7hK.js} +8 -1
- package/dist/inventory.server.cjs +2 -2
- package/dist/inventory.server.js +2 -2
- package/dist/{main-SZQ1QjeP.js → main-CJm5myDI.js} +631 -607
- package/dist/{main-MzmGbSxs.cjs → main-DTaE01lg.cjs} +6 -6
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs +1 -1
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs.map +1 -1
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.js +1 -1
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.js.map +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs +33 -7
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js +33 -7
- package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
- package/dist/martyrs/src/components/Field/{Field.vue2.cjs → Field.vue.cjs} +2 -2
- package/dist/martyrs/src/components/Field/{Field.vue2.js.map → Field.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/Field/{Field.vue2.js → Field.vue.js} +2 -2
- package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -0
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs +1 -1
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +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/Menu/{Menu.vue.cjs → Menu.vue2.cjs} +2 -2
- package/dist/martyrs/src/components/Menu/Menu.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/Menu/{Menu.vue.js → Menu.vue2.js} +2 -2
- package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Menu/MenuItem.vue.js +2 -2
- package/dist/martyrs/src/components/Menu/MenuItem.vue.js.map +1 -1
- package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js +4 -4
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.cjs +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.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +2 -2
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +2 -2
- package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.cjs +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.js +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.cjs +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Embed.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.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
- 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/BlockSearch.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +5 -1
- package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +5 -1
- package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js.map +1 -1
- package/dist/martyrs/src/modules/icons/entities/IconTime.vue.cjs +2 -2
- package/dist/martyrs/src/modules/icons/entities/IconTime.vue.js +2 -2
- package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.cjs +2 -2
- package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.js +2 -2
- package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.cjs +2 -2
- package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.js +2 -2
- package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js +6 -6
- package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs +22 -15
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +23 -16
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs +2 -2
- package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs +31 -13
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +33 -15
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs +39 -22
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +39 -22
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.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/PlaylistForm.vue.cjs +385 -125
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +391 -131
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs +24 -7
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +25 -8
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs +99 -87
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +111 -99
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs +21 -0
- package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs.map +1 -0
- package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js +21 -0
- package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js.map +1 -0
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +442 -210
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +445 -213
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs +92 -117
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +93 -118
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs +72 -113
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js +78 -119
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs +15 -12
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +15 -12
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +558 -429
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +560 -431
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +146 -284
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +149 -287
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +460 -63
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +462 -65
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs +126 -136
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +129 -139
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs +18 -15
- package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js +18 -15
- package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs +28 -23
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +29 -24
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/music.client.cjs +3 -6
- package/dist/martyrs/src/modules/music/music.client.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/music.client.js +9 -12
- package/dist/martyrs/src/modules/music/music.client.js.map +1 -1
- package/dist/martyrs/src/modules/music/router/music.cjs +27 -1
- package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/router/music.js +27 -1
- package/dist/martyrs/src/modules/music/router/music.js.map +1 -1
- package/dist/martyrs/src/modules/music/store/artists.cjs +6 -4
- package/dist/martyrs/src/modules/music/store/artists.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/store/artists.js +6 -4
- package/dist/martyrs/src/modules/music/store/artists.js.map +1 -1
- package/dist/martyrs/src/modules/music/store/player.cjs +5 -0
- package/dist/martyrs/src/modules/music/store/player.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/store/player.js +5 -0
- package/dist/martyrs/src/modules/music/store/player.js.map +1 -1
- package/dist/martyrs/src/modules/music/store/tracks.cjs +22 -0
- package/dist/martyrs/src/modules/music/store/tracks.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/store/tracks.js +22 -0
- package/dist/martyrs/src/modules/music/store/tracks.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +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 +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/router/organizations.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/router/organizations.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.cjs +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.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 +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs +4 -3
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js +4 -3
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs +37 -70
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js +38 -71
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +2 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +6 -5
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +45 -52
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +46 -53
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +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 +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +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/CardDeposit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.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.cjs.js +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/music.server.cjs +124 -31
- package/dist/music.server.js +124 -31
- package/dist/organizations.server.cjs +1 -1
- package/dist/organizations.server.js +1 -1
- package/dist/products.server.cjs +2 -2
- package/dist/products.server.js +2 -2
- package/dist/rents.server.cjs +3 -3
- package/dist/rents.server.js +3 -3
- package/dist/style.css +373 -80
- package/dist/{web-D7lZjuC0.js → web-Dkk0_7TA.js} +1 -1
- package/dist/{web-D-YZ9KHz.cjs → web-stVkXd0l.cjs} +1 -1
- package/package.json +1 -1
- package/src/builder/modes/ssr.prod.js +21 -5
- package/src/builder/rspack/rspack.config.ssr.client.js +40 -40
- package/src/components/Calendar/Calendar.vue +378 -377
- package/src/components/Feed/Feed.vue +28 -2
- package/src/modules/globals/controllers/classes/crud/crud.policies.js +5 -0
- package/src/modules/globals/controllers/classes/globals.validator.js +8 -1
- package/src/modules/globals/views/components/layouts/Client.vue +7 -0
- package/src/modules/music/README.md +8 -0
- package/src/modules/music/components/SidebarMusic.vue +6 -9
- package/src/modules/music/components/cards/AlbumCard.vue +20 -14
- package/src/modules/music/components/cards/ArtistCard.vue +1 -1
- package/src/modules/music/components/cards/PlaylistCard.vue +31 -11
- package/src/modules/music/components/cards/TrackListCard.vue +24 -13
- package/src/modules/music/components/forms/PlaylistForm.vue +417 -107
- package/src/modules/music/components/forms/SearchForm.vue +31 -8
- package/src/modules/music/components/forms/TrackForm.vue +50 -32
- package/src/modules/music/components/layouts/MusicBottomPlayer.vue +17 -0
- package/src/modules/music/components/pages/Album.vue +373 -186
- package/src/modules/music/components/pages/Artist.vue +54 -94
- package/src/modules/music/components/pages/MusicHome.vue +59 -56
- package/src/modules/music/components/pages/MusicLibrary.vue +13 -11
- package/src/modules/music/components/pages/Playlist.vue +495 -379
- package/src/modules/music/components/pages/SearchResults.vue +185 -313
- package/src/modules/music/components/pages/Track.vue +363 -69
- package/src/modules/music/components/player/MusicPlayer.vue +368 -97
- package/src/modules/music/components/player/TrackProgress.vue +76 -22
- package/src/modules/music/components/player/VolumeControl.vue +61 -28
- package/src/modules/music/controllers/search.controller.js +3 -0
- package/src/modules/music/controllers/stream.controller.js +11 -3
- package/src/modules/music/middlewares/playlists.verifier.js +1 -1
- package/src/modules/music/music.client.js +3 -6
- package/src/modules/music/music.server.js +8 -4
- package/src/modules/music/router/music.js +8 -1
- package/src/modules/music/routes/albums.routes.js +37 -5
- package/src/modules/music/routes/artists.routes.js +14 -4
- package/src/modules/music/routes/genres.routes.js +5 -1
- package/src/modules/music/routes/playlists.routes.js +42 -9
- package/src/modules/music/routes/tracks.routes.js +27 -2
- package/src/modules/music/store/artists.js +6 -2
- package/src/modules/music/store/player.js +6 -0
- package/src/modules/music/store/tracks.js +31 -0
- package/src/modules/music/websocket/streaming.handler.js +7 -1
- package/src/modules/rents/controllers/services/rents.services.js +2 -2
- package/src/modules/rents/views/components/pages/Gant/GanttBar.vue +4 -3
- package/src/modules/rents/views/components/pages/Gant/GanttChart.vue +42 -40
- package/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue +3 -1
- package/src/modules/rents/views/components/pages/Rents.vue +60 -56
- package/dist/globals.websocket-DzvdIBf6.js +0 -306
- package/dist/globals.websocket-k6_B1T7k.cjs +0 -322
- package/dist/martyrs/src/components/Field/Field.vue2.cjs.map +0 -1
- package/dist/martyrs/src/components/Menu/Menu.vue.cjs.map +0 -1
- package/dist/martyrs/src/components/Menu/Menu.vue.js.map +0 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs +0 -69
- package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs.map +0 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js +0 -69
- package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js.map +0 -1
- package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs +0 -104
- package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs.map +0 -1
- package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js +0 -104
- package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js.map +0 -1
- package/src/modules/music/components/cards/TrackCard.vue +0 -86
- package/src/modules/music/components/layouts/MusicLayout.vue +0 -83
|
@@ -1,27 +1,30 @@
|
|
|
1
1
|
<!-- components/player/VolumeControl.vue -->
|
|
2
2
|
<template>
|
|
3
|
-
<div
|
|
4
|
-
ref="volumeBarContainer"
|
|
5
|
-
class="volume-bar-container w-100 h-thin bg-grey-transp-50 radius-extra pos-relative cursor-pointer"
|
|
6
|
-
@click="setVolume"
|
|
7
|
-
@mousedown="startVolumeChange"
|
|
8
|
-
@mousemove="updateVolumePosition"
|
|
9
|
-
@mouseup="endVolumeChange"
|
|
10
|
-
@mouseleave="endVolumeChange"
|
|
11
|
-
>
|
|
3
|
+
<div class="volume-control">
|
|
12
4
|
<div
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
5
|
+
ref="volumeBarContainer"
|
|
6
|
+
class="volume-bar-container"
|
|
7
|
+
@click="setVolume"
|
|
8
|
+
@mousedown="startVolumeChange"
|
|
9
|
+
@mousemove="updateVolumePosition"
|
|
10
|
+
@mouseup="endVolumeChange"
|
|
11
|
+
@mouseleave="endVolumeChange"
|
|
12
|
+
>
|
|
13
|
+
<div
|
|
14
|
+
class="volume-track"
|
|
15
|
+
:style="{
|
|
16
|
+
background: `linear-gradient(to right, rgb(var(--main)) 0%, rgb(var(--main)) ${volumePercentage}%, rgb(79, 79, 79) ${volumePercentage}%, rgb(79, 79, 79) 100%)`
|
|
17
|
+
}"
|
|
18
|
+
>
|
|
19
|
+
<div
|
|
20
|
+
class="volume-thumb"
|
|
21
|
+
:style="{
|
|
22
|
+
left: `${volumePercentage}%`,
|
|
23
|
+
opacity: muted ? 0 : 1
|
|
24
|
+
}"
|
|
25
|
+
></div>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
25
28
|
</div>
|
|
26
29
|
</template>
|
|
27
30
|
|
|
@@ -80,19 +83,49 @@ const endVolumeChange = () => {
|
|
|
80
83
|
</script>
|
|
81
84
|
|
|
82
85
|
<style scoped>
|
|
83
|
-
.volume-
|
|
84
|
-
|
|
86
|
+
.volume-control {
|
|
87
|
+
width: 100%;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.volume-bar-container {
|
|
91
|
+
width: 100%;
|
|
92
|
+
height: 12px;
|
|
93
|
+
display: flex;
|
|
94
|
+
align-items: center;
|
|
95
|
+
cursor: pointer;
|
|
96
|
+
padding: 4px 0;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.volume-track {
|
|
100
|
+
position: relative;
|
|
101
|
+
width: 100%;
|
|
102
|
+
height: 4px;
|
|
103
|
+
border-radius: 2px;
|
|
104
|
+
transition: height 0.2s ease;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.volume-thumb {
|
|
108
|
+
position: absolute;
|
|
109
|
+
top: 50%;
|
|
110
|
+
width: 12px;
|
|
111
|
+
height: 12px;
|
|
112
|
+
background: rgb(var(--white));
|
|
113
|
+
border-radius: 50%;
|
|
114
|
+
transform: translate(-50%, -50%);
|
|
115
|
+
transition: opacity 0.2s ease;
|
|
116
|
+
opacity: 0;
|
|
85
117
|
}
|
|
86
118
|
|
|
87
|
-
.volume-
|
|
88
|
-
|
|
119
|
+
.volume-bar-container:hover .volume-track {
|
|
120
|
+
height: 6px;
|
|
89
121
|
}
|
|
90
122
|
|
|
91
|
-
.volume-bar-container:hover .volume-
|
|
92
|
-
|
|
123
|
+
.volume-bar-container:hover .volume-thumb {
|
|
124
|
+
opacity: 1 !important;
|
|
93
125
|
}
|
|
94
126
|
|
|
95
|
-
|
|
127
|
+
/* Muted state */
|
|
128
|
+
.volume-track.muted {
|
|
96
129
|
opacity: 0.5;
|
|
97
130
|
}
|
|
98
131
|
</style>
|
|
@@ -28,6 +28,9 @@ export default (function (app, db) {
|
|
|
28
28
|
status: 'published',
|
|
29
29
|
isPublic: true,
|
|
30
30
|
})
|
|
31
|
+
.populate('artist', 'name url photoUrl isVerified')
|
|
32
|
+
.populate('album', 'title url coverArt')
|
|
33
|
+
.populate('genre', 'name url')
|
|
31
34
|
.limit(limitNum);
|
|
32
35
|
}
|
|
33
36
|
if (types.includes('albums') || types.includes('all')) {
|
|
@@ -30,7 +30,6 @@ export default (function (app, db, publicPath) {
|
|
|
30
30
|
}
|
|
31
31
|
// Extract file path from fileUrl
|
|
32
32
|
const fileUrl = track.fileUrl;
|
|
33
|
-
console.log('public is', publicPath);
|
|
34
33
|
const filePath = path.join(publicPath, fileUrl);
|
|
35
34
|
// Check if file exists
|
|
36
35
|
if (!fs.existsSync(filePath)) {
|
|
@@ -41,7 +40,10 @@ export default (function (app, db, publicPath) {
|
|
|
41
40
|
const stat = fs.statSync(filePath);
|
|
42
41
|
const fileSize = stat.size;
|
|
43
42
|
const range = req.headers.range;
|
|
44
|
-
|
|
43
|
+
|
|
44
|
+
// Only count play on first request (not range requests)
|
|
45
|
+
const isFirstRequest = !range || range === 'bytes=0-';
|
|
46
|
+
|
|
45
47
|
if (req.userId) {
|
|
46
48
|
try {
|
|
47
49
|
await db.playHistory.create({
|
|
@@ -53,10 +55,16 @@ export default (function (app, db, publicPath) {
|
|
|
53
55
|
contextId: req.query.contextId || null,
|
|
54
56
|
});
|
|
55
57
|
// Increment playCount
|
|
56
|
-
await db.track.findByIdAndUpdate(trackId, { $inc: { playCount: 1 } });
|
|
58
|
+
const updatedTrack = await db.track.findByIdAndUpdate(trackId, { $inc: { playCount: 1 } }, { new: true });
|
|
57
59
|
} catch (error) {
|
|
58
60
|
logger.error(`Error logging play history: ${error.message}`);
|
|
59
61
|
}
|
|
62
|
+
} else {
|
|
63
|
+
try {
|
|
64
|
+
const updatedTrack = await db.track.findByIdAndUpdate(trackId, { $inc: { playCount: 1 } }, { new: true });
|
|
65
|
+
} catch (error) {
|
|
66
|
+
logger.error(`Error incrementing playCount: ${error.message}`);
|
|
67
|
+
}
|
|
60
68
|
}
|
|
61
69
|
// Handle range requests for audio streaming
|
|
62
70
|
if (range) {
|
|
@@ -11,7 +11,7 @@ import * as storeTracks from './store/tracks.js';
|
|
|
11
11
|
import routerMusic from './router/music.js';
|
|
12
12
|
|
|
13
13
|
// Layouts
|
|
14
|
-
import
|
|
14
|
+
import MusicBottomPlayer from './components/layouts/MusicBottomPlayer.vue';
|
|
15
15
|
|
|
16
16
|
// Pages
|
|
17
17
|
import Album from './components/pages/Album.vue';
|
|
@@ -32,7 +32,6 @@ import VolumeControl from './components/player/VolumeControl.vue';
|
|
|
32
32
|
import AlbumCard from './components/cards/AlbumCard.vue';
|
|
33
33
|
import ArtistCard from './components/cards/ArtistCard.vue';
|
|
34
34
|
import PlaylistCard from './components/cards/PlaylistCard.vue';
|
|
35
|
-
import TrackCard from './components/cards/TrackCard.vue';
|
|
36
35
|
import TrackListCard from './components/cards/TrackListCard.vue';
|
|
37
36
|
|
|
38
37
|
|
|
@@ -112,7 +111,7 @@ const ModuleMusic = {
|
|
|
112
111
|
},
|
|
113
112
|
components: {
|
|
114
113
|
// Layouts
|
|
115
|
-
|
|
114
|
+
MusicBottomPlayer,
|
|
116
115
|
// Pages
|
|
117
116
|
MusicHome,
|
|
118
117
|
SearchResults,
|
|
@@ -127,7 +126,6 @@ const ModuleMusic = {
|
|
|
127
126
|
TrackProgress,
|
|
128
127
|
VolumeControl,
|
|
129
128
|
// Cards
|
|
130
|
-
TrackCard,
|
|
131
129
|
TrackListCard,
|
|
132
130
|
AlbumCard,
|
|
133
131
|
PlaylistCard,
|
|
@@ -151,7 +149,7 @@ export {
|
|
|
151
149
|
// Pages
|
|
152
150
|
MusicHome,
|
|
153
151
|
// Layout
|
|
154
|
-
|
|
152
|
+
MusicBottomPlayer,
|
|
155
153
|
MusicLibrary,
|
|
156
154
|
// Player Components
|
|
157
155
|
MusicPlayer,
|
|
@@ -165,7 +163,6 @@ export {
|
|
|
165
163
|
SearchForm,
|
|
166
164
|
SearchResults,
|
|
167
165
|
// Cards
|
|
168
|
-
TrackCard,
|
|
169
166
|
TrackListCard,
|
|
170
167
|
Track,
|
|
171
168
|
TrackForm,
|
|
@@ -63,10 +63,14 @@ function initializeMusic({ app, db, wss, origins, publicPath }) {
|
|
|
63
63
|
const { getInstance } = globalsabac;
|
|
64
64
|
const abac = getInstance(db);
|
|
65
65
|
musicPolicies(abac);
|
|
66
|
-
// Set up WebSocket handlers if
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
// Set up WebSocket handlers if wss is provided
|
|
67
|
+
if (wss) {
|
|
68
|
+
console.log('Music Server: Registering music-streaming WebSocket handler');
|
|
69
|
+
const handler = StreamingHandler(db);
|
|
70
|
+
wss.registerModule('music-streaming', handler.handleStreamingMessage);
|
|
71
|
+
console.log('Music Server: WebSocket handler registered successfully');
|
|
72
|
+
} else {
|
|
73
|
+
console.log('Music Server: WebSocket server (wss) not provided, streaming handler not registered');
|
|
70
74
|
}
|
|
71
75
|
const musicCache = new Cache({ ttlSeconds: 60 * 15 }); // 15 minute cache
|
|
72
76
|
const musicLogger = new Logger(db);
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import SidebarMusic from '../components/SidebarMusic.vue';
|
|
2
|
+
import MusicBottomPlayer from '../components/layouts/MusicBottomPlayer.vue';
|
|
3
|
+
|
|
4
|
+
|
|
1
5
|
// router/music.js
|
|
2
6
|
import artistRoutes from './artists.js';
|
|
3
7
|
import albumRoutes from './albums.js';
|
|
@@ -6,7 +10,10 @@ import playlistRoutes from './playlists.js';
|
|
|
6
10
|
|
|
7
11
|
export default {
|
|
8
12
|
path: 'music',
|
|
9
|
-
|
|
13
|
+
meta: {
|
|
14
|
+
// sidebar_navigation: SidebarMusic,
|
|
15
|
+
player: MusicBottomPlayer,
|
|
16
|
+
},
|
|
10
17
|
children: [
|
|
11
18
|
{
|
|
12
19
|
path: '',
|
|
@@ -17,7 +17,7 @@ export default function setupAlbumsRoutes(app, db) {
|
|
|
17
17
|
modelName: 'album',
|
|
18
18
|
basePath: '/api/albums',
|
|
19
19
|
|
|
20
|
-
auth:
|
|
20
|
+
auth: { read: false },
|
|
21
21
|
|
|
22
22
|
verifiers: {
|
|
23
23
|
create: verifier.createVerifier,
|
|
@@ -28,6 +28,10 @@ export default function setupAlbumsRoutes(app, db) {
|
|
|
28
28
|
|
|
29
29
|
abac: abac,
|
|
30
30
|
|
|
31
|
+
policies: {
|
|
32
|
+
read: { enabled: false }
|
|
33
|
+
},
|
|
34
|
+
|
|
31
35
|
cache: {
|
|
32
36
|
enabled: true,
|
|
33
37
|
ttl: 300,
|
|
@@ -47,15 +51,27 @@ export default function setupAlbumsRoutes(app, db) {
|
|
|
47
51
|
method: 'get',
|
|
48
52
|
path: '/url/:url',
|
|
49
53
|
auth: false,
|
|
54
|
+
abac: { enabled: false },
|
|
50
55
|
handler: async (req, res) => {
|
|
51
56
|
try {
|
|
52
57
|
const album = await db.album
|
|
53
58
|
.findOne({ url: req.params.url })
|
|
54
|
-
.populate('artists', 'name url');
|
|
59
|
+
.populate('artists', 'name url photoUrl isVerified');
|
|
55
60
|
|
|
56
61
|
if (!album) {
|
|
57
62
|
return res.status(404).json({ error: 'Album not found' });
|
|
58
63
|
}
|
|
64
|
+
|
|
65
|
+
// Update totalTracks count if needed
|
|
66
|
+
const trackCount = await db.track.countDocuments({
|
|
67
|
+
album: album._id,
|
|
68
|
+
status: 'published'
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
if (album.totalTracks !== trackCount) {
|
|
72
|
+
album.totalTracks = trackCount;
|
|
73
|
+
await album.save();
|
|
74
|
+
}
|
|
59
75
|
|
|
60
76
|
res.json(album);
|
|
61
77
|
} catch (error) {
|
|
@@ -70,6 +86,7 @@ export default function setupAlbumsRoutes(app, db) {
|
|
|
70
86
|
method: 'get',
|
|
71
87
|
path: '/:albumId/tracks',
|
|
72
88
|
auth: false,
|
|
89
|
+
abac: { enabled: false },
|
|
73
90
|
handler: async (req, res) => {
|
|
74
91
|
try {
|
|
75
92
|
const { albumId } = req.params;
|
|
@@ -80,8 +97,9 @@ export default function setupAlbumsRoutes(app, db) {
|
|
|
80
97
|
status: 'published',
|
|
81
98
|
isPublic: true
|
|
82
99
|
})
|
|
83
|
-
.populate('artist', 'name url')
|
|
84
|
-
.populate('
|
|
100
|
+
.populate('artist', 'name url photoUrl isVerified')
|
|
101
|
+
.populate('album', 'title url coverArt')
|
|
102
|
+
.populate('genre', 'name url')
|
|
85
103
|
.sort({ trackNumber: 1, createdAt: 1 });
|
|
86
104
|
|
|
87
105
|
res.json(tracks);
|
|
@@ -97,6 +115,7 @@ export default function setupAlbumsRoutes(app, db) {
|
|
|
97
115
|
method: 'get',
|
|
98
116
|
path: '/featured',
|
|
99
117
|
auth: false,
|
|
118
|
+
abac: { enabled: false },
|
|
100
119
|
handler: async (req, res) => {
|
|
101
120
|
try {
|
|
102
121
|
const limit = parseInt(req.query.limit) || 10;
|
|
@@ -110,9 +129,22 @@ export default function setupAlbumsRoutes(app, db) {
|
|
|
110
129
|
$gte: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000) // последние 90 дней
|
|
111
130
|
}
|
|
112
131
|
})
|
|
113
|
-
.populate('artists', 'name url')
|
|
132
|
+
.populate('artists', 'name url photoUrl isVerified')
|
|
114
133
|
.sort({ createdAt: -1 })
|
|
115
134
|
.limit(limit);
|
|
135
|
+
|
|
136
|
+
// Update totalTracks count for each album
|
|
137
|
+
for (const album of featuredAlbums) {
|
|
138
|
+
const trackCount = await db.track.countDocuments({
|
|
139
|
+
album: album._id,
|
|
140
|
+
status: 'published'
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
if (album.totalTracks !== trackCount) {
|
|
144
|
+
album.totalTracks = trackCount;
|
|
145
|
+
await album.save();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
116
148
|
|
|
117
149
|
res.json(featuredAlbums);
|
|
118
150
|
} catch (error) {
|
|
@@ -17,7 +17,7 @@ export default function setupArtistsRoutes(app, db) {
|
|
|
17
17
|
modelName: 'artist',
|
|
18
18
|
basePath: '/api/artists',
|
|
19
19
|
|
|
20
|
-
auth:
|
|
20
|
+
auth: { read: false },
|
|
21
21
|
|
|
22
22
|
verifiers: {
|
|
23
23
|
create: verifier.createVerifier,
|
|
@@ -28,6 +28,10 @@ export default function setupArtistsRoutes(app, db) {
|
|
|
28
28
|
|
|
29
29
|
abac: abac,
|
|
30
30
|
|
|
31
|
+
policies: {
|
|
32
|
+
read: { enabled: false }
|
|
33
|
+
},
|
|
34
|
+
|
|
31
35
|
cache: {
|
|
32
36
|
enabled: true,
|
|
33
37
|
ttl: 300,
|
|
@@ -47,6 +51,7 @@ export default function setupArtistsRoutes(app, db) {
|
|
|
47
51
|
method: 'get',
|
|
48
52
|
path: '/url/:url',
|
|
49
53
|
auth: false,
|
|
54
|
+
abac: { enabled: false },
|
|
50
55
|
handler: async (req, res) => {
|
|
51
56
|
try {
|
|
52
57
|
const artist = await db.artist.findOne({ url: req.params.url });
|
|
@@ -66,6 +71,7 @@ export default function setupArtistsRoutes(app, db) {
|
|
|
66
71
|
method: 'get',
|
|
67
72
|
path: '/:artistId/discography',
|
|
68
73
|
auth: false,
|
|
74
|
+
abac: { enabled: false },
|
|
69
75
|
handler: async (req, res) => {
|
|
70
76
|
try {
|
|
71
77
|
const { artistId } = req.params;
|
|
@@ -76,19 +82,22 @@ export default function setupArtistsRoutes(app, db) {
|
|
|
76
82
|
.populate('artists', 'name')
|
|
77
83
|
.sort({ releaseDate: -1 });
|
|
78
84
|
|
|
79
|
-
// Получаем треки артиста (включая те, которые не в альбомах)
|
|
85
|
+
// Получаем популярные треки артиста (включая те, которые не в альбомах)
|
|
80
86
|
const tracks = await db.track
|
|
81
87
|
.find({
|
|
82
88
|
artist: artistId,
|
|
83
89
|
status: 'published',
|
|
84
90
|
isPublic: true
|
|
85
91
|
})
|
|
86
|
-
.populate('album', 'title')
|
|
87
|
-
.
|
|
92
|
+
.populate('album', 'title url coverArt')
|
|
93
|
+
.populate('genre', 'name')
|
|
94
|
+
.sort({ playCount: -1 })
|
|
95
|
+
.limit(10);
|
|
88
96
|
|
|
89
97
|
res.json({
|
|
90
98
|
albums,
|
|
91
99
|
tracks,
|
|
100
|
+
singles: tracks.filter(track => !track.album), // треки без альбома считаем синглами
|
|
92
101
|
artist: artistId
|
|
93
102
|
});
|
|
94
103
|
} catch (error) {
|
|
@@ -138,6 +147,7 @@ export default function setupArtistsRoutes(app, db) {
|
|
|
138
147
|
method: 'get',
|
|
139
148
|
path: '/:artistId/related',
|
|
140
149
|
auth: false,
|
|
150
|
+
abac: { enabled: false },
|
|
141
151
|
handler: async (req, res) => {
|
|
142
152
|
try {
|
|
143
153
|
const { artistId } = req.params;
|
|
@@ -17,7 +17,7 @@ export default function setupGenresRoutes(app, db) {
|
|
|
17
17
|
modelName: 'genre',
|
|
18
18
|
basePath: '/api/genres',
|
|
19
19
|
|
|
20
|
-
auth:
|
|
20
|
+
auth: { read: false },
|
|
21
21
|
|
|
22
22
|
verifiers: {
|
|
23
23
|
create: verifier.createVerifier,
|
|
@@ -28,6 +28,10 @@ export default function setupGenresRoutes(app, db) {
|
|
|
28
28
|
|
|
29
29
|
abac: abac,
|
|
30
30
|
|
|
31
|
+
policies: {
|
|
32
|
+
read: { enabled: false }
|
|
33
|
+
},
|
|
34
|
+
|
|
31
35
|
cache: {
|
|
32
36
|
enabled: true,
|
|
33
37
|
ttl: 300,
|
|
@@ -17,7 +17,7 @@ export default function setupPlaylistsRoutes(app, db) {
|
|
|
17
17
|
modelName: 'playlist',
|
|
18
18
|
basePath: '/api/playlists',
|
|
19
19
|
|
|
20
|
-
auth:
|
|
20
|
+
auth: { read: false },
|
|
21
21
|
|
|
22
22
|
verifiers: {
|
|
23
23
|
create: verifier.createVerifier,
|
|
@@ -28,6 +28,10 @@ export default function setupPlaylistsRoutes(app, db) {
|
|
|
28
28
|
|
|
29
29
|
abac: abac,
|
|
30
30
|
|
|
31
|
+
policies: {
|
|
32
|
+
read: { enabled: false }
|
|
33
|
+
},
|
|
34
|
+
|
|
31
35
|
cache: {
|
|
32
36
|
enabled: true,
|
|
33
37
|
ttl: 300,
|
|
@@ -47,6 +51,7 @@ export default function setupPlaylistsRoutes(app, db) {
|
|
|
47
51
|
method: 'get',
|
|
48
52
|
path: '/url/:url',
|
|
49
53
|
auth: false,
|
|
54
|
+
abac: { enabled: false },
|
|
50
55
|
handler: async (req, res) => {
|
|
51
56
|
try {
|
|
52
57
|
const playlist = await db.playlist
|
|
@@ -54,23 +59,38 @@ export default function setupPlaylistsRoutes(app, db) {
|
|
|
54
59
|
.populate({
|
|
55
60
|
path: 'tracks.track',
|
|
56
61
|
select: '-lyrics',
|
|
62
|
+
populate: [
|
|
63
|
+
{
|
|
64
|
+
path: 'artist',
|
|
65
|
+
select: 'name url photoUrl isVerified'
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
path: 'album',
|
|
69
|
+
select: 'title url coverArt'
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
path: 'genre',
|
|
73
|
+
select: 'name url'
|
|
74
|
+
}
|
|
75
|
+
]
|
|
57
76
|
});
|
|
58
77
|
|
|
59
78
|
if (!playlist) {
|
|
60
79
|
return res.status(404).json({ error: 'Playlist not found' });
|
|
61
80
|
}
|
|
62
81
|
|
|
63
|
-
//
|
|
64
|
-
if (!playlist.isPublic) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
82
|
+
// Only return public playlists if no auth
|
|
83
|
+
if (!playlist.isPublic && !req.userId) {
|
|
84
|
+
return res.status(404).json({ error: 'Playlist not found' });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// If private and authenticated, check permissions
|
|
88
|
+
if (!playlist.isPublic && req.userId) {
|
|
69
89
|
const isOwner = playlist.owner.target.toString() === req.userId;
|
|
70
90
|
const isCollaborator = playlist.collaborators.some(collab => collab.toString() === req.userId);
|
|
71
91
|
|
|
72
92
|
if (!isOwner && !isCollaborator) {
|
|
73
|
-
return res.status(
|
|
93
|
+
return res.status(404).json({ error: 'Playlist not found' });
|
|
74
94
|
}
|
|
75
95
|
}
|
|
76
96
|
|
|
@@ -99,7 +119,20 @@ export default function setupPlaylistsRoutes(app, db) {
|
|
|
99
119
|
|
|
100
120
|
const playlists = await db.playlist
|
|
101
121
|
.find(query)
|
|
102
|
-
.populate(
|
|
122
|
+
.populate({
|
|
123
|
+
path: 'tracks.track',
|
|
124
|
+
select: 'title artist album genre duration',
|
|
125
|
+
populate: [
|
|
126
|
+
{
|
|
127
|
+
path: 'artist',
|
|
128
|
+
select: 'name url photoUrl isVerified'
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
path: 'album',
|
|
132
|
+
select: 'title url coverArt'
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
})
|
|
103
136
|
.sort({ updatedAt: -1 });
|
|
104
137
|
|
|
105
138
|
res.json(playlists);
|
|
@@ -17,7 +17,7 @@ export default function setupTracksRoutes(app, db) {
|
|
|
17
17
|
modelName: 'track',
|
|
18
18
|
basePath: '/api/tracks',
|
|
19
19
|
|
|
20
|
-
auth:
|
|
20
|
+
auth: { read: false },
|
|
21
21
|
|
|
22
22
|
verifiers: {
|
|
23
23
|
create: verifier.createVerifier,
|
|
@@ -28,6 +28,10 @@ export default function setupTracksRoutes(app, db) {
|
|
|
28
28
|
|
|
29
29
|
abac: abac,
|
|
30
30
|
|
|
31
|
+
policies: {
|
|
32
|
+
read: { enabled: false }
|
|
33
|
+
},
|
|
34
|
+
|
|
31
35
|
cache: {
|
|
32
36
|
enabled: true,
|
|
33
37
|
ttl: 300,
|
|
@@ -40,6 +44,12 @@ export default function setupTracksRoutes(app, db) {
|
|
|
40
44
|
}
|
|
41
45
|
});
|
|
42
46
|
|
|
47
|
+
// Отключаем ABAC для кастомных действий
|
|
48
|
+
tracksCRUD.policies.disableForAction('get-by-url');
|
|
49
|
+
tracksCRUD.policies.disableForAction('recent');
|
|
50
|
+
tracksCRUD.policies.disableForAction('popular');
|
|
51
|
+
tracksCRUD.policies.disableForAction('by-genre');
|
|
52
|
+
|
|
43
53
|
// Перенос кастомных роутов через addAction для обратной совместимости
|
|
44
54
|
|
|
45
55
|
// Get track by URL - /api/tracks/url/:url
|
|
@@ -47,9 +57,15 @@ export default function setupTracksRoutes(app, db) {
|
|
|
47
57
|
method: 'get',
|
|
48
58
|
path: '/url/:url',
|
|
49
59
|
auth: false,
|
|
60
|
+
abac: { enabled: false },
|
|
50
61
|
handler: async (req, res) => {
|
|
51
62
|
try {
|
|
52
|
-
const track = await db.track
|
|
63
|
+
const track = await db.track
|
|
64
|
+
.findOne({ url: req.params.url })
|
|
65
|
+
.populate('artist', 'name url photoUrl isVerified')
|
|
66
|
+
.populate('album', 'title url coverArt')
|
|
67
|
+
.populate('genre', 'name url');
|
|
68
|
+
|
|
53
69
|
if (!track) {
|
|
54
70
|
return res.status(404).json({ error: 'Track not found' });
|
|
55
71
|
}
|
|
@@ -82,6 +98,7 @@ export default function setupTracksRoutes(app, db) {
|
|
|
82
98
|
method: 'get',
|
|
83
99
|
path: '/recent',
|
|
84
100
|
auth: false,
|
|
101
|
+
abac: { enabled: false },
|
|
85
102
|
handler: async (req, res) => {
|
|
86
103
|
try {
|
|
87
104
|
const limit = parseInt(req.query.limit) || 10;
|
|
@@ -90,6 +107,8 @@ export default function setupTracksRoutes(app, db) {
|
|
|
90
107
|
status: 'published',
|
|
91
108
|
isPublic: true,
|
|
92
109
|
})
|
|
110
|
+
.populate('artist', 'name url photoUrl isVerified')
|
|
111
|
+
.populate('album', 'title url coverArt')
|
|
93
112
|
.sort({ createdAt: -1 })
|
|
94
113
|
.limit(limit);
|
|
95
114
|
res.json(recentTracks);
|
|
@@ -105,6 +124,7 @@ export default function setupTracksRoutes(app, db) {
|
|
|
105
124
|
method: 'get',
|
|
106
125
|
path: '/popular',
|
|
107
126
|
auth: false,
|
|
127
|
+
abac: { enabled: false },
|
|
108
128
|
handler: async (req, res) => {
|
|
109
129
|
try {
|
|
110
130
|
const limit = parseInt(req.query.limit) || 10;
|
|
@@ -113,6 +133,8 @@ export default function setupTracksRoutes(app, db) {
|
|
|
113
133
|
status: 'published',
|
|
114
134
|
isPublic: true,
|
|
115
135
|
})
|
|
136
|
+
.populate('artist', 'name url photoUrl isVerified')
|
|
137
|
+
.populate('album', 'title url coverArt')
|
|
116
138
|
.sort({ playCount: -1 })
|
|
117
139
|
.limit(limit);
|
|
118
140
|
res.json(popularTracks);
|
|
@@ -128,6 +150,7 @@ export default function setupTracksRoutes(app, db) {
|
|
|
128
150
|
method: 'get',
|
|
129
151
|
path: '/genre/:genreId',
|
|
130
152
|
auth: false,
|
|
153
|
+
abac: { enabled: false },
|
|
131
154
|
handler: async (req, res) => {
|
|
132
155
|
try {
|
|
133
156
|
const tracks = await db.track
|
|
@@ -136,6 +159,8 @@ export default function setupTracksRoutes(app, db) {
|
|
|
136
159
|
status: 'published',
|
|
137
160
|
isPublic: true,
|
|
138
161
|
})
|
|
162
|
+
.populate('artist', 'name url photoUrl isVerified')
|
|
163
|
+
.populate('album', 'title url coverArt')
|
|
139
164
|
.sort({ releaseDate: -1 });
|
|
140
165
|
res.json(tracks);
|
|
141
166
|
} catch (error) {
|
|
@@ -14,6 +14,7 @@ export const state = reactive({
|
|
|
14
14
|
discography: {
|
|
15
15
|
albums: [],
|
|
16
16
|
singles: [],
|
|
17
|
+
tracks: [],
|
|
17
18
|
},
|
|
18
19
|
relatedArtists: [],
|
|
19
20
|
isLoading: false,
|
|
@@ -72,7 +73,6 @@ export const actions = {
|
|
|
72
73
|
try {
|
|
73
74
|
const response = await fetch(`${process.env.API_URL}/api/artists/url/${url}`);
|
|
74
75
|
const artist = await response.json();
|
|
75
|
-
state.currentArtist = artist;
|
|
76
76
|
|
|
77
77
|
// Fetch artist discography
|
|
78
78
|
await this.fetchArtistDiscography(artist._id);
|
|
@@ -80,6 +80,9 @@ export const actions = {
|
|
|
80
80
|
// Fetch related artists
|
|
81
81
|
await this.fetchRelatedArtists(artist._id);
|
|
82
82
|
|
|
83
|
+
// Set artist only after all data is loaded
|
|
84
|
+
state.currentArtist = artist;
|
|
85
|
+
|
|
83
86
|
return artist;
|
|
84
87
|
} catch (error) {
|
|
85
88
|
console.error('Error fetching artist by URL:', error);
|
|
@@ -94,11 +97,12 @@ export const actions = {
|
|
|
94
97
|
state.discography = {
|
|
95
98
|
albums: discography.albums || [],
|
|
96
99
|
singles: discography.singles || [],
|
|
100
|
+
tracks: discography.tracks || [],
|
|
97
101
|
};
|
|
98
102
|
return discography;
|
|
99
103
|
} catch (error) {
|
|
100
104
|
console.error('Error fetching artist discography:', error);
|
|
101
|
-
return { albums: [], singles: [] };
|
|
105
|
+
return { albums: [], singles: [], tracks: [] };
|
|
102
106
|
}
|
|
103
107
|
},
|
|
104
108
|
|