@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.
Files changed (340) hide show
  1. package/dist/_virtual/index.cjs +4 -4
  2. package/dist/_virtual/index.js +4 -4
  3. package/dist/_virtual/index2.cjs +4 -4
  4. package/dist/_virtual/index2.js +4 -4
  5. package/dist/builder.cjs +52 -45
  6. package/dist/builder.js +53 -46
  7. package/dist/{crud-B-kQw3Z5.cjs → crud-JN_LFj01.cjs} +3 -0
  8. package/dist/{crud-Cwx5VlSm.js → crud-sE7GLPbj.js} +3 -0
  9. package/dist/globals.server.cjs +322 -3
  10. package/dist/globals.server.js +303 -1
  11. package/dist/{globals.verifier-D68mHEBl.cjs → globals.verifier-C0zj_LLo.cjs} +8 -1
  12. package/dist/{globals.verifier-CWFz5Gh2.js → globals.verifier-DFqKQ7hK.js} +8 -1
  13. package/dist/inventory.server.cjs +2 -2
  14. package/dist/inventory.server.js +2 -2
  15. package/dist/{main-SZQ1QjeP.js → main-CJm5myDI.js} +631 -607
  16. package/dist/{main-MzmGbSxs.cjs → main-DTaE01lg.cjs} +6 -6
  17. package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs +1 -1
  18. package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs.map +1 -1
  19. package/dist/martyrs/src/components/Calendar/Calendar.vue2.js +1 -1
  20. package/dist/martyrs/src/components/Calendar/Calendar.vue2.js.map +1 -1
  21. package/dist/martyrs/src/components/Feed/Feed.vue.cjs +33 -7
  22. package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
  23. package/dist/martyrs/src/components/Feed/Feed.vue.js +33 -7
  24. package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
  25. package/dist/martyrs/src/components/Field/{Field.vue2.cjs → Field.vue.cjs} +2 -2
  26. package/dist/martyrs/src/components/Field/{Field.vue2.js.map → Field.vue.cjs.map} +1 -1
  27. package/dist/martyrs/src/components/Field/{Field.vue2.js → Field.vue.js} +2 -2
  28. package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -0
  29. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs +1 -1
  30. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +1 -1
  31. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +1 -1
  32. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +1 -1
  33. package/dist/martyrs/src/components/Menu/{Menu.vue.cjs → Menu.vue2.cjs} +2 -2
  34. package/dist/martyrs/src/components/Menu/Menu.vue2.cjs.map +1 -0
  35. package/dist/martyrs/src/components/Menu/{Menu.vue.js → Menu.vue2.js} +2 -2
  36. package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +1 -0
  37. package/dist/martyrs/src/components/Menu/MenuItem.vue.js +2 -2
  38. package/dist/martyrs/src/components/Menu/MenuItem.vue.js.map +1 -1
  39. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js +4 -4
  40. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs +1 -1
  41. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +1 -1
  42. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +1 -1
  43. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
  44. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
  45. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  46. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +2 -2
  47. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
  48. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.cjs +1 -1
  49. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
  50. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +1 -1
  51. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
  52. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +1 -1
  53. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
  54. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +1 -1
  55. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
  56. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.cjs +1 -1
  57. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
  58. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +2 -2
  59. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +2 -2
  60. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.cjs +1 -1
  61. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.js +1 -1
  62. package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.cjs +1 -1
  63. package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.js +1 -1
  64. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +1 -1
  65. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
  66. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +1 -1
  67. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
  68. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +1 -1
  69. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
  70. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
  71. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
  72. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
  73. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
  74. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.cjs +1 -1
  75. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.js +1 -1
  76. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +5 -1
  77. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs.map +1 -1
  78. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +5 -1
  79. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js.map +1 -1
  80. package/dist/martyrs/src/modules/icons/entities/IconTime.vue.cjs +2 -2
  81. package/dist/martyrs/src/modules/icons/entities/IconTime.vue.js +2 -2
  82. package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.cjs +2 -2
  83. package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.js +2 -2
  84. package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.cjs +2 -2
  85. package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.js +2 -2
  86. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js +6 -6
  87. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js.map +1 -1
  88. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.cjs +1 -1
  89. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +1 -1
  90. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.cjs +1 -1
  91. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +1 -1
  92. package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs +1 -1
  93. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs +1 -1
  94. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
  95. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs +22 -15
  96. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs.map +1 -1
  97. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +23 -16
  98. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js.map +1 -1
  99. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs +2 -2
  100. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs.map +1 -1
  101. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js +2 -2
  102. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js.map +1 -1
  103. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs +31 -13
  104. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs.map +1 -1
  105. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +33 -15
  106. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js.map +1 -1
  107. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs +39 -22
  108. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs.map +1 -1
  109. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +39 -22
  110. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js.map +1 -1
  111. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.cjs +1 -1
  112. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +1 -1
  113. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +1 -1
  114. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
  115. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs +385 -125
  116. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs.map +1 -1
  117. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +391 -131
  118. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js.map +1 -1
  119. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs +24 -7
  120. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs.map +1 -1
  121. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +25 -8
  122. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js.map +1 -1
  123. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs +99 -87
  124. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs.map +1 -1
  125. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +111 -99
  126. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js.map +1 -1
  127. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs +21 -0
  128. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs.map +1 -0
  129. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js +21 -0
  130. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js.map +1 -0
  131. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +442 -210
  132. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs.map +1 -1
  133. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +445 -213
  134. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js.map +1 -1
  135. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs +92 -117
  136. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs.map +1 -1
  137. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +93 -118
  138. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js.map +1 -1
  139. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs +72 -113
  140. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs.map +1 -1
  141. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js +78 -119
  142. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js.map +1 -1
  143. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs +15 -12
  144. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs.map +1 -1
  145. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +15 -12
  146. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js.map +1 -1
  147. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +558 -429
  148. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs.map +1 -1
  149. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +560 -431
  150. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
  151. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +146 -284
  152. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs.map +1 -1
  153. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +149 -287
  154. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js.map +1 -1
  155. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +460 -63
  156. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs.map +1 -1
  157. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +462 -65
  158. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js.map +1 -1
  159. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs +126 -136
  160. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs.map +1 -1
  161. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +129 -139
  162. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js.map +1 -1
  163. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs +18 -15
  164. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs.map +1 -1
  165. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js +18 -15
  166. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js.map +1 -1
  167. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs +28 -23
  168. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs.map +1 -1
  169. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +29 -24
  170. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js.map +1 -1
  171. package/dist/martyrs/src/modules/music/music.client.cjs +3 -6
  172. package/dist/martyrs/src/modules/music/music.client.cjs.map +1 -1
  173. package/dist/martyrs/src/modules/music/music.client.js +9 -12
  174. package/dist/martyrs/src/modules/music/music.client.js.map +1 -1
  175. package/dist/martyrs/src/modules/music/router/music.cjs +27 -1
  176. package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -1
  177. package/dist/martyrs/src/modules/music/router/music.js +27 -1
  178. package/dist/martyrs/src/modules/music/router/music.js.map +1 -1
  179. package/dist/martyrs/src/modules/music/store/artists.cjs +6 -4
  180. package/dist/martyrs/src/modules/music/store/artists.cjs.map +1 -1
  181. package/dist/martyrs/src/modules/music/store/artists.js +6 -4
  182. package/dist/martyrs/src/modules/music/store/artists.js.map +1 -1
  183. package/dist/martyrs/src/modules/music/store/player.cjs +5 -0
  184. package/dist/martyrs/src/modules/music/store/player.cjs.map +1 -1
  185. package/dist/martyrs/src/modules/music/store/player.js +5 -0
  186. package/dist/martyrs/src/modules/music/store/player.js.map +1 -1
  187. package/dist/martyrs/src/modules/music/store/tracks.cjs +22 -0
  188. package/dist/martyrs/src/modules/music/store/tracks.cjs.map +1 -1
  189. package/dist/martyrs/src/modules/music/store/tracks.js +22 -0
  190. package/dist/martyrs/src/modules/music/store/tracks.js.map +1 -1
  191. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js +2 -2
  192. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
  193. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +1 -1
  194. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  195. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.cjs +1 -1
  196. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.js +1 -1
  197. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.cjs +1 -1
  198. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.js +1 -1
  199. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +1 -1
  200. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
  201. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +2 -2
  202. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +1 -1
  203. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +1 -1
  204. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
  205. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
  206. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +1 -1
  207. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
  208. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
  209. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
  210. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
  211. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
  212. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
  213. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
  214. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +1 -1
  215. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
  216. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +1 -1
  217. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
  218. package/dist/martyrs/src/modules/organizations/router/organizations.cjs +1 -1
  219. package/dist/martyrs/src/modules/organizations/router/organizations.js +1 -1
  220. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
  221. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  222. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
  223. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  224. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +1 -1
  225. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +1 -1
  226. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
  227. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
  228. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.cjs +1 -1
  229. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
  230. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.cjs +1 -1
  231. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
  232. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +1 -1
  233. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
  234. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs +4 -3
  235. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs.map +1 -1
  236. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js +4 -3
  237. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js.map +1 -1
  238. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs +37 -70
  239. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs.map +1 -1
  240. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js +38 -71
  241. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js.map +1 -1
  242. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +2 -1
  243. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs.map +1 -1
  244. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +6 -5
  245. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js.map +1 -1
  246. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +45 -52
  247. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs.map +1 -1
  248. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +46 -53
  249. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js.map +1 -1
  250. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +1 -1
  251. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
  252. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.cjs +1 -1
  253. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
  254. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
  255. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  256. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +1 -1
  257. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
  258. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.cjs +1 -1
  259. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
  260. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.cjs +1 -1
  261. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js +1 -1
  262. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.cjs +1 -1
  263. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +1 -1
  264. package/dist/martyrs.cjs.js +1 -1
  265. package/dist/martyrs.css +1 -1
  266. package/dist/martyrs.es.js +1 -1
  267. package/dist/music.server.cjs +124 -31
  268. package/dist/music.server.js +124 -31
  269. package/dist/organizations.server.cjs +1 -1
  270. package/dist/organizations.server.js +1 -1
  271. package/dist/products.server.cjs +2 -2
  272. package/dist/products.server.js +2 -2
  273. package/dist/rents.server.cjs +3 -3
  274. package/dist/rents.server.js +3 -3
  275. package/dist/style.css +373 -80
  276. package/dist/{web-D7lZjuC0.js → web-Dkk0_7TA.js} +1 -1
  277. package/dist/{web-D-YZ9KHz.cjs → web-stVkXd0l.cjs} +1 -1
  278. package/package.json +1 -1
  279. package/src/builder/modes/ssr.prod.js +21 -5
  280. package/src/builder/rspack/rspack.config.ssr.client.js +40 -40
  281. package/src/components/Calendar/Calendar.vue +378 -377
  282. package/src/components/Feed/Feed.vue +28 -2
  283. package/src/modules/globals/controllers/classes/crud/crud.policies.js +5 -0
  284. package/src/modules/globals/controllers/classes/globals.validator.js +8 -1
  285. package/src/modules/globals/views/components/layouts/Client.vue +7 -0
  286. package/src/modules/music/README.md +8 -0
  287. package/src/modules/music/components/SidebarMusic.vue +6 -9
  288. package/src/modules/music/components/cards/AlbumCard.vue +20 -14
  289. package/src/modules/music/components/cards/ArtistCard.vue +1 -1
  290. package/src/modules/music/components/cards/PlaylistCard.vue +31 -11
  291. package/src/modules/music/components/cards/TrackListCard.vue +24 -13
  292. package/src/modules/music/components/forms/PlaylistForm.vue +417 -107
  293. package/src/modules/music/components/forms/SearchForm.vue +31 -8
  294. package/src/modules/music/components/forms/TrackForm.vue +50 -32
  295. package/src/modules/music/components/layouts/MusicBottomPlayer.vue +17 -0
  296. package/src/modules/music/components/pages/Album.vue +373 -186
  297. package/src/modules/music/components/pages/Artist.vue +54 -94
  298. package/src/modules/music/components/pages/MusicHome.vue +59 -56
  299. package/src/modules/music/components/pages/MusicLibrary.vue +13 -11
  300. package/src/modules/music/components/pages/Playlist.vue +495 -379
  301. package/src/modules/music/components/pages/SearchResults.vue +185 -313
  302. package/src/modules/music/components/pages/Track.vue +363 -69
  303. package/src/modules/music/components/player/MusicPlayer.vue +368 -97
  304. package/src/modules/music/components/player/TrackProgress.vue +76 -22
  305. package/src/modules/music/components/player/VolumeControl.vue +61 -28
  306. package/src/modules/music/controllers/search.controller.js +3 -0
  307. package/src/modules/music/controllers/stream.controller.js +11 -3
  308. package/src/modules/music/middlewares/playlists.verifier.js +1 -1
  309. package/src/modules/music/music.client.js +3 -6
  310. package/src/modules/music/music.server.js +8 -4
  311. package/src/modules/music/router/music.js +8 -1
  312. package/src/modules/music/routes/albums.routes.js +37 -5
  313. package/src/modules/music/routes/artists.routes.js +14 -4
  314. package/src/modules/music/routes/genres.routes.js +5 -1
  315. package/src/modules/music/routes/playlists.routes.js +42 -9
  316. package/src/modules/music/routes/tracks.routes.js +27 -2
  317. package/src/modules/music/store/artists.js +6 -2
  318. package/src/modules/music/store/player.js +6 -0
  319. package/src/modules/music/store/tracks.js +31 -0
  320. package/src/modules/music/websocket/streaming.handler.js +7 -1
  321. package/src/modules/rents/controllers/services/rents.services.js +2 -2
  322. package/src/modules/rents/views/components/pages/Gant/GanttBar.vue +4 -3
  323. package/src/modules/rents/views/components/pages/Gant/GanttChart.vue +42 -40
  324. package/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue +3 -1
  325. package/src/modules/rents/views/components/pages/Rents.vue +60 -56
  326. package/dist/globals.websocket-DzvdIBf6.js +0 -306
  327. package/dist/globals.websocket-k6_B1T7k.cjs +0 -322
  328. package/dist/martyrs/src/components/Field/Field.vue2.cjs.map +0 -1
  329. package/dist/martyrs/src/components/Menu/Menu.vue.cjs.map +0 -1
  330. package/dist/martyrs/src/components/Menu/Menu.vue.js.map +0 -1
  331. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs +0 -69
  332. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs.map +0 -1
  333. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js +0 -69
  334. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js.map +0 -1
  335. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs +0 -104
  336. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs.map +0 -1
  337. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js +0 -104
  338. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js.map +0 -1
  339. package/src/modules/music/components/cards/TrackCard.vue +0 -86
  340. 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
