@aphexcms/cms-core 3.0.0 → 5.0.0

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 (311) 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/config.d.ts.map +1 -1
  5. package/dist/config.js +1 -2
  6. package/dist/hooks.d.ts +3 -4
  7. package/dist/hooks.d.ts.map +1 -1
  8. package/dist/hooks.js +20 -99
  9. package/dist/index.d.ts +9 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +43 -4
  12. package/dist/lib/api/schemas/user.d.ts +10 -0
  13. package/dist/lib/api/schemas/user.d.ts.map +1 -1
  14. package/dist/lib/api/schemas/user.js +10 -0
  15. package/dist/lib/api/schemas/user.js.map +1 -1
  16. package/dist/lib/config.d.ts.map +1 -1
  17. package/dist/lib/config.js +1 -2
  18. package/dist/lib/config.js.map +1 -1
  19. package/dist/lib/hooks.d.ts +3 -4
  20. package/dist/lib/hooks.d.ts.map +1 -1
  21. package/dist/lib/hooks.js +20 -99
  22. package/dist/lib/hooks.js.map +1 -1
  23. package/dist/lib/index.d.ts +9 -1
  24. package/dist/lib/index.d.ts.map +1 -1
  25. package/dist/lib/index.js +43 -4
  26. package/dist/lib/index.js.map +1 -1
  27. package/dist/lib/server/api/index.d.ts +55 -0
  28. package/dist/lib/server/api/index.d.ts.map +1 -0
  29. package/dist/lib/server/api/index.js +107 -0
  30. package/dist/lib/server/api/index.js.map +1 -0
  31. package/dist/lib/server/api/routes/assets-bulk.d.ts +4 -0
  32. package/dist/lib/server/api/routes/assets-bulk.d.ts.map +1 -0
  33. package/dist/{routes → lib/server/api/routes}/assets-bulk.js +23 -23
  34. package/dist/lib/server/api/routes/assets-bulk.js.map +1 -0
  35. package/dist/lib/server/api/routes/assets-by-id.d.ts +4 -0
  36. package/dist/lib/server/api/routes/assets-by-id.d.ts.map +1 -0
  37. package/dist/lib/server/api/routes/assets-by-id.js +108 -0
  38. package/dist/lib/server/api/routes/assets-by-id.js.map +1 -0
  39. package/dist/lib/server/api/routes/assets-references.d.ts +15 -0
  40. package/dist/lib/server/api/routes/assets-references.d.ts.map +1 -0
  41. package/dist/lib/server/api/routes/assets-references.js +78 -0
  42. package/dist/lib/server/api/routes/assets-references.js.map +1 -0
  43. package/dist/lib/server/api/routes/assets.d.ts +4 -0
  44. package/dist/lib/server/api/routes/assets.d.ts.map +1 -0
  45. package/dist/{routes → lib/server/api/routes}/assets.js +76 -87
  46. package/dist/lib/server/api/routes/assets.js.map +1 -0
  47. package/dist/lib/server/api/routes/document-versions.d.ts +4 -0
  48. package/dist/lib/server/api/routes/document-versions.d.ts.map +1 -0
  49. package/dist/lib/server/api/routes/document-versions.js +113 -0
  50. package/dist/lib/server/api/routes/document-versions.js.map +1 -0
  51. package/dist/lib/server/api/routes/documents-by-id.d.ts +4 -0
  52. package/dist/lib/server/api/routes/documents-by-id.d.ts.map +1 -0
  53. package/dist/lib/server/api/routes/documents-by-id.js +148 -0
  54. package/dist/lib/server/api/routes/documents-by-id.js.map +1 -0
  55. package/dist/lib/server/api/routes/documents-publish.d.ts +4 -0
  56. package/dist/lib/server/api/routes/documents-publish.d.ts.map +1 -0
  57. package/dist/{routes → lib/server/api/routes}/documents-publish.js +42 -58
  58. package/dist/lib/server/api/routes/documents-publish.js.map +1 -0
  59. package/dist/lib/server/api/routes/documents-query.d.ts +8 -0
  60. package/dist/lib/server/api/routes/documents-query.d.ts.map +1 -0
  61. package/dist/lib/server/api/routes/documents-query.js +75 -0
  62. package/dist/lib/server/api/routes/documents-query.js.map +1 -0
  63. package/dist/lib/server/api/routes/documents.d.ts +4 -0
  64. package/dist/lib/server/api/routes/documents.d.ts.map +1 -0
  65. package/dist/{routes → lib/server/api/routes}/documents.js +55 -76
  66. package/dist/lib/server/api/routes/documents.js.map +1 -0
  67. package/dist/lib/server/api/routes/organizations-by-id.d.ts +4 -0
  68. package/dist/lib/server/api/routes/organizations-by-id.d.ts.map +1 -0
  69. package/dist/{routes → lib/server/api/routes}/organizations-by-id.js +62 -91
  70. package/dist/lib/server/api/routes/organizations-by-id.js.map +1 -0
  71. package/dist/lib/server/api/routes/organizations-invitations.d.ts +10 -0
  72. package/dist/lib/server/api/routes/organizations-invitations.d.ts.map +1 -0
  73. package/dist/{routes → lib/server/api/routes}/organizations-invitations.js +67 -78
  74. package/dist/lib/server/api/routes/organizations-invitations.js.map +1 -0
  75. package/dist/lib/server/api/routes/organizations-members.d.ts +4 -0
  76. package/dist/lib/server/api/routes/organizations-members.d.ts.map +1 -0
  77. package/dist/{routes → lib/server/api/routes}/organizations-members.js +74 -106
  78. package/dist/lib/server/api/routes/organizations-members.js.map +1 -0
  79. package/dist/lib/server/api/routes/organizations-switch.d.ts +4 -0
  80. package/dist/lib/server/api/routes/organizations-switch.d.ts.map +1 -0
  81. package/dist/lib/server/api/routes/organizations-switch.js +54 -0
  82. package/dist/lib/server/api/routes/organizations-switch.js.map +1 -0
  83. package/dist/lib/server/api/routes/organizations.d.ts +4 -0
  84. package/dist/lib/server/api/routes/organizations.d.ts.map +1 -0
  85. package/dist/lib/server/api/routes/organizations.js +99 -0
  86. package/dist/lib/server/api/routes/organizations.js.map +1 -0
  87. package/dist/lib/server/api/routes/roles.d.ts +12 -0
  88. package/dist/lib/server/api/routes/roles.d.ts.map +1 -0
  89. package/dist/lib/server/api/routes/roles.js +219 -0
  90. package/dist/lib/server/api/routes/roles.js.map +1 -0
  91. package/dist/lib/server/api/routes/schemas.d.ts +4 -0
  92. package/dist/lib/server/api/routes/schemas.d.ts.map +1 -0
  93. package/dist/lib/server/api/routes/schemas.js +27 -0
  94. package/dist/lib/server/api/routes/schemas.js.map +1 -0
  95. package/dist/lib/server/api/routes/user-preferences.d.ts +4 -0
  96. package/dist/lib/server/api/routes/user-preferences.d.ts.map +1 -0
  97. package/dist/lib/server/api/routes/user-preferences.js +63 -0
  98. package/dist/lib/server/api/routes/user-preferences.js.map +1 -0
  99. package/dist/lib/server/api/routes/user.d.ts +12 -0
  100. package/dist/lib/server/api/routes/user.d.ts.map +1 -0
  101. package/dist/lib/server/api/routes/user.js +114 -0
  102. package/dist/lib/server/api/routes/user.js.map +1 -0
  103. package/dist/lib/server/index.d.ts +2 -1
  104. package/dist/lib/server/index.d.ts.map +1 -1
  105. package/dist/lib/server/index.js +7 -3
  106. package/dist/lib/server/index.js.map +1 -1
  107. package/dist/lib/types/config.d.ts +28 -29
  108. package/dist/lib/types/config.d.ts.map +1 -1
  109. package/dist/server/api/index.d.ts +55 -0
  110. package/dist/server/api/index.d.ts.map +1 -0
  111. package/dist/server/api/index.js +106 -0
  112. package/dist/server/api/routes/assets-bulk.d.ts +4 -0
  113. package/dist/server/api/routes/assets-bulk.d.ts.map +1 -0
  114. package/dist/{lib → server/api}/routes/assets-bulk.js +22 -24
  115. package/dist/server/api/routes/assets-by-id.d.ts +4 -0
  116. package/dist/server/api/routes/assets-by-id.d.ts.map +1 -0
  117. package/dist/server/api/routes/assets-by-id.js +107 -0
  118. package/dist/server/api/routes/assets-references.d.ts +15 -0
  119. package/dist/server/api/routes/assets-references.d.ts.map +1 -0
  120. package/dist/server/api/routes/assets-references.js +77 -0
  121. package/dist/server/api/routes/assets.d.ts +4 -0
  122. package/dist/server/api/routes/assets.d.ts.map +1 -0
  123. package/dist/{lib → server/api}/routes/assets.js +75 -88
  124. package/dist/server/api/routes/document-versions.d.ts +4 -0
  125. package/dist/server/api/routes/document-versions.d.ts.map +1 -0
  126. package/dist/server/api/routes/document-versions.js +112 -0
  127. package/dist/server/api/routes/documents-by-id.d.ts +4 -0
  128. package/dist/server/api/routes/documents-by-id.d.ts.map +1 -0
  129. package/dist/server/api/routes/documents-by-id.js +147 -0
  130. package/dist/server/api/routes/documents-publish.d.ts +4 -0
  131. package/dist/server/api/routes/documents-publish.d.ts.map +1 -0
  132. package/dist/{lib → server/api}/routes/documents-publish.js +41 -59
  133. package/dist/server/api/routes/documents-query.d.ts +8 -0
  134. package/dist/server/api/routes/documents-query.d.ts.map +1 -0
  135. package/dist/server/api/routes/documents-query.js +74 -0
  136. package/dist/server/api/routes/documents.d.ts +4 -0
  137. package/dist/server/api/routes/documents.d.ts.map +1 -0
  138. package/dist/{lib → server/api}/routes/documents.js +54 -77
  139. package/dist/server/api/routes/organizations-by-id.d.ts +4 -0
  140. package/dist/server/api/routes/organizations-by-id.d.ts.map +1 -0
  141. package/dist/{lib → server/api}/routes/organizations-by-id.js +61 -92
  142. package/dist/server/api/routes/organizations-invitations.d.ts +10 -0
  143. package/dist/server/api/routes/organizations-invitations.d.ts.map +1 -0
  144. package/dist/{lib → server/api}/routes/organizations-invitations.js +66 -79
  145. package/dist/server/api/routes/organizations-members.d.ts +4 -0
  146. package/dist/server/api/routes/organizations-members.d.ts.map +1 -0
  147. package/dist/{lib → server/api}/routes/organizations-members.js +73 -107
  148. package/dist/server/api/routes/organizations-switch.d.ts +4 -0
  149. package/dist/server/api/routes/organizations-switch.d.ts.map +1 -0
  150. package/dist/server/api/routes/organizations-switch.js +53 -0
  151. package/dist/server/api/routes/organizations.d.ts +4 -0
  152. package/dist/server/api/routes/organizations.d.ts.map +1 -0
  153. package/dist/server/api/routes/organizations.js +98 -0
  154. package/dist/server/api/routes/roles.d.ts +12 -0
  155. package/dist/server/api/routes/roles.d.ts.map +1 -0
  156. package/dist/server/api/routes/roles.js +218 -0
  157. package/dist/server/api/routes/schemas.d.ts +4 -0
  158. package/dist/server/api/routes/schemas.d.ts.map +1 -0
  159. package/dist/server/api/routes/schemas.js +26 -0
  160. package/dist/server/api/routes/user-preferences.d.ts +4 -0
  161. package/dist/server/api/routes/user-preferences.d.ts.map +1 -0
  162. package/dist/server/api/routes/user-preferences.js +62 -0
  163. package/dist/server/api/routes/user.d.ts +12 -0
  164. package/dist/server/api/routes/user.d.ts.map +1 -0
  165. package/dist/server/api/routes/user.js +113 -0
  166. package/dist/server/index.d.ts +2 -1
  167. package/dist/server/index.d.ts.map +1 -1
  168. package/dist/server/index.js +7 -3
  169. package/dist/types/config.d.ts +28 -29
  170. package/dist/types/config.d.ts.map +1 -1
  171. package/package.json +4 -2
  172. package/dist/lib/routes/assets-bulk.d.ts +0 -3
  173. package/dist/lib/routes/assets-bulk.d.ts.map +0 -1
  174. package/dist/lib/routes/assets-bulk.js.map +0 -1
  175. package/dist/lib/routes/assets-by-id.d.ts +0 -5
  176. package/dist/lib/routes/assets-by-id.d.ts.map +0 -1
  177. package/dist/lib/routes/assets-by-id.js +0 -116
  178. package/dist/lib/routes/assets-by-id.js.map +0 -1
  179. package/dist/lib/routes/assets-references-counts.d.ts +0 -7
  180. package/dist/lib/routes/assets-references-counts.d.ts.map +0 -1
  181. package/dist/lib/routes/assets-references-counts.js +0 -42
  182. package/dist/lib/routes/assets-references-counts.js.map +0 -1
  183. package/dist/lib/routes/assets-references.d.ts +0 -7
  184. package/dist/lib/routes/assets-references.d.ts.map +0 -1
  185. package/dist/lib/routes/assets-references.js +0 -35
  186. package/dist/lib/routes/assets-references.js.map +0 -1
  187. package/dist/lib/routes/assets.d.ts +0 -4
  188. package/dist/lib/routes/assets.d.ts.map +0 -1
  189. package/dist/lib/routes/assets.js.map +0 -1
  190. package/dist/lib/routes/document-versions.d.ts +0 -5
  191. package/dist/lib/routes/document-versions.d.ts.map +0 -1
  192. package/dist/lib/routes/document-versions.js +0 -114
  193. package/dist/lib/routes/document-versions.js.map +0 -1
  194. package/dist/lib/routes/documents-by-id.d.ts +0 -5
  195. package/dist/lib/routes/documents-by-id.d.ts.map +0 -1
  196. package/dist/lib/routes/documents-by-id.js +0 -188
  197. package/dist/lib/routes/documents-by-id.js.map +0 -1
  198. package/dist/lib/routes/documents-publish.d.ts +0 -4
  199. package/dist/lib/routes/documents-publish.d.ts.map +0 -1
  200. package/dist/lib/routes/documents-publish.js.map +0 -1
  201. package/dist/lib/routes/documents-query.d.ts +0 -26
  202. package/dist/lib/routes/documents-query.d.ts.map +0 -1
  203. package/dist/lib/routes/documents-query.js +0 -104
  204. package/dist/lib/routes/documents-query.js.map +0 -1
  205. package/dist/lib/routes/documents.d.ts +0 -4
  206. package/dist/lib/routes/documents.d.ts.map +0 -1
  207. package/dist/lib/routes/documents.js.map +0 -1
  208. package/dist/lib/routes/index.d.ts +0 -9
  209. package/dist/lib/routes/index.d.ts.map +0 -1
  210. package/dist/lib/routes/index.js +0 -15
  211. package/dist/lib/routes/index.js.map +0 -1
  212. package/dist/lib/routes/organizations-by-id.d.ts +0 -5
  213. package/dist/lib/routes/organizations-by-id.d.ts.map +0 -1
  214. package/dist/lib/routes/organizations-by-id.js.map +0 -1
  215. package/dist/lib/routes/organizations-invitations.d.ts +0 -4
  216. package/dist/lib/routes/organizations-invitations.d.ts.map +0 -1
  217. package/dist/lib/routes/organizations-invitations.js.map +0 -1
  218. package/dist/lib/routes/organizations-members.d.ts +0 -5
  219. package/dist/lib/routes/organizations-members.d.ts.map +0 -1
  220. package/dist/lib/routes/organizations-members.js.map +0 -1
  221. package/dist/lib/routes/organizations-switch.d.ts +0 -3
  222. package/dist/lib/routes/organizations-switch.d.ts.map +0 -1
  223. package/dist/lib/routes/organizations-switch.js +0 -59
  224. package/dist/lib/routes/organizations-switch.js.map +0 -1
  225. package/dist/lib/routes/organizations.d.ts +0 -4
  226. package/dist/lib/routes/organizations.d.ts.map +0 -1
  227. package/dist/lib/routes/organizations.js +0 -117
  228. package/dist/lib/routes/organizations.js.map +0 -1
  229. package/dist/lib/routes/roles-by-name.d.ts +0 -4
  230. package/dist/lib/routes/roles-by-name.d.ts.map +0 -1
  231. package/dist/lib/routes/roles-by-name.js +0 -112
  232. package/dist/lib/routes/roles-by-name.js.map +0 -1
  233. package/dist/lib/routes/roles.d.ts +0 -4
  234. package/dist/lib/routes/roles.d.ts.map +0 -1
  235. package/dist/lib/routes/roles.js +0 -91
  236. package/dist/lib/routes/roles.js.map +0 -1
  237. package/dist/lib/routes/schemas-by-type.d.ts +0 -3
  238. package/dist/lib/routes/schemas-by-type.d.ts.map +0 -1
  239. package/dist/lib/routes/schemas-by-type.js +0 -27
  240. package/dist/lib/routes/schemas-by-type.js.map +0 -1
  241. package/dist/lib/routes/schemas.d.ts +0 -3
  242. package/dist/lib/routes/schemas.d.ts.map +0 -1
  243. package/dist/lib/routes/schemas.js +0 -12
  244. package/dist/lib/routes/schemas.js.map +0 -1
  245. package/dist/lib/routes/user-preferences.d.ts +0 -4
  246. package/dist/lib/routes/user-preferences.d.ts.map +0 -1
  247. package/dist/lib/routes/user-preferences.js +0 -73
  248. package/dist/lib/routes/user-preferences.js.map +0 -1
  249. package/dist/lib/routes-exports.d.ts +0 -20
  250. package/dist/lib/routes-exports.d.ts.map +0 -1
  251. package/dist/lib/routes-exports.js +0 -27
  252. package/dist/lib/routes-exports.js.map +0 -1
  253. package/dist/routes/assets-bulk.d.ts +0 -3
  254. package/dist/routes/assets-bulk.d.ts.map +0 -1
  255. package/dist/routes/assets-by-id.d.ts +0 -5
  256. package/dist/routes/assets-by-id.d.ts.map +0 -1
  257. package/dist/routes/assets-by-id.js +0 -115
  258. package/dist/routes/assets-references-counts.d.ts +0 -7
  259. package/dist/routes/assets-references-counts.d.ts.map +0 -1
  260. package/dist/routes/assets-references-counts.js +0 -41
  261. package/dist/routes/assets-references.d.ts +0 -7
  262. package/dist/routes/assets-references.d.ts.map +0 -1
  263. package/dist/routes/assets-references.js +0 -34
  264. package/dist/routes/assets.d.ts +0 -4
  265. package/dist/routes/assets.d.ts.map +0 -1
  266. package/dist/routes/document-versions.d.ts +0 -5
  267. package/dist/routes/document-versions.d.ts.map +0 -1
  268. package/dist/routes/document-versions.js +0 -113
  269. package/dist/routes/documents-by-id.d.ts +0 -5
  270. package/dist/routes/documents-by-id.d.ts.map +0 -1
  271. package/dist/routes/documents-by-id.js +0 -187
  272. package/dist/routes/documents-publish.d.ts +0 -4
  273. package/dist/routes/documents-publish.d.ts.map +0 -1
  274. package/dist/routes/documents-query.d.ts +0 -26
  275. package/dist/routes/documents-query.d.ts.map +0 -1
  276. package/dist/routes/documents-query.js +0 -103
  277. package/dist/routes/documents.d.ts +0 -4
  278. package/dist/routes/documents.d.ts.map +0 -1
  279. package/dist/routes/index.d.ts +0 -9
  280. package/dist/routes/index.d.ts.map +0 -1
  281. package/dist/routes/index.js +0 -14
  282. package/dist/routes/organizations-by-id.d.ts +0 -5
  283. package/dist/routes/organizations-by-id.d.ts.map +0 -1
  284. package/dist/routes/organizations-invitations.d.ts +0 -4
  285. package/dist/routes/organizations-invitations.d.ts.map +0 -1
  286. package/dist/routes/organizations-members.d.ts +0 -5
  287. package/dist/routes/organizations-members.d.ts.map +0 -1
  288. package/dist/routes/organizations-switch.d.ts +0 -3
  289. package/dist/routes/organizations-switch.d.ts.map +0 -1
  290. package/dist/routes/organizations-switch.js +0 -58
  291. package/dist/routes/organizations.d.ts +0 -4
  292. package/dist/routes/organizations.d.ts.map +0 -1
  293. package/dist/routes/organizations.js +0 -116
  294. package/dist/routes/roles-by-name.d.ts +0 -4
  295. package/dist/routes/roles-by-name.d.ts.map +0 -1
  296. package/dist/routes/roles-by-name.js +0 -111
  297. package/dist/routes/roles.d.ts +0 -4
  298. package/dist/routes/roles.d.ts.map +0 -1
  299. package/dist/routes/roles.js +0 -90
  300. package/dist/routes/schemas-by-type.d.ts +0 -3
  301. package/dist/routes/schemas-by-type.d.ts.map +0 -1
  302. package/dist/routes/schemas-by-type.js +0 -26
  303. package/dist/routes/schemas.d.ts +0 -3
  304. package/dist/routes/schemas.d.ts.map +0 -1
  305. package/dist/routes/schemas.js +0 -11
  306. package/dist/routes/user-preferences.d.ts +0 -4
  307. package/dist/routes/user-preferences.d.ts.map +0 -1
  308. package/dist/routes/user-preferences.js +0 -72
  309. package/dist/routes-exports.d.ts +0 -20
  310. package/dist/routes-exports.d.ts.map +0 -1
  311. package/dist/routes-exports.js +0 -26
