@ozdao/martyrs 0.2.485 → 0.2.487

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 (698) hide show
  1. package/dist/Media-B2jWzwLB.cjs +1 -0
  2. package/dist/{Media-DlUBwVWs.js → Media-DZ5_ItXQ.js} +3 -3
  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 +3 -24
  8. package/dist/auth.server.js +2 -23
  9. package/dist/{authJwt-DBB51Iql.cjs → authJwt-D35KyJlE.cjs} +31 -2
  10. package/dist/{authJwt-DcYNNwcr.js → authJwt-DqxhUym0.js} +31 -2
  11. package/dist/chats.server.cjs +1 -1
  12. package/dist/chats.server.js +1 -1
  13. package/dist/community.server.cjs +1 -1
  14. package/dist/community.server.js +1 -1
  15. package/dist/crud-BDIArc5A.cjs +1096 -0
  16. package/dist/crud-DJvpe0aZ.js +1097 -0
  17. package/dist/events.server.cjs +1 -1
  18. package/dist/events.server.js +1 -1
  19. package/dist/files.server.cjs +1 -1
  20. package/dist/files.server.js +1 -1
  21. package/dist/gallery.server.cjs +1 -1
  22. package/dist/gallery.server.js +1 -1
  23. package/dist/globals.server.cjs +3 -322
  24. package/dist/globals.server.js +1 -303
  25. package/dist/globals.websocket-DzvdIBf6.js +306 -0
  26. package/dist/globals.websocket-k6_B1T7k.cjs +322 -0
  27. package/dist/{index-CsJwdsBW.js → index-CVuQC4k1.js} +1 -1
  28. package/dist/{index-YNOkL1mu.cjs → index-DiSKVCaA.cjs} +1 -1
  29. package/dist/main-C6_DPWGX.cjs +11 -0
  30. package/dist/{main-CK6rC5Sz.js → main-nQmkbWsW.js} +2291 -2224
  31. package/dist/martyrs/src/components/Button/{Button.vue2.cjs → Button.vue.cjs} +2 -2
  32. package/dist/martyrs/src/components/Button/{Button.vue2.js.map → Button.vue.cjs.map} +1 -1
  33. package/dist/martyrs/src/components/Button/{Button.vue2.js → Button.vue.js} +2 -2
  34. package/dist/martyrs/src/components/Button/Button.vue.js.map +1 -0
  35. package/dist/martyrs/src/components/{DatePicker → Calendar}/Calendar.vue.cjs +1 -1
  36. package/dist/martyrs/src/components/Calendar/Calendar.vue.cjs.map +1 -0
  37. package/dist/martyrs/src/components/{DatePicker → Calendar}/Calendar.vue.js +1 -1
  38. package/dist/martyrs/src/components/Calendar/Calendar.vue.js.map +1 -0
  39. package/dist/martyrs/src/components/Chips/{Chips.vue2.cjs → Chips.vue.cjs} +2 -2
  40. package/dist/martyrs/src/components/Chips/Chips.vue.cjs.map +1 -0
  41. package/dist/martyrs/src/components/Chips/{Chips.vue2.js → Chips.vue.js} +2 -2
  42. package/dist/martyrs/src/components/Chips/Chips.vue.js.map +1 -0
  43. package/dist/martyrs/src/components/Feed/Feed.vue.cjs +1 -1
  44. package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
  45. package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
  46. package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
  47. package/dist/martyrs/src/components/Field/{Field.vue.cjs → Field.vue2.cjs} +5 -6
  48. package/dist/martyrs/src/components/Field/Field.vue2.cjs.map +1 -0
  49. package/dist/martyrs/src/components/Field/{Field.vue.js → Field.vue2.js} +5 -6
  50. package/dist/martyrs/src/components/Field/Field.vue2.js.map +1 -0
  51. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs +10 -9
  52. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs.map +1 -1
  53. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +13 -12
  54. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js.map +1 -1
  55. package/dist/martyrs/src/components/FieldPhone/FieldPhone.vue.cjs +1 -1
  56. package/dist/martyrs/src/components/FieldPhone/FieldPhone.vue.cjs.map +1 -1
  57. package/dist/martyrs/src/components/FieldPhone/FieldPhone.vue.js +1 -1
  58. package/dist/martyrs/src/components/FieldPhone/FieldPhone.vue.js.map +1 -1
  59. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +1 -1
  60. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +1 -1
  61. package/dist/martyrs/src/components/Media/Media.vue.cjs +2 -2
  62. package/dist/martyrs/src/components/Media/Media.vue.cjs.map +1 -1
  63. package/dist/martyrs/src/components/Media/Media.vue.js +2 -2
  64. package/dist/martyrs/src/components/Media/Media.vue.js.map +1 -1
  65. package/dist/martyrs/src/components/Menu/{Menu.vue2.cjs → Menu.vue.cjs} +2 -2
  66. package/dist/martyrs/src/components/Menu/Menu.vue.cjs.map +1 -0
  67. package/dist/martyrs/src/components/Menu/{Menu.vue2.js → Menu.vue.js} +2 -2
  68. package/dist/martyrs/src/components/Menu/Menu.vue.js.map +1 -0
  69. package/dist/martyrs/src/components/Popup/{Popup.vue2.cjs → Popup.vue.cjs} +2 -2
  70. package/dist/martyrs/src/components/Popup/{Popup.vue2.js.map → Popup.vue.cjs.map} +1 -1
  71. package/dist/martyrs/src/components/Popup/{Popup.vue2.js → Popup.vue.js} +2 -2
  72. package/dist/martyrs/src/components/Popup/Popup.vue.js.map +1 -0
  73. package/dist/martyrs/src/components/Select/Select.vue.cjs +2 -2
  74. package/dist/martyrs/src/components/Select/Select.vue.cjs.map +1 -1
  75. package/dist/martyrs/src/components/Select/Select.vue.js +2 -2
  76. package/dist/martyrs/src/components/Select/Select.vue.js.map +1 -1
  77. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs +1 -0
  78. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs.map +1 -1
  79. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +1 -0
  80. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js.map +1 -1
  81. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +2 -2
  82. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +5 -5
  83. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +2 -2
  84. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +5 -5
  85. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +3 -2
  86. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs.map +1 -1
  87. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +3 -2
  88. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js.map +1 -1
  89. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.cjs +1 -1
  90. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +1 -1
  91. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.cjs +1 -1
  92. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +1 -1
  93. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.cjs +2 -2
  94. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +10 -10
  95. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +2 -2
  96. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +4 -4
  97. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +2 -2
  98. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +5 -5
  99. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +2 -2
  100. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +4 -4
  101. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.cjs +2 -2
  102. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +23 -23
  103. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.cjs +1 -1
  104. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js +1 -1
  105. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +3 -3
  106. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +3 -3
  107. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +4 -4
  108. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +13 -13
  109. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.cjs +1 -1
  110. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.js +3 -3
  111. package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.cjs +1 -1
  112. package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.js +2 -2
  113. package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.cjs +1 -1
  114. package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.js +1 -1
  115. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.cjs +1 -1
  116. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
  117. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.cjs +1 -1
  118. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
  119. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +3 -3
  120. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs.map +1 -1
  121. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +25 -25
  122. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js.map +1 -1
  123. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +3 -3
  124. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +16 -16
  125. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +9 -2
  126. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs.map +1 -1
  127. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +9 -2
  128. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js.map +1 -1
  129. package/dist/martyrs/src/modules/events/components/pages/Events.vue.cjs +1 -1
  130. package/dist/martyrs/src/modules/events/components/pages/Events.vue.js +1 -1
  131. package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.cjs +1 -1
  132. package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.js +1 -1
  133. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +4 -3
  134. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs.map +1 -1
  135. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +4 -3
  136. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js.map +1 -1
  137. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
  138. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
  139. package/dist/martyrs/src/modules/globals/views/classes/globals.store.cjs +24 -58
  140. package/dist/martyrs/src/modules/globals/views/classes/globals.store.cjs.map +1 -1
  141. package/dist/martyrs/src/modules/globals/views/classes/globals.store.js +24 -58
  142. package/dist/martyrs/src/modules/globals/views/classes/globals.store.js.map +1 -1
  143. package/dist/martyrs/src/modules/globals/views/components/blocks/AlertDialog.vue.cjs +1 -1
  144. package/dist/martyrs/src/modules/globals/views/components/blocks/AlertDialog.vue.js +1 -1
  145. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.cjs +1 -1
  146. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.js +2 -2
  147. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
  148. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
  149. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupAuth.vue.cjs +2 -2
  150. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupAuth.vue.js +2 -2
  151. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs +3 -3
  152. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs.map +1 -1
  153. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js +3 -3
  154. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js.map +1 -1
  155. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +2 -2
  156. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +2 -2
  157. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.cjs +1 -1
  158. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.js +1 -1
  159. package/dist/martyrs/src/modules/globals/views/components/partials/NavigationBar.vue.cjs +1 -1
  160. package/dist/martyrs/src/modules/globals/views/components/partials/NavigationBar.vue.js +1 -1
  161. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs +2 -1
  162. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs.map +1 -1
  163. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.js +2 -1
  164. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.js.map +1 -1
  165. package/dist/martyrs/src/modules/globals/views/components/sections/filters/FilterOptions.vue.cjs +1 -1
  166. package/dist/martyrs/src/modules/globals/views/components/sections/filters/FilterOptions.vue.js +2 -2
  167. package/dist/martyrs/src/modules/globals/views/components/sections/filters/FilterPrice.vue.cjs +1 -1
  168. package/dist/martyrs/src/modules/globals/views/components/sections/filters/FilterPrice.vue.js +3 -3
  169. package/dist/martyrs/src/modules/globals/views/store/globals.cjs +6 -0
  170. package/dist/martyrs/src/modules/globals/views/store/globals.cjs.map +1 -1
  171. package/dist/martyrs/src/modules/globals/views/store/globals.js +6 -0
  172. package/dist/martyrs/src/modules/globals/views/store/globals.js.map +1 -1
  173. package/dist/martyrs/src/modules/globals/views/utils/axios-instance.cjs.map +1 -1
  174. package/dist/martyrs/src/modules/globals/views/utils/axios-instance.js.map +1 -1
  175. package/dist/martyrs/src/modules/globals/views/utils/query-serializer.cjs +100 -0
  176. package/dist/martyrs/src/modules/globals/views/utils/query-serializer.cjs.map +1 -0
  177. package/dist/martyrs/src/modules/globals/views/utils/query-serializer.js +100 -0
  178. package/dist/martyrs/src/modules/globals/views/utils/query-serializer.js.map +1 -0
  179. package/dist/martyrs/src/modules/icons/components/IconSearchPopup.vue.cjs +224 -0
  180. package/dist/martyrs/src/modules/icons/components/IconSearchPopup.vue.cjs.map +1 -0
  181. package/dist/martyrs/src/modules/icons/components/IconSearchPopup.vue.js +224 -0
  182. package/dist/martyrs/src/modules/icons/components/IconSearchPopup.vue.js.map +1 -0
  183. package/dist/martyrs/src/modules/icons/entities/IconAddress.vue.cjs +40 -0
  184. package/dist/martyrs/src/modules/icons/entities/IconAddress.vue.cjs.map +1 -0
  185. package/dist/martyrs/src/modules/icons/entities/IconAddress.vue.js +40 -0
  186. package/dist/martyrs/src/modules/icons/entities/IconAddress.vue.js.map +1 -0
  187. package/dist/martyrs/src/modules/icons/entities/IconDate.vue.cjs +6 -6
  188. package/dist/martyrs/src/modules/icons/entities/IconDate.vue.js +6 -6
  189. package/dist/martyrs/src/modules/icons/entities/IconEmail.vue.cjs +32 -0
  190. package/dist/martyrs/src/modules/icons/entities/IconEmail.vue.cjs.map +1 -0
  191. package/dist/martyrs/src/modules/icons/entities/IconEmail.vue.js +32 -0
  192. package/dist/martyrs/src/modules/icons/entities/IconEmail.vue.js.map +1 -0
  193. package/dist/martyrs/src/modules/icons/entities/IconMusic.vue.cjs +10 -12
  194. package/dist/martyrs/src/modules/icons/entities/IconMusic.vue.cjs.map +1 -1
  195. package/dist/martyrs/src/modules/icons/entities/IconMusic.vue.js +11 -13
  196. package/dist/martyrs/src/modules/icons/entities/IconMusic.vue.js.map +1 -1
  197. package/dist/martyrs/src/modules/icons/entities/IconPhone.vue.cjs +32 -0
  198. package/dist/martyrs/src/modules/icons/entities/IconPhone.vue.cjs.map +1 -0
  199. package/dist/martyrs/src/modules/icons/entities/IconPhone.vue.js +32 -0
  200. package/dist/martyrs/src/modules/icons/entities/IconPhone.vue.js.map +1 -0
  201. package/dist/martyrs/src/modules/icons/icons.client.cjs +48 -4
  202. package/dist/martyrs/src/modules/icons/icons.client.cjs.map +1 -1
  203. package/dist/martyrs/src/modules/icons/icons.client.js +172 -128
  204. package/dist/martyrs/src/modules/icons/icons.client.js.map +1 -1
  205. package/dist/martyrs/src/modules/icons/navigation/IconCross.vue.cjs +5 -7
  206. package/dist/martyrs/src/modules/icons/navigation/IconCross.vue.cjs.map +1 -1
  207. package/dist/martyrs/src/modules/icons/navigation/IconCross.vue.js +5 -7
  208. package/dist/martyrs/src/modules/icons/navigation/IconCross.vue.js.map +1 -1
  209. package/dist/martyrs/src/modules/icons/navigation/IconPause.vue.cjs +6 -11
  210. package/dist/martyrs/src/modules/icons/navigation/IconPause.vue.cjs.map +1 -1
  211. package/dist/martyrs/src/modules/icons/navigation/IconPause.vue.js +6 -11
  212. package/dist/martyrs/src/modules/icons/navigation/IconPause.vue.js.map +1 -1
  213. package/dist/martyrs/src/modules/icons/navigation/IconRefresh.vue.cjs +6 -11
  214. package/dist/martyrs/src/modules/icons/navigation/IconRefresh.vue.cjs.map +1 -1
  215. package/dist/martyrs/src/modules/icons/navigation/IconRefresh.vue.js +6 -11
  216. package/dist/martyrs/src/modules/icons/navigation/IconRefresh.vue.js.map +1 -1
  217. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.cjs +62 -6
  218. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.cjs.map +1 -1
  219. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js +189 -133
  220. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js.map +1 -1
  221. package/dist/martyrs/src/modules/icons/socials/dribbble.vue.cjs +21 -12
  222. package/dist/martyrs/src/modules/icons/socials/dribbble.vue.cjs.map +1 -1
  223. package/dist/martyrs/src/modules/icons/socials/dribbble.vue.js +21 -12
  224. package/dist/martyrs/src/modules/icons/socials/dribbble.vue.js.map +1 -1
  225. package/dist/martyrs/src/modules/icons/socials/facebook.vue.cjs +21 -12
  226. package/dist/martyrs/src/modules/icons/socials/facebook.vue.cjs.map +1 -1
  227. package/dist/martyrs/src/modules/icons/socials/facebook.vue.js +21 -12
  228. package/dist/martyrs/src/modules/icons/socials/facebook.vue.js.map +1 -1
  229. package/dist/martyrs/src/modules/icons/socials/instagram.vue.cjs +25 -17
  230. package/dist/martyrs/src/modules/icons/socials/instagram.vue.cjs.map +1 -1
  231. package/dist/martyrs/src/modules/icons/socials/instagram.vue.js +25 -17
  232. package/dist/martyrs/src/modules/icons/socials/instagram.vue.js.map +1 -1
  233. package/dist/martyrs/src/modules/icons/socials/line.vue.cjs +23 -14
  234. package/dist/martyrs/src/modules/icons/socials/line.vue.cjs.map +1 -1
  235. package/dist/martyrs/src/modules/icons/socials/line.vue.js +23 -14
  236. package/dist/martyrs/src/modules/icons/socials/line.vue.js.map +1 -1
  237. package/dist/martyrs/src/modules/icons/socials/linkedin.vue.cjs +26 -17
  238. package/dist/martyrs/src/modules/icons/socials/linkedin.vue.cjs.map +1 -1
  239. package/dist/martyrs/src/modules/icons/socials/linkedin.vue.js +26 -17
  240. package/dist/martyrs/src/modules/icons/socials/linkedin.vue.js.map +1 -1
  241. package/dist/martyrs/src/modules/icons/socials/reddit.vue.cjs +21 -12
  242. package/dist/martyrs/src/modules/icons/socials/reddit.vue.cjs.map +1 -1
  243. package/dist/martyrs/src/modules/icons/socials/reddit.vue.js +21 -12
  244. package/dist/martyrs/src/modules/icons/socials/reddit.vue.js.map +1 -1
  245. package/dist/martyrs/src/modules/icons/socials/telegram.vue.cjs +29 -20
  246. package/dist/martyrs/src/modules/icons/socials/telegram.vue.cjs.map +1 -1
  247. package/dist/martyrs/src/modules/icons/socials/telegram.vue.js +29 -20
  248. package/dist/martyrs/src/modules/icons/socials/telegram.vue.js.map +1 -1
  249. package/dist/martyrs/src/modules/icons/socials/twitter.vue.cjs +21 -12
  250. package/dist/martyrs/src/modules/icons/socials/twitter.vue.cjs.map +1 -1
  251. package/dist/martyrs/src/modules/icons/socials/twitter.vue.js +21 -12
  252. package/dist/martyrs/src/modules/icons/socials/twitter.vue.js.map +1 -1
  253. package/dist/martyrs/src/modules/icons/socials/vk.vue.cjs +21 -12
  254. package/dist/martyrs/src/modules/icons/socials/vk.vue.cjs.map +1 -1
  255. package/dist/martyrs/src/modules/icons/socials/vk.vue.js +21 -12
  256. package/dist/martyrs/src/modules/icons/socials/vk.vue.js.map +1 -1
  257. package/dist/martyrs/src/modules/icons/socials/whatsapp.vue.cjs +32 -0
  258. package/dist/martyrs/src/modules/icons/socials/whatsapp.vue.cjs.map +1 -0
  259. package/dist/martyrs/src/modules/icons/socials/whatsapp.vue.js +32 -0
  260. package/dist/martyrs/src/modules/icons/socials/whatsapp.vue.js.map +1 -0
  261. package/dist/martyrs/src/modules/icons/socials/youtube.vue.cjs +21 -12
  262. package/dist/martyrs/src/modules/icons/socials/youtube.vue.cjs.map +1 -1
  263. package/dist/martyrs/src/modules/icons/socials/youtube.vue.js +21 -12
  264. package/dist/martyrs/src/modules/icons/socials/youtube.vue.js.map +1 -1
  265. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs +87 -0
  266. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs.map +1 -0
  267. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +87 -0
  268. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js.map +1 -0
  269. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs +83 -0
  270. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs.map +1 -0
  271. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js +83 -0
  272. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js.map +1 -0
  273. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs +83 -0
  274. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs.map +1 -0
  275. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +83 -0
  276. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js.map +1 -0
  277. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs +68 -0
  278. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs.map +1 -0
  279. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js +68 -0
  280. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js.map +1 -0
  281. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs +162 -0
  282. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs.map +1 -0
  283. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +162 -0
  284. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js.map +1 -0
  285. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.cjs +437 -0
  286. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.cjs.map +1 -0
  287. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +437 -0
  288. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js.map +1 -0
  289. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +416 -0
  290. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs.map +1 -0
  291. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +416 -0
  292. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js.map +1 -0
  293. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs +174 -0
  294. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs.map +1 -0
  295. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +174 -0
  296. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js.map +1 -0
  297. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs +80 -0
  298. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs.map +1 -0
  299. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +80 -0
  300. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js.map +1 -0
  301. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs +554 -0
  302. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs.map +1 -0
  303. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +554 -0
  304. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js.map +1 -0
  305. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs +104 -0
  306. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs.map +1 -0
  307. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js +104 -0
  308. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js.map +1 -0
  309. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +314 -0
  310. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs.map +1 -0
  311. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +314 -0
  312. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js.map +1 -0
  313. package/dist/martyrs/src/modules/music/components/pages/AlbumCreate.vue.cjs +14 -0
  314. package/dist/martyrs/src/modules/music/components/pages/AlbumCreate.vue.cjs.map +1 -0
  315. package/dist/martyrs/src/modules/music/components/pages/AlbumCreate.vue.js +14 -0
  316. package/dist/martyrs/src/modules/music/components/pages/AlbumCreate.vue.js.map +1 -0
  317. package/dist/martyrs/src/modules/music/components/pages/AlbumEdit.vue.cjs +23 -0
  318. package/dist/martyrs/src/modules/music/components/pages/AlbumEdit.vue.cjs.map +1 -0
  319. package/dist/martyrs/src/modules/music/components/pages/AlbumEdit.vue.js +23 -0
  320. package/dist/martyrs/src/modules/music/components/pages/AlbumEdit.vue.js.map +1 -0
  321. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs +467 -0
  322. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs.map +1 -0
  323. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +467 -0
  324. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js.map +1 -0
  325. package/dist/martyrs/src/modules/music/components/pages/ArtistCreate.vue.cjs +14 -0
  326. package/dist/martyrs/src/modules/music/components/pages/ArtistCreate.vue.cjs.map +1 -0
  327. package/dist/martyrs/src/modules/music/components/pages/ArtistCreate.vue.js +14 -0
  328. package/dist/martyrs/src/modules/music/components/pages/ArtistCreate.vue.js.map +1 -0
  329. package/dist/martyrs/src/modules/music/components/pages/ArtistEdit.vue.cjs +23 -0
  330. package/dist/martyrs/src/modules/music/components/pages/ArtistEdit.vue.cjs.map +1 -0
  331. package/dist/martyrs/src/modules/music/components/pages/ArtistEdit.vue.js +23 -0
  332. package/dist/martyrs/src/modules/music/components/pages/ArtistEdit.vue.js.map +1 -0
  333. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs +256 -0
  334. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs.map +1 -0
  335. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js +256 -0
  336. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js.map +1 -0
  337. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs +248 -0
  338. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs.map +1 -0
  339. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +248 -0
  340. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js.map +1 -0
  341. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +580 -0
  342. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs.map +1 -0
  343. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +580 -0
  344. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -0
  345. package/dist/martyrs/src/modules/music/components/pages/PlaylistCreate.vue.cjs +14 -0
  346. package/dist/martyrs/src/modules/music/components/pages/PlaylistCreate.vue.cjs.map +1 -0
  347. package/dist/martyrs/src/modules/music/components/pages/PlaylistCreate.vue.js +14 -0
  348. package/dist/martyrs/src/modules/music/components/pages/PlaylistCreate.vue.js.map +1 -0
  349. package/dist/martyrs/src/modules/music/components/pages/PlaylistEdit.vue.cjs +23 -0
  350. package/dist/martyrs/src/modules/music/components/pages/PlaylistEdit.vue.cjs.map +1 -0
  351. package/dist/martyrs/src/modules/music/components/pages/PlaylistEdit.vue.js +23 -0
  352. package/dist/martyrs/src/modules/music/components/pages/PlaylistEdit.vue.js.map +1 -0
  353. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +473 -0
  354. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs.map +1 -0
  355. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +473 -0
  356. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js.map +1 -0
  357. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +111 -0
  358. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs.map +1 -0
  359. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +111 -0
  360. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js.map +1 -0
  361. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.cjs +28 -0
  362. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.cjs.map +1 -0
  363. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +28 -0
  364. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js.map +1 -0
  365. package/dist/martyrs/src/modules/music/components/pages/TrackEdit.vue.cjs +23 -0
  366. package/dist/martyrs/src/modules/music/components/pages/TrackEdit.vue.cjs.map +1 -0
  367. package/dist/martyrs/src/modules/music/components/pages/TrackEdit.vue.js +23 -0
  368. package/dist/martyrs/src/modules/music/components/pages/TrackEdit.vue.js.map +1 -0
  369. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs +227 -0
  370. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs.map +1 -0
  371. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +227 -0
  372. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js.map +1 -0
  373. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs +85 -0
  374. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs.map +1 -0
  375. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js +85 -0
  376. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js.map +1 -0
  377. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs +71 -0
  378. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs.map +1 -0
  379. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +71 -0
  380. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js.map +1 -0
  381. package/dist/martyrs/src/modules/music/music.client.cjs +137 -0
  382. package/dist/martyrs/src/modules/music/music.client.cjs.map +1 -0
  383. package/dist/martyrs/src/modules/music/music.client.js +137 -0
  384. package/dist/martyrs/src/modules/music/music.client.js.map +1 -0
  385. package/dist/martyrs/src/modules/music/router/albums.cjs +34 -0
  386. package/dist/martyrs/src/modules/music/router/albums.cjs.map +1 -0
  387. package/dist/martyrs/src/modules/music/router/albums.js +34 -0
  388. package/dist/martyrs/src/modules/music/router/albums.js.map +1 -0
  389. package/dist/martyrs/src/modules/music/router/artists.cjs +34 -0
  390. package/dist/martyrs/src/modules/music/router/artists.cjs.map +1 -0
  391. package/dist/martyrs/src/modules/music/router/artists.js +34 -0
  392. package/dist/martyrs/src/modules/music/router/artists.js.map +1 -0
  393. package/dist/martyrs/src/modules/music/router/music.cjs +47 -0
  394. package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -0
  395. package/dist/martyrs/src/modules/music/router/music.js +47 -0
  396. package/dist/martyrs/src/modules/music/router/music.js.map +1 -0
  397. package/dist/martyrs/src/modules/music/router/playlists.cjs +34 -0
  398. package/dist/martyrs/src/modules/music/router/playlists.cjs.map +1 -0
  399. package/dist/martyrs/src/modules/music/router/playlists.js +34 -0
  400. package/dist/martyrs/src/modules/music/router/playlists.js.map +1 -0
  401. package/dist/martyrs/src/modules/music/router/tracks.cjs +34 -0
  402. package/dist/martyrs/src/modules/music/router/tracks.cjs.map +1 -0
  403. package/dist/martyrs/src/modules/music/router/tracks.js +34 -0
  404. package/dist/martyrs/src/modules/music/router/tracks.js.map +1 -0
  405. package/dist/martyrs/src/modules/music/store/albums.cjs +167 -0
  406. package/dist/martyrs/src/modules/music/store/albums.cjs.map +1 -0
  407. package/dist/martyrs/src/modules/music/store/albums.js +167 -0
  408. package/dist/martyrs/src/modules/music/store/albums.js.map +1 -0
  409. package/dist/martyrs/src/modules/music/store/artists.cjs +160 -0
  410. package/dist/martyrs/src/modules/music/store/artists.cjs.map +1 -0
  411. package/dist/martyrs/src/modules/music/store/artists.js +160 -0
  412. package/dist/martyrs/src/modules/music/store/artists.js.map +1 -0
  413. package/dist/martyrs/src/modules/music/store/genres.cjs +123 -0
  414. package/dist/martyrs/src/modules/music/store/genres.cjs.map +1 -0
  415. package/dist/martyrs/src/modules/music/store/genres.js +123 -0
  416. package/dist/martyrs/src/modules/music/store/genres.js.map +1 -0
  417. package/dist/martyrs/src/modules/music/store/player.cjs +297 -0
  418. package/dist/martyrs/src/modules/music/store/player.cjs.map +1 -0
  419. package/dist/martyrs/src/modules/music/store/player.js +297 -0
  420. package/dist/martyrs/src/modules/music/store/player.js.map +1 -0
  421. package/dist/martyrs/src/modules/music/store/playlists.cjs +182 -0
  422. package/dist/martyrs/src/modules/music/store/playlists.cjs.map +1 -0
  423. package/dist/martyrs/src/modules/music/store/playlists.js +182 -0
  424. package/dist/martyrs/src/modules/music/store/playlists.js.map +1 -0
  425. package/dist/martyrs/src/modules/music/store/search.cjs +109 -0
  426. package/dist/martyrs/src/modules/music/store/search.cjs.map +1 -0
  427. package/dist/martyrs/src/modules/music/store/search.js +109 -0
  428. package/dist/martyrs/src/modules/music/store/search.js.map +1 -0
  429. package/dist/martyrs/src/modules/music/store/tracks.cjs +184 -0
  430. package/dist/martyrs/src/modules/music/store/tracks.cjs.map +1 -0
  431. package/dist/martyrs/src/modules/music/store/tracks.js +184 -0
  432. package/dist/martyrs/src/modules/music/store/tracks.js.map +1 -0
  433. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.cjs +1 -1
  434. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js +1 -1
  435. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs +2 -2
  436. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
  437. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs +1 -1
  438. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
  439. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +3 -2
  440. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs.map +1 -1
  441. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +3 -2
  442. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js.map +1 -1
  443. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.cjs +2 -1
  444. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.cjs.map +1 -1
  445. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.js +2 -1
  446. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.js.map +1 -1
  447. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.cjs +1 -1
  448. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.js +5 -5
  449. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +2 -2
  450. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +3 -3
  451. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.cjs +1 -1
  452. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +1 -1
  453. package/dist/martyrs/src/modules/organizations/components/blocks/Socials.vue.js +16 -16
  454. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.cjs +1 -1
  455. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
  456. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +3 -3
  457. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +16 -16
  458. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +2 -2
  459. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +2 -2
  460. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +1 -1
  461. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
  462. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
  463. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
  464. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +3 -3
  465. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +17 -17
  466. package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.cjs +1 -1
  467. package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.js +1 -1
  468. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +3 -3
  469. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +4 -4
  470. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +2 -2
  471. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +8 -8
  472. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +2 -1
  473. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs.map +1 -1
  474. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +2 -1
  475. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js.map +1 -1
  476. package/dist/martyrs/src/modules/organizations/router/organizations.cjs +1 -1
  477. package/dist/martyrs/src/modules/organizations/router/organizations.js +1 -1
  478. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +2 -1
  479. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs.map +1 -1
  480. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +2 -1
  481. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js.map +1 -1
  482. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +2 -1
  483. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs.map +1 -1
  484. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +2 -1
  485. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js.map +1 -1
  486. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.cjs +2 -2
  487. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +2 -2
  488. package/dist/martyrs/src/modules/products/components/blocks/ProductDiscounts.vue.cjs +1 -1
  489. package/dist/martyrs/src/modules/products/components/blocks/ProductDiscounts.vue.js +1 -1
  490. package/dist/martyrs/src/modules/products/components/blocks/ProductImages.vue.cjs +1 -1
  491. package/dist/martyrs/src/modules/products/components/blocks/ProductImages.vue.js +1 -1
  492. package/dist/martyrs/src/modules/products/components/forms/ReorderSettingsForm.vue.cjs +1 -1
  493. package/dist/martyrs/src/modules/products/components/forms/ReorderSettingsForm.vue.js +8 -8
  494. package/dist/martyrs/src/modules/products/components/forms/StockAuditForm.vue.cjs +1 -1
  495. package/dist/martyrs/src/modules/products/components/forms/StockAuditForm.vue.js +12 -12
  496. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs +1 -1
  497. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
  498. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +3 -3
  499. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +13 -13
  500. package/dist/martyrs/src/modules/products/components/pages/LeftoverEdit.vue.cjs +3 -3
  501. package/dist/martyrs/src/modules/products/components/pages/LeftoverEdit.vue.js +11 -11
  502. package/dist/martyrs/src/modules/products/components/pages/Leftovers.vue.cjs +2 -2
  503. package/dist/martyrs/src/modules/products/components/pages/Leftovers.vue.js +1 -1
  504. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +2 -2
  505. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs.map +1 -1
  506. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +2 -2
  507. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
  508. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +2 -2
  509. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +18 -18
  510. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.cjs +3 -3
  511. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +7 -7
  512. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.cjs +3 -3
  513. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +13 -13
  514. package/dist/martyrs/src/modules/products/components/sections/EditIngredients.vue.cjs +1 -1
  515. package/dist/martyrs/src/modules/products/components/sections/EditIngredients.vue.js +1 -1
  516. package/dist/martyrs/src/modules/products/components/sections/EditRecommended.vue.cjs +1 -1
  517. package/dist/martyrs/src/modules/products/components/sections/EditRecommended.vue.js +1 -1
  518. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +3 -3
  519. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +17 -17
  520. package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.cjs +1 -1
  521. package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +1 -1
  522. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.cjs +1 -1
  523. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +1 -1
  524. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.cjs +1 -1
  525. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
  526. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +2 -2
  527. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +5 -5
  528. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.cjs +2 -2
  529. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +2 -2
  530. package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.cjs +1 -1
  531. package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js +1 -1
  532. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.cjs +1 -0
  533. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.cjs.map +1 -1
  534. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -0
  535. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js.map +1 -1
  536. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -0
  537. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs.map +1 -1
  538. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -0
  539. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js.map +1 -1
  540. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.cjs +1 -1
  541. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
  542. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +3 -3
  543. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +14 -14
  544. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.cjs +3 -3
  545. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +9 -9
  546. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.cjs +1 -1
  547. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js +2 -2
  548. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.cjs +1 -1
  549. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +2 -2
  550. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.cjs +3 -3
  551. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +3 -3
  552. package/dist/martyrs.cjs.js +1 -1
  553. package/dist/martyrs.css +1 -1
  554. package/dist/martyrs.es.js +38 -36
  555. package/dist/music.server.cjs +2021 -0
  556. package/dist/music.server.js +2021 -0
  557. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.cjs +1 -1
  558. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js +1 -1
  559. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.cjs +1 -1
  560. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js +1 -1
  561. package/dist/orders.server.cjs +1 -1
  562. package/dist/orders.server.js +1 -1
  563. package/dist/organizations.server.cjs +1 -1
  564. package/dist/organizations.server.js +1 -1
  565. package/dist/products.server.cjs +3 -1093
  566. package/dist/products.server.js +2 -1092
  567. package/dist/rents.server.cjs +1 -1
  568. package/dist/rents.server.js +1 -1
  569. package/dist/socials.schema-BOZV82Mp.js +25 -0
  570. package/dist/socials.schema-CtpSF9dE.cjs +24 -0
  571. package/dist/style.css +230 -46
  572. package/dist/wallet.server.cjs +1 -1
  573. package/dist/wallet.server.js +1 -1
  574. package/package.json +1 -1
  575. package/src/.martyrs/filemap.json +2 -2
  576. package/src/components/Feed/Feed.vue +1 -1
  577. package/src/components/Field/Field.vue +13 -8
  578. package/src/components/FieldBig/FieldBig.vue +3 -5
  579. package/src/components/FieldPhone/FieldPhone.vue +1 -1
  580. package/src/components/Media/Media.vue +1 -1
  581. package/src/components/Select/Select.vue +1 -1
  582. package/src/components/Status/Snack.vue +83 -0
  583. package/src/components/index.js +2 -0
  584. package/src/main.js +6 -0
  585. package/src/modules/auth/controllers/middlewares/authJwt.js +59 -6
  586. package/src/modules/events/components/pages/EditEvent.vue +1 -1
  587. package/src/modules/globals/views/classes/globals.store.js +31 -66
  588. package/src/modules/globals/views/components/blocks/PopupDateSelector.vue +1 -1
  589. package/src/modules/globals/views/components/partials/FooterAlt.vue +363 -0
  590. package/src/modules/globals/views/store/globals.js +42 -0
  591. package/src/modules/globals/views/utils/axios-instance.js +15 -1
  592. package/src/modules/globals/views/utils/query-serializer.js +182 -0
  593. package/src/modules/icons/components/IconSearchPopup.vue +254 -0
  594. package/src/modules/icons/entities/IconAddress.vue +17 -0
  595. package/src/modules/icons/entities/IconDate.vue +3 -3
  596. package/src/modules/icons/entities/IconEmail.vue +14 -0
  597. package/src/modules/icons/entities/IconMusic.vue +3 -3
  598. package/src/modules/icons/entities/IconPhone.vue +14 -0
  599. package/src/modules/icons/icons.client.js +85 -31
  600. package/src/modules/icons/icons.server.js +292 -0
  601. package/src/modules/icons/navigation/IconCross.vue +4 -16
  602. package/src/modules/icons/navigation/IconPause.vue +9 -24
  603. package/src/modules/icons/navigation/IconRefresh.vue +9 -24
  604. package/src/modules/icons/pages/IconsPage.vue +78 -2
  605. package/src/modules/icons/routes/icons.routes.js +81 -0
  606. package/src/modules/icons/socials/dribbble.vue +11 -2
  607. package/src/modules/icons/socials/facebook.vue +11 -2
  608. package/src/modules/icons/socials/instagram.vue +11 -4
  609. package/src/modules/icons/socials/line.vue +11 -2
  610. package/src/modules/icons/socials/linkedin.vue +11 -2
  611. package/src/modules/icons/socials/reddit.vue +10 -1
  612. package/src/modules/icons/socials/telegram.vue +11 -2
  613. package/src/modules/icons/socials/twitter.vue +11 -2
  614. package/src/modules/icons/socials/vk.vue +11 -2
  615. package/src/modules/icons/socials/whatsapp.vue +12 -0
  616. package/src/modules/icons/socials/youtube.vue +11 -2
  617. package/src/modules/music/.claude/settings.local.json +8 -0
  618. package/src/modules/music/CLAUDE.md +312 -0
  619. package/src/modules/music/components/SidebarMusic.vue +8 -8
  620. package/src/modules/music/components/cards/AlbumCard.vue +2 -2
  621. package/src/modules/music/components/cards/ArtistCard.vue +2 -2
  622. package/src/modules/music/components/cards/PlaylistCard.vue +2 -2
  623. package/src/modules/music/components/cards/TrackCard.vue +1 -1
  624. package/src/modules/music/components/cards/TrackListCard.vue +135 -0
  625. package/src/modules/music/components/forms/AlbumForm.vue +463 -0
  626. package/src/modules/music/components/{pages → forms}/ArtistForm.vue +127 -96
  627. package/src/modules/music/components/forms/PlaylistForm.vue +10 -10
  628. package/src/modules/music/components/forms/SearchForm.vue +1 -1
  629. package/src/modules/music/components/forms/TrackForm.vue +577 -0
  630. package/src/modules/music/components/layouts/MusicLayout.vue +35 -41
  631. package/src/modules/music/components/pages/{AlbumDetail.vue → Album.vue} +42 -20
  632. package/src/modules/music/components/pages/AlbumCreate.vue +7 -0
  633. package/src/modules/music/components/pages/AlbumEdit.vue +14 -0
  634. package/src/modules/music/components/pages/{ArtistDetail.vue → Artist.vue} +9 -9
  635. package/src/modules/music/components/pages/ArtistCreate.vue +7 -0
  636. package/src/modules/music/components/pages/ArtistEdit.vue +14 -0
  637. package/src/modules/music/components/pages/MusicHome.vue +86 -67
  638. package/src/modules/music/components/pages/MusicLibrary.vue +136 -105
  639. package/src/modules/music/components/pages/{PlaylistDetail.vue → Playlist.vue} +56 -34
  640. package/src/modules/music/components/pages/PlaylistCreate.vue +7 -0
  641. package/src/modules/music/components/pages/PlaylistEdit.vue +14 -0
  642. package/src/modules/music/components/pages/SearchResults.vue +49 -27
  643. package/src/modules/music/components/pages/{TrackDetail.vue → Track.vue} +36 -14
  644. package/src/modules/music/components/pages/TrackCreate.vue +23 -0
  645. package/src/modules/music/components/pages/TrackEdit.vue +14 -0
  646. package/src/modules/music/components/player/MusicPlayer.vue +2 -2
  647. package/src/modules/music/middlewares/albums.verifier.js +234 -0
  648. package/src/modules/music/middlewares/artists.verifier.js +213 -0
  649. package/src/modules/music/middlewares/genres.verifier.js +148 -0
  650. package/src/modules/music/middlewares/playlists.verifier.js +219 -0
  651. package/src/modules/music/middlewares/tracks.verifier.js +263 -0
  652. package/src/modules/music/music.client.js +31 -33
  653. package/src/modules/music/music.server.js +33 -26
  654. package/src/modules/music/router/albums.js +31 -0
  655. package/src/modules/music/router/artists.js +31 -0
  656. package/src/modules/music/router/music.js +14 -65
  657. package/src/modules/music/router/playlists.js +31 -0
  658. package/src/modules/music/router/tracks.js +31 -0
  659. package/src/modules/music/routes/albums.routes.js +126 -0
  660. package/src/modules/music/routes/artists.routes.js +171 -0
  661. package/src/modules/music/routes/genres.routes.js +118 -0
  662. package/src/modules/music/routes/playlists.routes.js +239 -0
  663. package/src/modules/music/routes/tracks.routes.js +149 -0
  664. package/src/modules/music/store/artists.js +17 -7
  665. package/src/modules/music/store/genres.js +150 -0
  666. package/src/modules/music/store/playlists.js +19 -6
  667. package/src/modules/music/store/tracks.js +9 -2
  668. package/src/modules/products/components/pages/Product.vue +1 -1
  669. package/dist/Media-ByPHBvAU.cjs +0 -1
  670. package/dist/main-137vO86w.cjs +0 -11
  671. package/dist/martyrs/src/components/Button/Button.vue2.cjs.map +0 -1
  672. package/dist/martyrs/src/components/Chips/Chips.vue2.cjs.map +0 -1
  673. package/dist/martyrs/src/components/Chips/Chips.vue2.js.map +0 -1
  674. package/dist/martyrs/src/components/DatePicker/Calendar.vue.cjs.map +0 -1
  675. package/dist/martyrs/src/components/DatePicker/Calendar.vue.js.map +0 -1
  676. package/dist/martyrs/src/components/Field/Field.vue.cjs.map +0 -1
  677. package/dist/martyrs/src/components/Field/Field.vue.js.map +0 -1
  678. package/dist/martyrs/src/components/Menu/Menu.vue2.cjs.map +0 -1
  679. package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +0 -1
  680. package/dist/martyrs/src/components/Popup/Popup.vue2.cjs.map +0 -1
  681. package/src/modules/music/components/forms/UploadForm.vue +0 -313
  682. package/src/modules/music/components/lists/AlbumList.vue +0 -25
  683. package/src/modules/music/components/lists/ArtistList.vue +0 -280
  684. package/src/modules/music/components/lists/PlaylistList.vue +0 -25
  685. package/src/modules/music/components/lists/TrackList.vue +0 -175
  686. package/src/modules/music/components/pages/ArtistManager.vue +0 -277
  687. package/src/modules/music/components/pages/MusicUpload.vue +0 -44
  688. package/src/modules/music/controllers/album.controller.js +0 -82
  689. package/src/modules/music/controllers/artist.controller.js +0 -99
  690. package/src/modules/music/controllers/genre.controller.js +0 -63
  691. package/src/modules/music/controllers/music.controller.js +0 -145
  692. package/src/modules/music/controllers/playlist.controller.js +0 -146
  693. package/src/modules/music/routes/album.routes.js +0 -28
  694. package/src/modules/music/routes/artist.routes.js +0 -30
  695. package/src/modules/music/routes/genre.routes.js +0 -28
  696. package/src/modules/music/routes/music.routes.js +0 -106
  697. package/src/modules/music/routes/playlist.routes.js +0 -47
  698. /package/src/components/{DatePicker → Calendar}/Calendar.vue +0 -0
