@ozdao/martyrs 0.2.484 → 0.2.486

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 (436) hide show
  1. package/dist/{Media-2NvSR0vE.js → Media-CXQSPHt2.js} +1 -1
  2. package/dist/{Media-EYG9WPI4.cjs → Media-DhpD64nT.cjs} +1 -1
  3. package/dist/_virtual/index.cjs +4 -4
  4. package/dist/_virtual/index.js +4 -4
  5. package/dist/_virtual/index2.cjs +4 -4
  6. package/dist/_virtual/index2.js +4 -4
  7. package/dist/auth.server.cjs +2 -23
  8. package/dist/auth.server.js +1 -22
  9. package/dist/globals.crud-BQG1Lm0A.js +90 -0
  10. package/dist/globals.crud-Dv7UXbRM.cjs +89 -0
  11. package/dist/globals.server.cjs +3 -322
  12. package/dist/globals.server.js +1 -303
  13. package/dist/globals.websocket-DzvdIBf6.js +306 -0
  14. package/dist/globals.websocket-k6_B1T7k.cjs +322 -0
  15. package/dist/{main-BT1yoKH2.js → main-Cfh5138F.js} +2102 -1993
  16. package/dist/main-DKJqboZy.cjs +11 -0
  17. package/dist/martyrs/src/components/Button/{Button.vue2.cjs → Button.vue.cjs} +2 -2
  18. package/dist/martyrs/src/components/Button/{Button.vue2.js.map → Button.vue.cjs.map} +1 -1
  19. package/dist/martyrs/src/components/Button/{Button.vue2.js → Button.vue.js} +2 -2
  20. package/dist/martyrs/src/components/Button/Button.vue.js.map +1 -0
  21. package/dist/martyrs/src/components/{DatePicker → Calendar}/Calendar.vue.cjs +1 -1
  22. package/dist/martyrs/src/components/Calendar/Calendar.vue.cjs.map +1 -0
  23. package/dist/martyrs/src/components/{DatePicker → Calendar}/Calendar.vue.js +1 -1
  24. package/dist/martyrs/src/components/Calendar/Calendar.vue.js.map +1 -0
  25. package/dist/martyrs/src/components/Dropdown/{Dropdown.vue2.cjs → Dropdown.vue.cjs} +2 -2
  26. package/dist/martyrs/src/components/Dropdown/{Dropdown.vue2.js.map → Dropdown.vue.cjs.map} +1 -1
  27. package/dist/martyrs/src/components/Dropdown/{Dropdown.vue2.js → Dropdown.vue.js} +2 -2
  28. package/dist/martyrs/src/components/Dropdown/Dropdown.vue.js.map +1 -0
  29. package/dist/martyrs/src/components/Feed/Feed.vue.cjs +2 -2
  30. package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
  31. package/dist/martyrs/src/components/Feed/Feed.vue.js +2 -2
  32. package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
  33. package/dist/martyrs/src/components/Field/Field.vue.cjs +13 -7
  34. package/dist/martyrs/src/components/Field/Field.vue.cjs.map +1 -1
  35. package/dist/martyrs/src/components/Field/Field.vue.js +14 -8
  36. package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -1
  37. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +1 -1
  38. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +1 -1
  39. package/dist/martyrs/src/components/Popup/{Popup.vue2.cjs → Popup.vue.cjs} +2 -2
  40. package/dist/martyrs/src/components/Popup/{Popup.vue2.js.map → Popup.vue.cjs.map} +1 -1
  41. package/dist/martyrs/src/components/Popup/{Popup.vue2.js → Popup.vue.js} +2 -2
  42. package/dist/martyrs/src/components/Popup/Popup.vue.js.map +1 -0
  43. package/dist/martyrs/src/modules/auth/auth.client.cjs +3 -0
  44. package/dist/martyrs/src/modules/auth/auth.client.cjs.map +1 -1
  45. package/dist/martyrs/src/modules/auth/auth.client.js +3 -0
  46. package/dist/martyrs/src/modules/auth/auth.client.js.map +1 -1
  47. package/dist/martyrs/src/modules/auth/locales/en.cjs +79 -0
  48. package/dist/martyrs/src/modules/auth/locales/en.cjs.map +1 -0
  49. package/dist/martyrs/src/modules/auth/locales/en.js +79 -0
  50. package/dist/martyrs/src/modules/auth/locales/en.js.map +1 -0
  51. package/dist/martyrs/src/modules/auth/locales/index.cjs +10 -0
  52. package/dist/martyrs/src/modules/auth/locales/index.cjs.map +1 -0
  53. package/dist/martyrs/src/modules/auth/locales/index.js +10 -0
  54. package/dist/martyrs/src/modules/auth/locales/index.js.map +1 -0
  55. package/dist/martyrs/src/modules/auth/locales/ru.cjs +79 -0
  56. package/dist/martyrs/src/modules/auth/locales/ru.cjs.map +1 -0
  57. package/dist/martyrs/src/modules/auth/locales/ru.js +79 -0
  58. package/dist/martyrs/src/modules/auth/locales/ru.js.map +1 -0
  59. package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.cjs +0 -9
  60. package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.cjs.map +1 -1
  61. package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.js +2 -11
  62. package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.js.map +1 -1
  63. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs +4 -6
  64. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs.map +1 -1
  65. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +4 -6
  66. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js.map +1 -1
  67. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +7 -9
  68. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs.map +1 -1
  69. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +7 -9
  70. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js.map +1 -1
  71. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
  72. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  73. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +2 -2
  74. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
  75. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.cjs +1 -1
  76. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +1 -1
  77. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.cjs +1 -1
  78. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +1 -1
  79. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.cjs +1 -1
  80. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
  81. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +11 -13
  82. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs.map +1 -1
  83. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +11 -13
  84. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js.map +1 -1
  85. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +12 -14
  86. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs.map +1 -1
  87. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +12 -14
  88. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js.map +1 -1
  89. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +11 -13
  90. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs.map +1 -1
  91. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +11 -13
  92. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js.map +1 -1
  93. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.cjs +1 -1
  94. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
  95. package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.cjs +5 -47
  96. package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.cjs.map +1 -1
  97. package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.js +5 -47
  98. package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.js.map +1 -1
  99. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +2 -2
  100. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +2 -2
  101. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +3 -3
  102. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +3 -3
  103. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.cjs +1 -1
  104. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
  105. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.cjs +1 -1
  106. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
  107. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +2 -2
  108. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs.map +1 -1
  109. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
  110. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js.map +1 -1
  111. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +2 -2
  112. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +2 -2
  113. package/dist/martyrs/src/modules/events/components/pages/Events.vue.cjs +1 -1
  114. package/dist/martyrs/src/modules/events/components/pages/Events.vue.js +1 -1
  115. package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.cjs +1 -1
  116. package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.js +1 -1
  117. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +2 -2
  118. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +2 -2
  119. package/dist/martyrs/src/modules/globals/globals.client.cjs +1 -0
  120. package/dist/martyrs/src/modules/globals/globals.client.cjs.map +1 -1
  121. package/dist/martyrs/src/modules/globals/globals.client.js +1 -0
  122. package/dist/martyrs/src/modules/globals/globals.client.js.map +1 -1
  123. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
  124. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
  125. package/dist/martyrs/src/modules/globals/views/components/blocks/AlertDialog.vue.cjs +1 -1
  126. package/dist/martyrs/src/modules/globals/views/components/blocks/AlertDialog.vue.js +1 -1
  127. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +2 -2
  128. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +2 -2
  129. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupAuth.vue.cjs +2 -2
  130. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupAuth.vue.js +2 -2
  131. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs +3 -3
  132. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs.map +1 -1
  133. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js +3 -3
  134. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js.map +1 -1
  135. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +2 -2
  136. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +2 -2
  137. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.cjs +1 -1
  138. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.js +1 -1
  139. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs +1 -1
  140. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js +1 -1
  141. package/dist/martyrs/src/modules/globals/views/components/partials/NavigationBar.vue.cjs +1 -1
  142. package/dist/martyrs/src/modules/globals/views/components/partials/NavigationBar.vue.js +1 -1
  143. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs +1 -1
  144. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.js +1 -1
  145. package/dist/martyrs/src/modules/globals/views/utils/axios-instance.cjs.map +1 -1
  146. package/dist/martyrs/src/modules/globals/views/utils/axios-instance.js.map +1 -1
  147. package/dist/martyrs/src/modules/icons/actions/IconShow.vue.cjs +49 -0
  148. package/dist/martyrs/src/modules/icons/actions/IconShow.vue.cjs.map +1 -0
  149. package/dist/martyrs/src/modules/icons/actions/IconShow.vue.js +49 -0
  150. package/dist/martyrs/src/modules/icons/actions/IconShow.vue.js.map +1 -0
  151. package/dist/martyrs/src/modules/icons/navigation/IconHeart.vue.cjs +34 -0
  152. package/dist/martyrs/src/modules/icons/navigation/IconHeart.vue.cjs.map +1 -0
  153. package/dist/martyrs/src/modules/icons/navigation/IconHeart.vue.js +34 -0
  154. package/dist/martyrs/src/modules/icons/navigation/IconHeart.vue.js.map +1 -0
  155. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.cjs +115 -122
  156. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.cjs.map +1 -1
  157. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js +163 -170
  158. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js.map +1 -1
  159. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs +87 -0
  160. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs.map +1 -0
  161. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +87 -0
  162. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js.map +1 -0
  163. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs +83 -0
  164. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs.map +1 -0
  165. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js +83 -0
  166. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js.map +1 -0
  167. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs +83 -0
  168. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs.map +1 -0
  169. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +83 -0
  170. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js.map +1 -0
  171. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs +68 -0
  172. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs.map +1 -0
  173. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js +68 -0
  174. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js.map +1 -0
  175. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs +174 -0
  176. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs.map +1 -0
  177. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +174 -0
  178. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js.map +1 -0
  179. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs +80 -0
  180. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs.map +1 -0
  181. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +80 -0
  182. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js.map +1 -0
  183. package/dist/martyrs/src/modules/music/components/forms/UploadForm.vue.cjs +328 -0
  184. package/dist/martyrs/src/modules/music/components/forms/UploadForm.vue.cjs.map +1 -0
  185. package/dist/martyrs/src/modules/music/components/forms/UploadForm.vue.js +328 -0
  186. package/dist/martyrs/src/modules/music/components/forms/UploadForm.vue.js.map +1 -0
  187. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs +115 -0
  188. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs.map +1 -0
  189. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js +115 -0
  190. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js.map +1 -0
  191. package/dist/martyrs/src/modules/music/components/lists/AlbumList.vue.cjs +44 -0
  192. package/dist/martyrs/src/modules/music/components/lists/AlbumList.vue.cjs.map +1 -0
  193. package/dist/martyrs/src/modules/music/components/lists/AlbumList.vue.js +44 -0
  194. package/dist/martyrs/src/modules/music/components/lists/AlbumList.vue.js.map +1 -0
  195. package/dist/martyrs/src/modules/music/components/lists/ArtistList.vue.cjs +305 -0
  196. package/dist/martyrs/src/modules/music/components/lists/ArtistList.vue.cjs.map +1 -0
  197. package/dist/martyrs/src/modules/music/components/lists/ArtistList.vue.js +305 -0
  198. package/dist/martyrs/src/modules/music/components/lists/ArtistList.vue.js.map +1 -0
  199. package/dist/martyrs/src/modules/music/components/lists/PlaylistList.vue.cjs +44 -0
  200. package/dist/martyrs/src/modules/music/components/lists/PlaylistList.vue.cjs.map +1 -0
  201. package/dist/martyrs/src/modules/music/components/lists/PlaylistList.vue.js +44 -0
  202. package/dist/martyrs/src/modules/music/components/lists/PlaylistList.vue.js.map +1 -0
  203. package/dist/martyrs/src/modules/music/components/lists/TrackList.vue.cjs +199 -0
  204. package/dist/martyrs/src/modules/music/components/lists/TrackList.vue.cjs.map +1 -0
  205. package/dist/martyrs/src/modules/music/components/lists/TrackList.vue.js +199 -0
  206. package/dist/martyrs/src/modules/music/components/lists/TrackList.vue.js.map +1 -0
  207. package/dist/martyrs/src/modules/music/components/pages/AlbumDetail.vue.cjs +290 -0
  208. package/dist/martyrs/src/modules/music/components/pages/AlbumDetail.vue.cjs.map +1 -0
  209. package/dist/martyrs/src/modules/music/components/pages/AlbumDetail.vue.js +290 -0
  210. package/dist/martyrs/src/modules/music/components/pages/AlbumDetail.vue.js.map +1 -0
  211. package/dist/martyrs/src/modules/music/components/pages/ArtistDetail.vue.cjs +467 -0
  212. package/dist/martyrs/src/modules/music/components/pages/ArtistDetail.vue.cjs.map +1 -0
  213. package/dist/martyrs/src/modules/music/components/pages/ArtistDetail.vue.js +467 -0
  214. package/dist/martyrs/src/modules/music/components/pages/ArtistDetail.vue.js.map +1 -0
  215. package/dist/martyrs/src/modules/music/components/pages/ArtistForm.vue.cjs +382 -0
  216. package/dist/martyrs/src/modules/music/components/pages/ArtistForm.vue.cjs.map +1 -0
  217. package/dist/martyrs/src/modules/music/components/pages/ArtistForm.vue.js +382 -0
  218. package/dist/martyrs/src/modules/music/components/pages/ArtistForm.vue.js.map +1 -0
  219. package/dist/martyrs/src/modules/music/components/pages/ArtistManager.vue.cjs +303 -0
  220. package/dist/martyrs/src/modules/music/components/pages/ArtistManager.vue.cjs.map +1 -0
  221. package/dist/martyrs/src/modules/music/components/pages/ArtistManager.vue.js +303 -0
  222. package/dist/martyrs/src/modules/music/components/pages/ArtistManager.vue.js.map +1 -0
  223. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs +221 -0
  224. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs.map +1 -0
  225. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js +221 -0
  226. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js.map +1 -0
  227. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs +200 -0
  228. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs.map +1 -0
  229. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +200 -0
  230. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js.map +1 -0
  231. package/dist/martyrs/src/modules/music/components/pages/MusicUpload.vue.cjs +50 -0
  232. package/dist/martyrs/src/modules/music/components/pages/MusicUpload.vue.cjs.map +1 -0
  233. package/dist/martyrs/src/modules/music/components/pages/MusicUpload.vue.js +50 -0
  234. package/dist/martyrs/src/modules/music/components/pages/MusicUpload.vue.js.map +1 -0
  235. package/dist/martyrs/src/modules/music/components/pages/PlaylistDetail.vue.cjs +556 -0
  236. package/dist/martyrs/src/modules/music/components/pages/PlaylistDetail.vue.cjs.map +1 -0
  237. package/dist/martyrs/src/modules/music/components/pages/PlaylistDetail.vue.js +556 -0
  238. package/dist/martyrs/src/modules/music/components/pages/PlaylistDetail.vue.js.map +1 -0
  239. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +449 -0
  240. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs.map +1 -0
  241. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +449 -0
  242. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js.map +1 -0
  243. package/dist/martyrs/src/modules/music/components/pages/TrackDetail.vue.cjs +87 -0
  244. package/dist/martyrs/src/modules/music/components/pages/TrackDetail.vue.cjs.map +1 -0
  245. package/dist/martyrs/src/modules/music/components/pages/TrackDetail.vue.js +87 -0
  246. package/dist/martyrs/src/modules/music/components/pages/TrackDetail.vue.js.map +1 -0
  247. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs +227 -0
  248. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs.map +1 -0
  249. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +227 -0
  250. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js.map +1 -0
  251. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs +85 -0
  252. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs.map +1 -0
  253. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js +85 -0
  254. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js.map +1 -0
  255. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs +71 -0
  256. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs.map +1 -0
  257. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +71 -0
  258. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js.map +1 -0
  259. package/dist/martyrs/src/modules/music/music.client.cjs +137 -0
  260. package/dist/martyrs/src/modules/music/music.client.cjs.map +1 -0
  261. package/dist/martyrs/src/modules/music/music.client.js +137 -0
  262. package/dist/martyrs/src/modules/music/music.client.js.map +1 -0
  263. package/dist/martyrs/src/modules/music/router/music.cjs +99 -0
  264. package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -0
  265. package/dist/martyrs/src/modules/music/router/music.js +99 -0
  266. package/dist/martyrs/src/modules/music/router/music.js.map +1 -0
  267. package/dist/martyrs/src/modules/music/store/albums.cjs +167 -0
  268. package/dist/martyrs/src/modules/music/store/albums.cjs.map +1 -0
  269. package/dist/martyrs/src/modules/music/store/albums.js +167 -0
  270. package/dist/martyrs/src/modules/music/store/albums.js.map +1 -0
  271. package/dist/martyrs/src/modules/music/store/artists.cjs +154 -0
  272. package/dist/martyrs/src/modules/music/store/artists.cjs.map +1 -0
  273. package/dist/martyrs/src/modules/music/store/artists.js +154 -0
  274. package/dist/martyrs/src/modules/music/store/artists.js.map +1 -0
  275. package/dist/martyrs/src/modules/music/store/player.cjs +297 -0
  276. package/dist/martyrs/src/modules/music/store/player.cjs.map +1 -0
  277. package/dist/martyrs/src/modules/music/store/player.js +297 -0
  278. package/dist/martyrs/src/modules/music/store/player.js.map +1 -0
  279. package/dist/martyrs/src/modules/music/store/playlists.cjs +174 -0
  280. package/dist/martyrs/src/modules/music/store/playlists.cjs.map +1 -0
  281. package/dist/martyrs/src/modules/music/store/playlists.js +174 -0
  282. package/dist/martyrs/src/modules/music/store/playlists.js.map +1 -0
  283. package/dist/martyrs/src/modules/music/store/search.cjs +109 -0
  284. package/dist/martyrs/src/modules/music/store/search.cjs.map +1 -0
  285. package/dist/martyrs/src/modules/music/store/search.js +109 -0
  286. package/dist/martyrs/src/modules/music/store/search.js.map +1 -0
  287. package/dist/martyrs/src/modules/music/store/tracks.cjs +180 -0
  288. package/dist/martyrs/src/modules/music/store/tracks.cjs.map +1 -0
  289. package/dist/martyrs/src/modules/music/store/tracks.js +180 -0
  290. package/dist/martyrs/src/modules/music/store/tracks.js.map +1 -0
  291. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.cjs +1 -1
  292. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js +1 -1
  293. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs +2 -2
  294. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
  295. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs +1 -1
  296. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
  297. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +2 -2
  298. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +2 -2
  299. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.cjs +1 -1
  300. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.js +1 -1
  301. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +2 -2
  302. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +2 -2
  303. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.cjs +1 -1
  304. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
  305. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +2 -2
  306. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +2 -2
  307. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
  308. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
  309. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +2 -2
  310. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
  311. package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.cjs +1 -1
  312. package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.js +1 -1
  313. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +2 -2
  314. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +2 -2
  315. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +1 -1
  316. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
  317. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +1 -1
  318. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
  319. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
  320. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  321. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
  322. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  323. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.cjs +2 -2
  324. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +2 -2
  325. package/dist/martyrs/src/modules/products/components/blocks/ProductImages.vue.cjs +1 -1
  326. package/dist/martyrs/src/modules/products/components/blocks/ProductImages.vue.js +1 -1
  327. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs +1 -1
  328. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
  329. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +3 -3
  330. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +3 -3
  331. package/dist/martyrs/src/modules/products/components/pages/LeftoverEdit.vue.cjs +3 -3
  332. package/dist/martyrs/src/modules/products/components/pages/LeftoverEdit.vue.js +3 -3
  333. package/dist/martyrs/src/modules/products/components/pages/Leftovers.vue.cjs +2 -2
  334. package/dist/martyrs/src/modules/products/components/pages/Leftovers.vue.js +2 -2
  335. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +2 -2
  336. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs.map +1 -1
  337. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +2 -2
  338. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
  339. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
  340. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
  341. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.cjs +2 -2
  342. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +2 -2
  343. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.cjs +2 -2
  344. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +2 -2
  345. package/dist/martyrs/src/modules/products/components/sections/EditIngredients.vue.cjs +1 -1
  346. package/dist/martyrs/src/modules/products/components/sections/EditIngredients.vue.js +1 -1
  347. package/dist/martyrs/src/modules/products/components/sections/EditRecommended.vue.cjs +1 -1
  348. package/dist/martyrs/src/modules/products/components/sections/EditRecommended.vue.js +1 -1
  349. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +2 -2
  350. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +2 -2
  351. package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.cjs +1 -1
  352. package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +1 -1
  353. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.cjs +1 -1
  354. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +1 -1
  355. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.cjs +1 -1
  356. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
  357. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +1 -1
  358. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
  359. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.cjs +2 -2
  360. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +2 -2
  361. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
  362. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  363. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.cjs +1 -1
  364. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
  365. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +2 -2
  366. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +2 -2
  367. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.cjs +2 -2
  368. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +2 -2
  369. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.cjs +3 -3
  370. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +3 -3
  371. package/dist/martyrs.cjs.js +1 -1
  372. package/dist/martyrs.css +1 -1
  373. package/dist/martyrs.es.js +38 -36
  374. package/dist/music.server.cjs +1407 -0
  375. package/dist/music.server.js +1407 -0
  376. package/dist/orders.server.cjs +3 -88
  377. package/dist/orders.server.js +2 -87
  378. package/dist/socials.schema-BOZV82Mp.js +25 -0
  379. package/dist/socials.schema-CtpSF9dE.cjs +24 -0
  380. package/dist/style.css +250 -97
  381. package/package.json +1 -1
  382. package/src/.martyrs/filemap.json +2 -2
  383. package/src/components/Feed/Feed.vue +1 -1
  384. package/src/components/Field/Field.vue +42 -27
  385. package/src/components/index.js +2 -0
  386. package/src/main.js +6 -0
  387. package/src/modules/auth/auth.client.js +7 -0
  388. package/src/modules/auth/locales/en.js +76 -0
  389. package/src/modules/auth/locales/index.js +7 -0
  390. package/src/modules/auth/locales/ru.js +76 -0
  391. package/src/modules/auth/views/components/layouts/Auth.vue +2 -44
  392. package/src/modules/auth/views/components/pages/EnterCode.vue +5 -7
  393. package/src/modules/auth/views/components/pages/EnterPassword.vue +7 -10
  394. package/src/modules/auth/views/components/pages/ResetPassword.vue +9 -12
  395. package/src/modules/auth/views/components/pages/SignIn.vue +12 -15
  396. package/src/modules/auth/views/components/pages/SignUp.vue +9 -12
  397. package/src/modules/auth/views/components/sections/SliderFeatures.vue +11 -48
  398. package/src/modules/events/components/pages/EditEvent.vue +1 -1
  399. package/src/modules/globals/globals.client.js +1 -0
  400. package/src/modules/globals/views/components/blocks/PopupDateSelector.vue +1 -1
  401. package/src/modules/globals/views/utils/axios-instance.js +15 -1
  402. package/src/modules/icons/actions/IconShow.vue +23 -0
  403. package/src/modules/icons/pages/IconsPage.vue +114 -120
  404. package/src/modules/products/components/pages/Product.vue +1 -1
  405. package/dist/main-rF15sgss.cjs +0 -11
  406. package/dist/martyrs/src/components/Button/Button.vue2.cjs.map +0 -1
  407. package/dist/martyrs/src/components/DatePicker/Calendar.vue.cjs.map +0 -1
  408. package/dist/martyrs/src/components/DatePicker/Calendar.vue.js.map +0 -1
  409. package/dist/martyrs/src/components/Dropdown/Dropdown.vue2.cjs.map +0 -1
  410. package/dist/martyrs/src/components/Popup/Popup.vue2.cjs.map +0 -1
  411. package/dist/martyrs/src/modules/auth/views/localization/EnterCode.json.cjs +0 -9
  412. package/dist/martyrs/src/modules/auth/views/localization/EnterCode.json.cjs.map +0 -1
  413. package/dist/martyrs/src/modules/auth/views/localization/EnterCode.json.js +0 -9
  414. package/dist/martyrs/src/modules/auth/views/localization/EnterCode.json.js.map +0 -1
  415. package/dist/martyrs/src/modules/auth/views/localization/EnterPassword.json.cjs +0 -9
  416. package/dist/martyrs/src/modules/auth/views/localization/EnterPassword.json.cjs.map +0 -1
  417. package/dist/martyrs/src/modules/auth/views/localization/EnterPassword.json.js +0 -9
  418. package/dist/martyrs/src/modules/auth/views/localization/EnterPassword.json.js.map +0 -1
  419. package/dist/martyrs/src/modules/auth/views/localization/ResetPassword.json.cjs +0 -9
  420. package/dist/martyrs/src/modules/auth/views/localization/ResetPassword.json.cjs.map +0 -1
  421. package/dist/martyrs/src/modules/auth/views/localization/ResetPassword.json.js +0 -9
  422. package/dist/martyrs/src/modules/auth/views/localization/ResetPassword.json.js.map +0 -1
  423. package/dist/martyrs/src/modules/auth/views/localization/SignIn.json.cjs +0 -9
  424. package/dist/martyrs/src/modules/auth/views/localization/SignIn.json.cjs.map +0 -1
  425. package/dist/martyrs/src/modules/auth/views/localization/SignIn.json.js +0 -9
  426. package/dist/martyrs/src/modules/auth/views/localization/SignIn.json.js.map +0 -1
  427. package/dist/martyrs/src/modules/auth/views/localization/SignUp.json.cjs +0 -9
  428. package/dist/martyrs/src/modules/auth/views/localization/SignUp.json.cjs.map +0 -1
  429. package/dist/martyrs/src/modules/auth/views/localization/SignUp.json.js +0 -9
  430. package/dist/martyrs/src/modules/auth/views/localization/SignUp.json.js.map +0 -1
  431. package/src/modules/auth/views/localization/EnterCode.json +0 -16
  432. package/src/modules/auth/views/localization/EnterPassword.json +0 -22
  433. package/src/modules/auth/views/localization/ResetPassword.json +0 -26
  434. package/src/modules/auth/views/localization/SignIn.json +0 -34
  435. package/src/modules/auth/views/localization/SignUp.json +0 -28
  436. /package/src/components/{DatePicker → Calendar}/Calendar.vue +0 -0
