@aphexcms/cms-core 4.0.0 → 5.0.1

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 (318) hide show
  1. package/dist/api/schemas/user.d.ts +10 -0
  2. package/dist/api/schemas/user.d.ts.map +1 -1
  3. package/dist/api/schemas/user.js +10 -0
  4. package/dist/cli/generate-types.d.ts.map +1 -1
  5. package/dist/cli/generate-types.js +14 -9
  6. package/dist/cli/generate-types.js.map +1 -1
  7. package/dist/components/AdminApp.svelte +25 -7
  8. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  9. package/dist/components/admin/DocumentEditor.svelte +63 -11
  10. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
  11. package/dist/components/admin/DocumentVersionPanel.svelte +6 -0
  12. package/dist/components/admin/DocumentVersionPanel.svelte.d.ts +3 -1
  13. package/dist/components/admin/DocumentVersionPanel.svelte.d.ts.map +1 -1
  14. package/dist/components/admin/ObjectModal.svelte +55 -12
  15. package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -1
  16. package/dist/components/admin/fields/ArrayField.svelte +15 -15
  17. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
  18. package/dist/config.d.ts.map +1 -1
  19. package/dist/config.js +1 -2
  20. package/dist/hooks.d.ts +3 -4
  21. package/dist/hooks.d.ts.map +1 -1
  22. package/dist/hooks.js +20 -99
  23. package/dist/lib/api/schemas/user.d.ts +10 -0
  24. package/dist/lib/api/schemas/user.d.ts.map +1 -1
  25. package/dist/lib/api/schemas/user.js +10 -0
  26. package/dist/lib/api/schemas/user.js.map +1 -1
  27. package/dist/lib/config.d.ts.map +1 -1
  28. package/dist/lib/config.js +1 -2
  29. package/dist/lib/config.js.map +1 -1
  30. package/dist/lib/hooks.d.ts +3 -4
  31. package/dist/lib/hooks.d.ts.map +1 -1
  32. package/dist/lib/hooks.js +20 -99
  33. package/dist/lib/hooks.js.map +1 -1
  34. package/dist/lib/server/api/index.d.ts +55 -0
  35. package/dist/lib/server/api/index.d.ts.map +1 -0
  36. package/dist/lib/server/api/index.js +107 -0
  37. package/dist/lib/server/api/index.js.map +1 -0
  38. package/dist/lib/server/api/routes/assets-bulk.d.ts +4 -0
  39. package/dist/lib/server/api/routes/assets-bulk.d.ts.map +1 -0
  40. package/dist/{routes → lib/server/api/routes}/assets-bulk.js +23 -23
  41. package/dist/lib/server/api/routes/assets-bulk.js.map +1 -0
  42. package/dist/lib/server/api/routes/assets-by-id.d.ts +4 -0
  43. package/dist/lib/server/api/routes/assets-by-id.d.ts.map +1 -0
  44. package/dist/lib/server/api/routes/assets-by-id.js +108 -0
  45. package/dist/lib/server/api/routes/assets-by-id.js.map +1 -0
  46. package/dist/lib/server/api/routes/assets-references.d.ts +15 -0
  47. package/dist/lib/server/api/routes/assets-references.d.ts.map +1 -0
  48. package/dist/lib/server/api/routes/assets-references.js +78 -0
  49. package/dist/lib/server/api/routes/assets-references.js.map +1 -0
  50. package/dist/lib/server/api/routes/assets.d.ts +4 -0
  51. package/dist/lib/server/api/routes/assets.d.ts.map +1 -0
  52. package/dist/{routes → lib/server/api/routes}/assets.js +76 -87
  53. package/dist/lib/server/api/routes/assets.js.map +1 -0
  54. package/dist/lib/server/api/routes/document-versions.d.ts +4 -0
  55. package/dist/lib/server/api/routes/document-versions.d.ts.map +1 -0
  56. package/dist/lib/server/api/routes/document-versions.js +113 -0
  57. package/dist/lib/server/api/routes/document-versions.js.map +1 -0
  58. package/dist/lib/server/api/routes/documents-by-id.d.ts +4 -0
  59. package/dist/lib/server/api/routes/documents-by-id.d.ts.map +1 -0
  60. package/dist/lib/server/api/routes/documents-by-id.js +148 -0
  61. package/dist/lib/server/api/routes/documents-by-id.js.map +1 -0
  62. package/dist/lib/server/api/routes/documents-publish.d.ts +4 -0
  63. package/dist/lib/server/api/routes/documents-publish.d.ts.map +1 -0
  64. package/dist/{routes → lib/server/api/routes}/documents-publish.js +42 -58
  65. package/dist/lib/server/api/routes/documents-publish.js.map +1 -0
  66. package/dist/lib/server/api/routes/documents-query.d.ts +8 -0
  67. package/dist/lib/server/api/routes/documents-query.d.ts.map +1 -0
  68. package/dist/lib/server/api/routes/documents-query.js +75 -0
  69. package/dist/lib/server/api/routes/documents-query.js.map +1 -0
  70. package/dist/lib/server/api/routes/documents.d.ts +4 -0
  71. package/dist/lib/server/api/routes/documents.d.ts.map +1 -0
  72. package/dist/{routes → lib/server/api/routes}/documents.js +55 -76
  73. package/dist/lib/server/api/routes/documents.js.map +1 -0
  74. package/dist/lib/server/api/routes/organizations-by-id.d.ts +4 -0
  75. package/dist/lib/server/api/routes/organizations-by-id.d.ts.map +1 -0
  76. package/dist/{routes → lib/server/api/routes}/organizations-by-id.js +62 -91
  77. package/dist/lib/server/api/routes/organizations-by-id.js.map +1 -0
  78. package/dist/lib/server/api/routes/organizations-invitations.d.ts +10 -0
  79. package/dist/lib/server/api/routes/organizations-invitations.d.ts.map +1 -0
  80. package/dist/{routes → lib/server/api/routes}/organizations-invitations.js +67 -78
  81. package/dist/lib/server/api/routes/organizations-invitations.js.map +1 -0
  82. package/dist/lib/server/api/routes/organizations-members.d.ts +4 -0
  83. package/dist/lib/server/api/routes/organizations-members.d.ts.map +1 -0
  84. package/dist/{routes → lib/server/api/routes}/organizations-members.js +74 -106
  85. package/dist/lib/server/api/routes/organizations-members.js.map +1 -0
  86. package/dist/lib/server/api/routes/organizations-switch.d.ts +4 -0
  87. package/dist/lib/server/api/routes/organizations-switch.d.ts.map +1 -0
  88. package/dist/lib/server/api/routes/organizations-switch.js +54 -0
  89. package/dist/lib/server/api/routes/organizations-switch.js.map +1 -0
  90. package/dist/lib/server/api/routes/organizations.d.ts +4 -0
  91. package/dist/lib/server/api/routes/organizations.d.ts.map +1 -0
  92. package/dist/lib/server/api/routes/organizations.js +99 -0
  93. package/dist/lib/server/api/routes/organizations.js.map +1 -0
  94. package/dist/lib/server/api/routes/roles.d.ts +12 -0
  95. package/dist/lib/server/api/routes/roles.d.ts.map +1 -0
  96. package/dist/lib/server/api/routes/roles.js +219 -0
  97. package/dist/lib/server/api/routes/roles.js.map +1 -0
  98. package/dist/lib/server/api/routes/schemas.d.ts +4 -0
  99. package/dist/lib/server/api/routes/schemas.d.ts.map +1 -0
  100. package/dist/lib/server/api/routes/schemas.js +27 -0
  101. package/dist/lib/server/api/routes/schemas.js.map +1 -0
  102. package/dist/lib/server/api/routes/user-preferences.d.ts +4 -0
  103. package/dist/lib/server/api/routes/user-preferences.d.ts.map +1 -0
  104. package/dist/lib/server/api/routes/user-preferences.js +63 -0
  105. package/dist/lib/server/api/routes/user-preferences.js.map +1 -0
  106. package/dist/lib/server/api/routes/user.d.ts +12 -0
  107. package/dist/lib/server/api/routes/user.d.ts.map +1 -0
  108. package/dist/lib/server/api/routes/user.js +114 -0
  109. package/dist/lib/server/api/routes/user.js.map +1 -0
  110. package/dist/lib/server/index.d.ts +2 -1
  111. package/dist/lib/server/index.d.ts.map +1 -1
  112. package/dist/lib/server/index.js +7 -3
  113. package/dist/lib/server/index.js.map +1 -1
  114. package/dist/lib/types/config.d.ts +28 -29
  115. package/dist/lib/types/config.d.ts.map +1 -1
  116. package/dist/server/api/index.d.ts +55 -0
  117. package/dist/server/api/index.d.ts.map +1 -0
  118. package/dist/server/api/index.js +106 -0
  119. package/dist/server/api/routes/assets-bulk.d.ts +4 -0
  120. package/dist/server/api/routes/assets-bulk.d.ts.map +1 -0
  121. package/dist/{lib → server/api}/routes/assets-bulk.js +22 -24
  122. package/dist/server/api/routes/assets-by-id.d.ts +4 -0
  123. package/dist/server/api/routes/assets-by-id.d.ts.map +1 -0
  124. package/dist/server/api/routes/assets-by-id.js +107 -0
  125. package/dist/server/api/routes/assets-references.d.ts +15 -0
  126. package/dist/server/api/routes/assets-references.d.ts.map +1 -0
  127. package/dist/server/api/routes/assets-references.js +77 -0
  128. package/dist/server/api/routes/assets.d.ts +4 -0
  129. package/dist/server/api/routes/assets.d.ts.map +1 -0
  130. package/dist/{lib → server/api}/routes/assets.js +75 -88
  131. package/dist/server/api/routes/document-versions.d.ts +4 -0
  132. package/dist/server/api/routes/document-versions.d.ts.map +1 -0
  133. package/dist/server/api/routes/document-versions.js +112 -0
  134. package/dist/server/api/routes/documents-by-id.d.ts +4 -0
  135. package/dist/server/api/routes/documents-by-id.d.ts.map +1 -0
  136. package/dist/server/api/routes/documents-by-id.js +147 -0
  137. package/dist/server/api/routes/documents-publish.d.ts +4 -0
  138. package/dist/server/api/routes/documents-publish.d.ts.map +1 -0
  139. package/dist/{lib → server/api}/routes/documents-publish.js +41 -59
  140. package/dist/server/api/routes/documents-query.d.ts +8 -0
  141. package/dist/server/api/routes/documents-query.d.ts.map +1 -0
  142. package/dist/server/api/routes/documents-query.js +74 -0
  143. package/dist/server/api/routes/documents.d.ts +4 -0
  144. package/dist/server/api/routes/documents.d.ts.map +1 -0
  145. package/dist/{lib → server/api}/routes/documents.js +54 -77
  146. package/dist/server/api/routes/organizations-by-id.d.ts +4 -0
  147. package/dist/server/api/routes/organizations-by-id.d.ts.map +1 -0
  148. package/dist/{lib → server/api}/routes/organizations-by-id.js +61 -92
  149. package/dist/server/api/routes/organizations-invitations.d.ts +10 -0
  150. package/dist/server/api/routes/organizations-invitations.d.ts.map +1 -0
  151. package/dist/{lib → server/api}/routes/organizations-invitations.js +66 -79
  152. package/dist/server/api/routes/organizations-members.d.ts +4 -0
  153. package/dist/server/api/routes/organizations-members.d.ts.map +1 -0
  154. package/dist/{lib → server/api}/routes/organizations-members.js +73 -107
  155. package/dist/server/api/routes/organizations-switch.d.ts +4 -0
  156. package/dist/server/api/routes/organizations-switch.d.ts.map +1 -0
  157. package/dist/server/api/routes/organizations-switch.js +53 -0
  158. package/dist/server/api/routes/organizations.d.ts +4 -0
  159. package/dist/server/api/routes/organizations.d.ts.map +1 -0
  160. package/dist/server/api/routes/organizations.js +98 -0
  161. package/dist/server/api/routes/roles.d.ts +12 -0
  162. package/dist/server/api/routes/roles.d.ts.map +1 -0
  163. package/dist/server/api/routes/roles.js +218 -0
  164. package/dist/server/api/routes/schemas.d.ts +4 -0
  165. package/dist/server/api/routes/schemas.d.ts.map +1 -0
  166. package/dist/server/api/routes/schemas.js +26 -0
  167. package/dist/server/api/routes/user-preferences.d.ts +4 -0
  168. package/dist/server/api/routes/user-preferences.d.ts.map +1 -0
  169. package/dist/server/api/routes/user-preferences.js +62 -0
  170. package/dist/server/api/routes/user.d.ts +12 -0
  171. package/dist/server/api/routes/user.d.ts.map +1 -0
  172. package/dist/server/api/routes/user.js +113 -0
  173. package/dist/server/index.d.ts +2 -1
  174. package/dist/server/index.d.ts.map +1 -1
  175. package/dist/server/index.js +7 -3
  176. package/dist/types/config.d.ts +28 -29
  177. package/dist/types/config.d.ts.map +1 -1
  178. package/package.json +4 -2
  179. package/dist/lib/routes/assets-bulk.d.ts +0 -3
  180. package/dist/lib/routes/assets-bulk.d.ts.map +0 -1
  181. package/dist/lib/routes/assets-bulk.js.map +0 -1
  182. package/dist/lib/routes/assets-by-id.d.ts +0 -5
  183. package/dist/lib/routes/assets-by-id.d.ts.map +0 -1
  184. package/dist/lib/routes/assets-by-id.js +0 -116
  185. package/dist/lib/routes/assets-by-id.js.map +0 -1
  186. package/dist/lib/routes/assets-references-counts.d.ts +0 -7
  187. package/dist/lib/routes/assets-references-counts.d.ts.map +0 -1
  188. package/dist/lib/routes/assets-references-counts.js +0 -42
  189. package/dist/lib/routes/assets-references-counts.js.map +0 -1
  190. package/dist/lib/routes/assets-references.d.ts +0 -7
  191. package/dist/lib/routes/assets-references.d.ts.map +0 -1
  192. package/dist/lib/routes/assets-references.js +0 -35
  193. package/dist/lib/routes/assets-references.js.map +0 -1
  194. package/dist/lib/routes/assets.d.ts +0 -4
  195. package/dist/lib/routes/assets.d.ts.map +0 -1
  196. package/dist/lib/routes/assets.js.map +0 -1
  197. package/dist/lib/routes/document-versions.d.ts +0 -5
  198. package/dist/lib/routes/document-versions.d.ts.map +0 -1
  199. package/dist/lib/routes/document-versions.js +0 -114
  200. package/dist/lib/routes/document-versions.js.map +0 -1
  201. package/dist/lib/routes/documents-by-id.d.ts +0 -5
  202. package/dist/lib/routes/documents-by-id.d.ts.map +0 -1
  203. package/dist/lib/routes/documents-by-id.js +0 -188
  204. package/dist/lib/routes/documents-by-id.js.map +0 -1
  205. package/dist/lib/routes/documents-publish.d.ts +0 -4
  206. package/dist/lib/routes/documents-publish.d.ts.map +0 -1
  207. package/dist/lib/routes/documents-publish.js.map +0 -1
  208. package/dist/lib/routes/documents-query.d.ts +0 -26
  209. package/dist/lib/routes/documents-query.d.ts.map +0 -1
  210. package/dist/lib/routes/documents-query.js +0 -104
  211. package/dist/lib/routes/documents-query.js.map +0 -1
  212. package/dist/lib/routes/documents.d.ts +0 -4
  213. package/dist/lib/routes/documents.d.ts.map +0 -1
  214. package/dist/lib/routes/documents.js.map +0 -1
  215. package/dist/lib/routes/index.d.ts +0 -9
  216. package/dist/lib/routes/index.d.ts.map +0 -1
  217. package/dist/lib/routes/index.js +0 -15
  218. package/dist/lib/routes/index.js.map +0 -1
  219. package/dist/lib/routes/organizations-by-id.d.ts +0 -5
  220. package/dist/lib/routes/organizations-by-id.d.ts.map +0 -1
  221. package/dist/lib/routes/organizations-by-id.js.map +0 -1
  222. package/dist/lib/routes/organizations-invitations.d.ts +0 -4
  223. package/dist/lib/routes/organizations-invitations.d.ts.map +0 -1
  224. package/dist/lib/routes/organizations-invitations.js.map +0 -1
  225. package/dist/lib/routes/organizations-members.d.ts +0 -5
  226. package/dist/lib/routes/organizations-members.d.ts.map +0 -1
  227. package/dist/lib/routes/organizations-members.js.map +0 -1
  228. package/dist/lib/routes/organizations-switch.d.ts +0 -3
  229. package/dist/lib/routes/organizations-switch.d.ts.map +0 -1
  230. package/dist/lib/routes/organizations-switch.js +0 -59
  231. package/dist/lib/routes/organizations-switch.js.map +0 -1
  232. package/dist/lib/routes/organizations.d.ts +0 -4
  233. package/dist/lib/routes/organizations.d.ts.map +0 -1
  234. package/dist/lib/routes/organizations.js +0 -117
  235. package/dist/lib/routes/organizations.js.map +0 -1
  236. package/dist/lib/routes/roles-by-name.d.ts +0 -4
  237. package/dist/lib/routes/roles-by-name.d.ts.map +0 -1
  238. package/dist/lib/routes/roles-by-name.js +0 -112
  239. package/dist/lib/routes/roles-by-name.js.map +0 -1
  240. package/dist/lib/routes/roles.d.ts +0 -4
  241. package/dist/lib/routes/roles.d.ts.map +0 -1
  242. package/dist/lib/routes/roles.js +0 -91
  243. package/dist/lib/routes/roles.js.map +0 -1
  244. package/dist/lib/routes/schemas-by-type.d.ts +0 -3
  245. package/dist/lib/routes/schemas-by-type.d.ts.map +0 -1
  246. package/dist/lib/routes/schemas-by-type.js +0 -27
  247. package/dist/lib/routes/schemas-by-type.js.map +0 -1
  248. package/dist/lib/routes/schemas.d.ts +0 -3
  249. package/dist/lib/routes/schemas.d.ts.map +0 -1
  250. package/dist/lib/routes/schemas.js +0 -12
  251. package/dist/lib/routes/schemas.js.map +0 -1
  252. package/dist/lib/routes/user-preferences.d.ts +0 -4
  253. package/dist/lib/routes/user-preferences.d.ts.map +0 -1
  254. package/dist/lib/routes/user-preferences.js +0 -73
  255. package/dist/lib/routes/user-preferences.js.map +0 -1
  256. package/dist/lib/routes-exports.d.ts +0 -20
  257. package/dist/lib/routes-exports.d.ts.map +0 -1
  258. package/dist/lib/routes-exports.js +0 -27
  259. package/dist/lib/routes-exports.js.map +0 -1
  260. package/dist/routes/assets-bulk.d.ts +0 -3
  261. package/dist/routes/assets-bulk.d.ts.map +0 -1
  262. package/dist/routes/assets-by-id.d.ts +0 -5
  263. package/dist/routes/assets-by-id.d.ts.map +0 -1
  264. package/dist/routes/assets-by-id.js +0 -115
  265. package/dist/routes/assets-references-counts.d.ts +0 -7
  266. package/dist/routes/assets-references-counts.d.ts.map +0 -1
  267. package/dist/routes/assets-references-counts.js +0 -41
  268. package/dist/routes/assets-references.d.ts +0 -7
  269. package/dist/routes/assets-references.d.ts.map +0 -1
  270. package/dist/routes/assets-references.js +0 -34
  271. package/dist/routes/assets.d.ts +0 -4
  272. package/dist/routes/assets.d.ts.map +0 -1
  273. package/dist/routes/document-versions.d.ts +0 -5
  274. package/dist/routes/document-versions.d.ts.map +0 -1
  275. package/dist/routes/document-versions.js +0 -113
  276. package/dist/routes/documents-by-id.d.ts +0 -5
  277. package/dist/routes/documents-by-id.d.ts.map +0 -1
  278. package/dist/routes/documents-by-id.js +0 -187
  279. package/dist/routes/documents-publish.d.ts +0 -4
  280. package/dist/routes/documents-publish.d.ts.map +0 -1
  281. package/dist/routes/documents-query.d.ts +0 -26
  282. package/dist/routes/documents-query.d.ts.map +0 -1
  283. package/dist/routes/documents-query.js +0 -103
  284. package/dist/routes/documents.d.ts +0 -4
  285. package/dist/routes/documents.d.ts.map +0 -1
  286. package/dist/routes/index.d.ts +0 -9
  287. package/dist/routes/index.d.ts.map +0 -1
  288. package/dist/routes/index.js +0 -14
  289. package/dist/routes/organizations-by-id.d.ts +0 -5
  290. package/dist/routes/organizations-by-id.d.ts.map +0 -1
  291. package/dist/routes/organizations-invitations.d.ts +0 -4
  292. package/dist/routes/organizations-invitations.d.ts.map +0 -1
  293. package/dist/routes/organizations-members.d.ts +0 -5
  294. package/dist/routes/organizations-members.d.ts.map +0 -1
  295. package/dist/routes/organizations-switch.d.ts +0 -3
  296. package/dist/routes/organizations-switch.d.ts.map +0 -1
  297. package/dist/routes/organizations-switch.js +0 -58
  298. package/dist/routes/organizations.d.ts +0 -4
  299. package/dist/routes/organizations.d.ts.map +0 -1
  300. package/dist/routes/organizations.js +0 -116
  301. package/dist/routes/roles-by-name.d.ts +0 -4
  302. package/dist/routes/roles-by-name.d.ts.map +0 -1
  303. package/dist/routes/roles-by-name.js +0 -111
  304. package/dist/routes/roles.d.ts +0 -4
  305. package/dist/routes/roles.d.ts.map +0 -1
  306. package/dist/routes/roles.js +0 -90
  307. package/dist/routes/schemas-by-type.d.ts +0 -3
  308. package/dist/routes/schemas-by-type.d.ts.map +0 -1
  309. package/dist/routes/schemas-by-type.js +0 -26
  310. package/dist/routes/schemas.d.ts +0 -3
  311. package/dist/routes/schemas.d.ts.map +0 -1
  312. package/dist/routes/schemas.js +0 -11
  313. package/dist/routes/user-preferences.d.ts +0 -4
  314. package/dist/routes/user-preferences.d.ts.map +0 -1
  315. package/dist/routes/user-preferences.js +0 -72
  316. package/dist/routes-exports.d.ts +0 -20
  317. package/dist/routes-exports.d.ts.map +0 -1
  318. package/dist/routes-exports.js +0 -26
