@aphexcms/cms-core 0.1.11 → 0.1.12

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 (351) hide show
  1. package/dist/api/assets.d.ts +48 -0
  2. package/dist/api/assets.d.ts.map +1 -0
  3. package/dist/api/assets.js +52 -0
  4. package/dist/api/client.d.ts +37 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +125 -0
  7. package/dist/api/documents.d.ts +56 -0
  8. package/dist/api/documents.d.ts.map +1 -0
  9. package/dist/api/documents.js +77 -0
  10. package/dist/api/index.d.ts +7 -0
  11. package/dist/api/index.d.ts.map +1 -0
  12. package/dist/api/index.js +5 -0
  13. package/dist/api/organizations.d.ts +101 -0
  14. package/dist/api/organizations.d.ts.map +1 -0
  15. package/dist/api/organizations.js +92 -0
  16. package/dist/api/types.d.ts +23 -0
  17. package/dist/api/types.d.ts.map +1 -0
  18. package/dist/api/types.js +1 -0
  19. package/dist/auth/auth-errors.d.ts +7 -0
  20. package/dist/auth/auth-errors.d.ts.map +1 -0
  21. package/dist/auth/auth-errors.js +13 -0
  22. package/dist/auth/auth-hooks.d.ts +6 -0
  23. package/dist/auth/auth-hooks.d.ts.map +1 -0
  24. package/dist/auth/auth-hooks.js +108 -0
  25. package/dist/auth/provider.d.ts +17 -0
  26. package/dist/auth/provider.d.ts.map +1 -0
  27. package/dist/auth/provider.js +1 -0
  28. package/dist/client/index.d.ts +24 -0
  29. package/dist/client/index.d.ts.map +1 -0
  30. package/{src/lib/client/index.ts → dist/client/index.js} +7 -18
  31. package/dist/components/AdminApp.svelte.d.ts +26 -0
  32. package/dist/components/AdminApp.svelte.d.ts.map +1 -0
  33. package/dist/components/admin/AdminLayout.svelte.d.ts +15 -0
  34. package/dist/components/admin/AdminLayout.svelte.d.ts.map +1 -0
  35. package/dist/components/admin/DocumentEditor.svelte.d.ts +18 -0
  36. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -0
  37. package/dist/components/admin/DocumentTypesList.svelte.d.ts +14 -0
  38. package/dist/components/admin/DocumentTypesList.svelte.d.ts.map +1 -0
  39. package/dist/components/admin/ObjectModal.svelte.d.ts +15 -0
  40. package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -0
  41. package/dist/components/admin/SchemaField.svelte.d.ts +19 -0
  42. package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -0
  43. package/dist/components/admin/fields/ArrayField.svelte.d.ts +12 -0
  44. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -0
  45. package/dist/components/admin/fields/BooleanField.svelte.d.ts +13 -0
  46. package/dist/components/admin/fields/BooleanField.svelte.d.ts.map +1 -0
  47. package/dist/components/admin/fields/ImageField.svelte.d.ts +15 -0
  48. package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -0
  49. package/dist/components/admin/fields/NumberField.svelte.d.ts +14 -0
  50. package/dist/components/admin/fields/NumberField.svelte.d.ts.map +1 -0
  51. package/dist/components/admin/fields/ReferenceField.svelte.d.ts +12 -0
  52. package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -0
  53. package/dist/components/admin/fields/SlugField.svelte.d.ts +15 -0
  54. package/dist/components/admin/fields/SlugField.svelte.d.ts.map +1 -0
  55. package/dist/components/admin/fields/StringField.svelte.d.ts +14 -0
  56. package/dist/components/admin/fields/StringField.svelte.d.ts.map +1 -0
  57. package/dist/components/admin/fields/TextareaField.svelte.d.ts +14 -0
  58. package/dist/components/admin/fields/TextareaField.svelte.d.ts.map +1 -0
  59. package/dist/components/fields/index.d.ts +9 -0
  60. package/dist/components/fields/index.d.ts.map +1 -0
  61. package/dist/components/index.d.ts +7 -0
  62. package/dist/components/index.d.ts.map +1 -0
  63. package/{src/lib/components/index.ts → dist/components/index.js} +1 -5
  64. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts +11 -0
  65. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -0
  66. package/dist/components/layout/Sidebar.svelte.d.ts +14 -0
  67. package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -0
  68. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +4 -0
  69. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -0
  70. package/dist/components/layout/sidebar/NavMain.svelte.d.ts +19 -0
  71. package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -0
  72. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts +9 -0
  73. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts.map +1 -0
  74. package/dist/components/layout/sidebar/NavUser.svelte.d.ts +9 -0
  75. package/dist/components/layout/sidebar/NavUser.svelte.d.ts.map +1 -0
  76. package/dist/config.d.ts +3 -0
  77. package/dist/config.d.ts.map +1 -0
  78. package/dist/config.js +15 -0
  79. package/dist/db/adapters/index.d.ts +1 -0
  80. package/dist/db/adapters/index.d.ts.map +1 -0
  81. package/{src/lib/db/adapters/index.ts → dist/db/adapters/index.js} +1 -0
  82. package/dist/db/index.d.ts +2 -0
  83. package/dist/db/index.d.ts.map +1 -0
  84. package/{src/lib/db/index.ts → dist/db/index.js} +1 -2
  85. package/dist/db/interfaces/asset.d.ts +51 -0
  86. package/dist/db/interfaces/asset.d.ts.map +1 -0
  87. package/dist/db/interfaces/asset.js +1 -0
  88. package/dist/db/interfaces/document.d.ts +36 -0
  89. package/dist/db/interfaces/document.d.ts.map +1 -0
  90. package/dist/db/interfaces/document.js +1 -0
  91. package/dist/db/interfaces/index.d.ts +73 -0
  92. package/dist/db/interfaces/index.d.ts.map +1 -0
  93. package/dist/db/interfaces/index.js +1 -0
  94. package/dist/db/interfaces/organization.d.ts +27 -0
  95. package/dist/db/interfaces/organization.d.ts.map +1 -0
  96. package/dist/db/interfaces/organization.js +1 -0
  97. package/dist/db/interfaces/schema.d.ts +21 -0
  98. package/dist/db/interfaces/schema.d.ts.map +1 -0
  99. package/dist/db/interfaces/schema.js +1 -0
  100. package/dist/db/interfaces/user.d.ts +15 -0
  101. package/dist/db/interfaces/user.d.ts.map +1 -0
  102. package/dist/db/interfaces/user.js +1 -0
  103. package/dist/db/utils/reference-resolver.d.ts +18 -0
  104. package/dist/db/utils/reference-resolver.d.ts.map +1 -0
  105. package/dist/db/utils/reference-resolver.js +80 -0
  106. package/dist/define.d.ts +3 -0
  107. package/dist/define.d.ts.map +1 -0
  108. package/dist/define.js +4 -0
  109. package/dist/email/index.d.ts +2 -0
  110. package/dist/email/index.d.ts.map +1 -0
  111. package/{src/lib/email/index.ts → dist/email/index.js} +1 -2
  112. package/dist/email/interfaces/email.d.ts +42 -0
  113. package/dist/email/interfaces/email.d.ts.map +1 -0
  114. package/dist/email/interfaces/email.js +1 -0
  115. package/dist/engine.d.ts +26 -0
  116. package/dist/engine.d.ts.map +1 -0
  117. package/dist/engine.js +66 -0
  118. package/dist/field-validation/rule.d.ts +51 -0
  119. package/dist/field-validation/rule.d.ts.map +1 -0
  120. package/dist/field-validation/rule.js +221 -0
  121. package/dist/field-validation/utils.d.ts +21 -0
  122. package/dist/field-validation/utils.d.ts.map +1 -0
  123. package/dist/field-validation/utils.js +66 -0
  124. package/dist/hooks.d.ts +23 -0
  125. package/dist/hooks.d.ts.map +1 -0
  126. package/dist/hooks.js +96 -0
  127. package/dist/index.d.ts +2 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/{src/lib/index.ts → dist/index.js} +1 -2
  130. package/dist/is-mobile.svelte.d.ts +5 -0
  131. package/dist/is-mobile.svelte.d.ts.map +1 -0
  132. package/{src/lib/is-mobile.svelte.ts → dist/is-mobile.svelte.js} +3 -5
  133. package/dist/routes/assets-by-id.d.ts +5 -0
  134. package/dist/routes/assets-by-id.d.ts.map +1 -0
  135. package/dist/routes/assets-by-id.js +138 -0
  136. package/dist/routes/assets-cdn.d.ts +3 -0
  137. package/dist/routes/assets-cdn.d.ts.map +1 -0
  138. package/dist/routes/assets-cdn.js +155 -0
  139. package/dist/routes/assets.d.ts +4 -0
  140. package/dist/routes/assets.d.ts.map +1 -0
  141. package/dist/routes/assets.js +94 -0
  142. package/dist/routes/documents-by-id.d.ts +5 -0
  143. package/dist/routes/documents-by-id.d.ts.map +1 -0
  144. package/dist/routes/documents-by-id.js +142 -0
  145. package/dist/routes/documents-publish.d.ts +4 -0
  146. package/dist/routes/documents-publish.d.ts.map +1 -0
  147. package/dist/routes/documents-publish.js +151 -0
  148. package/dist/routes/documents.d.ts +4 -0
  149. package/dist/routes/documents.d.ts.map +1 -0
  150. package/dist/routes/documents.js +131 -0
  151. package/dist/routes/index.d.ts +6 -0
  152. package/dist/routes/index.d.ts.map +1 -0
  153. package/dist/routes/index.js +10 -0
  154. package/dist/routes/organizations-by-id.d.ts +5 -0
  155. package/dist/routes/organizations-by-id.d.ts.map +1 -0
  156. package/dist/routes/organizations-by-id.js +187 -0
  157. package/dist/routes/organizations-invitations.d.ts +4 -0
  158. package/dist/routes/organizations-invitations.d.ts.map +1 -0
  159. package/dist/routes/organizations-invitations.js +125 -0
  160. package/dist/routes/organizations-members.d.ts +5 -0
  161. package/dist/routes/organizations-members.d.ts.map +1 -0
  162. package/dist/routes/organizations-members.js +206 -0
  163. package/dist/routes/organizations-switch.d.ts +3 -0
  164. package/dist/routes/organizations-switch.d.ts.map +1 -0
  165. package/dist/routes/organizations-switch.js +53 -0
  166. package/dist/routes/organizations.d.ts +4 -0
  167. package/dist/routes/organizations.d.ts.map +1 -0
  168. package/dist/routes/organizations.js +109 -0
  169. package/dist/routes/schemas-by-type.d.ts +3 -0
  170. package/dist/routes/schemas-by-type.d.ts.map +1 -0
  171. package/dist/routes/schemas-by-type.js +25 -0
  172. package/dist/routes/schemas.d.ts +3 -0
  173. package/dist/routes/schemas.d.ts.map +1 -0
  174. package/dist/routes/schemas.js +11 -0
  175. package/dist/routes-exports.d.ts +14 -0
  176. package/dist/routes-exports.d.ts.map +1 -0
  177. package/dist/routes-exports.js +19 -0
  178. package/dist/schema-context.svelte.d.ts +10 -0
  179. package/dist/schema-context.svelte.d.ts.map +1 -0
  180. package/dist/schema-context.svelte.js +18 -0
  181. package/dist/schema-utils/cleanup.d.ts +21 -0
  182. package/dist/schema-utils/cleanup.d.ts.map +1 -0
  183. package/dist/schema-utils/cleanup.js +80 -0
  184. package/dist/schema-utils/index.d.ts +4 -0
  185. package/dist/schema-utils/index.d.ts.map +1 -0
  186. package/dist/schema-utils/index.js +4 -0
  187. package/dist/schema-utils/utils.d.ts +30 -0
  188. package/dist/schema-utils/utils.d.ts.map +1 -0
  189. package/dist/schema-utils/utils.js +37 -0
  190. package/dist/schema-utils/validator.d.ts +6 -0
  191. package/dist/schema-utils/validator.d.ts.map +1 -0
  192. package/dist/schema-utils/validator.js +45 -0
  193. package/dist/server/index.d.ts +16 -0
  194. package/dist/server/index.d.ts.map +1 -0
  195. package/dist/server/index.js +28 -0
  196. package/dist/services/asset-service.d.ts +86 -0
  197. package/dist/services/asset-service.d.ts.map +1 -0
  198. package/dist/services/asset-service.js +187 -0
  199. package/dist/services/index.d.ts +3 -0
  200. package/dist/services/index.d.ts.map +1 -0
  201. package/dist/services/index.js +4 -0
  202. package/dist/storage/adapters/index.d.ts +2 -0
  203. package/dist/storage/adapters/index.d.ts.map +1 -0
  204. package/dist/storage/adapters/index.js +2 -0
  205. package/dist/storage/adapters/local-storage-adapter.d.ts +54 -0
  206. package/dist/storage/adapters/local-storage-adapter.d.ts.map +1 -0
  207. package/dist/storage/adapters/local-storage-adapter.js +187 -0
  208. package/dist/storage/index.d.ts +3 -0
  209. package/dist/storage/index.d.ts.map +1 -0
  210. package/{src/lib/storage/index.ts → dist/storage/index.js} +2 -4
  211. package/dist/storage/interfaces/index.d.ts +2 -0
  212. package/dist/storage/interfaces/index.d.ts.map +1 -0
  213. package/dist/storage/interfaces/index.js +2 -0
  214. package/dist/storage/interfaces/storage.d.ts +91 -0
  215. package/dist/storage/interfaces/storage.d.ts.map +1 -0
  216. package/dist/storage/interfaces/storage.js +1 -0
  217. package/dist/storage/providers/storage.d.ts +43 -0
  218. package/dist/storage/providers/storage.d.ts.map +1 -0
  219. package/dist/storage/providers/storage.js +64 -0
  220. package/dist/types/asset.d.ts +73 -0
  221. package/dist/types/asset.d.ts.map +1 -0
  222. package/dist/types/asset.js +2 -0
  223. package/dist/types/auth.d.ts +50 -0
  224. package/dist/types/auth.d.ts.map +1 -0
  225. package/dist/types/auth.js +41 -0
  226. package/dist/types/config.d.ts +47 -0
  227. package/dist/types/config.d.ts.map +1 -0
  228. package/dist/types/config.js +1 -0
  229. package/dist/types/document.d.ts +34 -0
  230. package/dist/types/document.d.ts.map +1 -0
  231. package/dist/types/document.js +1 -0
  232. package/dist/types/index.d.ts +9 -0
  233. package/dist/types/index.d.ts.map +1 -0
  234. package/dist/types/index.js +8 -0
  235. package/dist/types/organization.d.ts +105 -0
  236. package/dist/types/organization.d.ts.map +1 -0
  237. package/dist/types/organization.js +3 -0
  238. package/dist/types/schemas.d.ts +119 -0
  239. package/dist/types/schemas.d.ts.map +1 -0
  240. package/dist/types/schemas.js +1 -0
  241. package/dist/types/sidebar.d.ts +33 -0
  242. package/dist/types/sidebar.d.ts.map +1 -0
  243. package/dist/types/sidebar.js +1 -0
  244. package/dist/types/user.d.ts +14 -0
  245. package/dist/types/user.d.ts.map +1 -0
  246. package/dist/types/user.js +1 -0
  247. package/dist/utils/content-hash.d.ts +22 -0
  248. package/dist/utils/content-hash.d.ts.map +1 -0
  249. package/dist/utils/content-hash.js +67 -0
  250. package/dist/utils/image-url.d.ts +88 -0
  251. package/dist/utils/image-url.d.ts.map +1 -0
  252. package/dist/utils/image-url.js +165 -0
  253. package/dist/utils/index.d.ts +6 -0
  254. package/dist/utils/index.d.ts.map +1 -0
  255. package/dist/utils/index.js +9 -0
  256. package/dist/utils/slug.d.ts +13 -0
  257. package/dist/utils/slug.d.ts.map +1 -0
  258. package/dist/utils/slug.js +30 -0
  259. package/dist/utils.d.ts +13 -0
  260. package/dist/utils.d.ts.map +1 -0
  261. package/dist/utils.js +5 -0
  262. package/package.json +2 -2
  263. package/src/lib/api/assets.ts +0 -75
  264. package/src/lib/api/client.ts +0 -150
  265. package/src/lib/api/documents.ts +0 -102
  266. package/src/lib/api/index.ts +0 -7
  267. package/src/lib/api/organizations.ts +0 -154
  268. package/src/lib/api/types.ts +0 -34
  269. package/src/lib/auth/auth-errors.ts +0 -23
  270. package/src/lib/auth/auth-hooks.ts +0 -132
  271. package/src/lib/auth/provider.ts +0 -25
  272. package/src/lib/config.ts +0 -18
  273. package/src/lib/db/interfaces/asset.ts +0 -61
  274. package/src/lib/db/interfaces/document.ts +0 -53
  275. package/src/lib/db/interfaces/index.ts +0 -98
  276. package/src/lib/db/interfaces/organization.ts +0 -51
  277. package/src/lib/db/interfaces/schema.ts +0 -13
  278. package/src/lib/db/interfaces/user.ts +0 -16
  279. package/src/lib/db/utils/reference-resolver.ts +0 -119
  280. package/src/lib/define.ts +0 -7
  281. package/src/lib/email/interfaces/email.ts +0 -45
  282. package/src/lib/engine.ts +0 -85
  283. package/src/lib/field-validation/rule.ts +0 -287
  284. package/src/lib/field-validation/utils.ts +0 -91
  285. package/src/lib/hooks.ts +0 -142
  286. package/src/lib/routes/assets-by-id.ts +0 -161
  287. package/src/lib/routes/assets-cdn.ts +0 -185
  288. package/src/lib/routes/assets.ts +0 -116
  289. package/src/lib/routes/documents-by-id.ts +0 -188
  290. package/src/lib/routes/documents-publish.ts +0 -211
  291. package/src/lib/routes/documents.ts +0 -172
  292. package/src/lib/routes/index.ts +0 -13
  293. package/src/lib/routes/organizations-by-id.ts +0 -258
  294. package/src/lib/routes/organizations-invitations.ts +0 -183
  295. package/src/lib/routes/organizations-members.ts +0 -301
  296. package/src/lib/routes/organizations-switch.ts +0 -74
  297. package/src/lib/routes/organizations.ts +0 -147
  298. package/src/lib/routes/schemas-by-type.ts +0 -35
  299. package/src/lib/routes/schemas.ts +0 -19
  300. package/src/lib/routes-exports.ts +0 -42
  301. package/src/lib/schema-context.svelte.ts +0 -24
  302. package/src/lib/schema-utils/cleanup.ts +0 -116
  303. package/src/lib/schema-utils/index.ts +0 -4
  304. package/src/lib/schema-utils/utils.ts +0 -47
  305. package/src/lib/schema-utils/validator.ts +0 -58
  306. package/src/lib/server/index.ts +0 -40
  307. package/src/lib/services/asset-service.ts +0 -256
  308. package/src/lib/services/index.ts +0 -6
  309. package/src/lib/storage/adapters/index.ts +0 -2
  310. package/src/lib/storage/adapters/local-storage-adapter.ts +0 -215
  311. package/src/lib/storage/interfaces/index.ts +0 -2
  312. package/src/lib/storage/interfaces/storage.ts +0 -114
  313. package/src/lib/storage/providers/storage.ts +0 -83
  314. package/src/lib/types/asset.ts +0 -81
  315. package/src/lib/types/auth.ts +0 -80
  316. package/src/lib/types/config.ts +0 -45
  317. package/src/lib/types/document.ts +0 -38
  318. package/src/lib/types/index.ts +0 -8
  319. package/src/lib/types/organization.ts +0 -119
  320. package/src/lib/types/schemas.ts +0 -156
  321. package/src/lib/types/sidebar.ts +0 -37
  322. package/src/lib/types/user.ts +0 -17
  323. package/src/lib/utils/content-hash.ts +0 -75
  324. package/src/lib/utils/image-url.ts +0 -204
  325. package/src/lib/utils/index.ts +0 -12
  326. package/src/lib/utils/slug.ts +0 -33
  327. package/src/lib/utils.ts +0 -13
  328. /package/{src/lib → dist}/app.d.ts +0 -0
  329. /package/{src/lib → dist}/auth/MULTI_TENANCY_PLAN.md +0 -0
  330. /package/{src/lib → dist}/components/AdminApp.svelte +0 -0
  331. /package/{src/lib → dist}/components/admin/AdminLayout.svelte +0 -0
  332. /package/{src/lib → dist}/components/admin/DocumentEditor.svelte +0 -0
  333. /package/{src/lib → dist}/components/admin/DocumentTypesList.svelte +0 -0
  334. /package/{src/lib → dist}/components/admin/ObjectModal.svelte +0 -0
  335. /package/{src/lib → dist}/components/admin/SchemaField.svelte +0 -0
  336. /package/{src/lib → dist}/components/admin/fields/ArrayField.svelte +0 -0
  337. /package/{src/lib → dist}/components/admin/fields/BooleanField.svelte +0 -0
  338. /package/{src/lib → dist}/components/admin/fields/ImageField.svelte +0 -0
  339. /package/{src/lib → dist}/components/admin/fields/NumberField.svelte +0 -0
  340. /package/{src/lib → dist}/components/admin/fields/ReferenceField.svelte +0 -0
  341. /package/{src/lib → dist}/components/admin/fields/SlugField.svelte +0 -0
  342. /package/{src/lib → dist}/components/admin/fields/StringField.svelte +0 -0
  343. /package/{src/lib → dist}/components/admin/fields/TextareaField.svelte +0 -0
  344. /package/{src/lib/components/fields/index.ts → dist/components/fields/index.js} +0 -0
  345. /package/{src/lib → dist}/components/layout/OrganizationSwitcher.svelte +0 -0
  346. /package/{src/lib → dist}/components/layout/Sidebar.svelte +0 -0
  347. /package/{src/lib → dist}/components/layout/sidebar/AppSidebar.svelte +0 -0
  348. /package/{src/lib → dist}/components/layout/sidebar/NavMain.svelte +0 -0
  349. /package/{src/lib → dist}/components/layout/sidebar/NavSecondary.svelte +0 -0
  350. /package/{src/lib → dist}/components/layout/sidebar/NavUser.svelte +0 -0
  351. /package/{src/lib → dist}/plugins/README.md +0 -0
