@aphexcms/cms-core 0.1.1 → 0.1.4

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 (336) 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/{src/api/index.ts → dist/api/index.d.ts} +1 -1
  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/client/index.ts → dist/client/index.js} +0 -16
  31. package/{src → dist}/components/AdminApp.svelte +7 -8
  32. package/dist/components/AdminApp.svelte.d.ts +24 -0
  33. package/dist/components/AdminApp.svelte.d.ts.map +1 -0
  34. package/dist/components/admin/AdminLayout.svelte.d.ts +15 -0
  35. package/dist/components/admin/AdminLayout.svelte.d.ts.map +1 -0
  36. package/dist/components/admin/DocumentEditor.svelte.d.ts +18 -0
  37. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -0
  38. package/dist/components/admin/DocumentTypesList.svelte.d.ts +14 -0
  39. package/dist/components/admin/DocumentTypesList.svelte.d.ts.map +1 -0
  40. package/dist/components/admin/ObjectModal.svelte.d.ts +15 -0
  41. package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -0
  42. package/dist/components/admin/SchemaField.svelte.d.ts +19 -0
  43. package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -0
  44. package/dist/components/admin/fields/ArrayField.svelte.d.ts +12 -0
  45. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -0
  46. package/dist/components/admin/fields/BooleanField.svelte.d.ts +13 -0
  47. package/dist/components/admin/fields/BooleanField.svelte.d.ts.map +1 -0
  48. package/dist/components/admin/fields/ImageField.svelte.d.ts +15 -0
  49. package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -0
  50. package/dist/components/admin/fields/NumberField.svelte.d.ts +14 -0
  51. package/dist/components/admin/fields/NumberField.svelte.d.ts.map +1 -0
  52. package/dist/components/admin/fields/ReferenceField.svelte.d.ts +12 -0
  53. package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -0
  54. package/dist/components/admin/fields/SlugField.svelte.d.ts +15 -0
  55. package/dist/components/admin/fields/SlugField.svelte.d.ts.map +1 -0
  56. package/dist/components/admin/fields/StringField.svelte.d.ts +14 -0
  57. package/dist/components/admin/fields/StringField.svelte.d.ts.map +1 -0
  58. package/dist/components/admin/fields/TextareaField.svelte.d.ts +14 -0
  59. package/dist/components/admin/fields/TextareaField.svelte.d.ts.map +1 -0
  60. package/dist/components/fields/index.d.ts +9 -0
  61. package/dist/components/fields/index.d.ts.map +1 -0
  62. package/dist/components/index.d.ts +7 -0
  63. package/dist/components/index.d.ts.map +1 -0
  64. package/{src/components/index.ts → dist/components/index.js} +0 -4
  65. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts +11 -0
  66. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -0
  67. package/{src → dist}/components/layout/Sidebar.svelte +7 -7
  68. package/dist/components/layout/Sidebar.svelte.d.ts +14 -0
  69. package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -0
  70. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +11 -0
  71. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -0
  72. package/dist/components/layout/sidebar/NavMain.svelte.d.ts +19 -0
  73. package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -0
  74. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts +9 -0
  75. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts.map +1 -0
  76. package/dist/components/layout/sidebar/NavUser.svelte.d.ts +9 -0
  77. package/dist/components/layout/sidebar/NavUser.svelte.d.ts.map +1 -0
  78. package/dist/config.d.ts +3 -0
  79. package/dist/config.d.ts.map +1 -0
  80. package/dist/config.js +15 -0
  81. package/dist/db/adapters/index.d.ts +1 -0
  82. package/dist/db/adapters/index.d.ts.map +1 -0
  83. package/{src/db/adapters/index.ts → dist/db/adapters/index.js} +1 -0
  84. package/dist/db/index.d.ts +2 -0
  85. package/dist/db/index.d.ts.map +1 -0
  86. package/{src/db/index.ts → dist/db/index.js} +0 -1
  87. package/dist/db/interfaces/asset.d.ts +51 -0
  88. package/dist/db/interfaces/asset.d.ts.map +1 -0
  89. package/dist/db/interfaces/asset.js +1 -0
  90. package/dist/db/interfaces/document.d.ts +36 -0
  91. package/dist/db/interfaces/document.d.ts.map +1 -0
  92. package/dist/db/interfaces/document.js +1 -0
  93. package/dist/db/interfaces/index.d.ts +73 -0
  94. package/dist/db/interfaces/index.d.ts.map +1 -0
  95. package/dist/db/interfaces/index.js +1 -0
  96. package/dist/db/interfaces/organization.d.ts +27 -0
  97. package/dist/db/interfaces/organization.d.ts.map +1 -0
  98. package/dist/db/interfaces/organization.js +1 -0
  99. package/dist/db/interfaces/schema.d.ts +21 -0
  100. package/dist/db/interfaces/schema.d.ts.map +1 -0
  101. package/dist/db/interfaces/schema.js +1 -0
  102. package/dist/db/interfaces/user.d.ts +15 -0
  103. package/dist/db/interfaces/user.d.ts.map +1 -0
  104. package/dist/db/interfaces/user.js +1 -0
  105. package/dist/db/utils/reference-resolver.d.ts +18 -0
  106. package/dist/db/utils/reference-resolver.d.ts.map +1 -0
  107. package/dist/db/utils/reference-resolver.js +80 -0
  108. package/dist/define.d.ts +3 -0
  109. package/dist/define.d.ts.map +1 -0
  110. package/dist/define.js +4 -0
  111. package/dist/email/index.d.ts +2 -0
  112. package/dist/email/index.d.ts.map +1 -0
  113. package/{src/email/index.ts → dist/email/index.js} +0 -1
  114. package/dist/email/interfaces/email.d.ts +42 -0
  115. package/dist/email/interfaces/email.d.ts.map +1 -0
  116. package/dist/email/interfaces/email.js +1 -0
  117. package/dist/engine.d.ts +26 -0
  118. package/dist/engine.d.ts.map +1 -0
  119. package/dist/engine.js +66 -0
  120. package/dist/field-validation/rule.d.ts +51 -0
  121. package/dist/field-validation/rule.d.ts.map +1 -0
  122. package/dist/field-validation/rule.js +221 -0
  123. package/dist/field-validation/utils.d.ts +21 -0
  124. package/dist/field-validation/utils.d.ts.map +1 -0
  125. package/dist/field-validation/utils.js +66 -0
  126. package/dist/hooks.d.ts +23 -0
  127. package/dist/hooks.d.ts.map +1 -0
  128. package/dist/hooks.js +96 -0
  129. package/dist/index.d.ts +2 -0
  130. package/dist/index.d.ts.map +1 -0
  131. package/{src/index.ts → dist/index.js} +0 -1
  132. package/dist/routes/assets-by-id.d.ts +5 -0
  133. package/dist/routes/assets-by-id.d.ts.map +1 -0
  134. package/dist/routes/assets-by-id.js +138 -0
  135. package/dist/routes/assets-cdn.d.ts +3 -0
  136. package/dist/routes/assets-cdn.d.ts.map +1 -0
  137. package/dist/routes/assets-cdn.js +155 -0
  138. package/dist/routes/assets.d.ts +4 -0
  139. package/dist/routes/assets.d.ts.map +1 -0
  140. package/dist/routes/assets.js +94 -0
  141. package/dist/routes/documents-by-id.d.ts +5 -0
  142. package/dist/routes/documents-by-id.d.ts.map +1 -0
  143. package/dist/routes/documents-by-id.js +142 -0
  144. package/dist/routes/documents-publish.d.ts +4 -0
  145. package/dist/routes/documents-publish.d.ts.map +1 -0
  146. package/dist/routes/documents-publish.js +151 -0
  147. package/dist/routes/documents.d.ts +4 -0
  148. package/dist/routes/documents.d.ts.map +1 -0
  149. package/dist/routes/documents.js +131 -0
  150. package/dist/routes/index.d.ts +6 -0
  151. package/dist/routes/index.d.ts.map +1 -0
  152. package/{src/routes/index.ts → dist/routes/index.js} +0 -3
  153. package/dist/routes/organizations-by-id.d.ts +5 -0
  154. package/dist/routes/organizations-by-id.d.ts.map +1 -0
  155. package/dist/routes/organizations-by-id.js +187 -0
  156. package/dist/routes/organizations-invitations.d.ts +4 -0
  157. package/dist/routes/organizations-invitations.d.ts.map +1 -0
  158. package/dist/routes/organizations-invitations.js +125 -0
  159. package/dist/routes/organizations-members.d.ts +5 -0
  160. package/dist/routes/organizations-members.d.ts.map +1 -0
  161. package/dist/routes/organizations-members.js +206 -0
  162. package/dist/routes/organizations-switch.d.ts +3 -0
  163. package/dist/routes/organizations-switch.d.ts.map +1 -0
  164. package/dist/routes/organizations-switch.js +53 -0
  165. package/dist/routes/organizations.d.ts +4 -0
  166. package/dist/routes/organizations.d.ts.map +1 -0
  167. package/dist/routes/organizations.js +108 -0
  168. package/dist/routes/schemas-by-type.d.ts +3 -0
  169. package/dist/routes/schemas-by-type.d.ts.map +1 -0
  170. package/dist/routes/schemas-by-type.js +25 -0
  171. package/dist/routes/schemas.d.ts +3 -0
  172. package/dist/routes/schemas.d.ts.map +1 -0
  173. package/dist/routes/schemas.js +11 -0
  174. package/dist/routes-exports.d.ts +14 -0
  175. package/dist/routes-exports.d.ts.map +1 -0
  176. package/{src/routes-exports.ts → dist/routes-exports.js} +5 -28
  177. package/dist/schema-context.svelte.d.ts +10 -0
  178. package/dist/schema-context.svelte.d.ts.map +1 -0
  179. package/dist/schema-context.svelte.js +18 -0
  180. package/dist/schema-utils/cleanup.d.ts +21 -0
  181. package/dist/schema-utils/cleanup.d.ts.map +1 -0
  182. package/dist/schema-utils/cleanup.js +80 -0
  183. package/dist/schema-utils/index.d.ts +4 -0
  184. package/dist/schema-utils/index.d.ts.map +1 -0
  185. package/dist/schema-utils/utils.d.ts +30 -0
  186. package/dist/schema-utils/utils.d.ts.map +1 -0
  187. package/dist/schema-utils/utils.js +37 -0
  188. package/dist/schema-utils/validator.d.ts +6 -0
  189. package/dist/schema-utils/validator.d.ts.map +1 -0
  190. package/dist/schema-utils/validator.js +45 -0
  191. package/dist/server/index.d.ts +16 -0
  192. package/dist/server/index.d.ts.map +1 -0
  193. package/{src/server/index.ts → dist/server/index.js} +2 -14
  194. package/dist/services/asset-service.d.ts +86 -0
  195. package/dist/services/asset-service.d.ts.map +1 -0
  196. package/dist/services/asset-service.js +187 -0
  197. package/{src/services/index.ts → dist/services/index.d.ts} +1 -4
  198. package/dist/services/index.d.ts.map +1 -0
  199. package/dist/services/index.js +4 -0
  200. package/dist/storage/adapters/index.d.ts +2 -0
  201. package/dist/storage/adapters/index.d.ts.map +1 -0
  202. package/dist/storage/adapters/local-storage-adapter.d.ts +54 -0
  203. package/dist/storage/adapters/local-storage-adapter.d.ts.map +1 -0
  204. package/dist/storage/adapters/local-storage-adapter.js +187 -0
  205. package/dist/storage/index.d.ts +3 -0
  206. package/dist/storage/index.d.ts.map +1 -0
  207. package/{src/storage/index.ts → dist/storage/index.js} +0 -2
  208. package/dist/storage/interfaces/index.d.ts +2 -0
  209. package/dist/storage/interfaces/index.d.ts.map +1 -0
  210. package/dist/storage/interfaces/storage.d.ts +91 -0
  211. package/dist/storage/interfaces/storage.d.ts.map +1 -0
  212. package/dist/storage/interfaces/storage.js +1 -0
  213. package/dist/storage/providers/storage.d.ts +43 -0
  214. package/dist/storage/providers/storage.d.ts.map +1 -0
  215. package/dist/storage/providers/storage.js +64 -0
  216. package/dist/types/asset.d.ts +73 -0
  217. package/dist/types/asset.d.ts.map +1 -0
  218. package/dist/types/asset.js +2 -0
  219. package/dist/types/auth.d.ts +50 -0
  220. package/dist/types/auth.d.ts.map +1 -0
  221. package/dist/types/auth.js +41 -0
  222. package/dist/types/config.d.ts +47 -0
  223. package/dist/types/config.d.ts.map +1 -0
  224. package/dist/types/config.js +1 -0
  225. package/dist/types/document.d.ts +34 -0
  226. package/dist/types/document.d.ts.map +1 -0
  227. package/dist/types/document.js +1 -0
  228. package/dist/types/index.d.ts +9 -0
  229. package/dist/types/index.d.ts.map +1 -0
  230. package/dist/types/organization.d.ts +105 -0
  231. package/dist/types/organization.d.ts.map +1 -0
  232. package/dist/types/organization.js +3 -0
  233. package/dist/types/schemas.d.ts +114 -0
  234. package/dist/types/schemas.d.ts.map +1 -0
  235. package/dist/types/schemas.js +1 -0
  236. package/dist/types/sidebar.d.ts +33 -0
  237. package/dist/types/sidebar.d.ts.map +1 -0
  238. package/dist/types/sidebar.js +1 -0
  239. package/dist/types/user.d.ts +14 -0
  240. package/dist/types/user.d.ts.map +1 -0
  241. package/dist/types/user.js +1 -0
  242. package/dist/utils/content-hash.d.ts +22 -0
  243. package/dist/utils/content-hash.d.ts.map +1 -0
  244. package/dist/utils/content-hash.js +67 -0
  245. package/dist/utils/image-url.d.ts +88 -0
  246. package/dist/utils/image-url.d.ts.map +1 -0
  247. package/dist/utils/image-url.js +165 -0
  248. package/dist/utils/index.d.ts +6 -0
  249. package/dist/utils/index.d.ts.map +1 -0
  250. package/{src/utils/index.ts → dist/utils/index.js} +0 -3
  251. package/dist/utils/slug.d.ts +13 -0
  252. package/dist/utils/slug.d.ts.map +1 -0
  253. package/dist/utils/slug.js +30 -0
  254. package/package.json +12 -25
  255. package/src/api/assets.ts +0 -75
  256. package/src/api/client.ts +0 -150
  257. package/src/api/documents.ts +0 -102
  258. package/src/api/organizations.ts +0 -154
  259. package/src/api/types.ts +0 -34
  260. package/src/auth/auth-errors.ts +0 -23
  261. package/src/auth/auth-hooks.ts +0 -132
  262. package/src/auth/provider.ts +0 -25
  263. package/src/config.ts +0 -18
  264. package/src/db/interfaces/asset.ts +0 -61
  265. package/src/db/interfaces/document.ts +0 -53
  266. package/src/db/interfaces/index.ts +0 -98
  267. package/src/db/interfaces/organization.ts +0 -51
  268. package/src/db/interfaces/schema.ts +0 -13
  269. package/src/db/interfaces/user.ts +0 -16
  270. package/src/db/utils/reference-resolver.ts +0 -119
  271. package/src/define.ts +0 -7
  272. package/src/email/interfaces/email.ts +0 -45
  273. package/src/engine.ts +0 -85
  274. package/src/field-validation/rule.ts +0 -287
  275. package/src/field-validation/utils.ts +0 -91
  276. package/src/hooks.ts +0 -142
  277. package/src/lib/is-mobile.svelte.ts +0 -9
  278. package/src/lib/utils.ts +0 -13
  279. package/src/routes/assets-by-id.ts +0 -161
  280. package/src/routes/assets-cdn.ts +0 -185
  281. package/src/routes/assets.ts +0 -116
  282. package/src/routes/documents-by-id.ts +0 -188
  283. package/src/routes/documents-publish.ts +0 -211
  284. package/src/routes/documents.ts +0 -172
  285. package/src/routes/organizations-by-id.ts +0 -258
  286. package/src/routes/organizations-invitations.ts +0 -183
  287. package/src/routes/organizations-members.ts +0 -301
  288. package/src/routes/organizations-switch.ts +0 -74
  289. package/src/routes/organizations.ts +0 -146
  290. package/src/routes/schemas-by-type.ts +0 -35
  291. package/src/routes/schemas.ts +0 -19
  292. package/src/schema-context.svelte.ts +0 -24
  293. package/src/schema-utils/cleanup.ts +0 -116
  294. package/src/schema-utils/utils.ts +0 -47
  295. package/src/schema-utils/validator.ts +0 -58
  296. package/src/services/asset-service.ts +0 -256
  297. package/src/storage/adapters/local-storage-adapter.ts +0 -215
  298. package/src/storage/interfaces/storage.ts +0 -114
  299. package/src/storage/providers/storage.ts +0 -83
  300. package/src/types/asset.ts +0 -81
  301. package/src/types/auth.ts +0 -80
  302. package/src/types/config.ts +0 -45
  303. package/src/types/document.ts +0 -38
  304. package/src/types/organization.ts +0 -119
  305. package/src/types/schemas.ts +0 -151
  306. package/src/types/sidebar.ts +0 -37
  307. package/src/types/user.ts +0 -17
  308. package/src/utils/content-hash.ts +0 -75
  309. package/src/utils/image-url.ts +0 -204
  310. package/src/utils/slug.ts +0 -33
  311. /package/{src → dist}/app.d.ts +0 -0
  312. /package/{src → dist}/auth/MULTI_TENANCY_PLAN.md +0 -0
  313. /package/{src → dist}/components/admin/AdminLayout.svelte +0 -0
  314. /package/{src → dist}/components/admin/DocumentEditor.svelte +0 -0
  315. /package/{src → dist}/components/admin/DocumentTypesList.svelte +0 -0
  316. /package/{src → dist}/components/admin/ObjectModal.svelte +0 -0
  317. /package/{src → dist}/components/admin/SchemaField.svelte +0 -0
  318. /package/{src → dist}/components/admin/fields/ArrayField.svelte +0 -0
  319. /package/{src → dist}/components/admin/fields/BooleanField.svelte +0 -0
  320. /package/{src → dist}/components/admin/fields/ImageField.svelte +0 -0
  321. /package/{src → dist}/components/admin/fields/NumberField.svelte +0 -0
  322. /package/{src → dist}/components/admin/fields/ReferenceField.svelte +0 -0
  323. /package/{src → dist}/components/admin/fields/SlugField.svelte +0 -0
  324. /package/{src → dist}/components/admin/fields/StringField.svelte +0 -0
  325. /package/{src → dist}/components/admin/fields/TextareaField.svelte +0 -0
  326. /package/{src/components/fields/index.ts → dist/components/fields/index.js} +0 -0
  327. /package/{src → dist}/components/layout/OrganizationSwitcher.svelte +0 -0
  328. /package/{src → dist}/components/layout/sidebar/AppSidebar.svelte +0 -0
  329. /package/{src → dist}/components/layout/sidebar/NavMain.svelte +0 -0
  330. /package/{src → dist}/components/layout/sidebar/NavSecondary.svelte +0 -0
  331. /package/{src → dist}/components/layout/sidebar/NavUser.svelte +0 -0
  332. /package/{src → dist}/plugins/README.md +0 -0
  333. /package/{src/schema-utils/index.ts → dist/schema-utils/index.js} +0 -0
  334. /package/{src/storage/adapters/index.ts → dist/storage/adapters/index.js} +0 -0
  335. /package/{src/storage/interfaces/index.ts → dist/storage/interfaces/index.js} +0 -0
  336. /package/{src/types/index.ts → dist/types/index.js} +0 -0