@@ -0,0 +1,2021 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const globals_abac = require("./globals.abac-Cm9e8Jdk.cjs");
4
+ const globals_logger = require("./globals.logger-CZMgIMlM.cjs");
5
+ const globals_websocket = require("./globals.websocket-k6_B1T7k.cjs");
6
+ const crud = require("./crud-BDIArc5A.cjs");
7
+ const abac = require("./abac-6LjoG9u-.cjs");
8
+ const globals_verifier = require("./globals.verifier-D68mHEBl.cjs");
9
+ const fs$1 = require("fs");
10
+ const path$1 = require("path");
11
+ const common_schema = require("./common.schema-BzFEVNn3.cjs");
12
+ const engagement_schema = require("./engagement.schema-JADHu8pj.cjs");
13
+ const metadata_schema = require("./metadata.schema-RlxNv46L.cjs");
14
+ const ownership_schema = require("./ownership.schema-DCosqOc1.cjs");
15
+ const socials_schema = require("./socials.schema-CtpSF9dE.cjs");
16
+ function tracksVerifierFactory(db) {
17
+ const createVerifier = new globals_verifier.Verifier({
18
+ title: {
19
+ rule: "required",
20
+ validator: globals_verifier.Validator.schema().string().required("Track title is required").min(1, "Title cannot be empty").max(200, "Title must not exceed 200 characters")
21
+ },
22
+ artist: {
23
+ rule: "required",
24
+ validator: globals_verifier.Validator.schema().string().required("Artist is required").pattern(/^[0-9a-fA-F]{24}$/, "Invalid artist ID format")
25
+ },
26
+ album: {
27
+ rule: "optional",
28
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid album ID format")
29
+ },
30
+ fileUrl: {
31
+ rule: "required",
32
+ validator: globals_verifier.Validator.schema().string().required("File URL is required").pattern(/^https?:\/\/.+/, "Invalid file URL format")
33
+ },
34
+ coverUrl: {
35
+ rule: "optional",
36
+ validator: globals_verifier.Validator.schema().string().pattern(/^https?:\/\/.+/, "Invalid cover URL format")
37
+ },
38
+ duration: {
39
+ rule: "optional",
40
+ default: 0,
41
+ validator: globals_verifier.Validator.schema().number().min(0, "Duration cannot be negative").max(3600, "Duration cannot exceed 1 hour")
42
+ },
43
+ genre: {
44
+ rule: "optional",
45
+ validator: globals_verifier.Validator.schema().array().items(
46
+ globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid genre ID format")
47
+ )
48
+ },
49
+ releaseDate: {
50
+ rule: "optional",
51
+ validator: globals_verifier.Validator.schema().date()
52
+ },
53
+ isExplicit: {
54
+ rule: "optional",
55
+ default: false,
56
+ validator: globals_verifier.Validator.schema().boolean()
57
+ },
58
+ lyrics: {
59
+ rule: "optional",
60
+ validator: globals_verifier.Validator.schema().string().max(1e4, "Lyrics too long")
61
+ },
62
+ isPublic: {
63
+ rule: "optional",
64
+ default: true,
65
+ validator: globals_verifier.Validator.schema().boolean()
66
+ },
67
+ owner: {
68
+ rule: "required",
69
+ validator: globals_verifier.Validator.schema().object({
70
+ type: globals_verifier.Validator.schema().string().oneOf(["user", "organization"]),
71
+ target: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/)
72
+ })
73
+ }
74
+ });
75
+ const updateVerifier = new globals_verifier.Verifier({
76
+ _id: {
77
+ rule: "required",
78
+ validator: globals_verifier.Validator.schema().string().required("Track ID is required").pattern(/^[0-9a-fA-F]{24}$/, "Invalid track ID format")
79
+ },
80
+ title: {
81
+ rule: "optional",
82
+ validator: globals_verifier.Validator.schema().string().min(1, "Title cannot be empty").max(200, "Title must not exceed 200 characters")
83
+ },
84
+ artist: {
85
+ rule: "optional",
86
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid artist ID format")
87
+ },
88
+ album: {
89
+ rule: "optional",
90
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid album ID format")
91
+ },
92
+ fileUrl: {
93
+ rule: "optional",
94
+ validator: globals_verifier.Validator.schema().string().pattern(/^https?:\/\/.+/, "Invalid file URL format")
95
+ },
96
+ coverUrl: {
97
+ rule: "optional",
98
+ validator: globals_verifier.Validator.schema().string().pattern(/^https?:\/\/.+/, "Invalid cover URL format")
99
+ },
100
+ duration: {
101
+ rule: "optional",
102
+ validator: globals_verifier.Validator.schema().number().min(0, "Duration cannot be negative").max(3600, "Duration cannot exceed 1 hour")
103
+ },
104
+ genre: {
105
+ rule: "optional",
106
+ validator: globals_verifier.Validator.schema().array().items(
107
+ globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid genre ID format")
108
+ )
109
+ },
110
+ releaseDate: {
111
+ rule: "optional",
112
+ validator: globals_verifier.Validator.schema().date()
113
+ },
114
+ isExplicit: {
115
+ rule: "optional",
116
+ validator: globals_verifier.Validator.schema().boolean()
117
+ },
118
+ lyrics: {
119
+ rule: "optional",
120
+ validator: globals_verifier.Validator.schema().string().max(1e4, "Lyrics too long")
121
+ },
122
+ isPublic: {
123
+ rule: "optional",
124
+ validator: globals_verifier.Validator.schema().boolean()
125
+ },
126
+ status: {
127
+ rule: "optional",
128
+ validator: globals_verifier.Validator.schema().string().oneOf(["draft", "published", "archived"], "Invalid status")
129
+ }
130
+ });
131
+ const readVerifier = new globals_verifier.Verifier({
132
+ _id: {
133
+ rule: "optional",
134
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid track ID format")
135
+ },
136
+ artist: {
137
+ rule: "optional",
138
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid artist ID format")
139
+ },
140
+ album: {
141
+ rule: "optional",
142
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid album ID format")
143
+ },
144
+ genre: {
145
+ rule: "optional",
146
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid genre ID format")
147
+ },
148
+ isPublic: {
149
+ rule: "optional",
150
+ validator: globals_verifier.Validator.schema().boolean()
151
+ },
152
+ status: {
153
+ rule: "optional",
154
+ validator: globals_verifier.Validator.schema().string().oneOf(["draft", "published", "archived"])
155
+ },
156
+ skip: {
157
+ rule: "optional",
158
+ default: 0,
159
+ validator: globals_verifier.Validator.schema().integer().min(0)
160
+ },
161
+ limit: {
162
+ rule: "optional",
163
+ default: 20,
164
+ validator: globals_verifier.Validator.schema().integer().min(1).max(100)
165
+ },
166
+ sortParam: {
167
+ rule: "optional",
168
+ validator: globals_verifier.Validator.schema().string().oneOf(["title", "playCount", "releaseDate", "createdAt", "updatedAt"])
169
+ },
170
+ sortOrder: {
171
+ rule: "optional",
172
+ default: "desc",
173
+ validator: globals_verifier.Validator.schema().string().oneOf(["asc", "desc"])
174
+ }
175
+ });
176
+ const deleteVerifier = new globals_verifier.Verifier({
177
+ _id: {
178
+ rule: "required",
179
+ validator: globals_verifier.Validator.schema().string().required("Track ID is required").pattern(/^[0-9a-fA-F]{24}$/, "Invalid track ID format")
180
+ }
181
+ });
182
+ return {
183
+ createVerifier,
184
+ readVerifier,
185
+ updateVerifier,
186
+ deleteVerifier
187
+ };
188
+ }
189
+ const { getInstance: getInstance$4 } = abac.ABAC;
190
+ function setupTracksRoutes(app, db) {
191
+ const abac2 = getInstance$4(db);
192
+ const verifier = tracksVerifierFactory();
193
+ const tracksCRUD = new crud.CRUD({
194
+ app,
195
+ db,
196
+ model: db.track,
197
+ modelName: "track",
198
+ basePath: "/api/tracks",
199
+ auth: true,
200
+ verifiers: {
201
+ create: verifier.createVerifier,
202
+ read: verifier.readVerifier,
203
+ update: verifier.updateVerifier,
204
+ delete: verifier.deleteVerifier
205
+ },
206
+ abac: abac2,
207
+ cache: {
208
+ enabled: true,
209
+ ttl: 300,
210
+ tags: ["tracks", "music"]
211
+ },
212
+ events: {
213
+ enabled: true,
214
+ logReads: false
215
+ }
216
+ });
217
+ tracksCRUD.addAction("get-by-url", {
218
+ method: "get",
219
+ path: "/url/:url",
220
+ auth: false,
221
+ handler: async (req, res) => {
222
+ try {
223
+ const track = await db.track.findOne({ url: req.params.url });
224
+ if (!track) {
225
+ return res.status(404).json({ error: "Track not found" });
226
+ }
227
+ const accessResult = await abac2.checkAccess({
228
+ user: req.userId,
229
+ resource: "tracks",
230
+ action: "read",
231
+ currentResource: track
232
+ });
233
+ if (!accessResult.allowed && !track.isPublic) {
234
+ return res.status(403).json({
235
+ errorCode: accessResult.reason,
236
+ message: "Access Denied"
237
+ });
238
+ }
239
+ res.json(track);
240
+ } catch (error) {
241
+ console.error(error);
242
+ res.status(500).json({ error: error.message });
243
+ }
244
+ }
245
+ });
246
+ tracksCRUD.addAction("recent", {
247
+ method: "get",
248
+ path: "/recent",
249
+ auth: false,
250
+ handler: async (req, res) => {
251
+ try {
252
+ const limit = parseInt(req.query.limit) || 10;
253
+ const recentTracks = await db.track.find({
254
+ status: "published",
255
+ isPublic: true
256
+ }).sort({ createdAt: -1 }).limit(limit);
257
+ res.json(recentTracks);
258
+ } catch (error) {
259
+ console.error(error);
260
+ res.status(500).json({ error: error.message });
261
+ }
262
+ }
263
+ });
264
+ tracksCRUD.addAction("popular", {
265
+ method: "get",
266
+ path: "/popular",
267
+ auth: false,
268
+ handler: async (req, res) => {
269
+ try {
270
+ const limit = parseInt(req.query.limit) || 10;
271
+ const popularTracks = await db.track.find({
272
+ status: "published",
273
+ isPublic: true
274
+ }).sort({ playCount: -1 }).limit(limit);
275
+ res.json(popularTracks);
276
+ } catch (error) {
277
+ console.error(error);
278
+ res.status(500).json({ error: error.message });
279
+ }
280
+ }
281
+ });
282
+ tracksCRUD.addAction("by-genre", {
283
+ method: "get",
284
+ path: "/genre/:genreId",
285
+ auth: false,
286
+ handler: async (req, res) => {
287
+ try {
288
+ const tracks = await db.track.find({
289
+ genre: req.params.genreId,
290
+ status: "published",
291
+ isPublic: true
292
+ }).sort({ releaseDate: -1 });
293
+ res.json(tracks);
294
+ } catch (error) {
295
+ console.error(error);
296
+ res.status(500).json({ error: error.message });
297
+ }
298
+ }
299
+ });
300
+ return tracksCRUD;
301
+ }
302
+ function artistsVerifierFactory(db) {
303
+ const createVerifier = new globals_verifier.Verifier({
304
+ name: {
305
+ rule: "required",
306
+ validator: globals_verifier.Validator.schema().string().required("Artist name is required").min(1, "Name cannot be empty").max(100, "Name must not exceed 100 characters")
307
+ },
308
+ bio: {
309
+ rule: "optional",
310
+ validator: globals_verifier.Validator.schema().string().max(2e3, "Bio must not exceed 2000 characters")
311
+ },
312
+ photoUrl: {
313
+ rule: "optional",
314
+ validator: globals_verifier.Validator.schema().string().pattern(/^\/(?!\/)/, 'Only relative URLs starting with "/" are allowed')
315
+ },
316
+ coverUrl: {
317
+ rule: "optional",
318
+ validator: globals_verifier.Validator.schema().string().pattern(/^\/(?!\/)/, 'Only relative URLs starting with "/" are allowed')
319
+ },
320
+ genre: {
321
+ rule: "optional",
322
+ validator: globals_verifier.Validator.schema().array().items(
323
+ globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid genre ID format")
324
+ )
325
+ },
326
+ website: {
327
+ rule: "optional",
328
+ validator: globals_verifier.Validator.schema().string().pattern(/^https?:\/\/.+/, "Invalid website URL format")
329
+ },
330
+ location: {
331
+ rule: "optional",
332
+ validator: globals_verifier.Validator.schema().string().max(100, "Location must not exceed 100 characters")
333
+ },
334
+ owner: {
335
+ rule: "required",
336
+ validator: globals_verifier.Validator.schema().object({
337
+ type: globals_verifier.Validator.schema().string().oneOf(["user", "organization"]),
338
+ target: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/)
339
+ })
340
+ }
341
+ });
342
+ const updateVerifier = new globals_verifier.Verifier({
343
+ _id: {
344
+ rule: "required",
345
+ validator: globals_verifier.Validator.schema().string().required("Artist ID is required").pattern(/^[0-9a-fA-F]{24}$/, "Invalid artist ID format")
346
+ },
347
+ name: {
348
+ rule: "optional",
349
+ validator: globals_verifier.Validator.schema().string().min(1, "Name cannot be empty").max(100, "Name must not exceed 100 characters")
350
+ },
351
+ bio: {
352
+ rule: "optional",
353
+ validator: globals_verifier.Validator.schema().string().max(2e3, "Bio must not exceed 2000 characters")
354
+ },
355
+ photoUrl: {
356
+ rule: "optional",
357
+ validator: globals_verifier.Validator.schema().string().pattern(/^https?:\/\/.+/, "Invalid photo URL format")
358
+ },
359
+ coverUrl: {
360
+ rule: "optional",
361
+ validator: globals_verifier.Validator.schema().string().pattern(/^https?:\/\/.+/, "Invalid cover URL format")
362
+ },
363
+ genre: {
364
+ rule: "optional",
365
+ validator: globals_verifier.Validator.schema().array().items(
366
+ globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid genre ID format")
367
+ )
368
+ },
369
+ website: {
370
+ rule: "optional",
371
+ validator: globals_verifier.Validator.schema().string().pattern(/^https?:\/\/.+/, "Invalid website URL format")
372
+ },
373
+ location: {
374
+ rule: "optional",
375
+ validator: globals_verifier.Validator.schema().string().max(100, "Location must not exceed 100 characters")
376
+ },
377
+ isVerified: {
378
+ rule: "optional",
379
+ validator: globals_verifier.Validator.schema().boolean()
380
+ },
381
+ status: {
382
+ rule: "optional",
383
+ validator: globals_verifier.Validator.schema().string().oneOf(["draft", "published", "archived"], "Invalid status")
384
+ }
385
+ });
386
+ const readVerifier = new globals_verifier.Verifier({
387
+ _id: {
388
+ rule: "optional",
389
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid artist ID format")
390
+ },
391
+ genre: {
392
+ rule: "optional",
393
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid genre ID format")
394
+ },
395
+ isVerified: {
396
+ rule: "optional",
397
+ validator: globals_verifier.Validator.schema().boolean()
398
+ },
399
+ status: {
400
+ rule: "optional",
401
+ validator: globals_verifier.Validator.schema().string().oneOf(["draft", "published", "archived"])
402
+ },
403
+ location: {
404
+ rule: "optional",
405
+ validator: globals_verifier.Validator.schema().string()
406
+ },
407
+ skip: {
408
+ rule: "optional",
409
+ default: 0,
410
+ validator: globals_verifier.Validator.schema().integer().min(0)
411
+ },
412
+ limit: {
413
+ rule: "optional",
414
+ default: 20,
415
+ validator: globals_verifier.Validator.schema().integer().min(1).max(100)
416
+ },
417
+ sortParam: {
418
+ rule: "optional",
419
+ validator: globals_verifier.Validator.schema().string().oneOf(["name", "popularity", "createdAt", "updatedAt"])
420
+ },
421
+ sortOrder: {
422
+ rule: "optional",
423
+ default: "desc",
424
+ validator: globals_verifier.Validator.schema().string().oneOf(["asc", "desc"])
425
+ }
426
+ });
427
+ const deleteVerifier = new globals_verifier.Verifier({
428
+ _id: {
429
+ rule: "required",
430
+ validator: globals_verifier.Validator.schema().string().required("Artist ID is required").pattern(/^[0-9a-fA-F]{24}$/, "Invalid artist ID format")
431
+ }
432
+ });
433
+ return {
434
+ createVerifier,
435
+ readVerifier,
436
+ updateVerifier,
437
+ deleteVerifier
438
+ };
439
+ }
440
+ const { getInstance: getInstance$3 } = abac.ABAC;
441
+ function setupArtistsRoutes(app, db) {
442
+ const abac2 = getInstance$3(db);
443
+ const verifier = artistsVerifierFactory();
444
+ const artistsCRUD = new crud.CRUD({
445
+ app,
446
+ db,
447
+ model: db.artist,
448
+ modelName: "artist",
449
+ basePath: "/api/artists",
450
+ auth: true,
451
+ verifiers: {
452
+ create: verifier.createVerifier,
453
+ read: verifier.readVerifier,
454
+ update: verifier.updateVerifier,
455
+ delete: verifier.deleteVerifier
456
+ },
457
+ abac: abac2,
458
+ cache: {
459
+ enabled: true,
460
+ ttl: 300,
461
+ tags: ["artists", "music"]
462
+ },
463
+ events: {
464
+ enabled: true,
465
+ logReads: false
466
+ }
467
+ });
468
+ artistsCRUD.addAction("get-by-url", {
469
+ method: "get",
470
+ path: "/url/:url",
471
+ auth: false,
472
+ handler: async (req, res) => {
473
+ try {
474
+ const artist = await db.artist.findOne({ url: req.params.url });
475
+ if (!artist) {
476
+ return res.status(404).json({ error: "Artist not found" });
477
+ }
478
+ res.json(artist);
479
+ } catch (error) {
480
+ console.error(error);
481
+ res.status(500).json({ error: error.message });
482
+ }
483
+ }
484
+ });
485
+ artistsCRUD.addAction("discography", {
486
+ method: "get",
487
+ path: "/:artistId/discography",
488
+ auth: false,
489
+ handler: async (req, res) => {
490
+ try {
491
+ const { artistId } = req.params;
492
+ const albums = await db.album.find({ artists: artistId }).populate("artists", "name").sort({ releaseDate: -1 });
493
+ const tracks = await db.track.find({
494
+ artist: artistId,
495
+ status: "published",
496
+ isPublic: true
497
+ }).populate("album", "title").sort({ releaseDate: -1 });
498
+ res.json({
499
+ albums,
500
+ tracks,
501
+ artist: artistId
502
+ });
503
+ } catch (error) {
504
+ console.error(error);
505
+ res.status(500).json({ error: error.message });
506
+ }
507
+ }
508
+ });
509
+ artistsCRUD.addAction("verify-artist", {
510
+ method: "put",
511
+ path: "/:artistId/verify",
512
+ auth: true,
513
+ abac: {
514
+ resource: "artists",
515
+ action: "verify",
516
+ strict: true
517
+ },
518
+ handler: async (req, res) => {
519
+ try {
520
+ const { artistId } = req.params;
521
+ const artist = await db.artist.findByIdAndUpdate(
522
+ artistId,
523
+ { isVerified: true },
524
+ { new: true }
525
+ );
526
+ if (!artist) {
527
+ return res.status(404).json({ error: "Artist not found" });
528
+ }
529
+ res.json({
530
+ message: "Artist verified successfully",
531
+ artist
532
+ });
533
+ } catch (error) {
534
+ console.error(error);
535
+ res.status(500).json({ error: error.message });
536
+ }
537
+ }
538
+ });
539
+ artistsCRUD.addAction("related-artists", {
540
+ method: "get",
541
+ path: "/:artistId/related",
542
+ auth: false,
543
+ handler: async (req, res) => {
544
+ try {
545
+ const { artistId } = req.params;
546
+ const limit = parseInt(req.query.limit) || 10;
547
+ const artist = await db.artist.findById(artistId);
548
+ if (!artist) {
549
+ return res.status(404).json({ error: "Artist not found" });
550
+ }
551
+ const relatedArtists = await db.artist.find({
552
+ _id: { $ne: artistId },
553
+ // исключаем самого артиста
554
+ genre: { $in: artist.genre },
555
+ // общие жанры
556
+ status: "published"
557
+ }).limit(limit).sort({ popularity: -1 });
558
+ res.json(relatedArtists);
559
+ } catch (error) {
560
+ console.error(error);
561
+ res.status(500).json({ error: error.message });
562
+ }
563
+ }
564
+ });
565
+ return artistsCRUD;
566
+ }
567
+ function albumsVerifierFactory(db) {
568
+ const createVerifier = new globals_verifier.Verifier({
569
+ title: {
570
+ rule: "required",
571
+ validator: globals_verifier.Validator.schema().string().required("Album title is required").min(1, "Title cannot be empty").max(200, "Title must not exceed 200 characters")
572
+ },
573
+ description: {
574
+ rule: "optional",
575
+ validator: globals_verifier.Validator.schema().string().max(1e3, "Description must not exceed 1000 characters")
576
+ },
577
+ releaseDate: {
578
+ rule: "required",
579
+ validator: globals_verifier.Validator.schema().date().required("Release date is required")
580
+ },
581
+ coverArt: {
582
+ rule: "optional",
583
+ validator: globals_verifier.Validator.schema().string().pattern(/^https?:\/\/.+/, "Invalid cover art URL format")
584
+ },
585
+ artists: {
586
+ rule: "required",
587
+ validator: globals_verifier.Validator.schema().array().items(
588
+ globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid artist ID format")
589
+ ).min(1, "At least one artist is required")
590
+ },
591
+ type: {
592
+ rule: "optional",
593
+ default: "album",
594
+ validator: globals_verifier.Validator.schema().string().oneOf(["album", "single", "EP", "compilation"], "Invalid album type")
595
+ },
596
+ genres: {
597
+ rule: "optional",
598
+ validator: globals_verifier.Validator.schema().array().items(
599
+ globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid genre ID format")
600
+ )
601
+ },
602
+ totalTracks: {
603
+ rule: "optional",
604
+ default: 0,
605
+ validator: globals_verifier.Validator.schema().integer().min(0, "Total tracks cannot be negative").max(100, "Too many tracks")
606
+ },
607
+ owner: {
608
+ rule: "required",
609
+ validator: globals_verifier.Validator.schema().object({
610
+ type: globals_verifier.Validator.schema().string().oneOf(["user", "organization"]),
611
+ target: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/)
612
+ })
613
+ }
614
+ });
615
+ const updateVerifier = new globals_verifier.Verifier({
616
+ _id: {
617
+ rule: "required",
618
+ validator: globals_verifier.Validator.schema().string().required("Album ID is required").pattern(/^[0-9a-fA-F]{24}$/, "Invalid album ID format")
619
+ },
620
+ title: {
621
+ rule: "optional",
622
+ validator: globals_verifier.Validator.schema().string().min(1, "Title cannot be empty").max(200, "Title must not exceed 200 characters")
623
+ },
624
+ description: {
625
+ rule: "optional",
626
+ validator: globals_verifier.Validator.schema().string().max(1e3, "Description must not exceed 1000 characters")
627
+ },
628
+ releaseDate: {
629
+ rule: "optional",
630
+ validator: globals_verifier.Validator.schema().date()
631
+ },
632
+ coverArt: {
633
+ rule: "optional",
634
+ validator: globals_verifier.Validator.schema().string().pattern(/^https?:\/\/.+/, "Invalid cover art URL format")
635
+ },
636
+ artists: {
637
+ rule: "optional",
638
+ validator: globals_verifier.Validator.schema().array().items(
639
+ globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid artist ID format")
640
+ ).min(1, "At least one artist is required")
641
+ },
642
+ type: {
643
+ rule: "optional",
644
+ validator: globals_verifier.Validator.schema().string().oneOf(["album", "single", "EP", "compilation"], "Invalid album type")
645
+ },
646
+ genres: {
647
+ rule: "optional",
648
+ validator: globals_verifier.Validator.schema().array().items(
649
+ globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid genre ID format")
650
+ )
651
+ },
652
+ totalTracks: {
653
+ rule: "optional",
654
+ validator: globals_verifier.Validator.schema().integer().min(0, "Total tracks cannot be negative").max(100, "Too many tracks")
655
+ },
656
+ status: {
657
+ rule: "optional",
658
+ validator: globals_verifier.Validator.schema().string().oneOf(["draft", "published", "archived"], "Invalid status")
659
+ }
660
+ });
661
+ const readVerifier = new globals_verifier.Verifier({
662
+ _id: {
663
+ rule: "optional",
664
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid album ID format")
665
+ },
666
+ artists: {
667
+ rule: "optional",
668
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid artist ID format")
669
+ },
670
+ type: {
671
+ rule: "optional",
672
+ validator: globals_verifier.Validator.schema().string().oneOf(["album", "single", "EP", "compilation"])
673
+ },
674
+ genres: {
675
+ rule: "optional",
676
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid genre ID format")
677
+ },
678
+ status: {
679
+ rule: "optional",
680
+ validator: globals_verifier.Validator.schema().string().oneOf(["draft", "published", "archived"])
681
+ },
682
+ skip: {
683
+ rule: "optional",
684
+ default: 0,
685
+ validator: globals_verifier.Validator.schema().integer().min(0)
686
+ },
687
+ limit: {
688
+ rule: "optional",
689
+ default: 20,
690
+ validator: globals_verifier.Validator.schema().integer().min(1).max(100)
691
+ },
692
+ sortParam: {
693
+ rule: "optional",
694
+ validator: globals_verifier.Validator.schema().string().oneOf(["title", "releaseDate", "totalTracks", "createdAt", "updatedAt"])
695
+ },
696
+ sortOrder: {
697
+ rule: "optional",
698
+ default: "desc",
699
+ validator: globals_verifier.Validator.schema().string().oneOf(["asc", "desc"])
700
+ }
701
+ });
702
+ const deleteVerifier = new globals_verifier.Verifier({
703
+ _id: {
704
+ rule: "required",
705
+ validator: globals_verifier.Validator.schema().string().required("Album ID is required").pattern(/^[0-9a-fA-F]{24}$/, "Invalid album ID format")
706
+ }
707
+ });
708
+ return {
709
+ createVerifier,
710
+ readVerifier,
711
+ updateVerifier,
712
+ deleteVerifier
713
+ };
714
+ }
715
+ const { getInstance: getInstance$2 } = abac.ABAC;
716
+ function setupAlbumsRoutes(app, db) {
717
+ const abac2 = getInstance$2(db);
718
+ const verifier = albumsVerifierFactory();
719
+ const albumsCRUD = new crud.CRUD({
720
+ app,
721
+ db,
722
+ model: db.album,
723
+ modelName: "album",
724
+ basePath: "/api/albums",
725
+ auth: true,
726
+ verifiers: {
727
+ create: verifier.createVerifier,
728
+ read: verifier.readVerifier,
729
+ update: verifier.updateVerifier,
730
+ delete: verifier.deleteVerifier
731
+ },
732
+ abac: abac2,
733
+ cache: {
734
+ enabled: true,
735
+ ttl: 300,
736
+ tags: ["albums", "music"]
737
+ },
738
+ events: {
739
+ enabled: true,
740
+ logReads: false
741
+ }
742
+ });
743
+ albumsCRUD.addAction("get-by-url", {
744
+ method: "get",
745
+ path: "/url/:url",
746
+ auth: false,
747
+ handler: async (req, res) => {
748
+ try {
749
+ const album = await db.album.findOne({ url: req.params.url }).populate("artists", "name url");
750
+ if (!album) {
751
+ return res.status(404).json({ error: "Album not found" });
752
+ }
753
+ res.json(album);
754
+ } catch (error) {
755
+ console.error(error);
756
+ res.status(500).json({ error: error.message });
757
+ }
758
+ }
759
+ });
760
+ albumsCRUD.addAction("album-tracks", {
761
+ method: "get",
762
+ path: "/:albumId/tracks",
763
+ auth: false,
764
+ handler: async (req, res) => {
765
+ try {
766
+ const { albumId } = req.params;
767
+ const tracks = await db.track.find({
768
+ album: albumId,
769
+ status: "published",
770
+ isPublic: true
771
+ }).populate("artist", "name url").populate("genre", "name").sort({ trackNumber: 1, createdAt: 1 });
772
+ res.json(tracks);
773
+ } catch (error) {
774
+ console.error(error);
775
+ res.status(500).json({ error: error.message });
776
+ }
777
+ }
778
+ });
779
+ albumsCRUD.addAction("featured", {
780
+ method: "get",
781
+ path: "/featured",
782
+ auth: false,
783
+ handler: async (req, res) => {
784
+ try {
785
+ const limit = parseInt(req.query.limit) || 10;
786
+ const featuredAlbums = await db.album.find({
787
+ status: "published",
788
+ releaseDate: {
789
+ $gte: new Date(Date.now() - 90 * 24 * 60 * 60 * 1e3)
790
+ // последние 90 дней
791
+ }
792
+ }).populate("artists", "name url").sort({ createdAt: -1 }).limit(limit);
793
+ res.json(featuredAlbums);
794
+ } catch (error) {
795
+ console.error(error);
796
+ res.status(500).json({ error: error.message });
797
+ }
798
+ }
799
+ });
800
+ return albumsCRUD;
801
+ }
802
+ function playlistsVerifierFactory(db) {
803
+ const createVerifier = new globals_verifier.Verifier({
804
+ title: {
805
+ rule: "required",
806
+ validator: globals_verifier.Validator.schema().string().required("Playlist title is required").min(1, "Title cannot be empty").max(200, "Title must not exceed 200 characters")
807
+ },
808
+ description: {
809
+ rule: "optional",
810
+ validator: globals_verifier.Validator.schema().string().max(1e3, "Description must not exceed 1000 characters")
811
+ },
812
+ coverUrl: {
813
+ rule: "optional",
814
+ validator: globals_verifier.Validator.schema().string().pattern(/^https?:\/\/.+/, "Invalid cover URL format")
815
+ },
816
+ tracks: {
817
+ rule: "optional",
818
+ validator: globals_verifier.Validator.schema().array().items(
819
+ globals_verifier.Validator.schema().object({
820
+ track: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid track ID format").required(),
821
+ addedAt: globals_verifier.Validator.schema().date()
822
+ })
823
+ )
824
+ },
825
+ isPublic: {
826
+ rule: "optional",
827
+ default: true,
828
+ validator: globals_verifier.Validator.schema().boolean()
829
+ },
830
+ isCollaborative: {
831
+ rule: "optional",
832
+ default: false,
833
+ validator: globals_verifier.Validator.schema().boolean()
834
+ },
835
+ collaborators: {
836
+ rule: "optional",
837
+ validator: globals_verifier.Validator.schema().array().items(
838
+ globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid collaborator ID format")
839
+ )
840
+ },
841
+ owner: {
842
+ rule: "required",
843
+ validator: globals_verifier.Validator.schema().object({
844
+ type: globals_verifier.Validator.schema().string().oneOf(["user", "organization"]),
845
+ target: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/)
846
+ })
847
+ }
848
+ });
849
+ const updateVerifier = new globals_verifier.Verifier({
850
+ _id: {
851
+ rule: "required",
852
+ validator: globals_verifier.Validator.schema().string().required("Playlist ID is required").pattern(/^[0-9a-fA-F]{24}$/, "Invalid playlist ID format")
853
+ },
854
+ title: {
855
+ rule: "optional",
856
+ validator: globals_verifier.Validator.schema().string().min(1, "Title cannot be empty").max(200, "Title must not exceed 200 characters")
857
+ },
858
+ description: {
859
+ rule: "optional",
860
+ validator: globals_verifier.Validator.schema().string().max(1e3, "Description must not exceed 1000 characters")
861
+ },
862
+ coverUrl: {
863
+ rule: "optional",
864
+ validator: globals_verifier.Validator.schema().string().pattern(/^https?:\/\/.+/, "Invalid cover URL format")
865
+ },
866
+ tracks: {
867
+ rule: "optional",
868
+ validator: globals_verifier.Validator.schema().array().items(
869
+ globals_verifier.Validator.schema().object({
870
+ track: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid track ID format").required(),
871
+ addedAt: globals_verifier.Validator.schema().date()
872
+ })
873
+ )
874
+ },
875
+ isPublic: {
876
+ rule: "optional",
877
+ validator: globals_verifier.Validator.schema().boolean()
878
+ },
879
+ isCollaborative: {
880
+ rule: "optional",
881
+ validator: globals_verifier.Validator.schema().boolean()
882
+ },
883
+ collaborators: {
884
+ rule: "optional",
885
+ validator: globals_verifier.Validator.schema().array().items(
886
+ globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid collaborator ID format")
887
+ )
888
+ },
889
+ status: {
890
+ rule: "optional",
891
+ validator: globals_verifier.Validator.schema().string().oneOf(["draft", "published", "archived"], "Invalid status")
892
+ }
893
+ });
894
+ const readVerifier = new globals_verifier.Verifier({
895
+ _id: {
896
+ rule: "optional",
897
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid playlist ID format")
898
+ },
899
+ owner: {
900
+ rule: "optional",
901
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid owner ID format")
902
+ },
903
+ isPublic: {
904
+ rule: "optional",
905
+ validator: globals_verifier.Validator.schema().boolean()
906
+ },
907
+ isCollaborative: {
908
+ rule: "optional",
909
+ validator: globals_verifier.Validator.schema().boolean()
910
+ },
911
+ status: {
912
+ rule: "optional",
913
+ validator: globals_verifier.Validator.schema().string().oneOf(["draft", "published", "archived"])
914
+ },
915
+ skip: {
916
+ rule: "optional",
917
+ default: 0,
918
+ validator: globals_verifier.Validator.schema().integer().min(0)
919
+ },
920
+ limit: {
921
+ rule: "optional",
922
+ default: 20,
923
+ validator: globals_verifier.Validator.schema().integer().min(1).max(100)
924
+ },
925
+ sortParam: {
926
+ rule: "optional",
927
+ validator: globals_verifier.Validator.schema().string().oneOf(["title", "followers", "createdAt", "updatedAt"])
928
+ },
929
+ sortOrder: {
930
+ rule: "optional",
931
+ default: "desc",
932
+ validator: globals_verifier.Validator.schema().string().oneOf(["asc", "desc"])
933
+ }
934
+ });
935
+ const deleteVerifier = new globals_verifier.Verifier({
936
+ _id: {
937
+ rule: "required",
938
+ validator: globals_verifier.Validator.schema().string().required("Playlist ID is required").pattern(/^[0-9a-fA-F]{24}$/, "Invalid playlist ID format")
939
+ }
940
+ });
941
+ return {
942
+ createVerifier,
943
+ readVerifier,
944
+ updateVerifier,
945
+ deleteVerifier
946
+ };
947
+ }
948
+ const { getInstance: getInstance$1 } = abac.ABAC;
949
+ function setupPlaylistsRoutes(app, db) {
950
+ const abac2 = getInstance$1(db);
951
+ const verifier = playlistsVerifierFactory();
952
+ const playlistsCRUD = new crud.CRUD({
953
+ app,
954
+ db,
955
+ model: db.playlist,
956
+ modelName: "playlist",
957
+ basePath: "/api/playlists",
958
+ auth: true,
959
+ verifiers: {
960
+ create: verifier.createVerifier,
961
+ read: verifier.readVerifier,
962
+ update: verifier.updateVerifier,
963
+ delete: verifier.deleteVerifier
964
+ },
965
+ abac: abac2,
966
+ cache: {
967
+ enabled: true,
968
+ ttl: 300,
969
+ tags: ["playlists", "music"]
970
+ },
971
+ events: {
972
+ enabled: true,
973
+ logReads: false
974
+ }
975
+ });
976
+ playlistsCRUD.addAction("get-by-url", {
977
+ method: "get",
978
+ path: "/url/:url",
979
+ auth: false,
980
+ handler: async (req, res) => {
981
+ try {
982
+ const playlist = await db.playlist.findOne({ url: req.params.url }).populate({
983
+ path: "tracks.track",
984
+ select: "-lyrics"
985
+ });
986
+ if (!playlist) {
987
+ return res.status(404).json({ error: "Playlist not found" });
988
+ }
989
+ if (!playlist.isPublic) {
990
+ if (!req.userId) {
991
+ return res.status(403).json({ error: "Access denied to private playlist" });
992
+ }
993
+ const isOwner = playlist.owner.target.toString() === req.userId;
994
+ const isCollaborator = playlist.collaborators.some((collab) => collab.toString() === req.userId);
995
+ if (!isOwner && !isCollaborator) {
996
+ return res.status(403).json({ error: "Access denied to private playlist" });
997
+ }
998
+ }
999
+ res.json(playlist);
1000
+ } catch (error) {
1001
+ console.error(error);
1002
+ res.status(500).json({ error: error.message });
1003
+ }
1004
+ }
1005
+ });
1006
+ playlistsCRUD.addAction("user-playlists", {
1007
+ method: "get",
1008
+ path: "/user/:userId?",
1009
+ auth: true,
1010
+ handler: async (req, res) => {
1011
+ try {
1012
+ const userId = req.params.userId || req.userId;
1013
+ const query = { "owner.target": userId };
1014
+ if (userId !== req.userId) {
1015
+ query.isPublic = true;
1016
+ }
1017
+ const playlists = await db.playlist.find(query).populate("tracks.track", "title artist").sort({ updatedAt: -1 });
1018
+ res.json(playlists);
1019
+ } catch (error) {
1020
+ console.error(error);
1021
+ res.status(500).json({ error: error.message });
1022
+ }
1023
+ }
1024
+ });
1025
+ playlistsCRUD.addAction("add-track", {
1026
+ method: "post",
1027
+ path: "/:playlistId/tracks/:trackId",
1028
+ auth: true,
1029
+ abac: {
1030
+ resource: "playlists",
1031
+ action: "update"
1032
+ },
1033
+ handler: async (req, res) => {
1034
+ try {
1035
+ const { playlistId, trackId } = req.params;
1036
+ const track = await db.track.findById(trackId);
1037
+ if (!track) {
1038
+ return res.status(404).json({ error: "Track not found" });
1039
+ }
1040
+ const playlist = await db.playlist.findById(playlistId);
1041
+ if (!playlist) {
1042
+ return res.status(404).json({ error: "Playlist not found" });
1043
+ }
1044
+ const trackExists = playlist.tracks.some((t) => t.track.toString() === trackId);
1045
+ if (trackExists) {
1046
+ return res.status(400).json({ error: "Track already in playlist" });
1047
+ }
1048
+ playlist.tracks.push({
1049
+ track: trackId,
1050
+ addedAt: /* @__PURE__ */ new Date()
1051
+ });
1052
+ await playlist.save();
1053
+ res.json({
1054
+ message: "Track added to playlist successfully",
1055
+ playlist
1056
+ });
1057
+ } catch (error) {
1058
+ console.error(error);
1059
+ res.status(500).json({ error: error.message });
1060
+ }
1061
+ }
1062
+ });
1063
+ playlistsCRUD.addAction("remove-track", {
1064
+ method: "delete",
1065
+ path: "/:playlistId/tracks/:trackId",
1066
+ auth: true,
1067
+ abac: {
1068
+ resource: "playlists",
1069
+ action: "update"
1070
+ },
1071
+ handler: async (req, res) => {
1072
+ try {
1073
+ const { playlistId, trackId } = req.params;
1074
+ const playlist = await db.playlist.findById(playlistId);
1075
+ if (!playlist) {
1076
+ return res.status(404).json({ error: "Playlist not found" });
1077
+ }
1078
+ playlist.tracks = playlist.tracks.filter(
1079
+ (t) => t.track.toString() !== trackId
1080
+ );
1081
+ await playlist.save();
1082
+ res.json({
1083
+ message: "Track removed from playlist successfully",
1084
+ playlist
1085
+ });
1086
+ } catch (error) {
1087
+ console.error(error);
1088
+ res.status(500).json({ error: error.message });
1089
+ }
1090
+ }
1091
+ });
1092
+ playlistsCRUD.addAction("add-collaborator", {
1093
+ method: "post",
1094
+ path: "/:playlistId/collaborators/:userId",
1095
+ auth: true,
1096
+ abac: {
1097
+ resource: "playlists",
1098
+ action: "update"
1099
+ },
1100
+ handler: async (req, res) => {
1101
+ try {
1102
+ const { playlistId, userId } = req.params;
1103
+ const playlist = await db.playlist.findById(playlistId);
1104
+ if (!playlist) {
1105
+ return res.status(404).json({ error: "Playlist not found" });
1106
+ }
1107
+ if (playlist.collaborators.includes(userId)) {
1108
+ return res.status(400).json({ error: "User is already a collaborator" });
1109
+ }
1110
+ playlist.collaborators.push(userId);
1111
+ playlist.isCollaborative = true;
1112
+ await playlist.save();
1113
+ res.json({
1114
+ message: "Collaborator added successfully",
1115
+ playlist
1116
+ });
1117
+ } catch (error) {
1118
+ console.error(error);
1119
+ res.status(500).json({ error: error.message });
1120
+ }
1121
+ }
1122
+ });
1123
+ return playlistsCRUD;
1124
+ }
1125
+ function genresVerifierFactory(db) {
1126
+ const createVerifier = new globals_verifier.Verifier({
1127
+ name: {
1128
+ rule: "required",
1129
+ validator: globals_verifier.Validator.schema().string().required("Genre name is required").min(1, "Name cannot be empty").max(50, "Name must not exceed 50 characters")
1130
+ },
1131
+ description: {
1132
+ rule: "optional",
1133
+ validator: globals_verifier.Validator.schema().string().max(500, "Description must not exceed 500 characters")
1134
+ },
1135
+ iconUrl: {
1136
+ rule: "optional",
1137
+ validator: globals_verifier.Validator.schema().string().pattern(/^https?:\/\/.+/, "Invalid icon URL format")
1138
+ },
1139
+ popularity: {
1140
+ rule: "optional",
1141
+ default: 0,
1142
+ validator: globals_verifier.Validator.schema().number().min(0, "Popularity cannot be negative").max(100, "Popularity cannot exceed 100")
1143
+ }
1144
+ });
1145
+ const updateVerifier = new globals_verifier.Verifier({
1146
+ _id: {
1147
+ rule: "required",
1148
+ validator: globals_verifier.Validator.schema().string().required("Genre ID is required").pattern(/^[0-9a-fA-F]{24}$/, "Invalid genre ID format")
1149
+ },
1150
+ name: {
1151
+ rule: "optional",
1152
+ validator: globals_verifier.Validator.schema().string().min(1, "Name cannot be empty").max(50, "Name must not exceed 50 characters")
1153
+ },
1154
+ description: {
1155
+ rule: "optional",
1156
+ validator: globals_verifier.Validator.schema().string().max(500, "Description must not exceed 500 characters")
1157
+ },
1158
+ iconUrl: {
1159
+ rule: "optional",
1160
+ validator: globals_verifier.Validator.schema().string().pattern(/^https?:\/\/.+/, "Invalid icon URL format")
1161
+ },
1162
+ popularity: {
1163
+ rule: "optional",
1164
+ validator: globals_verifier.Validator.schema().number().min(0, "Popularity cannot be negative").max(100, "Popularity cannot exceed 100")
1165
+ },
1166
+ status: {
1167
+ rule: "optional",
1168
+ validator: globals_verifier.Validator.schema().string().oneOf(["draft", "published", "archived"], "Invalid status")
1169
+ }
1170
+ });
1171
+ const readVerifier = new globals_verifier.Verifier({
1172
+ _id: {
1173
+ rule: "optional",
1174
+ validator: globals_verifier.Validator.schema().string().pattern(/^[0-9a-fA-F]{24}$/, "Invalid genre ID format")
1175
+ },
1176
+ name: {
1177
+ rule: "optional",
1178
+ validator: globals_verifier.Validator.schema().string()
1179
+ },
1180
+ status: {
1181
+ rule: "optional",
1182
+ validator: globals_verifier.Validator.schema().string().oneOf(["draft", "published", "archived"])
1183
+ },
1184
+ skip: {
1185
+ rule: "optional",
1186
+ default: 0,
1187
+ validator: globals_verifier.Validator.schema().integer().min(0)
1188
+ },
1189
+ limit: {
1190
+ rule: "optional",
1191
+ default: 20,
1192
+ validator: globals_verifier.Validator.schema().integer().min(1).max(100)
1193
+ },
1194
+ sortParam: {
1195
+ rule: "optional",
1196
+ validator: globals_verifier.Validator.schema().string().oneOf(["name", "popularity", "createdAt", "updatedAt"])
1197
+ },
1198
+ sortOrder: {
1199
+ rule: "optional",
1200
+ default: "desc",
1201
+ validator: globals_verifier.Validator.schema().string().oneOf(["asc", "desc"])
1202
+ }
1203
+ });
1204
+ const deleteVerifier = new globals_verifier.Verifier({
1205
+ _id: {
1206
+ rule: "required",
1207
+ validator: globals_verifier.Validator.schema().string().required("Genre ID is required").pattern(/^[0-9a-fA-F]{24}$/, "Invalid genre ID format")
1208
+ }
1209
+ });
1210
+ return {
1211
+ createVerifier,
1212
+ readVerifier,
1213
+ updateVerifier,
1214
+ deleteVerifier
1215
+ };
1216
+ }
1217
+ const { getInstance } = abac.ABAC;
1218
+ function setupGenresRoutes(app, db) {
1219
+ const abac2 = getInstance(db);
1220
+ const verifier = genresVerifierFactory();
1221
+ const genresCRUD = new crud.CRUD({
1222
+ app,
1223
+ db,
1224
+ model: db.genre,
1225
+ modelName: "genre",
1226
+ basePath: "/api/genres",
1227
+ auth: true,
1228
+ verifiers: {
1229
+ create: verifier.createVerifier,
1230
+ read: verifier.readVerifier,
1231
+ update: verifier.updateVerifier,
1232
+ delete: verifier.deleteVerifier
1233
+ },
1234
+ abac: abac2,
1235
+ cache: {
1236
+ enabled: true,
1237
+ ttl: 300,
1238
+ tags: ["genres", "music"]
1239
+ },
1240
+ events: {
1241
+ enabled: true,
1242
+ logReads: false
1243
+ }
1244
+ });
1245
+ genresCRUD.addAction("get-by-url", {
1246
+ method: "get",
1247
+ path: "/url/:url",
1248
+ auth: false,
1249
+ handler: async (req, res) => {
1250
+ try {
1251
+ const genre = await db.genre.findOne({ url: req.params.url });
1252
+ if (!genre) {
1253
+ return res.status(404).json({ error: "Genre not found" });
1254
+ }
1255
+ res.json(genre);
1256
+ } catch (error) {
1257
+ console.error(error);
1258
+ res.status(500).json({ error: error.message });
1259
+ }
1260
+ }
1261
+ });
1262
+ genresCRUD.addAction("genre-tracks", {
1263
+ method: "get",
1264
+ path: "/:genreId/tracks",
1265
+ auth: false,
1266
+ handler: async (req, res) => {
1267
+ try {
1268
+ const { genreId } = req.params;
1269
+ const limit = parseInt(req.query.limit) || 50;
1270
+ const skip = parseInt(req.query.skip) || 0;
1271
+ const tracks = await db.track.find({
1272
+ genre: genreId,
1273
+ status: "published",
1274
+ isPublic: true
1275
+ }).populate("artist", "name url").populate("album", "title url").sort({ playCount: -1, releaseDate: -1 }).skip(skip).limit(limit);
1276
+ res.json(tracks);
1277
+ } catch (error) {
1278
+ console.error(error);
1279
+ res.status(500).json({ error: error.message });
1280
+ }
1281
+ }
1282
+ });
1283
+ genresCRUD.addAction("popular", {
1284
+ method: "get",
1285
+ path: "/popular",
1286
+ auth: false,
1287
+ handler: async (req, res) => {
1288
+ try {
1289
+ const limit = parseInt(req.query.limit) || 20;
1290
+ const popularGenres = await db.genre.find({ status: "published" }).sort({ popularity: -1 }).limit(limit);
1291
+ res.json(popularGenres);
1292
+ } catch (error) {
1293
+ console.error(error);
1294
+ res.status(500).json({ error: error.message });
1295
+ }
1296
+ }
1297
+ });
1298
+ return genresCRUD;
1299
+ }
1300
+ const SearchController = function(app, db) {
1301
+ const logger = new globals_logger.Logger(db);
1302
+ const cache = new globals_logger.Cache();
1303
+ async function search(req, res) {
1304
+ try {
1305
+ const { query, type, limit = 10 } = req.query;
1306
+ if (!query || query.length < 2) {
1307
+ return res.status(400).json({ error: "Search query must be at least 2 characters" });
1308
+ }
1309
+ const limitNum = parseInt(limit, 10);
1310
+ const cacheKey = `search:${query}:${type || "all"}:${limitNum}`;
1311
+ let results = await cache.get(cacheKey);
1312
+ if (!results) {
1313
+ results = {};
1314
+ const searchRegex = new RegExp(query, "i");
1315
+ const types = type ? [type] : ["tracks", "albums", "artists", "playlists", "genres"];
1316
+ if (types.includes("tracks") || types.includes("all")) {
1317
+ results.tracks = await db.track.find({
1318
+ $or: [{ title: searchRegex }, { tags: searchRegex }],
1319
+ status: "published",
1320
+ isPublic: true
1321
+ }).limit(limitNum);
1322
+ }
1323
+ if (types.includes("albums") || types.includes("all")) {
1324
+ results.albums = await db.album.find({
1325
+ $or: [{ title: searchRegex }, { description: searchRegex }, { tags: searchRegex }],
1326
+ status: "published",
1327
+ isPublic: true
1328
+ }).limit(limitNum);
1329
+ }
1330
+ if (types.includes("artists") || types.includes("all")) {
1331
+ results.artists = await db.artist.find({
1332
+ $or: [{ name: searchRegex }, { bio: searchRegex }, { tags: searchRegex }],
1333
+ status: "published"
1334
+ }).limit(limitNum);
1335
+ }
1336
+ if (types.includes("playlists") || types.includes("all")) {
1337
+ results.playlists = await db.playlist.find({
1338
+ $or: [{ title: searchRegex }, { description: searchRegex }, { tags: searchRegex }],
1339
+ isPublic: true
1340
+ }).limit(limitNum);
1341
+ }
1342
+ if (types.includes("genres") || types.includes("all")) {
1343
+ results.genres = await db.genre.find({
1344
+ $or: [{ name: searchRegex }, { description: searchRegex }],
1345
+ status: "published"
1346
+ }).limit(limitNum);
1347
+ }
1348
+ await cache.set(cacheKey, results, 600);
1349
+ }
1350
+ res.json(results);
1351
+ } catch (error) {
1352
+ logger.error(`Error searching: ${error.message}`);
1353
+ res.status(500).json({ error: error.message });
1354
+ }
1355
+ }
1356
+ return {
1357
+ search
1358
+ };
1359
+ };
1360
+ const StreamController = function(app, db, publicPath) {
1361
+ const { getInstance: getInstance2 } = globals_abac.globalsabac;
1362
+ const logger = new globals_logger.Logger(db);
1363
+ const abac2 = getInstance2(db);
1364
+ async function streamAudio(req, res) {
1365
+ try {
1366
+ const trackId = req.params.trackId;
1367
+ const track = await db.track.findById(trackId);
1368
+ if (!track) {
1369
+ return res.status(404).json({ error: "Track not found" });
1370
+ }
1371
+ const accessResult = await abac2.checkAccess({
1372
+ user: req.userId,
1373
+ resource: "tracks",
1374
+ action: "read",
1375
+ currentResource: track
1376
+ });
1377
+ if (!accessResult.allowed && !track.isPublic) {
1378
+ return res.status(403).json({
1379
+ errorCode: accessResult.reason,
1380
+ message: "Access Denied"
1381
+ });
1382
+ }
1383
+ const fileUrl = track.fileUrl;
1384
+ console.log("public is", publicPath);
1385
+ const filePath = path$1.join(publicPath, fileUrl);
1386
+ if (!fs$1.existsSync(filePath)) {
1387
+ logger.error(`File not found: ${filePath}`);
1388
+ return res.status(404).json({ error: "Audio file not found" });
1389
+ }
1390
+ const stat = fs$1.statSync(filePath);
1391
+ const fileSize = stat.size;
1392
+ const range = req.headers.range;
1393
+ if (req.userId) {
1394
+ try {
1395
+ await db.playHistory.create({
1396
+ user: req.userId,
1397
+ track: trackId,
1398
+ playedAt: /* @__PURE__ */ new Date(),
1399
+ deviceInfo: req.headers["user-agent"],
1400
+ playedFrom: req.query.from || "other",
1401
+ contextId: req.query.contextId || null
1402
+ });
1403
+ await db.track.findByIdAndUpdate(trackId, { $inc: { playCount: 1 } });
1404
+ } catch (error) {
1405
+ logger.error(`Error logging play history: ${error.message}`);
1406
+ }
1407
+ }
1408
+ if (range) {
1409
+ const parts = range.replace(/bytes=/, "").split("-");
1410
+ const start = parseInt(parts[0], 10);
1411
+ const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1;
1412
+ const chunksize = end - start + 1;
1413
+ const file = fs$1.createReadStream(filePath, { start, end });
1414
+ res.writeHead(206, {
1415
+ "Content-Range": `bytes ${start}-${end}/${fileSize}`,
1416
+ "Accept-Ranges": "bytes",
1417
+ "Content-Length": chunksize,
1418
+ "Content-Type": "audio/mpeg"
1419
+ });
1420
+ file.pipe(res);
1421
+ } else {
1422
+ res.writeHead(200, {
1423
+ "Content-Length": fileSize,
1424
+ "Content-Type": "audio/mpeg"
1425
+ });
1426
+ fs$1.createReadStream(filePath).pipe(res);
1427
+ }
1428
+ } catch (error) {
1429
+ logger.error(`Error streaming audio: ${error.message}`);
1430
+ res.status(500).json({ error: error.message });
1431
+ }
1432
+ }
1433
+ return {
1434
+ streamAudio
1435
+ };
1436
+ };
1437
+ const AlbumModel = function(db) {
1438
+ const albumSchema = new db.mongoose.Schema(
1439
+ {
1440
+ title: {
1441
+ type: String,
1442
+ required: true
1443
+ },
1444
+ description: {
1445
+ type: String,
1446
+ default: ""
1447
+ },
1448
+ releaseDate: {
1449
+ type: Date,
1450
+ required: true
1451
+ },
1452
+ coverArt: {
1453
+ type: String,
1454
+ default: null
1455
+ },
1456
+ artists: [
1457
+ {
1458
+ type: db.mongoose.Schema.Types.ObjectId,
1459
+ ref: "Artist",
1460
+ required: true
1461
+ }
1462
+ ],
1463
+ type: {
1464
+ type: String,
1465
+ enum: ["album", "single", "EP", "compilation"],
1466
+ default: "album"
1467
+ },
1468
+ genres: [
1469
+ {
1470
+ type: db.mongoose.Schema.Types.ObjectId,
1471
+ ref: "Genre"
1472
+ }
1473
+ ],
1474
+ totalTracks: {
1475
+ type: Number,
1476
+ default: 0
1477
+ }
1478
+ },
1479
+ {
1480
+ timestamps: true,
1481
+ versionKey: false
1482
+ }
1483
+ );
1484
+ ownership_schema.applyOwnershipSchema(albumSchema, db);
1485
+ metadata_schema.applyMetadataSchema(albumSchema);
1486
+ common_schema.applyCommonSchema(albumSchema);
1487
+ engagement_schema.applyEngagementSchema(albumSchema);
1488
+ albumSchema.index({ title: "text", description: "text" });
1489
+ albumSchema.index({ artists: 1 });
1490
+ albumSchema.index({ releaseDate: -1 });
1491
+ albumSchema.index({ type: 1 });
1492
+ albumSchema.index({ genres: 1 });
1493
+ return db.mongoose.models.Album || db.mongoose.model("Album", albumSchema);
1494
+ };
1495
+ const ArtistModel = function(db) {
1496
+ const mongoose = db.mongoose;
1497
+ const Schema = mongoose.Schema;
1498
+ const ArtistSchema = new Schema(
1499
+ {
1500
+ name: {
1501
+ type: String,
1502
+ required: true,
1503
+ trim: true
1504
+ },
1505
+ bio: {
1506
+ type: String,
1507
+ trim: true
1508
+ },
1509
+ photoUrl: {
1510
+ type: String
1511
+ },
1512
+ coverUrl: {
1513
+ type: String
1514
+ },
1515
+ genre: [
1516
+ {
1517
+ type: Schema.Types.ObjectId,
1518
+ ref: "Genre"
1519
+ }
1520
+ ],
1521
+ isVerified: {
1522
+ type: Boolean,
1523
+ default: false
1524
+ },
1525
+ website: {
1526
+ type: String,
1527
+ trim: true
1528
+ },
1529
+ location: {
1530
+ type: String,
1531
+ trim: true
1532
+ },
1533
+ popularity: {
1534
+ type: Number,
1535
+ default: 0
1536
+ }
1537
+ },
1538
+ {
1539
+ timestamps: true,
1540
+ versionKey: false
1541
+ }
1542
+ );
1543
+ common_schema.applyCommonSchema(ArtistSchema);
1544
+ metadata_schema.applyMetadataSchema(ArtistSchema);
1545
+ ownership_schema.applyOwnershipSchema(ArtistSchema, db);
1546
+ socials_schema.applySocialsSchema(ArtistSchema);
1547
+ engagement_schema.applyEngagementSchema(ArtistSchema);
1548
+ ArtistSchema.index({ name: "text", bio: "text" });
1549
+ ArtistSchema.index({ popularity: -1 });
1550
+ ArtistSchema.index({ isVerified: 1 });
1551
+ return mongoose.models.Artist || mongoose.model("Artist", ArtistSchema);
1552
+ };
1553
+ const GenreModel = function(db) {
1554
+ const mongoose = db.mongoose;
1555
+ const Schema = mongoose.Schema;
1556
+ const GenreSchema = new Schema(
1557
+ {
1558
+ name: {
1559
+ type: String,
1560
+ required: true,
1561
+ trim: true,
1562
+ unique: true
1563
+ },
1564
+ description: {
1565
+ type: String,
1566
+ trim: true
1567
+ },
1568
+ iconUrl: {
1569
+ type: String
1570
+ },
1571
+ popularity: {
1572
+ type: Number,
1573
+ default: 0
1574
+ }
1575
+ },
1576
+ {
1577
+ timestamps: true,
1578
+ versionKey: false
1579
+ }
1580
+ );
1581
+ common_schema.applyCommonSchema(GenreSchema);
1582
+ metadata_schema.applyMetadataSchema(GenreSchema);
1583
+ GenreSchema.index({ name: "text", description: "text" });
1584
+ GenreSchema.index({ popularity: -1 });
1585
+ return mongoose.models.Genre || mongoose.model("Genre", GenreSchema);
1586
+ };
1587
+ const PlayHistoryModel = function(db) {
1588
+ const mongoose = db.mongoose;
1589
+ const Schema = mongoose.Schema;
1590
+ const PlayHistorySchema = new Schema(
1591
+ {
1592
+ user: {
1593
+ type: Schema.Types.ObjectId,
1594
+ ref: "User",
1595
+ required: true
1596
+ },
1597
+ track: {
1598
+ type: Schema.Types.ObjectId,
1599
+ ref: "Track",
1600
+ required: true
1601
+ },
1602
+ playedAt: {
1603
+ type: Date,
1604
+ default: Date.now
1605
+ },
1606
+ playDuration: {
1607
+ type: Number,
1608
+ default: 0
1609
+ },
1610
+ playedFrom: {
1611
+ type: String,
1612
+ enum: ["playlist", "album", "search", "recommendation", "artist", "other"],
1613
+ default: "other"
1614
+ },
1615
+ contextId: {
1616
+ type: Schema.Types.ObjectId,
1617
+ refPath: "playedFrom"
1618
+ },
1619
+ deviceInfo: {
1620
+ type: String
1621
+ },
1622
+ location: {
1623
+ type: String
1624
+ }
1625
+ },
1626
+ {
1627
+ timestamps: true,
1628
+ versionKey: false
1629
+ }
1630
+ );
1631
+ PlayHistorySchema.index({ user: 1, playedAt: -1 });
1632
+ PlayHistorySchema.index({ track: 1 });
1633
+ PlayHistorySchema.index({ playedAt: -1 });
1634
+ return mongoose.models.PlayHistory || mongoose.model("PlayHistory", PlayHistorySchema);
1635
+ };
1636
+ const PlaylistModel = function(db) {
1637
+ const mongoose = db.mongoose;
1638
+ const Schema = mongoose.Schema;
1639
+ const PlaylistSchema = new Schema(
1640
+ {
1641
+ title: {
1642
+ type: String,
1643
+ required: true,
1644
+ trim: true
1645
+ },
1646
+ description: {
1647
+ type: String,
1648
+ trim: true
1649
+ },
1650
+ coverUrl: {
1651
+ type: String
1652
+ },
1653
+ tracks: [
1654
+ {
1655
+ track: {
1656
+ type: Schema.Types.ObjectId,
1657
+ ref: "Track"
1658
+ },
1659
+ addedAt: {
1660
+ type: Date,
1661
+ default: Date.now
1662
+ }
1663
+ }
1664
+ ],
1665
+ isPublic: {
1666
+ type: Boolean,
1667
+ default: true
1668
+ },
1669
+ followers: {
1670
+ type: Number,
1671
+ default: 0
1672
+ },
1673
+ isCollaborative: {
1674
+ type: Boolean,
1675
+ default: false
1676
+ },
1677
+ collaborators: [
1678
+ {
1679
+ type: Schema.Types.ObjectId,
1680
+ ref: "User"
1681
+ }
1682
+ ]
1683
+ },
1684
+ {
1685
+ timestamps: true,
1686
+ versionKey: false
1687
+ }
1688
+ );
1689
+ common_schema.applyCommonSchema(PlaylistSchema);
1690
+ metadata_schema.applyMetadataSchema(PlaylistSchema);
1691
+ ownership_schema.applyOwnershipSchema(PlaylistSchema, db);
1692
+ engagement_schema.applyEngagementSchema(PlaylistSchema);
1693
+ PlaylistSchema.index({ title: "text", description: "text" });
1694
+ PlaylistSchema.index({ isPublic: 1 });
1695
+ PlaylistSchema.index({ followers: -1 });
1696
+ PlaylistSchema.index({ "tracks.addedAt": -1 });
1697
+ return mongoose.models.Playlist || mongoose.model("Playlist", PlaylistSchema);
1698
+ };
1699
+ const TrackModel = function(db) {
1700
+ const mongoose = db.mongoose;
1701
+ const Schema = mongoose.Schema;
1702
+ const TrackSchema = new Schema(
1703
+ {
1704
+ title: {
1705
+ type: String,
1706
+ required: true,
1707
+ trim: true
1708
+ },
1709
+ artist: {
1710
+ type: Schema.Types.ObjectId,
1711
+ ref: "Artist",
1712
+ required: true
1713
+ },
1714
+ album: {
1715
+ type: Schema.Types.ObjectId,
1716
+ ref: "Album"
1717
+ },
1718
+ duration: {
1719
+ type: Number,
1720
+ default: 0
1721
+ },
1722
+ fileUrl: {
1723
+ type: String,
1724
+ required: true
1725
+ },
1726
+ coverUrl: {
1727
+ type: String
1728
+ },
1729
+ genre: [
1730
+ {
1731
+ type: Schema.Types.ObjectId,
1732
+ ref: "Genre"
1733
+ }
1734
+ ],
1735
+ releaseDate: {
1736
+ type: Date,
1737
+ default: Date.now
1738
+ },
1739
+ isExplicit: {
1740
+ type: Boolean,
1741
+ default: false
1742
+ },
1743
+ lyrics: {
1744
+ type: String
1745
+ },
1746
+ playCount: {
1747
+ type: Number,
1748
+ default: 0
1749
+ },
1750
+ isPublic: {
1751
+ type: Boolean,
1752
+ default: true
1753
+ }
1754
+ },
1755
+ {
1756
+ timestamps: true,
1757
+ versionKey: false
1758
+ }
1759
+ );
1760
+ common_schema.applyCommonSchema(TrackSchema);
1761
+ metadata_schema.applyMetadataSchema(TrackSchema);
1762
+ ownership_schema.applyOwnershipSchema(TrackSchema, db);
1763
+ engagement_schema.applyEngagementSchema(TrackSchema);
1764
+ TrackSchema.index({ title: "text" });
1765
+ TrackSchema.index({ artist: 1 });
1766
+ TrackSchema.index({ album: 1 });
1767
+ TrackSchema.index({ releaseDate: -1 });
1768
+ TrackSchema.index({ playCount: -1 });
1769
+ TrackSchema.pre("save", function(next) {
1770
+ if (!this.url) {
1771
+ this.url = metadata_schema.createFriendlyURL(`${this.title}-${this._id}`);
1772
+ }
1773
+ next();
1774
+ });
1775
+ TrackSchema.virtual("artistName").get(function() {
1776
+ return this.artist ? this.artist.name : "";
1777
+ });
1778
+ return mongoose.models.Track || mongoose.model("Track", TrackSchema);
1779
+ };
1780
+ const musicPolicies = function initializeMusicPolicies(abacAccessControl) {
1781
+ abacAccessControl.registerResourcePolicy("tracks", async (context) => {
1782
+ const { user, action, currentResource, resourceModel } = context;
1783
+ const ObjectId = abacAccessControl.db.mongoose.Types.ObjectId;
1784
+ if (action === "read" && currentResource?.status === "published" && currentResource?.isPublic === true) {
1785
+ return true;
1786
+ }
1787
+ if (action === "create") {
1788
+ if (context.data.creator && context.data.creator.target) {
1789
+ return context.data.creator.target.toString() === user.toString();
1790
+ }
1791
+ return false;
1792
+ }
1793
+ if (["update", "edit", "delete"].includes(action) && currentResource) {
1794
+ if (currentResource.owner && currentResource.owner.type === "Organization") {
1795
+ const Organization = abacAccessControl.db.organization;
1796
+ const org = await Organization.findOne({
1797
+ _id: currentResource.owner.target,
1798
+ members: { $elemMatch: { user: new ObjectId(user) } }
1799
+ });
1800
+ if (org) return true;
1801
+ }
1802
+ if (currentResource.creator && currentResource.creator.target && currentResource.creator.target.toString() === user.toString()) {
1803
+ return true;
1804
+ }
1805
+ return false;
1806
+ }
1807
+ return false;
1808
+ });
1809
+ abacAccessControl.registerResourcePolicy("albums", async (context) => {
1810
+ return abacAccessControl.policies.resources.tracks(context);
1811
+ });
1812
+ abacAccessControl.registerResourcePolicy("playlists", async (context) => {
1813
+ const { user, action, currentResource } = context;
1814
+ if (currentResource && currentResource.isCollaborative && currentResource.collaborators && currentResource.collaborators.some((collaborator) => collaborator.toString() === user.toString())) {
1815
+ if (action === "edit" || action === "update") {
1816
+ return true;
1817
+ }
1818
+ }
1819
+ return abacAccessControl.policies.resources.tracks(context);
1820
+ });
1821
+ abacAccessControl.registerResourcePolicy("artists", async (context) => {
1822
+ return abacAccessControl.policies.resources.tracks(context);
1823
+ });
1824
+ return abacAccessControl;
1825
+ };
1826
+ const searchRoutes = function(app, db, origins, publicPath) {
1827
+ const controller = SearchController(app, db);
1828
+ app.get("/api/music/search", controller.search);
1829
+ };
1830
+ const streamRoutes = function(app, db, origins, publicPath) {
1831
+ console.log("rouus publioc is", publicPath);
1832
+ const controller = StreamController(app, db, publicPath);
1833
+ app.get("/api/stream/:trackId", controller.streamAudio);
1834
+ app.get("/api/waveform/:trackId", async (req, res) => {
1835
+ try {
1836
+ const track = await db.track.findById(req.params.trackId);
1837
+ if (!track) {
1838
+ return res.status(404).json({ error: "Track not found" });
1839
+ }
1840
+ const waveformPath = path.join(process.env.FILE_STORAGE_PATH || "./uploads", `waveforms/${track._id}.json`);
1841
+ if (fs.existsSync(waveformPath)) {
1842
+ const waveformData = JSON.parse(fs.readFileSync(waveformPath, "utf8"));
1843
+ return res.json(waveformData);
1844
+ }
1845
+ res.status(404).json({ error: "Waveform data not found" });
1846
+ } catch (error) {
1847
+ console.error(error);
1848
+ res.status(500).json({ error: error.message });
1849
+ }
1850
+ });
1851
+ };
1852
+ const StreamingHandler = function(db) {
1853
+ const logger = new globals_logger.Logger(db);
1854
+ return {
1855
+ // Handle WebSocket messages for music streaming
1856
+ handleStreamingMessage: async (ws, message) => {
1857
+ try {
1858
+ const { action, data } = message;
1859
+ switch (action) {
1860
+ case "startPlaying":
1861
+ if (ws.userId && data.trackId) {
1862
+ await db.playHistory.create({
1863
+ user: ws.userId,
1864
+ track: data.trackId,
1865
+ playedAt: /* @__PURE__ */ new Date(),
1866
+ deviceInfo: data.deviceInfo || "Unknown",
1867
+ playedFrom: data.from || "other",
1868
+ contextId: data.contextId || null
1869
+ });
1870
+ await db.track.findByIdAndUpdate(data.trackId, { $inc: { playCount: 1 } });
1871
+ ws.send(
1872
+ JSON.stringify({
1873
+ type: "playAcknowledged",
1874
+ trackId: data.trackId
1875
+ })
1876
+ );
1877
+ }
1878
+ break;
1879
+ case "syncPosition":
1880
+ if (ws.userId && data.trackId && data.position) {
1881
+ const latestPlay = await db.playHistory.findOne({
1882
+ user: ws.userId,
1883
+ track: data.trackId
1884
+ }).sort({ playedAt: -1 });
1885
+ if (latestPlay) {
1886
+ latestPlay.playDuration = data.position;
1887
+ await latestPlay.save();
1888
+ }
1889
+ }
1890
+ break;
1891
+ case "getRecommendations":
1892
+ if (ws.userId) {
1893
+ const recentTracks = await db.playHistory.find({
1894
+ user: ws.userId
1895
+ }).sort({ playedAt: -1 }).limit(10).populate("track");
1896
+ const recentGenres = /* @__PURE__ */ new Set();
1897
+ const recentArtists = /* @__PURE__ */ new Set();
1898
+ recentTracks.forEach((history) => {
1899
+ if (history.track) {
1900
+ if (history.track.genre) {
1901
+ history.track.genre.forEach((g) => recentGenres.add(g.toString()));
1902
+ }
1903
+ if (history.track.artist) {
1904
+ recentArtists.add(history.track.artist.toString());
1905
+ }
1906
+ }
1907
+ });
1908
+ const recommendations = await db.track.find({
1909
+ $or: [{ genre: { $in: Array.from(recentGenres) } }, { artist: { $in: Array.from(recentArtists) } }],
1910
+ _id: { $nin: recentTracks.map((h) => h.track._id) },
1911
+ // Exclude recently played
1912
+ status: "published",
1913
+ isPublic: true
1914
+ }).limit(10).populate("artist", "name").populate("album", "title coverUrl");
1915
+ ws.send(
1916
+ JSON.stringify({
1917
+ type: "recommendations",
1918
+ tracks: recommendations
1919
+ })
1920
+ );
1921
+ }
1922
+ break;
1923
+ case "joinListeningParty":
1924
+ if (ws.userId && data.partyId) {
1925
+ ws.listeningParty = data.partyId;
1926
+ global.webSocketManager.broadcastToModuleWithFilter("music-streaming", (socket) => socket.listeningParty === data.partyId, {
1927
+ type: "partyMemberJoined",
1928
+ userId: ws.userId,
1929
+ partyId: data.partyId
1930
+ });
1931
+ }
1932
+ break;
1933
+ case "syncPartyPlayback":
1934
+ if (ws.userId && ws.listeningParty && data.trackId && data.position) {
1935
+ global.webSocketManager.broadcastToModuleWithFilter("music-streaming", (socket) => socket.listeningParty === ws.listeningParty && socket !== ws, {
1936
+ type: "partyPlaybackSync",
1937
+ trackId: data.trackId,
1938
+ position: data.position,
1939
+ isPlaying: data.isPlaying,
1940
+ timestamp: Date.now()
1941
+ });
1942
+ }
1943
+ break;
1944
+ default:
1945
+ logger.info(`Unknown streaming action: ${action}`);
1946
+ }
1947
+ } catch (error) {
1948
+ logger.error(`Error in streaming handler: ${error.message}`);
1949
+ ws.send(
1950
+ JSON.stringify({
1951
+ type: "error",
1952
+ message: "An error occurred while processing your request"
1953
+ })
1954
+ );
1955
+ }
1956
+ }
1957
+ };
1958
+ };
1959
+ function initializeMusic({ app, db, wss, origins, publicPath }) {
1960
+ db.track = TrackModel(db);
1961
+ db.playlist = PlaylistModel(db);
1962
+ db.album = AlbumModel(db);
1963
+ db.artist = ArtistModel(db);
1964
+ db.genre = GenreModel(db);
1965
+ db.playHistory = PlayHistoryModel(db);
1966
+ console.log("server publioc is", publicPath);
1967
+ if (app) {
1968
+ setupTracksRoutes(app, db);
1969
+ setupArtistsRoutes(app, db);
1970
+ setupAlbumsRoutes(app, db);
1971
+ setupPlaylistsRoutes(app, db);
1972
+ setupGenresRoutes(app, db);
1973
+ streamRoutes(app, db, origins, publicPath);
1974
+ searchRoutes(app, db);
1975
+ }
1976
+ const { getInstance: getInstance2 } = globals_abac.globalsabac;
1977
+ const abac2 = getInstance2(db);
1978
+ musicPolicies(abac2);
1979
+ const { WebSocketManager } = globals_websocket.WebSocketManager;
1980
+ if (global.webSocketManager && global.webSocketManager instanceof WebSocketManager) {
1981
+ global.webSocketManager.registerModule("music-streaming", StreamingHandler(db).handleStreamingMessage);
1982
+ }
1983
+ new globals_logger.Cache({ ttlSeconds: 60 * 15 });
1984
+ const musicLogger = new globals_logger.Logger(db);
1985
+ musicLogger.info("Music module initialized");
1986
+ }
1987
+ const models = {
1988
+ TrackModel,
1989
+ PlaylistModel,
1990
+ AlbumModel,
1991
+ ArtistModel,
1992
+ GenreModel,
1993
+ PlayHistoryModel
1994
+ };
1995
+ const routes = {
1996
+ // NEW CRUD Routes
1997
+ setupTracksRoutes,
1998
+ setupArtistsRoutes,
1999
+ setupAlbumsRoutes,
2000
+ setupPlaylistsRoutes,
2001
+ setupGenresRoutes,
2002
+ // Legacy routes
2003
+ streamRoutes,
2004
+ searchRoutes
2005
+ };
2006
+ const controllers = {
2007
+ // Keep only non-CRUD controllers
2008
+ StreamController,
2009
+ SearchController
2010
+ };
2011
+ const music_server = {
2012
+ initialize: initializeMusic,
2013
+ models,
2014
+ routes,
2015
+ controllers
2016
+ };
2017
+ exports.controllers = controllers;
2018
+ exports.default = music_server;
2019
+ exports.initialize = initializeMusic;
2020
+ exports.models = models;
2021
+ exports.routes = routes;