@@ -0,0 +1,1407 @@
1
+ import { g as globalsabac } from "./globals.abac-DBV_kaOq.js";
2
+ import { L as Logger, C as Cache } from "./globals.logger-Bf6rRU7j.js";
3
+ import { W as WebSocketManager } from "./globals.websocket-DzvdIBf6.js";
4
+ import { C as CRUD } from "./globals.crud-BQG1Lm0A.js";
5
+ import fs$1 from "fs";
6
+ import path$1 from "path";
7
+ import { a as applyCommonSchema } from "./common.schema-Bw1O5_2Q.js";
8
+ import { a as applyEngagementSchema } from "./engagement.schema-Dh1adRsn.js";
9
+ import { a as applyMetadataSchema, c as createFriendlyURL } from "./metadata.schema-CWmcDJN7.js";
10
+ import { a as applyOwnershipSchema } from "./ownership.schema-CCZX5vfw.js";
11
+ import { a as applySocialsSchema } from "./socials.schema-BOZV82Mp.js";
12
+ import { m as middlewareIndexFactory } from "./index-CsJwdsBW.js";
13
+ const { getInstance: getInstance$1 } = globalsabac;
14
+ const MusicController = function(app, db) {
15
+ const logger = new Logger(db);
16
+ const cache = new Cache();
17
+ const abac = getInstance$1(db);
18
+ class MusicController2 extends CRUD {
19
+ constructor(basePath, app2, db2, model, options) {
20
+ super(basePath, app2, db2, model, options);
21
+ this.logger = logger;
22
+ this.cache = cache;
23
+ this.abac = abac;
24
+ }
25
+ // Override the create method to handle ownership
26
+ async create(req, res) {
27
+ try {
28
+ console.log(`[MusicController] Create request received:`, {
29
+ userId: req.userId,
30
+ body: req.body
31
+ });
32
+ if (!req.userId) {
33
+ console.error("[MusicController] No userId found in request, auth middleware may have failed");
34
+ return res.status(401).json({
35
+ errorCode: "AUTHENTICATION_REQUIRED",
36
+ message: "You must be authenticated to perform this action"
37
+ });
38
+ }
39
+ if (!req.body.creator) {
40
+ req.body.creator = {
41
+ type: "user",
42
+ // Note lowercase - must match your schema expectations
43
+ target: req.userId
44
+ };
45
+ }
46
+ if (!req.body.owner) {
47
+ req.body.owner = {
48
+ type: "user",
49
+ // Note lowercase - must match your schema expectations
50
+ target: req.userId
51
+ };
52
+ }
53
+ console.log(`[MusicController] Checking access with ABAC`);
54
+ const accessResult = await this.abac.checkAccess({
55
+ user: req.userId,
56
+ resource: this.model.collection.collectionName,
57
+ action: "create",
58
+ data: req.body
59
+ });
60
+ console.log(`[MusicController] Access check result:`, accessResult);
61
+ if (!accessResult.allowed) {
62
+ console.error(`[MusicController] Access denied:`, accessResult.reason);
63
+ return res.status(403).json({
64
+ errorCode: accessResult.reason,
65
+ message: "Access Denied"
66
+ });
67
+ }
68
+ console.log(`[MusicController] Creating record with data:`, req.body);
69
+ const createdData = await this.model.create(req.body);
70
+ await this.cache.flush();
71
+ console.log(`[MusicController] Record created successfully:`, createdData._id);
72
+ res.status(201).json(createdData);
73
+ } catch (error) {
74
+ console.error(`[MusicController] Error creating record:`, error);
75
+ this.logger.error(`Error creating ${this.model.collection.collectionName}: ${error.message}`);
76
+ res.status(500).json({ error: error.message });
77
+ }
78
+ }
79
+ // Override the update method to check ownership
80
+ async update(req, res) {
81
+ try {
82
+ const resourceId = req.body._id;
83
+ const resource = await this.model.findById(resourceId);
84
+ if (!resource) {
85
+ return res.status(404).json({ error: "Resource not found" });
86
+ }
87
+ const accessResult = await this.abac.checkAccess({
88
+ user: req.userId,
89
+ resource: this.model.collection.collectionName,
90
+ action: "update",
91
+ data: req.body,
92
+ currentResource: resource
93
+ });
94
+ if (!accessResult.allowed) {
95
+ return res.status(403).json({
96
+ errorCode: accessResult.reason,
97
+ message: "Access Denied"
98
+ });
99
+ }
100
+ const updatedData = await this.model.findOneAndUpdate({ _id: resourceId }, req.body, {
101
+ new: true,
102
+ runValidators: true
103
+ });
104
+ await this.cache.flush();
105
+ res.json(updatedData);
106
+ } catch (error) {
107
+ this.logger.error(`Error updating ${this.model.collection.collectionName}: ${error.message}`);
108
+ res.status(500).json({ error: error.message });
109
+ }
110
+ }
111
+ // Override the delete method to check ownership
112
+ async delete(req, res) {
113
+ try {
114
+ const resourceId = req.body._id;
115
+ const resource = await this.model.findById(resourceId);
116
+ if (!resource) {
117
+ return res.status(404).json({ error: "Resource not found" });
118
+ }
119
+ const accessResult = await this.abac.checkAccess({
120
+ user: req.userId,
121
+ resource: this.model.collection.collectionName,
122
+ action: "delete",
123
+ data: req.body,
124
+ currentResource: resource
125
+ });
126
+ if (!accessResult.allowed) {
127
+ return res.status(403).json({
128
+ errorCode: accessResult.reason,
129
+ message: "Access Denied"
130
+ });
131
+ }
132
+ await this.model.findOneAndDelete({ _id: resourceId });
133
+ await this.cache.flush();
134
+ res.status(204).send();
135
+ } catch (error) {
136
+ this.logger.error(`Error deleting ${this.model.collection.collectionName}: ${error.message}`);
137
+ res.status(500).json({ error: error.message });
138
+ }
139
+ }
140
+ }
141
+ return {
142
+ MusicController: MusicController2
143
+ };
144
+ };
145
+ const AlbumController = function(app, db) {
146
+ const { MusicController: MusicController$1 } = MusicController(app, db);
147
+ class AlbumController2 extends MusicController$1 {
148
+ constructor(app2) {
149
+ super("/api/albums", app2, db, db.album);
150
+ }
151
+ // Get tracks for a specific album
152
+ async getAlbumTracks(req, res) {
153
+ try {
154
+ const albumId = req.params.albumId;
155
+ const album = await db.album.findById(albumId);
156
+ if (!album) {
157
+ return res.status(404).json({ error: "Album not found" });
158
+ }
159
+ const accessResult = await this.abac.checkAccess({
160
+ user: req.userId,
161
+ resource: "albums",
162
+ action: "read",
163
+ currentResource: album
164
+ });
165
+ if (!accessResult.allowed && !album.isPublic) {
166
+ return res.status(403).json({
167
+ errorCode: accessResult.reason,
168
+ message: "Access Denied"
169
+ });
170
+ }
171
+ const tracks = await db.track.find({ album: albumId, status: "published" }).sort({ releaseDate: -1 });
172
+ res.json(tracks);
173
+ } catch (error) {
174
+ this.logger.error(`Error getting album tracks: ${error.message}`);
175
+ res.status(500).json({ error: error.message });
176
+ }
177
+ }
178
+ // Get featured albums
179
+ async getFeaturedAlbums(req, res) {
180
+ try {
181
+ const cacheKey = "featured-albums";
182
+ let featuredAlbums = await this.cache.get(cacheKey);
183
+ if (!featuredAlbums) {
184
+ featuredAlbums = await db.album.aggregate([
185
+ { $match: { status: "featured", isPublic: true } },
186
+ {
187
+ $lookup: {
188
+ from: "tracks",
189
+ localField: "_id",
190
+ foreignField: "album",
191
+ as: "tracks"
192
+ }
193
+ },
194
+ {
195
+ $addFields: {
196
+ trackCount: { $size: "$tracks" }
197
+ }
198
+ },
199
+ { $project: { tracks: 0 } },
200
+ { $sort: { releaseDate: -1 } },
201
+ { $limit: 10 }
202
+ ]);
203
+ await this.cache.set(cacheKey, featuredAlbums, 3600);
204
+ }
205
+ res.json(featuredAlbums);
206
+ } catch (error) {
207
+ this.logger.error(`Error getting featured albums: ${error.message}`);
208
+ res.status(500).json({ error: error.message });
209
+ }
210
+ }
211
+ }
212
+ const albumController = new AlbumController2(app, db);
213
+ return {
214
+ create: albumController.create.bind(albumController),
215
+ read: albumController.read.bind(albumController),
216
+ update: albumController.update.bind(albumController),
217
+ delete: albumController.delete.bind(albumController),
218
+ getAlbumTracks: albumController.getAlbumTracks.bind(albumController),
219
+ getFeaturedAlbums: albumController.getFeaturedAlbums.bind(albumController)
220
+ };
221
+ };
222
+ const ArtistController = function(app, db) {
223
+ const { MusicController: MusicController$1 } = MusicController(app, db);
224
+ class ArtistController2 extends MusicController$1 {
225
+ constructor(app2) {
226
+ super("/api/artists", app2, db, db.artist);
227
+ }
228
+ // Get artist discography
229
+ async getDiscography(req, res) {
230
+ try {
231
+ const artistId = req.params.artistId;
232
+ const artist = await db.artist.findById(artistId);
233
+ if (!artist) {
234
+ return res.status(404).json({ error: "Artist not found" });
235
+ }
236
+ const albums = await db.album.find({
237
+ artist: artistId,
238
+ status: "published",
239
+ isPublic: true
240
+ }).sort({ releaseDate: -1 });
241
+ const singleTracks = await db.track.find({
242
+ artist: artistId,
243
+ album: { $exists: false },
244
+ status: "published",
245
+ isPublic: true
246
+ }).sort({ releaseDate: -1 });
247
+ res.json({
248
+ artist,
249
+ albums,
250
+ singles: singleTracks
251
+ });
252
+ } catch (error) {
253
+ this.logger.error(`Error getting artist discography: ${error.message}`);
254
+ res.status(500).json({ error: error.message });
255
+ }
256
+ }
257
+ // Verify an artist (admin only)
258
+ async verifyArtist(req, res) {
259
+ try {
260
+ const artistId = req.params.artistId;
261
+ if (!req.userRoles.includes("ROLE_ADMIN")) {
262
+ return res.status(403).json({ error: "Only administrators can verify artists" });
263
+ }
264
+ const artist = await db.artist.findById(artistId);
265
+ if (!artist) {
266
+ return res.status(404).json({ error: "Artist not found" });
267
+ }
268
+ artist.isVerified = true;
269
+ await artist.save();
270
+ await this.cache.flush();
271
+ res.json({ success: true, artist });
272
+ } catch (error) {
273
+ this.logger.error(`Error verifying artist: ${error.message}`);
274
+ res.status(500).json({ error: error.message });
275
+ }
276
+ }
277
+ // Get related artists
278
+ async getRelatedArtists(req, res) {
279
+ try {
280
+ const artistId = req.params.artistId;
281
+ const artist = await db.artist.findById(artistId);
282
+ if (!artist) {
283
+ return res.status(404).json({ error: "Artist not found" });
284
+ }
285
+ const relatedArtists = await db.artist.find({
286
+ _id: { $ne: artistId },
287
+ genre: { $in: artist.genre },
288
+ status: "published"
289
+ }).limit(5);
290
+ res.json(relatedArtists);
291
+ } catch (error) {
292
+ this.logger.error(`Error getting related artists: ${error.message}`);
293
+ res.status(500).json({ error: error.message });
294
+ }
295
+ }
296
+ }
297
+ const artistController = new ArtistController2(app, db);
298
+ return {
299
+ create: artistController.create.bind(artistController),
300
+ read: artistController.read.bind(artistController),
301
+ update: artistController.update.bind(artistController),
302
+ delete: artistController.delete.bind(artistController),
303
+ getDiscography: artistController.getDiscography.bind(artistController),
304
+ verifyArtist: artistController.verifyArtist.bind(artistController),
305
+ getRelatedArtists: artistController.getRelatedArtists.bind(artistController)
306
+ };
307
+ };
308
+ const GenreController = function(app, db) {
309
+ const { MusicController: MusicController$1 } = MusicController(app, db);
310
+ class GenreController2 extends MusicController$1 {
311
+ constructor(app2) {
312
+ super("/api/genres", app2, db, db.genre);
313
+ }
314
+ // Get tracks by genre
315
+ async getGenreTracks(req, res) {
316
+ try {
317
+ const genreId = req.params.genreId;
318
+ const genre = await db.genre.findById(genreId);
319
+ if (!genre) {
320
+ return res.status(404).json({ error: "Genre not found" });
321
+ }
322
+ const tracks = await db.track.find({
323
+ genre: genreId,
324
+ status: "published",
325
+ isPublic: true
326
+ }).sort({ releaseDate: -1 }).limit(50).populate("artist", "name").populate("album", "title coverUrl");
327
+ res.json({
328
+ genre,
329
+ tracks
330
+ });
331
+ } catch (error) {
332
+ this.logger.error(`Error getting genre tracks: ${error.message}`);
333
+ res.status(500).json({ error: error.message });
334
+ }
335
+ }
336
+ // Get popular genres
337
+ async getPopularGenres(req, res) {
338
+ try {
339
+ const limit = parseInt(req.query.limit) || 10;
340
+ const genres = await db.genre.find({
341
+ status: "published"
342
+ }).sort({ popularity: -1 }).limit(limit);
343
+ res.json(genres);
344
+ } catch (error) {
345
+ this.logger.error(`Error getting popular genres: ${error.message}`);
346
+ res.status(500).json({ error: error.message });
347
+ }
348
+ }
349
+ }
350
+ const genreController = new GenreController2(app, db);
351
+ return {
352
+ create: genreController.create.bind(genreController),
353
+ read: genreController.read.bind(genreController),
354
+ update: genreController.update.bind(genreController),
355
+ delete: genreController.delete.bind(genreController),
356
+ getGenreTracks: genreController.getGenreTracks.bind(genreController),
357
+ getPopularGenres: genreController.getPopularGenres.bind(genreController)
358
+ };
359
+ };
360
+ const PlaylistController = function(app, db) {
361
+ const { MusicController: MusicController$1 } = MusicController(app, db);
362
+ class PlaylistController2 extends MusicController$1 {
363
+ constructor(app2, db2) {
364
+ super("/api/playlists", app2, db2, db2.playlist);
365
+ }
366
+ // Add track to playlist
367
+ async addTrack(req, res) {
368
+ try {
369
+ const { playlistId, trackId } = req.params;
370
+ const playlist = await db.playlist.findById(playlistId);
371
+ if (!playlist) {
372
+ return res.status(404).json({ error: "Playlist not found" });
373
+ }
374
+ const accessResult = await this.abac.checkAccess({
375
+ user: req.userId,
376
+ resource: "playlists",
377
+ action: "update",
378
+ currentResource: playlist
379
+ });
380
+ if (!accessResult.allowed) {
381
+ return res.status(403).json({
382
+ errorCode: accessResult.reason,
383
+ message: "Access Denied"
384
+ });
385
+ }
386
+ const track = await db.track.findById(trackId);
387
+ if (!track) {
388
+ return res.status(404).json({ error: "Track not found" });
389
+ }
390
+ const trackExists = playlist.tracks.some((item) => item.track.toString() === trackId);
391
+ if (trackExists) {
392
+ return res.status(400).json({ error: "Track already in playlist" });
393
+ }
394
+ playlist.tracks.push({
395
+ track: trackId,
396
+ addedAt: /* @__PURE__ */ new Date()
397
+ });
398
+ await playlist.save();
399
+ await this.cache.flush();
400
+ res.json(playlist);
401
+ } catch (error) {
402
+ this.logger.error(`Error adding track to playlist: ${error.message}`);
403
+ res.status(500).json({ error: error.message });
404
+ }
405
+ }
406
+ // Remove track from playlist
407
+ async removeTrack(req, res) {
408
+ try {
409
+ const { playlistId, trackId } = req.params;
410
+ const playlist = await db.playlist.findById(playlistId);
411
+ if (!playlist) {
412
+ return res.status(404).json({ error: "Playlist not found" });
413
+ }
414
+ const accessResult = await this.abac.checkAccess({
415
+ user: req.userId,
416
+ resource: "playlists",
417
+ action: "update",
418
+ currentResource: playlist
419
+ });
420
+ if (!accessResult.allowed) {
421
+ return res.status(403).json({
422
+ errorCode: accessResult.reason,
423
+ message: "Access Denied"
424
+ });
425
+ }
426
+ playlist.tracks = playlist.tracks.filter((item) => item.track.toString() !== trackId);
427
+ await playlist.save();
428
+ await this.cache.flush();
429
+ res.json(playlist);
430
+ } catch (error) {
431
+ this.logger.error(`Error removing track from playlist: ${error.message}`);
432
+ res.status(500).json({ error: error.message });
433
+ }
434
+ }
435
+ // Get user playlists
436
+ async getUserPlaylists(req, res) {
437
+ try {
438
+ const userId = req.params.userId || req.userId;
439
+ const playlists = await db.playlist.find({
440
+ $or: [{ "owner.target": userId, "owner.type": "User" }, { collaborators: userId }]
441
+ }).sort({ updatedAt: -1 });
442
+ res.json(playlists);
443
+ } catch (error) {
444
+ this.logger.error(`Error getting user playlists: ${error.message}`);
445
+ res.status(500).json({ error: error.message });
446
+ }
447
+ }
448
+ // Add collaborator to playlist
449
+ async addCollaborator(req, res) {
450
+ try {
451
+ const { playlistId, userId } = req.params;
452
+ const playlist = await db.playlist.findById(playlistId);
453
+ if (!playlist) {
454
+ return res.status(404).json({ error: "Playlist not found" });
455
+ }
456
+ if (playlist.owner.target.toString() !== req.userId) {
457
+ return res.status(403).json({ error: "Only playlist owner can add collaborators" });
458
+ }
459
+ const user = await db.mongoose.model("User").findById(userId);
460
+ if (!user) {
461
+ return res.status(404).json({ error: "User not found" });
462
+ }
463
+ if (playlist.collaborators.includes(userId)) {
464
+ return res.status(400).json({ error: "User is already a collaborator" });
465
+ }
466
+ playlist.collaborators.push(userId);
467
+ playlist.isCollaborative = true;
468
+ await playlist.save();
469
+ await this.cache.flush();
470
+ res.json(playlist);
471
+ } catch (error) {
472
+ this.logger.error(`Error adding collaborator to playlist: ${error.message}`);
473
+ res.status(500).json({ error: error.message });
474
+ }
475
+ }
476
+ }
477
+ const playlistController = new PlaylistController2(app, db);
478
+ return {
479
+ create: playlistController.create.bind(playlistController),
480
+ read: playlistController.read.bind(playlistController),
481
+ update: playlistController.update.bind(playlistController),
482
+ delete: playlistController.delete.bind(playlistController),
483
+ addTrack: playlistController.addTrack.bind(playlistController),
484
+ removeTrack: playlistController.removeTrack.bind(playlistController),
485
+ getUserPlaylists: playlistController.getUserPlaylists.bind(playlistController),
486
+ addCollaborator: playlistController.addCollaborator.bind(playlistController)
487
+ };
488
+ };
489
+ const SearchController = function(app, db) {
490
+ const logger = new Logger(db);
491
+ const cache = new Cache();
492
+ async function search(req, res) {
493
+ try {
494
+ const { query, type, limit = 10 } = req.query;
495
+ if (!query || query.length < 2) {
496
+ return res.status(400).json({ error: "Search query must be at least 2 characters" });
497
+ }
498
+ const limitNum = parseInt(limit, 10);
499
+ const cacheKey = `search:${query}:${type || "all"}:${limitNum}`;
500
+ let results = await cache.get(cacheKey);
501
+ if (!results) {
502
+ results = {};
503
+ const searchRegex = new RegExp(query, "i");
504
+ const types = type ? [type] : ["tracks", "albums", "artists", "playlists", "genres"];
505
+ if (types.includes("tracks") || types.includes("all")) {
506
+ results.tracks = await db.track.find({
507
+ $or: [{ title: searchRegex }, { tags: searchRegex }],
508
+ status: "published",
509
+ isPublic: true
510
+ }).limit(limitNum);
511
+ }
512
+ if (types.includes("albums") || types.includes("all")) {
513
+ results.albums = await db.album.find({
514
+ $or: [{ title: searchRegex }, { description: searchRegex }, { tags: searchRegex }],
515
+ status: "published",
516
+ isPublic: true
517
+ }).limit(limitNum);
518
+ }
519
+ if (types.includes("artists") || types.includes("all")) {
520
+ results.artists = await db.artist.find({
521
+ $or: [{ name: searchRegex }, { bio: searchRegex }, { tags: searchRegex }],
522
+ status: "published"
523
+ }).limit(limitNum);
524
+ }
525
+ if (types.includes("playlists") || types.includes("all")) {
526
+ results.playlists = await db.playlist.find({
527
+ $or: [{ title: searchRegex }, { description: searchRegex }, { tags: searchRegex }],
528
+ isPublic: true
529
+ }).limit(limitNum);
530
+ }
531
+ if (types.includes("genres") || types.includes("all")) {
532
+ results.genres = await db.genre.find({
533
+ $or: [{ name: searchRegex }, { description: searchRegex }],
534
+ status: "published"
535
+ }).limit(limitNum);
536
+ }
537
+ await cache.set(cacheKey, results, 600);
538
+ }
539
+ res.json(results);
540
+ } catch (error) {
541
+ logger.error(`Error searching: ${error.message}`);
542
+ res.status(500).json({ error: error.message });
543
+ }
544
+ }
545
+ return {
546
+ search
547
+ };
548
+ };
549
+ const StreamController = function(app, db, publicPath) {
550
+ const { getInstance: getInstance2 } = globalsabac;
551
+ const logger = new Logger(db);
552
+ const abac = getInstance2(db);
553
+ async function streamAudio(req, res) {
554
+ try {
555
+ const trackId = req.params.trackId;
556
+ const track = await db.track.findById(trackId);
557
+ if (!track) {
558
+ return res.status(404).json({ error: "Track not found" });
559
+ }
560
+ const accessResult = await abac.checkAccess({
561
+ user: req.userId,
562
+ resource: "tracks",
563
+ action: "read",
564
+ currentResource: track
565
+ });
566
+ if (!accessResult.allowed && !track.isPublic) {
567
+ return res.status(403).json({
568
+ errorCode: accessResult.reason,
569
+ message: "Access Denied"
570
+ });
571
+ }
572
+ const fileUrl = track.fileUrl;
573
+ console.log("public is", publicPath);
574
+ const filePath = path$1.join(publicPath, fileUrl);
575
+ if (!fs$1.existsSync(filePath)) {
576
+ logger.error(`File not found: ${filePath}`);
577
+ return res.status(404).json({ error: "Audio file not found" });
578
+ }
579
+ const stat = fs$1.statSync(filePath);
580
+ const fileSize = stat.size;
581
+ const range = req.headers.range;
582
+ if (req.userId) {
583
+ try {
584
+ await db.playHistory.create({
585
+ user: req.userId,
586
+ track: trackId,
587
+ playedAt: /* @__PURE__ */ new Date(),
588
+ deviceInfo: req.headers["user-agent"],
589
+ playedFrom: req.query.from || "other",
590
+ contextId: req.query.contextId || null
591
+ });
592
+ await db.track.findByIdAndUpdate(trackId, { $inc: { playCount: 1 } });
593
+ } catch (error) {
594
+ logger.error(`Error logging play history: ${error.message}`);
595
+ }
596
+ }
597
+ if (range) {
598
+ const parts = range.replace(/bytes=/, "").split("-");
599
+ const start = parseInt(parts[0], 10);
600
+ const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1;
601
+ const chunksize = end - start + 1;
602
+ const file = fs$1.createReadStream(filePath, { start, end });
603
+ res.writeHead(206, {
604
+ "Content-Range": `bytes ${start}-${end}/${fileSize}`,
605
+ "Accept-Ranges": "bytes",
606
+ "Content-Length": chunksize,
607
+ "Content-Type": "audio/mpeg"
608
+ });
609
+ file.pipe(res);
610
+ } else {
611
+ res.writeHead(200, {
612
+ "Content-Length": fileSize,
613
+ "Content-Type": "audio/mpeg"
614
+ });
615
+ fs$1.createReadStream(filePath).pipe(res);
616
+ }
617
+ } catch (error) {
618
+ logger.error(`Error streaming audio: ${error.message}`);
619
+ res.status(500).json({ error: error.message });
620
+ }
621
+ }
622
+ return {
623
+ streamAudio
624
+ };
625
+ };
626
+ const AlbumModel = function(db) {
627
+ const albumSchema = new db.mongoose.Schema(
628
+ {
629
+ title: {
630
+ type: String,
631
+ required: true
632
+ },
633
+ description: {
634
+ type: String,
635
+ default: ""
636
+ },
637
+ releaseDate: {
638
+ type: Date,
639
+ required: true
640
+ },
641
+ coverArt: {
642
+ type: String,
643
+ default: null
644
+ },
645
+ artists: [
646
+ {
647
+ type: db.mongoose.Schema.Types.ObjectId,
648
+ ref: "Artist",
649
+ required: true
650
+ }
651
+ ],
652
+ type: {
653
+ type: String,
654
+ enum: ["album", "single", "EP", "compilation"],
655
+ default: "album"
656
+ },
657
+ genres: [
658
+ {
659
+ type: db.mongoose.Schema.Types.ObjectId,
660
+ ref: "Genre"
661
+ }
662
+ ],
663
+ totalTracks: {
664
+ type: Number,
665
+ default: 0
666
+ }
667
+ },
668
+ {
669
+ timestamps: true,
670
+ versionKey: false
671
+ }
672
+ );
673
+ applyOwnershipSchema(albumSchema, db);
674
+ applyMetadataSchema(albumSchema);
675
+ applyCommonSchema(albumSchema);
676
+ applyEngagementSchema(albumSchema);
677
+ albumSchema.index({ title: "text", description: "text" });
678
+ albumSchema.index({ artists: 1 });
679
+ albumSchema.index({ releaseDate: -1 });
680
+ albumSchema.index({ type: 1 });
681
+ albumSchema.index({ genres: 1 });
682
+ return db.mongoose.models.Album || db.mongoose.model("Album", albumSchema);
683
+ };
684
+ const ArtistModel = function(db) {
685
+ const mongoose = db.mongoose;
686
+ const Schema = mongoose.Schema;
687
+ const ArtistSchema = new Schema(
688
+ {
689
+ name: {
690
+ type: String,
691
+ required: true,
692
+ trim: true
693
+ },
694
+ bio: {
695
+ type: String,
696
+ trim: true
697
+ },
698
+ photoUrl: {
699
+ type: String
700
+ },
701
+ coverUrl: {
702
+ type: String
703
+ },
704
+ genre: [
705
+ {
706
+ type: Schema.Types.ObjectId,
707
+ ref: "Genre"
708
+ }
709
+ ],
710
+ isVerified: {
711
+ type: Boolean,
712
+ default: false
713
+ },
714
+ website: {
715
+ type: String,
716
+ trim: true
717
+ },
718
+ location: {
719
+ type: String,
720
+ trim: true
721
+ },
722
+ popularity: {
723
+ type: Number,
724
+ default: 0
725
+ }
726
+ },
727
+ {
728
+ timestamps: true,
729
+ versionKey: false
730
+ }
731
+ );
732
+ applyCommonSchema(ArtistSchema);
733
+ applyMetadataSchema(ArtistSchema);
734
+ applyOwnershipSchema(ArtistSchema, db);
735
+ applySocialsSchema(ArtistSchema);
736
+ applyEngagementSchema(ArtistSchema);
737
+ ArtistSchema.index({ name: "text", bio: "text" });
738
+ ArtistSchema.index({ popularity: -1 });
739
+ ArtistSchema.index({ isVerified: 1 });
740
+ return mongoose.models.Artist || mongoose.model("Artist", ArtistSchema);
741
+ };
742
+ const GenreModel = function(db) {
743
+ const mongoose = db.mongoose;
744
+ const Schema = mongoose.Schema;
745
+ const GenreSchema = new Schema(
746
+ {
747
+ name: {
748
+ type: String,
749
+ required: true,
750
+ trim: true,
751
+ unique: true
752
+ },
753
+ description: {
754
+ type: String,
755
+ trim: true
756
+ },
757
+ iconUrl: {
758
+ type: String
759
+ },
760
+ popularity: {
761
+ type: Number,
762
+ default: 0
763
+ }
764
+ },
765
+ {
766
+ timestamps: true,
767
+ versionKey: false
768
+ }
769
+ );
770
+ applyCommonSchema(GenreSchema);
771
+ applyMetadataSchema(GenreSchema);
772
+ GenreSchema.index({ name: "text", description: "text" });
773
+ GenreSchema.index({ popularity: -1 });
774
+ return mongoose.models.Genre || mongoose.model("Genre", GenreSchema);
775
+ };
776
+ const PlayHistoryModel = function(db) {
777
+ const mongoose = db.mongoose;
778
+ const Schema = mongoose.Schema;
779
+ const PlayHistorySchema = new Schema(
780
+ {
781
+ user: {
782
+ type: Schema.Types.ObjectId,
783
+ ref: "User",
784
+ required: true
785
+ },
786
+ track: {
787
+ type: Schema.Types.ObjectId,
788
+ ref: "Track",
789
+ required: true
790
+ },
791
+ playedAt: {
792
+ type: Date,
793
+ default: Date.now
794
+ },
795
+ playDuration: {
796
+ type: Number,
797
+ default: 0
798
+ },
799
+ playedFrom: {
800
+ type: String,
801
+ enum: ["playlist", "album", "search", "recommendation", "artist", "other"],
802
+ default: "other"
803
+ },
804
+ contextId: {
805
+ type: Schema.Types.ObjectId,
806
+ refPath: "playedFrom"
807
+ },
808
+ deviceInfo: {
809
+ type: String
810
+ },
811
+ location: {
812
+ type: String
813
+ }
814
+ },
815
+ {
816
+ timestamps: true,
817
+ versionKey: false
818
+ }
819
+ );
820
+ PlayHistorySchema.index({ user: 1, playedAt: -1 });
821
+ PlayHistorySchema.index({ track: 1 });
822
+ PlayHistorySchema.index({ playedAt: -1 });
823
+ return mongoose.models.PlayHistory || mongoose.model("PlayHistory", PlayHistorySchema);
824
+ };
825
+ const PlaylistModel = function(db) {
826
+ const mongoose = db.mongoose;
827
+ const Schema = mongoose.Schema;
828
+ const PlaylistSchema = new Schema(
829
+ {
830
+ title: {
831
+ type: String,
832
+ required: true,
833
+ trim: true
834
+ },
835
+ description: {
836
+ type: String,
837
+ trim: true
838
+ },
839
+ coverUrl: {
840
+ type: String
841
+ },
842
+ tracks: [
843
+ {
844
+ track: {
845
+ type: Schema.Types.ObjectId,
846
+ ref: "Track"
847
+ },
848
+ addedAt: {
849
+ type: Date,
850
+ default: Date.now
851
+ }
852
+ }
853
+ ],
854
+ isPublic: {
855
+ type: Boolean,
856
+ default: true
857
+ },
858
+ followers: {
859
+ type: Number,
860
+ default: 0
861
+ },
862
+ isCollaborative: {
863
+ type: Boolean,
864
+ default: false
865
+ },
866
+ collaborators: [
867
+ {
868
+ type: Schema.Types.ObjectId,
869
+ ref: "User"
870
+ }
871
+ ]
872
+ },
873
+ {
874
+ timestamps: true,
875
+ versionKey: false
876
+ }
877
+ );
878
+ applyCommonSchema(PlaylistSchema);
879
+ applyMetadataSchema(PlaylistSchema);
880
+ applyOwnershipSchema(PlaylistSchema, db);
881
+ applyEngagementSchema(PlaylistSchema);
882
+ PlaylistSchema.index({ title: "text", description: "text" });
883
+ PlaylistSchema.index({ isPublic: 1 });
884
+ PlaylistSchema.index({ followers: -1 });
885
+ PlaylistSchema.index({ "tracks.addedAt": -1 });
886
+ return mongoose.models.Playlist || mongoose.model("Playlist", PlaylistSchema);
887
+ };
888
+ const TrackModel = function(db) {
889
+ const mongoose = db.mongoose;
890
+ const Schema = mongoose.Schema;
891
+ const TrackSchema = new Schema(
892
+ {
893
+ title: {
894
+ type: String,
895
+ required: true,
896
+ trim: true
897
+ },
898
+ artist: {
899
+ type: Schema.Types.ObjectId,
900
+ ref: "Artist",
901
+ required: true
902
+ },
903
+ album: {
904
+ type: Schema.Types.ObjectId,
905
+ ref: "Album"
906
+ },
907
+ duration: {
908
+ type: Number,
909
+ default: 0
910
+ },
911
+ fileUrl: {
912
+ type: String,
913
+ required: true
914
+ },
915
+ coverUrl: {
916
+ type: String
917
+ },
918
+ genre: [
919
+ {
920
+ type: Schema.Types.ObjectId,
921
+ ref: "Genre"
922
+ }
923
+ ],
924
+ releaseDate: {
925
+ type: Date,
926
+ default: Date.now
927
+ },
928
+ isExplicit: {
929
+ type: Boolean,
930
+ default: false
931
+ },
932
+ lyrics: {
933
+ type: String
934
+ },
935
+ playCount: {
936
+ type: Number,
937
+ default: 0
938
+ },
939
+ isPublic: {
940
+ type: Boolean,
941
+ default: true
942
+ }
943
+ },
944
+ {
945
+ timestamps: true,
946
+ versionKey: false
947
+ }
948
+ );
949
+ applyCommonSchema(TrackSchema);
950
+ applyMetadataSchema(TrackSchema);
951
+ applyOwnershipSchema(TrackSchema, db);
952
+ applyEngagementSchema(TrackSchema);
953
+ TrackSchema.index({ title: "text" });
954
+ TrackSchema.index({ artist: 1 });
955
+ TrackSchema.index({ album: 1 });
956
+ TrackSchema.index({ releaseDate: -1 });
957
+ TrackSchema.index({ playCount: -1 });
958
+ TrackSchema.pre("save", function(next) {
959
+ if (!this.url) {
960
+ this.url = createFriendlyURL(`${this.title}-${this._id}`);
961
+ }
962
+ next();
963
+ });
964
+ TrackSchema.virtual("artistName").get(function() {
965
+ return this.artist ? this.artist.name : "";
966
+ });
967
+ return mongoose.models.Track || mongoose.model("Track", TrackSchema);
968
+ };
969
+ const musicPolicies = function initializeMusicPolicies(abacAccessControl) {
970
+ abacAccessControl.registerResourcePolicy("tracks", async (context) => {
971
+ const { user, action, currentResource, resourceModel } = context;
972
+ const ObjectId = abacAccessControl.db.mongoose.Types.ObjectId;
973
+ if (action === "read" && currentResource?.status === "published" && currentResource?.isPublic === true) {
974
+ return true;
975
+ }
976
+ if (action === "create") {
977
+ if (context.data.creator && context.data.creator.target) {
978
+ return context.data.creator.target.toString() === user.toString();
979
+ }
980
+ return false;
981
+ }
982
+ if (["update", "edit", "delete"].includes(action) && currentResource) {
983
+ if (currentResource.owner && currentResource.owner.type === "Organization") {
984
+ const Organization = abacAccessControl.db.organization;
985
+ const org = await Organization.findOne({
986
+ _id: currentResource.owner.target,
987
+ members: { $elemMatch: { user: new ObjectId(user) } }
988
+ });
989
+ if (org) return true;
990
+ }
991
+ if (currentResource.creator && currentResource.creator.target && currentResource.creator.target.toString() === user.toString()) {
992
+ return true;
993
+ }
994
+ return false;
995
+ }
996
+ return false;
997
+ });
998
+ abacAccessControl.registerResourcePolicy("albums", async (context) => {
999
+ return abacAccessControl.policies.resources.tracks(context);
1000
+ });
1001
+ abacAccessControl.registerResourcePolicy("playlists", async (context) => {
1002
+ const { user, action, currentResource } = context;
1003
+ if (currentResource && currentResource.isCollaborative && currentResource.collaborators && currentResource.collaborators.some((collaborator) => collaborator.toString() === user.toString())) {
1004
+ if (action === "edit" || action === "update") {
1005
+ return true;
1006
+ }
1007
+ }
1008
+ return abacAccessControl.policies.resources.tracks(context);
1009
+ });
1010
+ abacAccessControl.registerResourcePolicy("artists", async (context) => {
1011
+ return abacAccessControl.policies.resources.tracks(context);
1012
+ });
1013
+ return abacAccessControl;
1014
+ };
1015
+ const albumRoutes = function(app, db, origins, publicPath) {
1016
+ const controller = AlbumController(app, db);
1017
+ const { authJwt } = middlewareIndexFactory(db);
1018
+ app.post("/api/albums/create", [authJwt.verifyToken], controller.create);
1019
+ app.get("/api/albums/read", controller.read);
1020
+ app.put("/api/albums/update", [authJwt.verifyToken], controller.update);
1021
+ app.delete("/api/albums/delete", [authJwt.verifyToken], controller.delete);
1022
+ app.get("/api/albums/:albumId/tracks", controller.getAlbumTracks);
1023
+ app.get("/api/albums/featured", controller.getFeaturedAlbums);
1024
+ app.get("/api/albums/url/:url", async (req, res) => {
1025
+ try {
1026
+ const album = await db.album.findOne({ url: req.params.url }).populate("artist");
1027
+ if (!album) {
1028
+ return res.status(404).json({ error: "Album not found" });
1029
+ }
1030
+ res.json(album);
1031
+ } catch (error) {
1032
+ console.error(error);
1033
+ res.status(500).json({ error: error.message });
1034
+ }
1035
+ });
1036
+ };
1037
+ const artistRoutes = function(app, db, origins, publicPath) {
1038
+ const controller = ArtistController(app, db);
1039
+ const { authJwt } = middlewareIndexFactory(db);
1040
+ app.post("/api/artists/create", [authJwt.verifyToken], controller.create);
1041
+ app.get("/api/artists/read", controller.read);
1042
+ app.put("/api/artists/update", [authJwt.verifyToken], controller.update);
1043
+ app.delete("/api/artists/delete", [authJwt.verifyToken], controller.delete);
1044
+ app.get("/api/artists/:artistId/discography", controller.getDiscography);
1045
+ app.put("/api/artists/:artistId/verify", [authJwt.verifyToken, authJwt.isAdmin], controller.verifyArtist);
1046
+ app.get("/api/artists/:artistId/related", controller.getRelatedArtists);
1047
+ app.get("/api/artists/url/:url", async (req, res) => {
1048
+ try {
1049
+ const artist = await db.artist.findOne({ url: req.params.url });
1050
+ if (!artist) {
1051
+ return res.status(404).json({ error: "Artist not found" });
1052
+ }
1053
+ res.json(artist);
1054
+ } catch (error) {
1055
+ console.error(error);
1056
+ res.status(500).json({ error: error.message });
1057
+ }
1058
+ });
1059
+ };
1060
+ const genreRoutes = function(app, db, origins, publicPath) {
1061
+ const controller = GenreController(app, db);
1062
+ const { authJwt } = middlewareIndexFactory(db);
1063
+ app.post("/api/genres/create", [authJwt.verifyToken, authJwt.isAdmin], controller.create);
1064
+ app.get("/api/genres/read", controller.read);
1065
+ app.put("/api/genres/update", [authJwt.verifyToken, authJwt.isAdmin], controller.update);
1066
+ app.delete("/api/genres/delete", [authJwt.verifyToken, authJwt.isAdmin], controller.delete);
1067
+ app.get("/api/genres/:genreId/tracks", controller.getGenreTracks);
1068
+ app.get("/api/genres/popular", controller.getPopularGenres);
1069
+ app.get("/api/genres/url/:url", async (req, res) => {
1070
+ try {
1071
+ const genre = await db.genre.findOne({ url: req.params.url });
1072
+ if (!genre) {
1073
+ return res.status(404).json({ error: "Genre not found" });
1074
+ }
1075
+ res.json(genre);
1076
+ } catch (error) {
1077
+ console.error(error);
1078
+ res.status(500).json({ error: error.message });
1079
+ }
1080
+ });
1081
+ };
1082
+ const { getInstance } = globalsabac;
1083
+ const musicRoutes = function(app, db, origins, publicPath) {
1084
+ const { MusicController: MusicController$1 } = MusicController(app, db);
1085
+ const { authJwt } = middlewareIndexFactory(db);
1086
+ const controller = new MusicController$1("/api/tracks", app, db, db.track, {
1087
+ disableDefaultRoutes: true
1088
+ });
1089
+ const abac = getInstance(db);
1090
+ app.post(
1091
+ "/api/tracks/create",
1092
+ [
1093
+ authJwt.verifyToken(),
1094
+ // Auth middleware
1095
+ (req, res, next) => {
1096
+ console.log("[Route] /api/tracks/create - Request received");
1097
+ console.log("[Route] User ID from token:", req.userId);
1098
+ next();
1099
+ }
1100
+ ],
1101
+ controller.create.bind(controller)
1102
+ // Bind to ensure 'this' context
1103
+ );
1104
+ app.get("/api/tracks/read", controller.read.bind(controller));
1105
+ app.put("/api/tracks/update", [authJwt.verifyToken], controller.update.bind(controller));
1106
+ app.delete("/api/tracks/delete", [authJwt.verifyToken], controller.delete.bind(controller));
1107
+ app.get("/api/tracks/url/:url", async (req, res) => {
1108
+ try {
1109
+ const track = await db.track.findOne({ url: req.params.url });
1110
+ if (!track) {
1111
+ return res.status(404).json({ error: "Track not found" });
1112
+ }
1113
+ const accessResult = await abac.checkAccess({
1114
+ user: req.userId,
1115
+ resource: "tracks",
1116
+ action: "read",
1117
+ currentResource: track
1118
+ });
1119
+ if (!accessResult.allowed && !track.isPublic) {
1120
+ return res.status(403).json({
1121
+ errorCode: accessResult.reason,
1122
+ message: "Access Denied"
1123
+ });
1124
+ }
1125
+ res.json(track);
1126
+ } catch (error) {
1127
+ console.error(error);
1128
+ res.status(500).json({ error: error.message });
1129
+ }
1130
+ });
1131
+ app.get("/api/tracks/recent", async (req, res) => {
1132
+ try {
1133
+ const limit = parseInt(req.query.limit) || 10;
1134
+ const recentTracks = await db.track.find({
1135
+ status: "published",
1136
+ isPublic: true
1137
+ }).sort({ createdAt: -1 }).limit(limit);
1138
+ res.json(recentTracks);
1139
+ } catch (error) {
1140
+ console.error(error);
1141
+ res.status(500).json({ error: error.message });
1142
+ }
1143
+ });
1144
+ app.get("/api/tracks/popular", async (req, res) => {
1145
+ try {
1146
+ const limit = parseInt(req.query.limit) || 10;
1147
+ const popularTracks = await db.track.find({
1148
+ status: "published",
1149
+ isPublic: true
1150
+ }).sort({ playCount: -1 }).limit(limit);
1151
+ res.json(popularTracks);
1152
+ } catch (error) {
1153
+ console.error(error);
1154
+ res.status(500).json({ error: error.message });
1155
+ }
1156
+ });
1157
+ app.get("/api/tracks/genre/:genreId", async (req, res) => {
1158
+ try {
1159
+ const tracks = await db.track.find({
1160
+ genre: req.params.genreId,
1161
+ status: "published",
1162
+ isPublic: true
1163
+ }).sort({ releaseDate: -1 });
1164
+ res.json(tracks);
1165
+ } catch (error) {
1166
+ console.error(error);
1167
+ res.status(500).json({ error: error.message });
1168
+ }
1169
+ });
1170
+ };
1171
+ const playlistRoutes = function(app, db, origins, publicPath) {
1172
+ const controller = PlaylistController(app, db);
1173
+ const { authJwt } = middlewareIndexFactory(db);
1174
+ app.post("/api/playlists/create", [authJwt.verifyToken], controller.create);
1175
+ app.get("/api/playlists/read", controller.read);
1176
+ app.put("/api/playlists/update", [authJwt.verifyToken], controller.update);
1177
+ app.delete("/api/playlists/delete", [authJwt.verifyToken], controller.delete);
1178
+ app.get("/api/playlists/user/:userId?", [authJwt.verifyToken], controller.getUserPlaylists);
1179
+ app.post("/api/playlists/:playlistId/tracks/:trackId", [authJwt.verifyToken], controller.addTrack);
1180
+ app.delete("/api/playlists/:playlistId/tracks/:trackId", [authJwt.verifyToken], controller.removeTrack);
1181
+ app.post("/api/playlists/:playlistId/collaborators/:userId", [authJwt.verifyToken], controller.addCollaborator);
1182
+ app.get("/api/playlists/url/:url", async (req, res) => {
1183
+ try {
1184
+ const playlist = await db.playlist.findOne({ url: req.params.url }).populate({
1185
+ path: "tracks.track",
1186
+ select: "-lyrics"
1187
+ });
1188
+ if (!playlist) {
1189
+ return res.status(404).json({ error: "Playlist not found" });
1190
+ }
1191
+ if (!playlist.isPublic) {
1192
+ if (!req.userId) {
1193
+ return res.status(403).json({ error: "Access denied to private playlist" });
1194
+ }
1195
+ const isOwner = playlist.owner.target.toString() === req.userId;
1196
+ const isCollaborator = playlist.collaborators.some((collab) => collab.toString() === req.userId);
1197
+ if (!isOwner && !isCollaborator) {
1198
+ return res.status(403).json({ error: "Access denied to private playlist" });
1199
+ }
1200
+ }
1201
+ res.json(playlist);
1202
+ } catch (error) {
1203
+ console.error(error);
1204
+ res.status(500).json({ error: error.message });
1205
+ }
1206
+ });
1207
+ };
1208
+ const searchRoutes = function(app, db, origins, publicPath) {
1209
+ const controller = SearchController(app, db);
1210
+ app.get("/api/music/search", controller.search);
1211
+ };
1212
+ const streamRoutes = function(app, db, origins, publicPath) {
1213
+ console.log("rouus publioc is", publicPath);
1214
+ const controller = StreamController(app, db, publicPath);
1215
+ app.get("/api/stream/:trackId", controller.streamAudio);
1216
+ app.get("/api/waveform/:trackId", async (req, res) => {
1217
+ try {
1218
+ const track = await db.track.findById(req.params.trackId);
1219
+ if (!track) {
1220
+ return res.status(404).json({ error: "Track not found" });
1221
+ }
1222
+ const waveformPath = path.join(process.env.FILE_STORAGE_PATH || "./uploads", `waveforms/${track._id}.json`);
1223
+ if (fs.existsSync(waveformPath)) {
1224
+ const waveformData = JSON.parse(fs.readFileSync(waveformPath, "utf8"));
1225
+ return res.json(waveformData);
1226
+ }
1227
+ res.status(404).json({ error: "Waveform data not found" });
1228
+ } catch (error) {
1229
+ console.error(error);
1230
+ res.status(500).json({ error: error.message });
1231
+ }
1232
+ });
1233
+ };
1234
+ const StreamingHandler = function(db) {
1235
+ const logger = new Logger(db);
1236
+ return {
1237
+ // Handle WebSocket messages for music streaming
1238
+ handleStreamingMessage: async (ws, message) => {
1239
+ try {
1240
+ const { action, data } = message;
1241
+ switch (action) {
1242
+ case "startPlaying":
1243
+ if (ws.userId && data.trackId) {
1244
+ await db.playHistory.create({
1245
+ user: ws.userId,
1246
+ track: data.trackId,
1247
+ playedAt: /* @__PURE__ */ new Date(),
1248
+ deviceInfo: data.deviceInfo || "Unknown",
1249
+ playedFrom: data.from || "other",
1250
+ contextId: data.contextId || null
1251
+ });
1252
+ await db.track.findByIdAndUpdate(data.trackId, { $inc: { playCount: 1 } });
1253
+ ws.send(
1254
+ JSON.stringify({
1255
+ type: "playAcknowledged",
1256
+ trackId: data.trackId
1257
+ })
1258
+ );
1259
+ }
1260
+ break;
1261
+ case "syncPosition":
1262
+ if (ws.userId && data.trackId && data.position) {
1263
+ const latestPlay = await db.playHistory.findOne({
1264
+ user: ws.userId,
1265
+ track: data.trackId
1266
+ }).sort({ playedAt: -1 });
1267
+ if (latestPlay) {
1268
+ latestPlay.playDuration = data.position;
1269
+ await latestPlay.save();
1270
+ }
1271
+ }
1272
+ break;
1273
+ case "getRecommendations":
1274
+ if (ws.userId) {
1275
+ const recentTracks = await db.playHistory.find({
1276
+ user: ws.userId
1277
+ }).sort({ playedAt: -1 }).limit(10).populate("track");
1278
+ const recentGenres = /* @__PURE__ */ new Set();
1279
+ const recentArtists = /* @__PURE__ */ new Set();
1280
+ recentTracks.forEach((history) => {
1281
+ if (history.track) {
1282
+ if (history.track.genre) {
1283
+ history.track.genre.forEach((g) => recentGenres.add(g.toString()));
1284
+ }
1285
+ if (history.track.artist) {
1286
+ recentArtists.add(history.track.artist.toString());
1287
+ }
1288
+ }
1289
+ });
1290
+ const recommendations = await db.track.find({
1291
+ $or: [{ genre: { $in: Array.from(recentGenres) } }, { artist: { $in: Array.from(recentArtists) } }],
1292
+ _id: { $nin: recentTracks.map((h) => h.track._id) },
1293
+ // Exclude recently played
1294
+ status: "published",
1295
+ isPublic: true
1296
+ }).limit(10).populate("artist", "name").populate("album", "title coverUrl");
1297
+ ws.send(
1298
+ JSON.stringify({
1299
+ type: "recommendations",
1300
+ tracks: recommendations
1301
+ })
1302
+ );
1303
+ }
1304
+ break;
1305
+ case "joinListeningParty":
1306
+ if (ws.userId && data.partyId) {
1307
+ ws.listeningParty = data.partyId;
1308
+ global.webSocketManager.broadcastToModuleWithFilter("music-streaming", (socket) => socket.listeningParty === data.partyId, {
1309
+ type: "partyMemberJoined",
1310
+ userId: ws.userId,
1311
+ partyId: data.partyId
1312
+ });
1313
+ }
1314
+ break;
1315
+ case "syncPartyPlayback":
1316
+ if (ws.userId && ws.listeningParty && data.trackId && data.position) {
1317
+ global.webSocketManager.broadcastToModuleWithFilter("music-streaming", (socket) => socket.listeningParty === ws.listeningParty && socket !== ws, {
1318
+ type: "partyPlaybackSync",
1319
+ trackId: data.trackId,
1320
+ position: data.position,
1321
+ isPlaying: data.isPlaying,
1322
+ timestamp: Date.now()
1323
+ });
1324
+ }
1325
+ break;
1326
+ default:
1327
+ logger.info(`Unknown streaming action: ${action}`);
1328
+ }
1329
+ } catch (error) {
1330
+ logger.error(`Error in streaming handler: ${error.message}`);
1331
+ ws.send(
1332
+ JSON.stringify({
1333
+ type: "error",
1334
+ message: "An error occurred while processing your request"
1335
+ })
1336
+ );
1337
+ }
1338
+ }
1339
+ };
1340
+ };
1341
+ function initializeMusic({ app, db, wss, origins, publicPath }) {
1342
+ db.track = TrackModel(db);
1343
+ db.playlist = PlaylistModel(db);
1344
+ db.album = AlbumModel(db);
1345
+ db.artist = ArtistModel(db);
1346
+ db.genre = GenreModel(db);
1347
+ db.playHistory = PlayHistoryModel(db);
1348
+ console.log("server publioc is", publicPath);
1349
+ if (app) {
1350
+ musicRoutes(app, db);
1351
+ playlistRoutes(app, db);
1352
+ albumRoutes(app, db);
1353
+ artistRoutes(app, db);
1354
+ streamRoutes(app, db, origins, publicPath);
1355
+ searchRoutes(app, db);
1356
+ genreRoutes(app, db);
1357
+ }
1358
+ const { getInstance: getInstance2 } = globalsabac;
1359
+ const abac = getInstance2(db);
1360
+ musicPolicies(abac);
1361
+ const { WebSocketManager: WebSocketManager$1 } = WebSocketManager;
1362
+ if (global.webSocketManager && global.webSocketManager instanceof WebSocketManager$1) {
1363
+ global.webSocketManager.registerModule("music-streaming", StreamingHandler(db).handleStreamingMessage);
1364
+ }
1365
+ new Cache({ ttlSeconds: 60 * 15 });
1366
+ const musicLogger = new Logger(db);
1367
+ musicLogger.info("Music module initialized");
1368
+ }
1369
+ const models = {
1370
+ TrackModel,
1371
+ PlaylistModel,
1372
+ AlbumModel,
1373
+ ArtistModel,
1374
+ GenreModel,
1375
+ PlayHistoryModel
1376
+ };
1377
+ const routes = {
1378
+ musicRoutes,
1379
+ playlistRoutes,
1380
+ albumRoutes,
1381
+ artistRoutes,
1382
+ streamRoutes,
1383
+ searchRoutes,
1384
+ genreRoutes
1385
+ };
1386
+ const controllers = {
1387
+ MusicController,
1388
+ PlaylistController,
1389
+ AlbumController,
1390
+ ArtistController,
1391
+ StreamController,
1392
+ SearchController,
1393
+ GenreController
1394
+ };
1395
+ const music_server = {
1396
+ initialize: initializeMusic,
1397
+ models,
1398
+ routes,
1399
+ controllers
1400
+ };
1401
+ export {
1402
+ controllers,
1403
+ music_server as default,
1404
+ initializeMusic as initialize,
1405
+ models,
1406
+ routes
1407
+ };