@@ -0,0 +1,138 @@
1
+ import { json } from '@sveltejs/kit';
2
+ export const GET = async ({ params, locals }) => {
3
+ try {
4
+ const { assetService } = locals.aphexCMS;
5
+ const auth = locals.auth;
6
+ const { id } = params;
7
+ if (!auth) {
8
+ return json({ success: false, error: 'Unauthorized' }, { status: 401 });
9
+ }
10
+ if (!id) {
11
+ return json({ success: false, error: 'Asset ID is required' }, { status: 400 });
12
+ }
13
+ const asset = await assetService.findAssetById(auth.organizationId, id);
14
+ if (!asset) {
15
+ return json({ success: false, error: 'Asset not found' }, { status: 404 });
16
+ }
17
+ // Return JSON metadata for admin UI
18
+ return json({
19
+ success: true,
20
+ data: {
21
+ _type: asset.assetType === 'image' ? 'sanity.imageAsset' : 'sanity.fileAsset',
22
+ _id: asset.id,
23
+ url: asset.url,
24
+ originalFilename: asset.originalFilename,
25
+ mimeType: asset.mimeType,
26
+ size: asset.size,
27
+ metadata: {
28
+ dimensions: asset.width && asset.height
29
+ ? {
30
+ width: asset.width,
31
+ height: asset.height
32
+ }
33
+ : undefined,
34
+ ...asset.metadata
35
+ },
36
+ title: asset.title,
37
+ description: asset.description,
38
+ alt: asset.alt,
39
+ creditLine: asset.creditLine,
40
+ _createdAt: asset.createdAt,
41
+ _updatedAt: asset.updatedAt
42
+ }
43
+ });
44
+ }
45
+ catch (error) {
46
+ console.error('[Asset API] Error fetching asset:', error);
47
+ return json({ success: false, error: 'Failed to fetch asset' }, { status: 500 });
48
+ }
49
+ };
50
+ export const DELETE = async ({ params, locals }) => {
51
+ try {
52
+ const { id } = params;
53
+ const { assetService } = locals.aphexCMS;
54
+ const auth = locals.auth;
55
+ if (!auth) {
56
+ return json({ success: false, error: 'Unauthorized' }, { status: 401 });
57
+ }
58
+ if (!id) {
59
+ return json({ success: false, error: 'Asset ID is required' }, { status: 400 });
60
+ }
61
+ const result = await assetService.deleteAsset(auth.organizationId, id);
62
+ if (!result) {
63
+ return json({ success: false, error: 'Asset not found or could not be deleted' }, { status: 404 });
64
+ }
65
+ return json({ success: true });
66
+ }
67
+ catch (error) {
68
+ console.error('Error deleting asset:', error);
69
+ return json({ success: false, error: 'Failed to delete asset' }, { status: 500 });
70
+ }
71
+ };
72
+ export const PATCH = async ({ params, locals, request }) => {
73
+ try {
74
+ const { assetService } = locals.aphexCMS;
75
+ const auth = locals.auth;
76
+ const { id } = params;
77
+ if (!auth) {
78
+ return json({ success: false, error: 'Unauthorized' }, { status: 401 });
79
+ }
80
+ if (!id) {
81
+ return json({ success: false, error: 'Asset ID is required' }, { status: 400 });
82
+ }
83
+ const { title, description, alt, creditLine } = await request.json();
84
+ let updatedAsset;
85
+ if (auth.type == 'session') {
86
+ updatedAsset = await assetService.updateAssetMetadata(auth.organizationId, id, {
87
+ title,
88
+ description,
89
+ alt,
90
+ creditLine,
91
+ updatedBy: auth.user.id
92
+ });
93
+ }
94
+ else {
95
+ updatedAsset = await assetService.updateAssetMetadata(auth.organizationId, id, {
96
+ title,
97
+ description,
98
+ alt,
99
+ creditLine,
100
+ updatedBy: auth.keyId
101
+ });
102
+ }
103
+ if (!updatedAsset) {
104
+ return json({ success: false, error: 'Asset not found' }, { status: 404 });
105
+ }
106
+ // Return API response with success wrapper
107
+ return json({
108
+ success: true,
109
+ data: {
110
+ _type: updatedAsset.assetType === 'image' ? 'sanity.imageAsset' : 'sanity.fileAsset',
111
+ _id: updatedAsset.id,
112
+ url: updatedAsset.url,
113
+ originalFilename: updatedAsset.originalFilename,
114
+ mimeType: updatedAsset.mimeType,
115
+ size: updatedAsset.size,
116
+ metadata: {
117
+ dimensions: updatedAsset.width && updatedAsset.height
118
+ ? {
119
+ width: updatedAsset.width,
120
+ height: updatedAsset.height
121
+ }
122
+ : undefined,
123
+ ...updatedAsset.metadata
124
+ },
125
+ title: updatedAsset.title,
126
+ description: updatedAsset.description,
127
+ alt: updatedAsset.alt,
128
+ creditLine: updatedAsset.creditLine,
129
+ _createdAt: updatedAsset.createdAt,
130
+ _updatedAt: updatedAsset.updatedAt
131
+ }
132
+ });
133
+ }
134
+ catch (error) {
135
+ console.error('Error updating asset:', error);
136
+ return json({ success: false, error: 'Failed to update asset' }, { status: 500 });
137
+ }
138
+ };
@@ -0,0 +1,3 @@
1
+ import type { RequestHandler } from '@sveltejs/kit';
2
+ export declare const GET: RequestHandler;
3
+ //# sourceMappingURL=assets-cdn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets-cdn.d.ts","sourceRoot":"","sources":["../../src/lib/routes/assets-cdn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,eAAO,MAAM,GAAG,EAAE,cAsLjB,CAAC"}
@@ -0,0 +1,155 @@
1
+ export const GET = async ({ params, locals, setHeaders, request }) => {
2
+ console.log('[Asset CDN] ========== ROUTE HIT ==========');
3
+ console.log('[Asset CDN] Params:', params);
4
+ try {
5
+ const { assetService, databaseAdapter, storageAdapter, cmsEngine, config } = locals.aphexCMS;
6
+ let auth = locals.auth;
7
+ const { id, filename } = params;
8
+ console.log('[Asset CDN] Request for asset:', id, filename);
9
+ console.log('[Asset CDN] Has auth?', !!auth);
10
+ // If no session auth, check for API key in headers
11
+ if (!auth) {
12
+ const apiKey = request.headers.get('x-api-key');
13
+ console.log('[Asset CDN] API key present?', !!apiKey);
14
+ if (apiKey && config.auth?.provider) {
15
+ try {
16
+ const apiKeyAuth = await config.auth.provider.validateApiKey(request, databaseAdapter);
17
+ if (apiKeyAuth) {
18
+ auth = apiKeyAuth;
19
+ console.log('[Asset CDN] Authenticated via API key, org:', apiKeyAuth.organizationId);
20
+ }
21
+ }
22
+ catch (err) {
23
+ console.warn('[Asset CDN] API key validation failed:', err);
24
+ }
25
+ }
26
+ }
27
+ console.log('[Asset CDN] Auth type:', auth?.type);
28
+ if (!id) {
29
+ return new Response('Asset ID is required', { status: 400 });
30
+ }
31
+ // Try to fetch asset globally first (bypasses RLS for public assets)
32
+ const asset = await assetService.findAssetByIdGlobal(id);
33
+ console.log('[Asset CDN] Asset found globally?', !!asset);
34
+ if (!asset) {
35
+ console.warn('[Asset CDN] Asset not found:', id);
36
+ return new Response('Asset not found', { status: 404 });
37
+ }
38
+ const organizationId = auth?.organizationId;
39
+ console.log('[Asset CDN] Auth object:', JSON.stringify(auth, null, 2));
40
+ console.log('[Asset CDN] Auth organizationId:', organizationId);
41
+ console.log('[Asset CDN] Asset organizationId:', asset.organizationId);
42
+ // Check if this asset is used in a private field
43
+ // The field metadata (schemaType and fieldPath) is stored when the asset is uploaded
44
+ let isPrivate = false;
45
+ const schemaType = asset.metadata?.schemaType;
46
+ const fieldPath = asset.metadata?.fieldPath;
47
+ if (schemaType && fieldPath) {
48
+ // Get the schema definition from IN-MEMORY config (always up-to-date with code changes)
49
+ const schema = cmsEngine.getSchemaTypeByName(schemaType);
50
+ console.log(`[Asset CDN] Schema lookup for ${schemaType}:`, {
51
+ found: !!schema,
52
+ fieldCount: schema?.fields?.length
53
+ });
54
+ if (schema && schema.fields) {
55
+ // Navigate the field path to find the field definition
56
+ const findField = (fields, path) => {
57
+ const parts = path.split('.');
58
+ let current = null;
59
+ for (let i = 0; i < parts.length; i++) {
60
+ const part = parts[i];
61
+ current = fields.find((f) => f.name === part);
62
+ if (!current)
63
+ return null;
64
+ // If not the last part, navigate into nested fields
65
+ if (i < parts.length - 1) {
66
+ if (current.type === 'object' && current.fields) {
67
+ fields = current.fields;
68
+ }
69
+ else {
70
+ return null;
71
+ }
72
+ }
73
+ }
74
+ return current;
75
+ };
76
+ const field = findField(schema.fields, fieldPath);
77
+ console.log(`[Asset CDN] Field lookup for ${fieldPath}:`, {
78
+ found: !!field,
79
+ type: field?.type,
80
+ private: field?.private
81
+ });
82
+ if (field && field.type === 'image') {
83
+ isPrivate = field.private === true;
84
+ console.log(`[Asset CDN] Field check: ${schemaType}.${fieldPath} - private: ${isPrivate}`);
85
+ }
86
+ else {
87
+ console.warn(`[Asset CDN] Could not find field: ${schemaType}.${fieldPath}`);
88
+ }
89
+ }
90
+ }
91
+ else {
92
+ console.log('[Asset CDN] No field metadata - treating as public');
93
+ }
94
+ console.log('[Asset CDN] Asset privacy result:', { isPrivate, schemaType, fieldPath });
95
+ // If asset is private, require auth
96
+ if (isPrivate && !organizationId) {
97
+ console.warn('[Asset CDN] Private asset accessed without auth - DENIED');
98
+ return new Response('Unauthorized - This asset is private', { status: 401 });
99
+ }
100
+ // If asset is private, verify org matches
101
+ if (isPrivate && organizationId && organizationId !== asset.organizationId) {
102
+ console.warn('[Asset CDN] Org mismatch for private asset - FORBIDDEN');
103
+ return new Response('Forbidden', { status: 403 });
104
+ }
105
+ // Log the decision
106
+ if (isPrivate && organizationId) {
107
+ console.log('[Asset CDN] Private asset access ALLOWED - user has auth and org matches');
108
+ }
109
+ else if (!isPrivate) {
110
+ console.log('[Asset CDN] Public asset access ALLOWED');
111
+ }
112
+ console.log('[Asset CDN] Asset found:', {
113
+ id: asset.id,
114
+ path: asset.path,
115
+ mimeType: asset.mimeType,
116
+ storageAdapter: asset.storageAdapter
117
+ });
118
+ // If asset has a direct URL (S3/R2), redirect to it
119
+ if (asset.url && asset.url.startsWith('http')) {
120
+ console.log('[Asset CDN] Redirecting to external URL:', asset.url);
121
+ return new Response(null, {
122
+ status: 302,
123
+ headers: { Location: asset.url }
124
+ });
125
+ }
126
+ // Otherwise, serve from local storage
127
+ if (!storageAdapter?.getObject) {
128
+ console.error('[Asset CDN] Storage adapter does not support getObject');
129
+ return new Response('Storage adapter does not support file serving', { status: 500 });
130
+ }
131
+ console.log('[Asset CDN] Reading file from storage:', asset.path);
132
+ const fileBuffer = await storageAdapter.getObject(asset.path);
133
+ console.log('[Asset CDN] Serving file:', {
134
+ size: fileBuffer.length,
135
+ mimeType: asset.mimeType
136
+ });
137
+ // Set appropriate headers for the asset
138
+ setHeaders({
139
+ 'Content-Type': asset.mimeType || 'application/octet-stream',
140
+ 'Content-Length': fileBuffer.length.toString(),
141
+ 'Cache-Control': 'public, max-age=31536000, immutable', // Cache for 1 year
142
+ 'Content-Disposition': `inline; filename="${encodeURIComponent(asset.originalFilename || asset.filename)}"`,
143
+ ...(asset.mimeType?.startsWith('image/') && {
144
+ 'Accept-Ranges': 'bytes'
145
+ })
146
+ });
147
+ // Convert Buffer to ArrayBuffer for Response
148
+ const arrayBuffer = fileBuffer.buffer.slice(fileBuffer.byteOffset, fileBuffer.byteOffset + fileBuffer.byteLength);
149
+ return new Response(arrayBuffer);
150
+ }
151
+ catch (error) {
152
+ console.error('[Asset CDN] Error serving asset:', error);
153
+ return new Response('Failed to serve asset', { status: 500 });
154
+ }
155
+ };
@@ -0,0 +1,4 @@
1
+ import type { RequestHandler } from '@sveltejs/kit';
2
+ export declare const POST: RequestHandler;
3
+ export declare const GET: RequestHandler;
4
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/lib/routes/assets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,eAAO,MAAM,IAAI,EAAE,cAiElB,CAAC;AAEF,eAAO,MAAM,GAAG,EAAE,cA4CjB,CAAC"}
@@ -0,0 +1,94 @@
1
+ // Aphex CMS Asset API Handlers
2
+ import { json } from '@sveltejs/kit';
3
+ export const POST = async ({ request, locals }) => {
4
+ try {
5
+ const { assetService } = locals.aphexCMS;
6
+ const auth = locals.auth;
7
+ if (!auth) {
8
+ return json({ success: false, error: 'Unauthorized' }, { status: 401 });
9
+ }
10
+ const formData = await request.formData();
11
+ const file = formData.get('file');
12
+ if (!file) {
13
+ return json({ success: false, error: 'No file provided' }, { status: 400 });
14
+ }
15
+ // Convert file to buffer
16
+ const arrayBuffer = await file.arrayBuffer();
17
+ const buffer = Buffer.from(arrayBuffer);
18
+ // Get optional metadata from form data
19
+ const title = formData.get('title') || undefined;
20
+ const description = formData.get('description') || undefined;
21
+ const alt = formData.get('alt') || undefined;
22
+ const creditLine = formData.get('creditLine') || undefined;
23
+ // Get field metadata for privacy checking
24
+ const schemaType = formData.get('schemaType') || undefined;
25
+ const fieldPath = formData.get('fieldPath') || undefined;
26
+ // Create asset upload data
27
+ const uploadData = {
28
+ buffer,
29
+ originalFilename: file.name,
30
+ mimeType: file.type,
31
+ size: file.size,
32
+ title,
33
+ description,
34
+ alt,
35
+ creditLine,
36
+ createdBy: auth.type === 'session' ? auth.user.id : undefined,
37
+ metadata: {
38
+ schemaType,
39
+ fieldPath
40
+ }
41
+ };
42
+ // Upload asset using the service
43
+ const asset = await assetService.uploadAsset(auth.organizationId, uploadData);
44
+ return json({
45
+ success: true,
46
+ data: asset
47
+ });
48
+ }
49
+ catch (error) {
50
+ console.error('Asset upload failed:', error);
51
+ return json({
52
+ success: false,
53
+ error: 'Asset upload failed',
54
+ message: error instanceof Error ? error.message : 'Unknown error'
55
+ }, { status: 500 });
56
+ }
57
+ };
58
+ export const GET = async ({ url, locals }) => {
59
+ try {
60
+ const { assetService } = locals.aphexCMS;
61
+ const auth = locals.auth;
62
+ if (!auth) {
63
+ return json({ success: false, error: 'Unauthorized' }, { status: 401 });
64
+ }
65
+ // Parse query parameters
66
+ const assetType = url.searchParams.get('assetType');
67
+ const mimeType = url.searchParams.get('mimeType') || undefined;
68
+ const search = url.searchParams.get('search') || undefined;
69
+ const limitParam = url.searchParams.get('limit');
70
+ const offsetParam = url.searchParams.get('offset');
71
+ const limit = limitParam ? parseInt(limitParam) : 20;
72
+ const offset = offsetParam ? parseInt(offsetParam) : 0;
73
+ const filters = {
74
+ assetType,
75
+ mimeType,
76
+ search,
77
+ limit: isNaN(limit) ? 20 : limit,
78
+ offset: isNaN(offset) ? 0 : offset
79
+ };
80
+ const assets = await assetService.findAssets(auth.organizationId, filters);
81
+ return json({
82
+ success: true,
83
+ data: assets
84
+ });
85
+ }
86
+ catch (error) {
87
+ console.error('Failed to fetch assets:', error);
88
+ return json({
89
+ success: false,
90
+ error: 'Failed to fetch assets',
91
+ message: error instanceof Error ? error.message : 'Unknown error'
92
+ }, { status: 500 });
93
+ }
94
+ };
@@ -0,0 +1,5 @@
1
+ import type { RequestHandler } from '@sveltejs/kit';
2
+ export declare const GET: RequestHandler;
3
+ export declare const PUT: RequestHandler;
4
+ export declare const DELETE: RequestHandler;
5
+ //# sourceMappingURL=documents-by-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents-by-id.d.ts","sourceRoot":"","sources":["../../src/lib/routes/documents-by-id.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD,eAAO,MAAM,GAAG,EAAE,cA2DjB,CAAC;AAGF,eAAO,MAAM,GAAG,EAAE,cAoEjB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,cA+CpB,CAAC"}
@@ -0,0 +1,142 @@
1
+ // Aphex CMS Document by ID API Handlers
2
+ import { json } from '@sveltejs/kit';
3
+ import { canWrite } from '../types/auth.js';
4
+ // GET /api/documents/[id] - Get document by ID
5
+ export const GET = async ({ params, url, locals }) => {
6
+ try {
7
+ const { databaseAdapter, auth: authProvider } = locals.aphexCMS;
8
+ const auth = locals.auth;
9
+ const { id } = params;
10
+ if (!auth) {
11
+ return json({ success: false, error: 'Unauthorized' }, { status: 401 });
12
+ }
13
+ if (!id) {
14
+ return json({ success: false, error: 'Document ID is required' }, { status: 400 });
15
+ }
16
+ // Parse depth parameter
17
+ const depthParam = url.searchParams.get('depth');
18
+ const depth = depthParam ? parseInt(depthParam) : 0;
19
+ const clampedDepth = isNaN(depth) ? 0 : Math.max(0, Math.min(depth, 5)); // Clamp between 0-5
20
+ const document = await databaseAdapter.findByDocId(auth.organizationId, id, clampedDepth);
21
+ if (!document) {
22
+ return json({ success: false, error: 'Document not found' }, { status: 404 });
23
+ }
24
+ // Populate createdBy user info if available
25
+ if (document.createdBy && authProvider) {
26
+ try {
27
+ if (typeof document.createdBy === 'string') {
28
+ const user = await authProvider.getUserById(document.createdBy);
29
+ if (user) {
30
+ document.createdBy = {
31
+ id: user.id,
32
+ name: user.name,
33
+ email: user.email
34
+ };
35
+ }
36
+ }
37
+ }
38
+ catch (err) {
39
+ // If user fetch fails, keep the user ID
40
+ console.warn('[documents-by-id] Failed to populate createdBy user:', err);
41
+ }
42
+ }
43
+ return json({
44
+ success: true,
45
+ data: document
46
+ });
47
+ }
48
+ catch (error) {
49
+ console.error('Failed to fetch document:', error);
50
+ return json({
51
+ success: false,
52
+ error: 'Failed to fetch document',
53
+ message: error instanceof Error ? error.message : 'Unknown error'
54
+ }, { status: 500 });
55
+ }
56
+ };
57
+ // PUT /api/documents/[id] - Update document
58
+ export const PUT = async ({ params, request, locals }) => {
59
+ try {
60
+ const { databaseAdapter } = locals.aphexCMS;
61
+ const auth = locals.auth;
62
+ const { id } = params;
63
+ const body = await request.json();
64
+ if (!auth) {
65
+ return json({ success: false, error: 'Unauthorized' }, { status: 401 });
66
+ }
67
+ // Check write permissions (viewers are read-only)
68
+ if (!canWrite(auth)) {
69
+ return json({
70
+ success: false,
71
+ error: 'Forbidden',
72
+ message: 'You do not have permission to update documents. Viewers have read-only access.'
73
+ }, { status: 403 });
74
+ }
75
+ const documentData = body.draftData;
76
+ if (!id) {
77
+ return json({ success: false, error: 'Document ID is required' }, { status: 400 });
78
+ }
79
+ let updatedDocument;
80
+ // NO VALIDATION FOR DRAFTS - Sanity-style: drafts can have any state
81
+ // Validation only happens on publish
82
+ if (auth.type == 'session') {
83
+ updatedDocument = await databaseAdapter.updateDocDraft(auth.organizationId, id, documentData, auth.user.id);
84
+ }
85
+ else {
86
+ updatedDocument = await databaseAdapter.updateDocDraft(auth.organizationId, id, documentData, auth.keyId);
87
+ }
88
+ if (!updatedDocument) {
89
+ return json({ success: false, error: 'Document not found' }, { status: 404 });
90
+ }
91
+ return json({
92
+ success: true,
93
+ data: updatedDocument
94
+ });
95
+ }
96
+ catch (error) {
97
+ console.error('Failed to update document:', error);
98
+ return json({
99
+ success: false,
100
+ error: 'Failed to update document',
101
+ message: error instanceof Error ? error.message : 'Unknown error'
102
+ }, { status: 500 });
103
+ }
104
+ };
105
+ // DELETE /api/documents/[id] - Delete document
106
+ export const DELETE = async ({ params, locals }) => {
107
+ try {
108
+ const { databaseAdapter } = locals.aphexCMS;
109
+ const auth = locals.auth;
110
+ const { id } = params;
111
+ if (!auth) {
112
+ return json({ success: false, error: 'Unauthorized' }, { status: 401 });
113
+ }
114
+ // Check write permissions (viewers are read-only)
115
+ if (!canWrite(auth)) {
116
+ return json({
117
+ success: false,
118
+ error: 'Forbidden',
119
+ message: 'You do not have permission to delete documents. Viewers have read-only access.'
120
+ }, { status: 403 });
121
+ }
122
+ if (!id) {
123
+ return json({ success: false, error: 'Document ID is required' }, { status: 400 });
124
+ }
125
+ const success = await databaseAdapter.deleteDocById(auth.organizationId, id);
126
+ if (!success) {
127
+ return json({ success: false, error: 'Document not found' }, { status: 404 });
128
+ }
129
+ return json({
130
+ success: true,
131
+ message: 'Document deleted successfully'
132
+ });
133
+ }
134
+ catch (error) {
135
+ console.error('Failed to delete document:', error);
136
+ return json({
137
+ success: false,
138
+ error: 'Failed to delete document',
139
+ message: error instanceof Error ? error.message : 'Unknown error'
140
+ }, { status: 500 });
141
+ }
142
+ };
@@ -0,0 +1,4 @@
1
+ import type { RequestHandler } from '@sveltejs/kit';
2
+ export declare const POST: RequestHandler;
3
+ export declare const DELETE: RequestHandler;
4
+ //# sourceMappingURL=documents-publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents-publish.d.ts","sourceRoot":"","sources":["../../src/lib/routes/documents-publish.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD,eAAO,MAAM,IAAI,EAAE,cAkIlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,cAsEpB,CAAC"}