@@ -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,23 +155,18 @@ 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
- };
171
+ });
172
+ //# sourceMappingURL=organizations-by-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations-by-id.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-by-id.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -1,84 +1,81 @@
1
- // Aphex CMS Organization Invitations API Handlers
2
- import { json } from '@sveltejs/kit';
3
- import { cmsLogger } from '../utils/logger.js';
4
- import { inviteMemberRequest, cancelInvitationRequest } from '../api/schemas/organizations.js';
5
- import { hasCapability } from '../types/capabilities.js';
6
- // POST /api/organizations/invitations - Create/send an invitation
7
- export const POST = async ({ request, locals }) => {
1
+ import { Hono } from 'hono';
2
+ import { zValidator } from '@hono/zod-validator';
3
+ import { cmsLogger } from '../../../utils/logger.js';
4
+ import { inviteMemberRequest, cancelInvitationRequest } from '../../../api/schemas/organizations.js';
5
+ import { hasCapability } from '../../../types/capabilities.js';
6
+ /**
7
+ * Note: in studio, invitations are wrapped by a SvelteKit `+server.ts`
8
+ * that adds email sending after the invite row is created. While that
9
+ * shim exists, this Hono router sits dormant (specific SK routes win
10
+ * over the catch-all). Phase 5 moves the wrapper into `config.api`.
11
+ */
12
+ export const organizationsInvitationsRouter = new Hono()
13
+ .post('/invitations', zValidator('json', inviteMemberRequest, (result, c) => {
14
+ if (!result.success) {
15
+ return c.json({
16
+ success: false,
17
+ error: 'Invalid request body',
18
+ message: 'email and role are required',
19
+ issues: result.error.issues
20
+ }, 400);
21
+ }
22
+ }), async (c) => {
8
23
  try {
9
- const { databaseAdapter } = locals.aphexCMS;
10
- const auth = locals.auth;
24
+ const { databaseAdapter } = c.var.aphexCMS;
25
+ const auth = c.var.auth;
11
26
  if (!auth || auth.type !== 'session') {
12
- return json({
27
+ return c.json({
13
28
  success: false,
14
29
  error: 'Unauthorized',
15
30
  message: 'Session authentication required'
16
- }, { status: 401 });
31
+ }, 401);
17
32
  }
18
33
  if (!hasCapability(auth, 'member.invite')) {
19
- return json({
34
+ return c.json({
20
35
  success: false,
21
36
  error: 'Forbidden',
22
37
  message: 'You do not have permission to invite members'
23
- }, { status: 403 });
24
- }
25
- const rawBody = await request.json();
26
- const parsed = inviteMemberRequest.safeParse(rawBody);
27
- if (!parsed.success) {
28
- return json({
29
- success: false,
30
- error: 'Invalid request body',
31
- message: 'email and role are required',
32
- issues: parsed.error.issues
33
- }, { status: 400 });
38
+ }, 403);
34
39
  }
35
- const body = parsed.data;
36
- // Verify the role exists in this organization. Defends against
37
- // clients sending a role name that was deleted between page load
38
- // and submit, or against typos slipping past the format regex.
40
+ const body = c.req.valid('json');
39
41
  const roleRow = await databaseAdapter.findRoleByName(auth.organizationId, body.role);
40
42
  if (!roleRow) {
41
- return json({
43
+ return c.json({
42
44
  success: false,
43
45
  error: 'Unknown role',
44
46
  message: `No role named "${body.role}" in this organization`
45
- }, { status: 400 });
47
+ }, 400);
46
48
  }
47
- // Reject self-invitation
48
49
  if (body.email.toLowerCase() === auth.user.email.toLowerCase()) {
49
- return json({
50
+ return c.json({
50
51
  success: false,
51
52
  error: 'Invalid invitation',
52
53
  message: 'You cannot invite yourself'
53
- }, { status: 400 });
54
+ }, 400);
54
55
  }
55
- // Reject if the invitee is already a member of the organization
56
- if (locals.aphexCMS.auth) {
57
- const existingUser = await locals.aphexCMS.auth.getUserByEmail(body.email);
56
+ if (c.var.aphexCMS.auth) {
57
+ const existingUser = await c.var.aphexCMS.auth.getUserByEmail(body.email);
58
58
  if (existingUser) {
59
59
  const existingMembership = await databaseAdapter.findUserMembership(existingUser.id, auth.organizationId);
60
60
  if (existingMembership) {
61
- return json({
61
+ return c.json({
62
62
  success: false,
63
63
  error: 'Already a member',
64
64
  message: 'This user is already a member of the organization'
65
- }, { status: 400 });
65
+ }, 400);
66
66
  }
67
67
  }
68
68
  }
69
- // Check if there's already a pending invitation for this email
70
69
  const existingInvitations = await databaseAdapter.findOrganizationInvitations(auth.organizationId);
71
70
  const pendingInvitation = existingInvitations.find((inv) => inv.email.toLowerCase() === body.email.toLowerCase() && inv.acceptedAt === null);
72
71
  if (pendingInvitation) {
73
- return json({
72
+ return c.json({
74
73
  success: false,
75
74
  error: 'Already invited',
76
75
  message: 'This email has already been invited to the organization'
77
- }, { status: 400 });
76
+ }, 400);
78
77
  }
79
- // Generate a unique invitation token
80
78
  const token = crypto.randomUUID();
81
- // Create invitation - email sending is handled by the app layer
82
79
  const invitation = await databaseAdapter.createInvitation({
83
80
  organizationId: auth.organizationId,
84
81
  email: body.email.toLowerCase(),
@@ -87,70 +84,62 @@ export const POST = async ({ request, locals }) => {
87
84
  token,
88
85
  expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) // 7 days
89
86
  });
90
- return json({
87
+ return c.json({
91
88
  success: true,
92
89
  data: invitation,
93
90
  message: 'Invitation created successfully.'
94
- }, { status: 201 });
91
+ }, 201);
95
92
  }
96
93
  catch (error) {
97
94
  cmsLogger.error('Failed to create invitation:', error);
98
- return json({
95
+ return c.json({
99
96
  success: false,
100
97
  error: 'Failed to create invitation',
101
98
  message: error instanceof Error ? error.message : 'Unknown error'
102
- }, { status: 500 });
99
+ }, 500);
100
+ }
101
+ })
102
+ .delete('/invitations', zValidator('json', cancelInvitationRequest, (result, c) => {
103
+ if (!result.success) {
104
+ return c.json({
105
+ success: false,
106
+ error: 'Missing required field',
107
+ message: 'invitationId is required',
108
+ issues: result.error.issues
109
+ }, 400);
103
110
  }
104
- };
105
- // DELETE /api/organizations/invitations - Cancel an invitation
106
- export const DELETE = async ({ request, locals }) => {
111
+ }), async (c) => {
107
112
  try {
108
- const { databaseAdapter } = locals.aphexCMS;
109
- const auth = locals.auth;
113
+ const { databaseAdapter } = c.var.aphexCMS;
114
+ const auth = c.var.auth;
110
115
  if (!auth || auth.type !== 'session') {
111
- return json({
116
+ return c.json({
112
117
  success: false,
113
118
  error: 'Unauthorized',
114
119
  message: 'Session authentication required'
115
- }, { status: 401 });
120
+ }, 401);
116
121
  }
117
122
  if (!hasCapability(auth, 'member.invite')) {
118
- return json({
123
+ return c.json({
119
124
  success: false,
120
125
  error: 'Forbidden',
121
126
  message: 'You do not have permission to cancel invitations'
122
- }, { status: 403 });
127
+ }, 403);
123
128
  }
124
- const rawBody = await request.json();
125
- const parsed = cancelInvitationRequest.safeParse(rawBody);
126
- if (!parsed.success) {
127
- return json({
128
- success: false,
129
- error: 'Missing required field',
130
- message: 'invitationId is required',
131
- issues: parsed.error.issues
132
- }, { status: 400 });
133
- }
134
- const body = parsed.data;
135
- // Delete the invitation
129
+ const body = c.req.valid('json');
136
130
  const deleted = await databaseAdapter.deleteInvitation(body.invitationId);
137
131
  if (!deleted) {
138
- return json({
139
- success: false,
140
- error: 'Invitation not found'
141
- }, { status: 404 });
132
+ return c.json({ success: false, error: 'Invitation not found' }, 404);
142
133
  }
143
- return json({
144
- success: true,
145
- message: 'Invitation canceled successfully'
146
- });
134
+ return c.json({ success: true, message: 'Invitation canceled successfully' });
147
135
  }
148
136
  catch (error) {
149
137
  cmsLogger.error('Failed to cancel invitation:', error);
150
- return json({
138
+ return c.json({
151
139
  success: false,
152
140
  error: 'Failed to cancel invitation',
153
141
  message: error instanceof Error ? error.message : 'Unknown error'
154
- }, { status: 500 });
142
+ }, 500);
155
143
  }
156
- };
144
+ });
145
+ //# sourceMappingURL=organizations-invitations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations-invitations.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-invitations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ import type { AphexEnv } from '../index.js';
3
+ export declare const organizationsMembersRouter: Hono<AphexEnv>;
4
+ //# sourceMappingURL=organizations-members.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations-members.d.ts","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,0BAA0B,EAAE,IAAI,CAAC,QAAQ,CAgRpD,CAAC"}