@@ -1,188 +0,0 @@
1
- // Aphex CMS Document by ID API Handlers
2
- import { json } from '@sveltejs/kit';
3
- import type { RequestHandler } from '@sveltejs/kit';
4
- import type { Document } from '../types/document.js';
5
- import { canWrite } from '../types/auth.js';
6
-
7
- // GET /api/documents/[id] - Get document by ID
8
- export const GET: RequestHandler = async ({ params, url, locals }) => {
9
- try {
10
- const { databaseAdapter, auth: authProvider } = locals.aphexCMS;
11
- const auth = locals.auth;
12
- const { id } = params;
13
-
14
- if (!auth) {
15
- return json({ success: false, error: 'Unauthorized' }, { status: 401 });
16
- }
17
-
18
- if (!id) {
19
- return json({ success: false, error: 'Document ID is required' }, { status: 400 });
20
- }
21
-
22
- // Parse depth parameter
23
- const depthParam = url.searchParams.get('depth');
24
- const depth = depthParam ? parseInt(depthParam) : 0;
25
- const clampedDepth = isNaN(depth) ? 0 : Math.max(0, Math.min(depth, 5)); // Clamp between 0-5
26
-
27
- const document = await databaseAdapter.findByDocId(auth.organizationId, id, clampedDepth);
28
-
29
- if (!document) {
30
- return json({ success: false, error: 'Document not found' }, { status: 404 });
31
- }
32
-
33
- // Populate createdBy user info if available
34
- if (document.createdBy && authProvider) {
35
- try {
36
- if (typeof document.createdBy === 'string') {
37
- const user = await authProvider.getUserById(document.createdBy);
38
- if (user) {
39
- document.createdBy = {
40
- id: user.id,
41
- name: user.name,
42
- email: user.email
43
- };
44
- }
45
- }
46
- } catch (err) {
47
- // If user fetch fails, keep the user ID
48
- console.warn('[documents-by-id] Failed to populate createdBy user:', err);
49
- }
50
- }
51
-
52
- return json({
53
- success: true,
54
- data: document
55
- });
56
- } catch (error) {
57
- console.error('Failed to fetch document:', error);
58
- return json(
59
- {
60
- success: false,
61
- error: 'Failed to fetch document',
62
- message: error instanceof Error ? error.message : 'Unknown error'
63
- },
64
- { status: 500 }
65
- );
66
- }
67
- };
68
-
69
- // PUT /api/documents/[id] - Update document
70
- export const PUT: RequestHandler = async ({ params, request, locals }) => {
71
- try {
72
- const { databaseAdapter } = locals.aphexCMS;
73
- const auth = locals.auth;
74
- const { id } = params;
75
- const body = await request.json();
76
-
77
- if (!auth) {
78
- return json({ success: false, error: 'Unauthorized' }, { status: 401 });
79
- }
80
-
81
- // Check write permissions (viewers are read-only)
82
- if (!canWrite(auth)) {
83
- return json(
84
- {
85
- success: false,
86
- error: 'Forbidden',
87
- message: 'You do not have permission to update documents. Viewers have read-only access.'
88
- },
89
- { status: 403 }
90
- );
91
- }
92
-
93
- const documentData = body.draftData;
94
-
95
- if (!id) {
96
- return json({ success: false, error: 'Document ID is required' }, { status: 400 });
97
- }
98
-
99
- let updatedDocument: Document | null;
100
-
101
- // NO VALIDATION FOR DRAFTS - Sanity-style: drafts can have any state
102
- // Validation only happens on publish
103
- if (auth.type == 'session') {
104
- updatedDocument = await databaseAdapter.updateDocDraft(
105
- auth.organizationId,
106
- id,
107
- documentData,
108
- auth.user.id
109
- );
110
- } else {
111
- updatedDocument = await databaseAdapter.updateDocDraft(
112
- auth.organizationId,
113
- id,
114
- documentData,
115
- auth.keyId
116
- );
117
- }
118
-
119
- if (!updatedDocument) {
120
- return json({ success: false, error: 'Document not found' }, { status: 404 });
121
- }
122
-
123
- return json({
124
- success: true,
125
- data: updatedDocument
126
- });
127
- } catch (error) {
128
- console.error('Failed to update document:', error);
129
- return json(
130
- {
131
- success: false,
132
- error: 'Failed to update document',
133
- message: error instanceof Error ? error.message : 'Unknown error'
134
- },
135
- { status: 500 }
136
- );
137
- }
138
- };
139
-
140
- // DELETE /api/documents/[id] - Delete document
141
- export const DELETE: RequestHandler = async ({ params, locals }) => {
142
- try {
143
- const { databaseAdapter } = locals.aphexCMS;
144
- const auth = locals.auth;
145
- const { id } = params;
146
-
147
- if (!auth) {
148
- return json({ success: false, error: 'Unauthorized' }, { status: 401 });
149
- }
150
-
151
- // Check write permissions (viewers are read-only)
152
- if (!canWrite(auth)) {
153
- return json(
154
- {
155
- success: false,
156
- error: 'Forbidden',
157
- message: 'You do not have permission to delete documents. Viewers have read-only access.'
158
- },
159
- { status: 403 }
160
- );
161
- }
162
-
163
- if (!id) {
164
- return json({ success: false, error: 'Document ID is required' }, { status: 400 });
165
- }
166
-
167
- const success = await databaseAdapter.deleteDocById(auth.organizationId, id);
168
-
169
- if (!success) {
170
- return json({ success: false, error: 'Document not found' }, { status: 404 });
171
- }
172
-
173
- return json({
174
- success: true,
175
- message: 'Document deleted successfully'
176
- });
177
- } catch (error) {
178
- console.error('Failed to delete document:', error);
179
- return json(
180
- {
181
- success: false,
182
- error: 'Failed to delete document',
183
- message: error instanceof Error ? error.message : 'Unknown error'
184
- },
185
- { status: 500 }
186
- );
187
- }
188
- };
@@ -1,211 +0,0 @@
1
- // Aphex CMS Document Publish API Handlers
2
- import { json } from '@sveltejs/kit';
3
- import type { RequestHandler } from '@sveltejs/kit';
4
- import { validateField } from '../field-validation/utils.js';
5
- import { canWrite } from '../types/auth.js';
6
-
7
- // POST /api/documents/[id]/publish - Publish document
8
- export const POST: RequestHandler = async ({ params, locals }) => {
9
- try {
10
- const { databaseAdapter, cmsEngine } = locals.aphexCMS;
11
- const auth = locals.auth;
12
- const { id } = params;
13
-
14
- if (!auth) {
15
- return json(
16
- {
17
- success: false,
18
- error: 'Unauthorized',
19
- message: 'Authentication required'
20
- },
21
- { status: 401 }
22
- );
23
- }
24
-
25
- // Check write permissions (viewers are read-only)
26
- if (!canWrite(auth)) {
27
- return json(
28
- {
29
- success: false,
30
- error: 'Forbidden',
31
- message: 'You do not have permission to publish documents. Viewers have read-only access.'
32
- },
33
- { status: 403 }
34
- );
35
- }
36
-
37
- if (!id) {
38
- return json(
39
- {
40
- success: false,
41
- error: 'Missing document ID',
42
- message: 'Document ID is required'
43
- },
44
- { status: 400 }
45
- );
46
- }
47
-
48
- // Get document to validate
49
- const document = await databaseAdapter.findByDocId(auth.organizationId, id);
50
- if (!document || !document.draftData) {
51
- return json(
52
- {
53
- success: false,
54
- error: 'Document not found or cannot be published',
55
- message: 'Document may not exist or may not have draft content'
56
- },
57
- { status: 404 }
58
- );
59
- }
60
-
61
- // Get schema for validation (from config to preserve validation functions)
62
- const schema = cmsEngine.getSchemaTypeByName(document.type);
63
- if (!schema) {
64
- return json(
65
- {
66
- success: false,
67
- error: 'Invalid document type',
68
- message: `Schema type '${document.type}' not found`
69
- },
70
- { status: 400 }
71
- );
72
- }
73
-
74
- // VALIDATE before publishing - block if errors exist
75
- const validationErrors: Array<{ field: string; errors: string[] }> = [];
76
-
77
- for (const field of schema.fields) {
78
- const value = document.draftData[field.name];
79
- const result = await validateField(field, value, document.draftData);
80
-
81
- if (!result.isValid) {
82
- const errorMessages = result.errors
83
- .filter((e) => e.level === 'error')
84
- .map((e) => e.message);
85
-
86
- if (errorMessages.length > 0) {
87
- validationErrors.push({
88
- field: field.name,
89
- errors: errorMessages
90
- });
91
- }
92
- }
93
- }
94
-
95
- // Block publishing if validation errors exist
96
- if (validationErrors.length > 0) {
97
- return json(
98
- {
99
- success: false,
100
- error: 'Cannot publish: validation errors',
101
- message: 'Please fix all validation errors before publishing',
102
- validationErrors
103
- },
104
- { status: 400 }
105
- );
106
- }
107
-
108
- // All validation passed - proceed with publish
109
- const publishedDocument = await databaseAdapter.publishDoc(auth.organizationId, id);
110
-
111
- if (!publishedDocument) {
112
- return json(
113
- {
114
- success: false,
115
- error: 'Document not found or cannot be published',
116
- message: 'Document may not exist or may not have draft content'
117
- },
118
- { status: 404 }
119
- );
120
- }
121
-
122
- return json({
123
- success: true,
124
- data: publishedDocument,
125
- message: 'Document published successfully'
126
- });
127
- } catch (error) {
128
- console.error('Failed to publish document:', error);
129
- return json(
130
- {
131
- success: false,
132
- error: 'Failed to publish document',
133
- message: error instanceof Error ? error.message : 'Unknown error'
134
- },
135
- { status: 500 }
136
- );
137
- }
138
- };
139
-
140
- // DELETE /api/documents/[id]/publish - Unpublish document
141
- export const DELETE: RequestHandler = async ({ params, locals }) => {
142
- try {
143
- const { databaseAdapter } = locals.aphexCMS;
144
- const auth = locals.auth;
145
- const { id } = params;
146
-
147
- if (!auth) {
148
- return json(
149
- {
150
- success: false,
151
- error: 'Unauthorized',
152
- message: 'Authentication required'
153
- },
154
- { status: 401 }
155
- );
156
- }
157
-
158
- // Check write permissions (viewers are read-only)
159
- if (!canWrite(auth)) {
160
- return json(
161
- {
162
- success: false,
163
- error: 'Forbidden',
164
- message:
165
- 'You do not have permission to unpublish documents. Viewers have read-only access.'
166
- },
167
- { status: 403 }
168
- );
169
- }
170
-
171
- if (!id) {
172
- return json(
173
- {
174
- success: false,
175
- error: 'Missing document ID',
176
- message: 'Document ID is required'
177
- },
178
- { status: 400 }
179
- );
180
- }
181
-
182
- const unpublishedDocument = await databaseAdapter.unpublishDoc(auth.organizationId, id);
183
-
184
- if (!unpublishedDocument) {
185
- return json(
186
- {
187
- success: false,
188
- error: 'Document not found',
189
- message: `No document found with ID: ${id}`
190
- },
191
- { status: 404 }
192
- );
193
- }
194
-
195
- return json({
196
- success: true,
197
- data: unpublishedDocument,
198
- message: 'Document unpublished successfully'
199
- });
200
- } catch (error) {
201
- console.error('Failed to unpublish document:', error);
202
- return json(
203
- {
204
- success: false,
205
- error: 'Failed to unpublish document',
206
- message: error instanceof Error ? error.message : 'Unknown error'
207
- },
208
- { status: 500 }
209
- );
210
- }
211
- };
@@ -1,172 +0,0 @@
1
- // Aphex CMS Document API Handlers
2
- import { json } from '@sveltejs/kit';
3
- import type { RequestHandler } from '@sveltejs/kit';
4
- import { canWrite } from '../types/auth.js';
5
-
6
- // Default values for API
7
- const DEFAULT_API_LIMIT = 20;
8
- const DEFAULT_API_OFFSET = 0;
9
-
10
- // GET /api/documents - List documents with filtering
11
- export const GET: RequestHandler = async ({ url, locals }) => {
12
- try {
13
- const { databaseAdapter } = locals.aphexCMS;
14
- const auth = locals.auth;
15
-
16
- if (!auth) {
17
- return json(
18
- {
19
- success: false,
20
- error: 'Unauthorized',
21
- message: 'Authentication required'
22
- },
23
- { status: 401 }
24
- );
25
- }
26
-
27
- const docType = url.searchParams.get('docType');
28
- const status = url.searchParams.get('status') || undefined;
29
- const limitParam = url.searchParams.get('limit');
30
- const offsetParam = url.searchParams.get('offset');
31
- const depthParam = url.searchParams.get('depth');
32
- const organizationIdsParam = url.searchParams.get('organizationIds'); // Comma-separated list
33
-
34
- // Parse with defaults
35
- const limit = limitParam ? parseInt(limitParam) : DEFAULT_API_LIMIT;
36
- const offset = offsetParam ? parseInt(offsetParam) : DEFAULT_API_OFFSET;
37
- const depth = depthParam ? parseInt(depthParam) : 0;
38
-
39
- // Parse organizationIds if provided
40
- const filterOrganizationIds = organizationIdsParam
41
- ? organizationIdsParam
42
- .split(',')
43
- .map((id) => id.trim())
44
- .filter(Boolean)
45
- : undefined;
46
-
47
- const filters = {
48
- ...(docType && { type: docType }),
49
- ...(status && { status }),
50
- ...(filterOrganizationIds && { filterOrganizationIds }),
51
- limit: isNaN(limit) ? DEFAULT_API_LIMIT : limit,
52
- offset: isNaN(offset) ? DEFAULT_API_OFFSET : offset,
53
- depth: isNaN(depth) ? 0 : Math.max(0, Math.min(depth, 5)) // Clamp between 0-5 for safety
54
- };
55
- const documents = await databaseAdapter.findManyDoc(auth.organizationId, filters);
56
-
57
- return json({
58
- success: true,
59
- data: documents,
60
- meta: {
61
- count: documents.length,
62
- limit: filters.limit,
63
- offset: filters.offset,
64
- filters: {
65
- docType,
66
- status
67
- }
68
- }
69
- });
70
- } catch (error) {
71
- console.error('Failed to fetch documents:', error);
72
- return json(
73
- {
74
- success: false,
75
- error: 'Failed to fetch documents',
76
- message: error instanceof Error ? error.message : 'Unknown error'
77
- },
78
- { status: 500 }
79
- );
80
- }
81
- };
82
-
83
- // POST /api/documents - Create new document
84
- export const POST: RequestHandler = async ({ request, locals }) => {
85
- try {
86
- const { databaseAdapter } = locals.aphexCMS;
87
- const auth = locals.auth;
88
-
89
- if (!auth) {
90
- return json(
91
- {
92
- success: false,
93
- error: 'Unauthorized',
94
- message: 'Authentication required'
95
- },
96
- { status: 401 }
97
- );
98
- }
99
-
100
- // Check write permissions (viewers are read-only)
101
- if (!canWrite(auth)) {
102
- return json(
103
- {
104
- success: false,
105
- error: 'Forbidden',
106
- message: 'You do not have permission to create documents. Viewers have read-only access.'
107
- },
108
- { status: 403 }
109
- );
110
- }
111
-
112
- const body = await request.json();
113
-
114
- // Validate required fields (support both old and new format)
115
- const documentType = body.type;
116
- const documentData = body.draftData || body.data;
117
-
118
- if (!documentType || !documentData) {
119
- return json(
120
- {
121
- success: false,
122
- error: 'Missing required fields',
123
- message: 'Document type and data are required'
124
- },
125
- { status: 400 }
126
- );
127
- }
128
-
129
- // Validate document type exists
130
- const { cmsEngine } = locals.aphexCMS;
131
- const schema = cmsEngine.getSchemaTypeByName(documentType);
132
- if (!schema) {
133
- return json(
134
- {
135
- success: false,
136
- error: 'Invalid document type',
137
- message: `Schema type '${documentType}' not found`
138
- },
139
- { status: 400 }
140
- );
141
- }
142
-
143
- // NO VALIDATION FOR DRAFTS - Sanity-style: drafts can have any state
144
- // Validation only happens on publish
145
-
146
- // Create document (always starts as draft)
147
- const newDocument = await databaseAdapter.createDocument({
148
- type: documentType,
149
- draftData: documentData,
150
- organizationId: auth.organizationId,
151
- createdBy: auth.type === 'session' ? auth.user.id : undefined
152
- });
153
-
154
- return json(
155
- {
156
- success: true,
157
- data: newDocument
158
- },
159
- { status: 201 }
160
- );
161
- } catch (error) {
162
- console.error('Failed to create document:', error);
163
- return json(
164
- {
165
- success: false,
166
- error: 'Failed to create document',
167
- message: error instanceof Error ? error.message : 'Unknown error'
168
- },
169
- { status: 500 }
170
- );
171
- }
172
- };