@@ -0,0 +1,8 @@
1
+ import { Hono } from 'hono';
2
+ import type { AphexEnv } from '../index.js';
3
+ /**
4
+ * POST /api/documents/query — Advanced document querying with complex
5
+ * filters. Body shape mirrors LocalAPI's `FindOptions`.
6
+ */
7
+ export declare const documentsQueryRouter: Hono<AphexEnv>;
8
+ //# sourceMappingURL=documents-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents-query.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/documents-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKzC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,IAAI,CAAC,QAAQ,CAiF/C,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { Hono } from 'hono';
2
+ import { zValidator } from '@hono/zod-validator';
3
+ import { authToContext } from '../../../local-api/auth-helpers.js';
4
+ import { PermissionError } from '../../../local-api/permissions.js';
5
+ import { cmsLogger } from '../../../utils/logger.js';
6
+ import { queryDocumentsRequest } from '../../../api/schemas/documents.js';
7
+ const DEFAULT_PAGE_SIZE = 20;
8
+ const DEFAULT_PAGE = 1;
9
+ /**
10
+ * POST /api/documents/query — Advanced document querying with complex
11
+ * filters. Body shape mirrors LocalAPI's `FindOptions`.
12
+ */
13
+ export const documentsQueryRouter = new Hono().post('/query', zValidator('json', queryDocumentsRequest, (result, c) => {
14
+ if (!result.success) {
15
+ return c.json({
16
+ success: false,
17
+ error: 'Bad Request',
18
+ message: 'Document type is required in request body',
19
+ issues: result.error.issues
20
+ }, 400);
21
+ }
22
+ }), async (c) => {
23
+ try {
24
+ const { localAPI } = c.var.aphexCMS;
25
+ const context = authToContext(c.var.auth);
26
+ const body = c.req.valid('json');
27
+ const documentType = body.type;
28
+ if (!localAPI.hasCollection(documentType)) {
29
+ return c.json({
30
+ success: false,
31
+ error: 'Invalid document type',
32
+ message: `Collection '${documentType}' not found. Available: ${localAPI.getCollectionNames().join(', ')}`
33
+ }, 400);
34
+ }
35
+ const page = body.page ?? DEFAULT_PAGE;
36
+ const pageSize = body.pageSize ?? body.limit ?? DEFAULT_PAGE_SIZE;
37
+ const offset = body.offset !== undefined ? body.offset : (page - 1) * pageSize;
38
+ const findOptions = {
39
+ where: body.where,
40
+ limit: pageSize,
41
+ offset,
42
+ sort: body.sort,
43
+ depth: body.depth ?? 0,
44
+ select: body.select,
45
+ perspective: body.perspective ?? 'draft',
46
+ includeChildOrganizations: body.includeChildOrganizations,
47
+ filterOrganizationIds: body.filterOrganizationIds
48
+ };
49
+ const result = await localAPI.collections[documentType].find(context, findOptions);
50
+ return c.json({
51
+ success: true,
52
+ data: result.docs,
53
+ pagination: {
54
+ total: result.totalDocs,
55
+ page: result.page,
56
+ pageSize: result.limit,
57
+ totalPages: result.totalPages,
58
+ hasNextPage: result.hasNextPage,
59
+ hasPrevPage: result.hasPrevPage
60
+ }
61
+ });
62
+ }
63
+ catch (error) {
64
+ cmsLogger.error('Failed to query documents:', error);
65
+ if (error instanceof PermissionError) {
66
+ return c.json({ success: false, error: 'Forbidden', message: error.message }, 403);
67
+ }
68
+ return c.json({
69
+ success: false,
70
+ error: 'Failed to query documents',
71
+ message: error instanceof Error ? error.message : 'Unknown error'
72
+ }, 500);
73
+ }
74
+ });
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ import type { AphexEnv } from '../index.js';
3
+ export declare const documentsRouter: Hono<AphexEnv>;
4
+ //# sourceMappingURL=documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/documents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKzC,eAAO,MAAM,eAAe,EAAE,IAAI,CAAC,QAAQ,CAuKxC,CAAC"}
@@ -1,28 +1,25 @@
1
- // Aphex CMS Document API Handlers
2
- import { json } from '@sveltejs/kit';
3
- import { authToContext } from '../local-api/auth-helpers.js';
4
- import { PermissionError } from '../local-api/permissions.js';
5
- import { cmsLogger } from '../utils/logger.js';
6
- import { createDocumentRequest, listDocumentsQuery } from '../api/schemas/documents.js';
7
- // Default values for API
1
+ import { Hono } from 'hono';
2
+ import { zValidator } from '@hono/zod-validator';
3
+ import { authToContext } from '../../../local-api/auth-helpers.js';
4
+ import { PermissionError } from '../../../local-api/permissions.js';
5
+ import { cmsLogger } from '../../../utils/logger.js';
6
+ import { createDocumentRequest, listDocumentsQuery } from '../../../api/schemas/documents.js';
8
7
  const DEFAULT_PAGE_SIZE = 20;