- class="volume-bar h-100 bg-white radius-extra"
14
- :style="{ width: volumePercentage + '%' }"
15
- :class="{ 'muted': muted }"
16
- ></div>
17
- <div
18
- class="volume-handle w-thin h-thin bg-white radius-round pos-absolute pos-t-50 pos-l-0"
19
- :style="{
20
- left: `calc(${volumePercentage}% - 4px)`,
21
- transform: 'translateY(-50%)',
22
- opacity: muted ? 0 : 1
23
- }"
24
- ></div>
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-bar-container:hover .volume-bar:not(.muted) {
84
- background-color: rgb(var(--main));
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-handle {
88
- display: none;
119
+ .volume-bar-container:hover .volume-track {
120
+ height: 6px;
89
121
  }
90
122
 
91
- .volume-bar-container:hover .volume-handle {
92
- display: block;
123
+ .volume-bar-container:hover .volume-thumb {
124
+ opacity: 1 !important;
93
125
  }
94
126
 
95
- .muted {
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
- // Log play history if user is authenticated
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) {
@@ -167,7 +167,7 @@ export default function(db) {
167
167
  rule: 'optional',
168
168
  validator: Validator.schema()
169
169
  .string()
170
- .oneOf(['draft', 'published', 'archived'])
170
+ .oneOf(['draft', 'published', 'archived', 'featured'])
171
171
  },
172
172
  skip: {
173
173
  rule: 'optional',
@@ -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 MusicLayout from './components/layouts/MusicLayout.vue';
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
- MusicLayout,
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
- MusicLayout,
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 WebSocketManager is available
67
- const { WebSocketManager } = globalswebsocket;
68
- if (global.webSocketManager && global.webSocketManager instanceof WebSocketManager) {
69
- global.webSocketManager.registerModule('music-streaming', StreamingHandler(db).handleStreamingMessage);
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
- component: () => import('../components/layouts/MusicLayout.vue'),
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: true,
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('genre', 'name')
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: true,
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
- .sort({ releaseDate: -1 });
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: true,
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: true,
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
- // If not public, check permissions
64
- if (!playlist.isPublic) {
65
- if (!req.userId) {
66
- return res.status(403).json({ error: 'Access denied to private playlist' });
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(403).json({ error: 'Access denied to private playlist' });
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('tracks.track', 'title artist')
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: true,
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.findOne({ url: req.params.url });
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