9
8
  const DEFAULT_PAGE = 1;
10
- // GET /api/documents - Simple document listing with basic filters
11
- export const GET = async ({ url, locals }) => {
9
+ export const documentsRouter = new Hono()
10
+ .get('/', zValidator('query', listDocumentsQuery, (result, c) => {
11
+ if (!result.success) {
12
+ return c.json({
13
+ success: false,
14
+ error: 'Invalid query parameters',
15
+ issues: result.error.issues
16
+ }, 400);
17
+ }
18
+ }), async (c) => {
12
19
  try {
13
- const { localAPI } = locals.aphexCMS;
14
- const context = authToContext(locals.auth);
15
- // Parse + validate query params with zod
16
- const rawQuery = Object.fromEntries(url.searchParams.entries());
17
- const parsedQuery = listDocumentsQuery.safeParse(rawQuery);
18
- if (!parsedQuery.success) {
19
- return json({
20
- success: false,
21
- error: 'Invalid query parameters',
22
- issues: parsedQuery.error.issues
23
- }, { status: 400 });
24
- }
25
- const q = parsedQuery.data;
20
+ const { localAPI } = c.var.aphexCMS;
21
+ const context = authToContext(c.var.auth);
22
+ const q = c.req.valid('query');
26
23
  const docType = q.type ?? q.docType;
27
24
  const status = q.status;
28
25
  const sortParam = Array.isArray(q.sort) ? q.sort.join(',') : q.sort;
@@ -34,38 +31,35 @@ export const GET = async ({ url, locals }) => {
34
31
  const offset = (page - 1) * pageSize;
35
32
  const depth = q.depth ?? 0;
36
33
  if (!docType) {
37
- return json({
34
+ return c.json({
38
35
  success: false,
39
36
  error: 'Bad Request',
40
37
  message: 'Document type is required. Use ?type=page or ?docType=page'
41
- }, { status: 400 });
38
+ }, 400);
42
39
  }
43
- // Get collection API (TypeScript-safe)
44
40
  const collection = localAPI.collections[docType];
45
41
  if (!collection) {
46
- return json({
42
+ return c.json({
47
43
  success: false,
48
44
  error: 'Invalid document type',
49
45
  message: `Collection '${docType}' not found. Available: ${localAPI.getCollectionNames().join(', ')}`
50
- }, { status: 400 });
46
+ }, 400);
51
47
  }
52
- // Build where clause from query params
53
48
  const where = {};
54
49
  if (status) {
55
50
  where.status = { equals: status };
56
51
  }
57
- // Query via LocalAPI
58
52
  const result = await collection.find(context, {
59
53
  where: Object.keys(where).length > 0 ? where : undefined,
60
54
  limit: pageSize,
61
- offset: offset,
62
- depth: depth,
55
+ offset,
56
+ depth,
63
57
  sort: sortParam || undefined,
64
58
  perspective,
65
59
  includeChildOrganizations,
66
60
  filterOrganizationIds
67
61
  });
68
- return json({
62
+ return c.json({
69
63
  success: true,
70
64
  data: result.docs,
71
65
  pagination: {
@@ -81,77 +75,60 @@ export const GET = async ({ url, locals }) => {
81
75
  catch (error) {
82
76
  cmsLogger.error('Failed to fetch documents:', error);
83
77
  if (error instanceof PermissionError) {
84
- return json({
85
- success: false,
86
- error: 'Forbidden',
87
- message: error.message
88
- }, { status: 403 });
78
+ return c.json({ success: false, error: 'Forbidden', message: error.message }, 403);
89
79
  }
90
- return json({
80
+ return c.json({
91
81
  success: false,
92
82
  error: 'Failed to fetch documents',
93
83
  message: error instanceof Error ? error.message : 'Unknown error'
94
- }, { status: 500 });
84
+ }, 500);
95
85
  }
96
- };
97
- // POST /api/documents - Create new document
98
- export const POST = async ({ request, locals }) => {
86
+ })
87
+ .post('/', zValidator('json', createDocumentRequest, (result, c) => {
88
+ if (!result.success) {
89
+ return c.json({
90
+ success: false,
91
+ error: 'Invalid request body',
92
+ issues: result.error.issues
93
+ }, 400);
94
+ }
95
+ }), async (c) => {
99
96
  try {
100
- const { localAPI } = locals.aphexCMS;
101
- const context = authToContext(locals.auth);
102
- const rawBody = await request.json();
103
- const parsed = createDocumentRequest.safeParse(rawBody);
104
- if (!parsed.success) {
105
- return json({
106
- success: false,
107
- error: 'Invalid request body',
108
- issues: parsed.error.issues
109
- }, { status: 400 });
110
- }
111
- const documentType = parsed.data.type;
112
- const documentData = (parsed.data.draftData ?? parsed.data.data);
113
- const shouldPublish = parsed.data.publish ?? false;
114
- // Get collection API (TypeScript-safe)
97
+ const { localAPI } = c.var.aphexCMS;
98
+ const context = authToContext(c.var.auth);
99
+ const parsed = c.req.valid('json');
100
+ const documentType = parsed.type;
101
+ const documentData = (parsed.draftData ?? parsed.data);
102
+ const shouldPublish = parsed.publish ?? false;
115
103
  const collection = localAPI.collections[documentType];
116
104
  if (!collection) {
117
- return json({
105
+ return c.json({
118
106
  success: false,
119
107
  error: 'Invalid document type',
120
108
  message: `Collection '${documentType}' not found. Available: ${localAPI.getCollectionNames().join(', ')}`
121
- }, { status: 400 });
109
+ }, 400);
122
110
  }
123
- // Create via LocalAPI (permission checks and validation happen inside)
124
111
  const result = await collection.create(context, documentData, {
125
112
  publish: shouldPublish
126
113
  });
127
- return json({
114
+ return c.json({
128
115
  success: true,
129
116
  data: result.document,
130
117
  validation: result.validation
131
- }, { status: 201 });
118
+ }, 201);
132
119
  }
133
120
  catch (error) {
134
121
  cmsLogger.error('Failed to create document:', error);
135
122
  if (error instanceof PermissionError) {
136
- return json({
137
- success: false,
138
- error: 'Forbidden',
139
- message: error.message
140
- }, { status: 403 });
123
+ return c.json({ success: false, error: 'Forbidden', message: error.message }, 403);
141
124
  }
142
- // Validation errors from publish attempts
143
125
  if (error instanceof Error && error.message.includes('validation errors')) {
144
- return json({
145
- success: false,
146
- error: 'Validation failed',
147
- message: error.message
148
- }, { status: 400 });
126
+ return c.json({ success: false, error: 'Validation failed', message: error.message }, 400);
149
127
  }
150
- return json({
128
+ return c.json({
151
129
  success: false,
152
130
  error: 'Failed to create document',
153
131
  message: error instanceof Error ? error.message : 'Unknown error'
154
- }, { status: 500 });
132
+ }, 500);
155
133
  }
156
- };
157
- //# sourceMappingURL=documents.js.map
134
+ });
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ import type { AphexEnv } from '../index.js';
3
+ export declare const organizationsByIdRouter: Hono<AphexEnv>;
4
+ //# sourceMappingURL=organizations-by-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations-by-id.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/organizations-by-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,uBAAuB,EAAE,IAAI,CAAC,QAAQ,CAuOhD,CAAC"}
@@ -1,111 +1,97 @@
1
- // Aphex CMS Organization by ID API Handlers
2
- import { json } from '@sveltejs/kit';
3
- import { cmsLogger } from '../utils/logger.js';
4
- import { updateOrganizationRequest } from '../api/schemas/organizations.js';
5
- import { hasCapability } from '../types/capabilities.js';
6
- // GET /api/organizations/[id] - Get organization by ID
7
- export const GET = async ({ params, locals }) => {
1
+ import { Hono } from 'hono';
2
+ import { zValidator } from '@hono/zod-validator';
3
+ import { cmsLogger } from '../../../utils/logger.js';
4
+ import { updateOrganizationRequest } from '../../../api/schemas/organizations.js';
5
+ import { hasCapability } from '../../../types/capabilities.js';
6
+ export const organizationsByIdRouter = new Hono()
7
+ .get('/:id', async (c) => {
8
8
  try {
9
- const { databaseAdapter } = locals.aphexCMS;
10
- const auth = locals.auth;
11
- const { id } = params;
9
+ const { databaseAdapter } = c.var.aphexCMS;
10
+ const auth = c.var.auth;
11
+ const id = c.req.param('id');
12
12
  if (!auth || auth.type !== 'session') {
13
- return json({
13
+ return c.json({
14
14
  success: false,
15
15
  error: 'Unauthorized',
16
16
  message: 'Session authentication required'
17
- }, { status: 401 });
17
+ }, 401);
18
18
  }
19
19
  if (!id) {
20
- return json({
20
+ return c.json({
21
21
  success: false,
22
22
  error: 'Missing required field',
23
23
  message: 'Organization ID is required'
24
- }, { status: 400 });
24
+ }, 400);
25
25
  }
26
- // Check if user is a member of this organization
27
26
  const membership = await databaseAdapter.findUserMembership(auth.user.id, id);
28
27
  if (!membership) {
29
- return json({
28
+ return c.json({
30
29
  success: false,
31
30
  error: 'Forbidden',
32
31
  message: 'You are not a member of this organization'
33
- }, { status: 403 });
32
+ }, 403);
34
33
  }
35
34
  const organization = await databaseAdapter.findOrganizationById(id);
36
35
  if (!organization) {
37
- return json({
38
- success: false,
39
- error: 'Organization not found'
40
- }, { status: 404 });
36
+ return c.json({ success: false, error: 'Organization not found' }, 404);
41
37
  }
42
- return json({
43
- success: true,
44
- data: organization
45
- });
38
+ return c.json({ success: true, data: organization });
46
39
  }
47
40
  catch (error) {
48
41
  cmsLogger.error('Failed to fetch organization:', error);
49
- return json({
42
+ return c.json({
50
43
  success: false,
51
44
  error: 'Failed to fetch organization',
52
45
  message: error instanceof Error ? error.message : 'Unknown error'
53
- }, { status: 500 });
46
+ }, 500);
47
+ }
48
+ })
49
+ .patch('/:id', zValidator('json', updateOrganizationRequest, (result, c) => {
50
+ if (!result.success) {
51
+ return c.json({
52
+ success: false,
53
+ error: 'Invalid request body',
54
+ issues: result.error.issues
55
+ }, 400);
54
56
  }
55
- };
56
- // PATCH /api/organizations/[id] - Update organization
57
- export const PATCH = async ({ params, request, locals }) => {
57
+ }), async (c) => {
58
58
  try {
59
- const { databaseAdapter } = locals.aphexCMS;
60
- const auth = locals.auth;
61
- const { id } = params;
59
+ const { databaseAdapter } = c.var.aphexCMS;
60
+ const auth = c.var.auth;
61
+ const id = c.req.param('id');
62
62
  if (!auth || auth.type !== 'session') {
63
- return json({
63
+ return c.json({
64
64
  success: false,
65
65
  error: 'Unauthorized',
66
66
  message: 'Session authentication required'
67
- }, { status: 401 });
67
+ }, 401);
68
68
  }
69
69
  if (!id) {
70
- return json({
70
+ return c.json({
71
71
  success: false,
72
72
  error: 'Missing required field',
73
73
  message: 'Organization ID is required'
74
- }, { status: 400 });
74
+ }, 400);
75
75
  }
76
- // Require `org.settings` capability + membership in the target org.
77
- // Membership check stands regardless — even a capability holder can only
78
- // edit orgs they actually belong to.
79
76
  const membership = await databaseAdapter.findUserMembership(auth.user.id, id);
80
77
  if (!membership || !hasCapability(auth, 'org.settings')) {
81
- return json({
78
+ return c.json({
82
79
  success: false,
83
80
  error: 'Forbidden',
84
81
  message: 'You do not have permission to update organization settings'
85
- }, { status: 403 });
82
+ }, 403);
86
83
  }
87
- const rawBody = await request.json();
88
- const parsed = updateOrganizationRequest.safeParse(rawBody);
89
- if (!parsed.success) {
90
- return json({
91
- success: false,
92
- error: 'Invalid request body',
93
- issues: parsed.error.issues
94
- }, { status: 400 });
95
- }
96
- const body = parsed.data;
97
- // Validate: if slug is being changed, check it's not already taken
84
+ const body = c.req.valid('json');
98
85
  if (body.slug) {
99
86
  const existingOrg = await databaseAdapter.findOrganizationBySlug(body.slug);
100
87
  if (existingOrg && existingOrg.id !== id) {
101
- return json({
88
+ return c.json({
102
89
  success: false,
103
90
  error: 'Slug already exists',
104
91
  message: `Organization with slug '${body.slug}' already exists`
105
- }, { status: 409 });
92
+ }, 409);
106
93
  }
107
94
  }
108
- // Update organization
109
95
  const updateData = {};
110
96
  if (body.name !== undefined)
111
97
  updateData.name = body.name;
@@ -115,57 +101,47 @@ export const PATCH = async ({ params, request, locals }) => {
115
101
  updateData.metadata = body.metadata;
116
102
  const updatedOrganization = await databaseAdapter.updateOrganization(id, updateData);
117
103
  if (!updatedOrganization) {
118
- return json({
119
- success: false,
120
- error: 'Organization not found'
121
- }, { status: 404 });
104
+ return c.json({ success: false, error: 'Organization not found' }, 404);
122
105
  }
123
- return json({
124
- success: true,
125
- data: updatedOrganization
126
- });
106
+ return c.json({ success: true, data: updatedOrganization });
127
107
  }
128
108
  catch (error) {
129
109
  cmsLogger.error('Failed to update organization:', error);
130
- return json({
110
+ return c.json({
131
111
  success: false,
132
112
  error: 'Failed to update organization',
133
113
  message: error instanceof Error ? error.message : 'Unknown error'
134
- }, { status: 500 });
114
+ }, 500);
135
115
  }
136
- };
137
- // DELETE /api/organizations/[id] - Delete an organization
138
- export const DELETE = async ({ params, locals }) => {
116
+ })
117
+ .delete('/:id', async (c) => {
139
118
  try {
140
- const { databaseAdapter } = locals.aphexCMS;
141
- const auth = locals.auth;
142
- const { id } = params;
119
+ const { databaseAdapter } = c.var.aphexCMS;
120
+ const auth = c.var.auth;
121
+ const id = c.req.param('id');
143
122
  if (!auth || auth.type !== 'session') {
144
- return json({
123
+ return c.json({
145
124
  success: false,
146
125
  error: 'Unauthorized',
147
126
  message: 'Session authentication required'
148
- }, { status: 401 });
127
+ }, 401);
149
128
  }
150
129
  if (!id) {
151
- return json({
130
+ return c.json({
152
131
  success: false,
153
132
  error: 'Missing required field',
154
133
  message: 'Organization ID is required'
155
- }, { status: 400 });
134
+ }, 400);
156
135
  }
157
- // Only owners can delete an organization
158
136
  const membership = await databaseAdapter.findUserMembership(auth.user.id, id);
159
137
  if (!membership || membership.role !== 'owner') {
160
- return json({
138
+ return c.json({
161
139
  success: false,
162
140
  error: 'Forbidden',
163
141
  message: 'Only owners can delete an organization'
164
- }, { status: 403 });
142
+ }, 403);
165
143
  }
166
- // Get all members of the organization
167
144
  const members = await databaseAdapter.findOrganizationMembers(id);
168
- // Handle member lifecycle
169
145
  for (const member of members) {
170
146
  const userSession = await databaseAdapter.findUserSession(member.userId);
171
147
  if (userSession?.activeOrganizationId === id) {
@@ -179,24 +155,17 @@ export const DELETE = async ({ params, locals }) => {
179
155
  }
180
156
  }
181
157
  }
182
- // Delete all members from the organization
183
158
  await databaseAdapter.removeAllMembers(id);
184
- // Delete all invitations for the organization
185
159
  await databaseAdapter.removeAllInvitations(id);
186
- // Delete the organization
187
160
  await databaseAdapter.deleteOrganization(id);
188
- return json({
189
- success: true,
190
- message: 'Organization deleted successfully'
191
- });
161
+ return c.json({ success: true, message: 'Organization deleted successfully' });
192
162
  }
193
163
  catch (error) {
194
164
  cmsLogger.error('Failed to delete organization:', error);
195
- return json({
165
+ return c.json({
196
166
  success: false,
197
167
  error: 'Failed to delete organization',
198
168
  message: error instanceof Error ? error.message : 'Unknown error'
199
- }, { status: 500 });
169
+ }, 500);
200
170
  }
201
- };
202
- //# sourceMappingURL=organizations-by-id.js.map
171
+ });
@@ -0,0 +1,10 @@
1
+ import { Hono } from 'hono';
2
+ import type { AphexEnv } from '../index.js';
3
+ /**
4
+ * Note: in studio, invitations are wrapped by a SvelteKit `+server.ts`
5
+ * that adds email sending after the invite row is created. While that
6
+ * shim exists, this Hono router sits dormant (specific SK routes win
7
+ * over the catch-all). Phase 5 moves the wrapper into `config.api`.
8
+ */
9
+ export declare const organizationsInvitationsRouter: Hono<AphexEnv>;
10
+ //# sourceMappingURL=organizations-invitations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations-invitations.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/organizations-invitations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,EAAE,IAAI,CAAC,QAAQ,CA0MxD,CAAC"}