@aphexcms/cms-core 4.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 (304) 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/lib/api/schemas/user.d.ts +10 -0
  10. package/dist/lib/api/schemas/user.d.ts.map +1 -1
  11. package/dist/lib/api/schemas/user.js +10 -0
  12. package/dist/lib/api/schemas/user.js.map +1 -1
  13. package/dist/lib/config.d.ts.map +1 -1
  14. package/dist/lib/config.js +1 -2
  15. package/dist/lib/config.js.map +1 -1
  16. package/dist/lib/hooks.d.ts +3 -4
  17. package/dist/lib/hooks.d.ts.map +1 -1
  18. package/dist/lib/hooks.js +20 -99
  19. package/dist/lib/hooks.js.map +1 -1
  20. package/dist/lib/server/api/index.d.ts +55 -0
  21. package/dist/lib/server/api/index.d.ts.map +1 -0
  22. package/dist/lib/server/api/index.js +107 -0
  23. package/dist/lib/server/api/index.js.map +1 -0
  24. package/dist/lib/server/api/routes/assets-bulk.d.ts +4 -0
  25. package/dist/lib/server/api/routes/assets-bulk.d.ts.map +1 -0
  26. package/dist/{routes → lib/server/api/routes}/assets-bulk.js +23 -23
  27. package/dist/lib/server/api/routes/assets-bulk.js.map +1 -0
  28. package/dist/lib/server/api/routes/assets-by-id.d.ts +4 -0
  29. package/dist/lib/server/api/routes/assets-by-id.d.ts.map +1 -0
  30. package/dist/lib/server/api/routes/assets-by-id.js +108 -0
  31. package/dist/lib/server/api/routes/assets-by-id.js.map +1 -0
  32. package/dist/lib/server/api/routes/assets-references.d.ts +15 -0
  33. package/dist/lib/server/api/routes/assets-references.d.ts.map +1 -0
  34. package/dist/lib/server/api/routes/assets-references.js +78 -0
  35. package/dist/lib/server/api/routes/assets-references.js.map +1 -0
  36. package/dist/lib/server/api/routes/assets.d.ts +4 -0
  37. package/dist/lib/server/api/routes/assets.d.ts.map +1 -0
  38. package/dist/{routes → lib/server/api/routes}/assets.js +76 -87
  39. package/dist/lib/server/api/routes/assets.js.map +1 -0
  40. package/dist/lib/server/api/routes/document-versions.d.ts +4 -0
  41. package/dist/lib/server/api/routes/document-versions.d.ts.map +1 -0
  42. package/dist/lib/server/api/routes/document-versions.js +113 -0
  43. package/dist/lib/server/api/routes/document-versions.js.map +1 -0
  44. package/dist/lib/server/api/routes/documents-by-id.d.ts +4 -0
  45. package/dist/lib/server/api/routes/documents-by-id.d.ts.map +1 -0
  46. package/dist/lib/server/api/routes/documents-by-id.js +148 -0
  47. package/dist/lib/server/api/routes/documents-by-id.js.map +1 -0
  48. package/dist/lib/server/api/routes/documents-publish.d.ts +4 -0
  49. package/dist/lib/server/api/routes/documents-publish.d.ts.map +1 -0
  50. package/dist/{routes → lib/server/api/routes}/documents-publish.js +42 -58
  51. package/dist/lib/server/api/routes/documents-publish.js.map +1 -0
  52. package/dist/lib/server/api/routes/documents-query.d.ts +8 -0
  53. package/dist/lib/server/api/routes/documents-query.d.ts.map +1 -0
  54. package/dist/lib/server/api/routes/documents-query.js +75 -0
  55. package/dist/lib/server/api/routes/documents-query.js.map +1 -0
  56. package/dist/lib/server/api/routes/documents.d.ts +4 -0
  57. package/dist/lib/server/api/routes/documents.d.ts.map +1 -0
  58. package/dist/{routes → lib/server/api/routes}/documents.js +55 -76
  59. package/dist/lib/server/api/routes/documents.js.map +1 -0
  60. package/dist/lib/server/api/routes/organizations-by-id.d.ts +4 -0
  61. package/dist/lib/server/api/routes/organizations-by-id.d.ts.map +1 -0
  62. package/dist/{routes → lib/server/api/routes}/organizations-by-id.js +62 -91
  63. package/dist/lib/server/api/routes/organizations-by-id.js.map +1 -0
  64. package/dist/lib/server/api/routes/organizations-invitations.d.ts +10 -0
  65. package/dist/lib/server/api/routes/organizations-invitations.d.ts.map +1 -0
  66. package/dist/{routes → lib/server/api/routes}/organizations-invitations.js +67 -78
  67. package/dist/lib/server/api/routes/organizations-invitations.js.map +1 -0
  68. package/dist/lib/server/api/routes/organizations-members.d.ts +4 -0
  69. package/dist/lib/server/api/routes/organizations-members.d.ts.map +1 -0
  70. package/dist/{routes → lib/server/api/routes}/organizations-members.js +74 -106
  71. package/dist/lib/server/api/routes/organizations-members.js.map +1 -0
  72. package/dist/lib/server/api/routes/organizations-switch.d.ts +4 -0
  73. package/dist/lib/server/api/routes/organizations-switch.d.ts.map +1 -0
  74. package/dist/lib/server/api/routes/organizations-switch.js +54 -0
  75. package/dist/lib/server/api/routes/organizations-switch.js.map +1 -0
  76. package/dist/lib/server/api/routes/organizations.d.ts +4 -0
  77. package/dist/lib/server/api/routes/organizations.d.ts.map +1 -0
  78. package/dist/lib/server/api/routes/organizations.js +99 -0
  79. package/dist/lib/server/api/routes/organizations.js.map +1 -0
  80. package/dist/lib/server/api/routes/roles.d.ts +12 -0
  81. package/dist/lib/server/api/routes/roles.d.ts.map +1 -0
  82. package/dist/lib/server/api/routes/roles.js +219 -0
  83. package/dist/lib/server/api/routes/roles.js.map +1 -0
  84. package/dist/lib/server/api/routes/schemas.d.ts +4 -0
  85. package/dist/lib/server/api/routes/schemas.d.ts.map +1 -0
  86. package/dist/lib/server/api/routes/schemas.js +27 -0
  87. package/dist/lib/server/api/routes/schemas.js.map +1 -0
  88. package/dist/lib/server/api/routes/user-preferences.d.ts +4 -0
  89. package/dist/lib/server/api/routes/user-preferences.d.ts.map +1 -0
  90. package/dist/lib/server/api/routes/user-preferences.js +63 -0
  91. package/dist/lib/server/api/routes/user-preferences.js.map +1 -0
  92. package/dist/lib/server/api/routes/user.d.ts +12 -0
  93. package/dist/lib/server/api/routes/user.d.ts.map +1 -0
  94. package/dist/lib/server/api/routes/user.js +114 -0
  95. package/dist/lib/server/api/routes/user.js.map +1 -0
  96. package/dist/lib/server/index.d.ts +2 -1
  97. package/dist/lib/server/index.d.ts.map +1 -1
  98. package/dist/lib/server/index.js +7 -3
  99. package/dist/lib/server/index.js.map +1 -1
  100. package/dist/lib/types/config.d.ts +28 -29
  101. package/dist/lib/types/config.d.ts.map +1 -1
  102. package/dist/server/api/index.d.ts +55 -0
  103. package/dist/server/api/index.d.ts.map +1 -0
  104. package/dist/server/api/index.js +106 -0
  105. package/dist/server/api/routes/assets-bulk.d.ts +4 -0
  106. package/dist/server/api/routes/assets-bulk.d.ts.map +1 -0
  107. package/dist/{lib → server/api}/routes/assets-bulk.js +22 -24
  108. package/dist/server/api/routes/assets-by-id.d.ts +4 -0
  109. package/dist/server/api/routes/assets-by-id.d.ts.map +1 -0
  110. package/dist/server/api/routes/assets-by-id.js +107 -0
  111. package/dist/server/api/routes/assets-references.d.ts +15 -0
  112. package/dist/server/api/routes/assets-references.d.ts.map +1 -0
  113. package/dist/server/api/routes/assets-references.js +77 -0
  114. package/dist/server/api/routes/assets.d.ts +4 -0
  115. package/dist/server/api/routes/assets.d.ts.map +1 -0
  116. package/dist/{lib → server/api}/routes/assets.js +75 -88
  117. package/dist/server/api/routes/document-versions.d.ts +4 -0
  118. package/dist/server/api/routes/document-versions.d.ts.map +1 -0
  119. package/dist/server/api/routes/document-versions.js +112 -0
  120. package/dist/server/api/routes/documents-by-id.d.ts +4 -0
  121. package/dist/server/api/routes/documents-by-id.d.ts.map +1 -0
  122. package/dist/server/api/routes/documents-by-id.js +147 -0
  123. package/dist/server/api/routes/documents-publish.d.ts +4 -0
  124. package/dist/server/api/routes/documents-publish.d.ts.map +1 -0
  125. package/dist/{lib → server/api}/routes/documents-publish.js +41 -59
  126. package/dist/server/api/routes/documents-query.d.ts +8 -0
  127. package/dist/server/api/routes/documents-query.d.ts.map +1 -0
  128. package/dist/server/api/routes/documents-query.js +74 -0
  129. package/dist/server/api/routes/documents.d.ts +4 -0
  130. package/dist/server/api/routes/documents.d.ts.map +1 -0
  131. package/dist/{lib → server/api}/routes/documents.js +54 -77
  132. package/dist/server/api/routes/organizations-by-id.d.ts +4 -0
  133. package/dist/server/api/routes/organizations-by-id.d.ts.map +1 -0
  134. package/dist/{lib → server/api}/routes/organizations-by-id.js +61 -92
  135. package/dist/server/api/routes/organizations-invitations.d.ts +10 -0
  136. package/dist/server/api/routes/organizations-invitations.d.ts.map +1 -0
  137. package/dist/{lib → server/api}/routes/organizations-invitations.js +66 -79
  138. package/dist/server/api/routes/organizations-members.d.ts +4 -0
  139. package/dist/server/api/routes/organizations-members.d.ts.map +1 -0
  140. package/dist/{lib → server/api}/routes/organizations-members.js +73 -107
  141. package/dist/server/api/routes/organizations-switch.d.ts +4 -0
  142. package/dist/server/api/routes/organizations-switch.d.ts.map +1 -0
  143. package/dist/server/api/routes/organizations-switch.js +53 -0
  144. package/dist/server/api/routes/organizations.d.ts +4 -0
  145. package/dist/server/api/routes/organizations.d.ts.map +1 -0
  146. package/dist/server/api/routes/organizations.js +98 -0
  147. package/dist/server/api/routes/roles.d.ts +12 -0
  148. package/dist/server/api/routes/roles.d.ts.map +1 -0
  149. package/dist/server/api/routes/roles.js +218 -0
  150. package/dist/server/api/routes/schemas.d.ts +4 -0
  151. package/dist/server/api/routes/schemas.d.ts.map +1 -0
  152. package/dist/server/api/routes/schemas.js +26 -0
  153. package/dist/server/api/routes/user-preferences.d.ts +4 -0
  154. package/dist/server/api/routes/user-preferences.d.ts.map +1 -0
  155. package/dist/server/api/routes/user-preferences.js +62 -0
  156. package/dist/server/api/routes/user.d.ts +12 -0
  157. package/dist/server/api/routes/user.d.ts.map +1 -0
  158. package/dist/server/api/routes/user.js +113 -0
  159. package/dist/server/index.d.ts +2 -1
  160. package/dist/server/index.d.ts.map +1 -1
  161. package/dist/server/index.js +7 -3
  162. package/dist/types/config.d.ts +28 -29
  163. package/dist/types/config.d.ts.map +1 -1
  164. package/package.json +4 -2
  165. package/dist/lib/routes/assets-bulk.d.ts +0 -3
  166. package/dist/lib/routes/assets-bulk.d.ts.map +0 -1
  167. package/dist/lib/routes/assets-bulk.js.map +0 -1
  168. package/dist/lib/routes/assets-by-id.d.ts +0 -5
  169. package/dist/lib/routes/assets-by-id.d.ts.map +0 -1
  170. package/dist/lib/routes/assets-by-id.js +0 -116
  171. package/dist/lib/routes/assets-by-id.js.map +0 -1
  172. package/dist/lib/routes/assets-references-counts.d.ts +0 -7
  173. package/dist/lib/routes/assets-references-counts.d.ts.map +0 -1
  174. package/dist/lib/routes/assets-references-counts.js +0 -42
  175. package/dist/lib/routes/assets-references-counts.js.map +0 -1
  176. package/dist/lib/routes/assets-references.d.ts +0 -7
  177. package/dist/lib/routes/assets-references.d.ts.map +0 -1
  178. package/dist/lib/routes/assets-references.js +0 -35
  179. package/dist/lib/routes/assets-references.js.map +0 -1
  180. package/dist/lib/routes/assets.d.ts +0 -4
  181. package/dist/lib/routes/assets.d.ts.map +0 -1
  182. package/dist/lib/routes/assets.js.map +0 -1
  183. package/dist/lib/routes/document-versions.d.ts +0 -5
  184. package/dist/lib/routes/document-versions.d.ts.map +0 -1
  185. package/dist/lib/routes/document-versions.js +0 -114
  186. package/dist/lib/routes/document-versions.js.map +0 -1
  187. package/dist/lib/routes/documents-by-id.d.ts +0 -5
  188. package/dist/lib/routes/documents-by-id.d.ts.map +0 -1
  189. package/dist/lib/routes/documents-by-id.js +0 -188
  190. package/dist/lib/routes/documents-by-id.js.map +0 -1
  191. package/dist/lib/routes/documents-publish.d.ts +0 -4
  192. package/dist/lib/routes/documents-publish.d.ts.map +0 -1
  193. package/dist/lib/routes/documents-publish.js.map +0 -1
  194. package/dist/lib/routes/documents-query.d.ts +0 -26
  195. package/dist/lib/routes/documents-query.d.ts.map +0 -1
  196. package/dist/lib/routes/documents-query.js +0 -104
  197. package/dist/lib/routes/documents-query.js.map +0 -1
  198. package/dist/lib/routes/documents.d.ts +0 -4
  199. package/dist/lib/routes/documents.d.ts.map +0 -1
  200. package/dist/lib/routes/documents.js.map +0 -1
  201. package/dist/lib/routes/index.d.ts +0 -9
  202. package/dist/lib/routes/index.d.ts.map +0 -1
  203. package/dist/lib/routes/index.js +0 -15
  204. package/dist/lib/routes/index.js.map +0 -1
  205. package/dist/lib/routes/organizations-by-id.d.ts +0 -5
  206. package/dist/lib/routes/organizations-by-id.d.ts.map +0 -1
  207. package/dist/lib/routes/organizations-by-id.js.map +0 -1
  208. package/dist/lib/routes/organizations-invitations.d.ts +0 -4
  209. package/dist/lib/routes/organizations-invitations.d.ts.map +0 -1
  210. package/dist/lib/routes/organizations-invitations.js.map +0 -1
  211. package/dist/lib/routes/organizations-members.d.ts +0 -5
  212. package/dist/lib/routes/organizations-members.d.ts.map +0 -1
  213. package/dist/lib/routes/organizations-members.js.map +0 -1
  214. package/dist/lib/routes/organizations-switch.d.ts +0 -3
  215. package/dist/lib/routes/organizations-switch.d.ts.map +0 -1
  216. package/dist/lib/routes/organizations-switch.js +0 -59
  217. package/dist/lib/routes/organizations-switch.js.map +0 -1
  218. package/dist/lib/routes/organizations.d.ts +0 -4
  219. package/dist/lib/routes/organizations.d.ts.map +0 -1
  220. package/dist/lib/routes/organizations.js +0 -117
  221. package/dist/lib/routes/organizations.js.map +0 -1
  222. package/dist/lib/routes/roles-by-name.d.ts +0 -4
  223. package/dist/lib/routes/roles-by-name.d.ts.map +0 -1
  224. package/dist/lib/routes/roles-by-name.js +0 -112
  225. package/dist/lib/routes/roles-by-name.js.map +0 -1
  226. package/dist/lib/routes/roles.d.ts +0 -4
  227. package/dist/lib/routes/roles.d.ts.map +0 -1
  228. package/dist/lib/routes/roles.js +0 -91
  229. package/dist/lib/routes/roles.js.map +0 -1
  230. package/dist/lib/routes/schemas-by-type.d.ts +0 -3
  231. package/dist/lib/routes/schemas-by-type.d.ts.map +0 -1
  232. package/dist/lib/routes/schemas-by-type.js +0 -27
  233. package/dist/lib/routes/schemas-by-type.js.map +0 -1
  234. package/dist/lib/routes/schemas.d.ts +0 -3
  235. package/dist/lib/routes/schemas.d.ts.map +0 -1
  236. package/dist/lib/routes/schemas.js +0 -12
  237. package/dist/lib/routes/schemas.js.map +0 -1
  238. package/dist/lib/routes/user-preferences.d.ts +0 -4
  239. package/dist/lib/routes/user-preferences.d.ts.map +0 -1
  240. package/dist/lib/routes/user-preferences.js +0 -73
  241. package/dist/lib/routes/user-preferences.js.map +0 -1
  242. package/dist/lib/routes-exports.d.ts +0 -20
  243. package/dist/lib/routes-exports.d.ts.map +0 -1
  244. package/dist/lib/routes-exports.js +0 -27
  245. package/dist/lib/routes-exports.js.map +0 -1
  246. package/dist/routes/assets-bulk.d.ts +0 -3
  247. package/dist/routes/assets-bulk.d.ts.map +0 -1
  248. package/dist/routes/assets-by-id.d.ts +0 -5
  249. package/dist/routes/assets-by-id.d.ts.map +0 -1
  250. package/dist/routes/assets-by-id.js +0 -115
  251. package/dist/routes/assets-references-counts.d.ts +0 -7
  252. package/dist/routes/assets-references-counts.d.ts.map +0 -1
  253. package/dist/routes/assets-references-counts.js +0 -41
  254. package/dist/routes/assets-references.d.ts +0 -7
  255. package/dist/routes/assets-references.d.ts.map +0 -1
  256. package/dist/routes/assets-references.js +0 -34
  257. package/dist/routes/assets.d.ts +0 -4
  258. package/dist/routes/assets.d.ts.map +0 -1
  259. package/dist/routes/document-versions.d.ts +0 -5
  260. package/dist/routes/document-versions.d.ts.map +0 -1
  261. package/dist/routes/document-versions.js +0 -113
  262. package/dist/routes/documents-by-id.d.ts +0 -5
  263. package/dist/routes/documents-by-id.d.ts.map +0 -1
  264. package/dist/routes/documents-by-id.js +0 -187
  265. package/dist/routes/documents-publish.d.ts +0 -4
  266. package/dist/routes/documents-publish.d.ts.map +0 -1
  267. package/dist/routes/documents-query.d.ts +0 -26
  268. package/dist/routes/documents-query.d.ts.map +0 -1
  269. package/dist/routes/documents-query.js +0 -103
  270. package/dist/routes/documents.d.ts +0 -4
  271. package/dist/routes/documents.d.ts.map +0 -1
  272. package/dist/routes/index.d.ts +0 -9
  273. package/dist/routes/index.d.ts.map +0 -1
  274. package/dist/routes/index.js +0 -14
  275. package/dist/routes/organizations-by-id.d.ts +0 -5
  276. package/dist/routes/organizations-by-id.d.ts.map +0 -1
  277. package/dist/routes/organizations-invitations.d.ts +0 -4
  278. package/dist/routes/organizations-invitations.d.ts.map +0 -1
  279. package/dist/routes/organizations-members.d.ts +0 -5
  280. package/dist/routes/organizations-members.d.ts.map +0 -1
  281. package/dist/routes/organizations-switch.d.ts +0 -3
  282. package/dist/routes/organizations-switch.d.ts.map +0 -1
  283. package/dist/routes/organizations-switch.js +0 -58
  284. package/dist/routes/organizations.d.ts +0 -4
  285. package/dist/routes/organizations.d.ts.map +0 -1
  286. package/dist/routes/organizations.js +0 -116
  287. package/dist/routes/roles-by-name.d.ts +0 -4
  288. package/dist/routes/roles-by-name.d.ts.map +0 -1
  289. package/dist/routes/roles-by-name.js +0 -111
  290. package/dist/routes/roles.d.ts +0 -4
  291. package/dist/routes/roles.d.ts.map +0 -1
  292. package/dist/routes/roles.js +0 -90
  293. package/dist/routes/schemas-by-type.d.ts +0 -3
  294. package/dist/routes/schemas-by-type.d.ts.map +0 -1
  295. package/dist/routes/schemas-by-type.js +0 -26
  296. package/dist/routes/schemas.d.ts +0 -3
  297. package/dist/routes/schemas.d.ts.map +0 -1
  298. package/dist/routes/schemas.js +0 -11
  299. package/dist/routes/user-preferences.d.ts +0 -4
  300. package/dist/routes/user-preferences.d.ts.map +0 -1
  301. package/dist/routes/user-preferences.js +0 -72
  302. package/dist/routes-exports.d.ts +0 -20
  303. package/dist/routes-exports.d.ts.map +0 -1
  304. package/dist/routes-exports.js +0 -26
@@ -1,213 +1,181 @@
1
- // Aphex CMS Organization Members API Handlers
2
- import { json } from '@sveltejs/kit';
3
- import { cmsLogger } from '../utils/logger.js';
4
- import { removeMemberRequest, updateMemberRoleRequest } from '../api/schemas/organizations.js';
5
- import { hasCapability } from '../types/capabilities.js';
6
- // GET /api/organizations/members - List organization members
7
- export const GET = async ({ locals }) => {
1
+ import { Hono } from 'hono';
2
+ import { zValidator } from '@hono/zod-validator';
3
+ import { cmsLogger } from '../../../utils/logger.js';
4
+ import { removeMemberRequest, updateMemberRoleRequest } from '../../../api/schemas/organizations.js';
5
+ import { hasCapability } from '../../../types/capabilities.js';
6
+ export const organizationsMembersRouter = new Hono()
7
+ .get('/members', async (c) => {
8
8
  try {
9
- const { databaseAdapter } = locals.aphexCMS;
10
- const auth = locals.auth;
9
+ const { databaseAdapter } = c.var.aphexCMS;
10
+ const auth = c.var.auth;
11
11
  if (!auth || auth.type !== 'session') {
12
- return json({
12
+ return c.json({
13
13
  success: false,
14
14
  error: 'Unauthorized',
15
15
  message: 'Session authentication required'
16
- }, { status: 401 });
16
+ }, 401);
17
17
  }
18
- // Get members of the current active organization
19
18
  const members = await databaseAdapter.findOrganizationMembers(auth.organizationId);
20
- return json({
21
- success: true,
22
- data: members
23
- });
19
+ return c.json({ success: true, data: members });
24
20
  }
25
21
  catch (error) {
26
22
  cmsLogger.error('Failed to fetch organization members:', error);
27
- return json({
23
+ return c.json({
28
24
  success: false,
29
25
  error: 'Failed to fetch members',
30
26
  message: error instanceof Error ? error.message : 'Unknown error'
31
- }, { status: 500 });
27
+ }, 500);
32
28
  }
33
- };
34
- // DELETE /api/organizations/members - Remove a member
35
- export const DELETE = async ({ request, locals }) => {
29
+ })
30
+ .delete('/members', zValidator('json', removeMemberRequest, (result, c) => {
31
+ if (!result.success) {
32
+ return c.json({
33
+ success: false,
34
+ error: 'Missing required field',
35
+ message: 'userId is required',
36
+ issues: result.error.issues
37
+ }, 400);
38
+ }
39
+ }), async (c) => {
36
40
  try {
37
- const { databaseAdapter } = locals.aphexCMS;
38
- const auth = locals.auth;
41
+ const { databaseAdapter } = c.var.aphexCMS;
42
+ const auth = c.var.auth;
39
43
  if (!auth || auth.type !== 'session') {
40
- return json({
44
+ return c.json({
41
45
  success: false,
42
46
  error: 'Unauthorized',
43
47
  message: 'Session authentication required'
44
- }, { status: 401 });
48
+ }, 401);
45
49
  }
46
50
  if (!hasCapability(auth, 'member.remove')) {
47
- return json({
51
+ return c.json({
48
52
  success: false,
49
53
  error: 'Forbidden',
50
54
  message: 'You do not have permission to remove members'
51
- }, { status: 403 });
55
+ }, 403);
52
56
  }
53
- const rawBody = await request.json();
54
- const parsed = removeMemberRequest.safeParse(rawBody);
55
- if (!parsed.success) {
56
- return json({
57
- success: false,
58
- error: 'Missing required field',
59
- message: 'userId is required',
60
- issues: parsed.error.issues
61
- }, { status: 400 });
62
- }
63
- const body = parsed.data;
64
- // Prevent removing yourself
57
+ const body = c.req.valid('json');
65
58
  if (body.userId === auth.user.id) {
66
- return json({
59
+ return c.json({
67
60
  success: false,
68
61
  error: 'Invalid operation',
69
62
  message: 'You cannot remove yourself from the organization'
70
- }, { status: 400 });
63
+ }, 400);
71
64
  }
72
- // Get the target member's role
73
65
  const targetMember = await databaseAdapter.findUserMembership(body.userId, auth.organizationId);
74
66
  if (!targetMember) {
75
- return json({
67
+ return c.json({
76
68
  success: false,
77
69
  error: 'Member not found',
78
70
  message: 'User is not a member of this organization'
79
- }, { status: 404 });
71
+ }, 404);
80
72
  }
81
- // Admins cannot remove owners
82
73
  if (auth.organizationRole === 'admin' && targetMember.role === 'owner') {
83
- return json({
74
+ return c.json({
84
75
  success: false,
85
76
  error: 'Forbidden',
86
77
  message: 'Admins cannot remove owners'
87
- }, { status: 403 });
78
+ }, 403);
88
79
  }
89
- // Remove the member
90
80
  const removed = await databaseAdapter.removeMember(auth.organizationId, body.userId);
91
81
  if (!removed) {
92
- return json({
93
- success: false,
94
- error: 'Failed to remove member'
95
- }, { status: 500 });
82
+ return c.json({ success: false, error: 'Failed to remove member' }, 500);
96
83
  }
97
- // Clear the user's session if their active org is the one they were removed from
98
84
  const userSession = await databaseAdapter.findUserSession(body.userId);
99
85
  if (userSession?.activeOrganizationId === auth.organizationId) {
100
86
  cmsLogger.debug(`[Organizations]: Clearing user session for ${body.userId} - removed from active org ${auth.organizationId}`);
101
- // Check if user has other organizations
102
87
  const otherOrgs = await databaseAdapter.findUserOrganizations(body.userId);
103
88
  if (otherOrgs.length > 0 && otherOrgs[0]) {
104
- // Set their first remaining org as active
105
89
  await databaseAdapter.updateUserSession(body.userId, otherOrgs[0].organization.id);
106
90
  cmsLogger.debug(`[Organizations]: Set org ${otherOrgs[0].organization.id} as new active org for ${body.userId}`);
107
91
  }
108
92
  else {
109
- // No other orgs - delete the session so invitations can be processed on next login
110
93
  await databaseAdapter.deleteUserSession(body.userId);
111
94
  cmsLogger.debug(`[Organizations]: Deleted user session for ${body.userId} - no remaining organizations`);
112
95
  }
113
96
  }
114
- return json({
115
- success: true,
116
- message: 'Member removed successfully'
117
- });
97
+ return c.json({ success: true, message: 'Member removed successfully' });
118
98
  }
119
99
  catch (error) {
120
100
  cmsLogger.error('Failed to remove member:', error);
121
- return json({
101
+ return c.json({
122
102
  success: false,
123
103
  error: 'Failed to remove member',
124
104
  message: error instanceof Error ? error.message : 'Unknown error'
125
- }, { status: 500 });
105
+ }, 500);
126
106
  }
127
- };
128
- // PATCH /api/organizations/members - Update member role
129
- export const PATCH = async ({ request, locals }) => {
107
+ })
108
+ .patch('/members', zValidator('json', updateMemberRoleRequest, (result, c) => {
109
+ if (!result.success) {
110
+ return c.json({
111
+ success: false,
112
+ error: 'Invalid request body',
113
+ message: 'userId and role are required',
114
+ issues: result.error.issues
115
+ }, 400);
116
+ }
117
+ }), async (c) => {
130
118
  try {
131
- const { databaseAdapter } = locals.aphexCMS;
132
- const auth = locals.auth;
119
+ const { databaseAdapter } = c.var.aphexCMS;
120
+ const auth = c.var.auth;
133
121
  if (!auth || auth.type !== 'session') {
134
- return json({
122
+ return c.json({
135
123
  success: false,
136
124
  error: 'Unauthorized',
137
125
  message: 'Session authentication required'
138
- }, { status: 401 });
126
+ }, 401);
139
127
  }
140
128
  if (!hasCapability(auth, 'member.changeRole')) {
141
- return json({
129
+ return c.json({
142
130
  success: false,
143
131
  error: 'Forbidden',
144
132
  message: 'You do not have permission to change member roles'
145
- }, { status: 403 });
133
+ }, 403);
146
134
  }
147
- const rawBody = await request.json();
148
- const parsed = updateMemberRoleRequest.safeParse(rawBody);
149
- if (!parsed.success) {
150
- return json({
151
- success: false,
152
- error: 'Invalid request body',
153
- message: 'userId and role are required',
154
- issues: parsed.error.issues
155
- }, { status: 400 });
156
- }
157
- const body = parsed.data;
158
- // Verify the target role exists in this organization.
135
+ const body = c.req.valid('json');
159
136
  const roleRow = await databaseAdapter.findRoleByName(auth.organizationId, body.role);
160
137
  if (!roleRow) {
161
- return json({
138
+ return c.json({
162
139
  success: false,
163
140
  error: 'Unknown role',
164
141
  message: `No role named "${body.role}" in this organization`
165
- }, { status: 400 });
142
+ }, 400);
166
143
  }
167
- // Prevent changing your own role
168
144
  if (body.userId === auth.user.id) {
169
- return json({
145
+ return c.json({
170
146
  success: false,
171
147
  error: 'Invalid operation',
172
148
  message: 'You cannot change your own role'
173
- }, { status: 400 });
149
+ }, 400);
174
150
  }
175
- // Get the target member's current role
176
151
  const targetMember = await databaseAdapter.findUserMembership(body.userId, auth.organizationId);
177
152
  if (!targetMember) {
178
- return json({
153
+ return c.json({
179
154
  success: false,
180
155
  error: 'Member not found',
181
156
  message: 'User is not a member of this organization'
182
- }, { status: 404 });
157
+ }, 404);
183
158
  }
184
- // Admins cannot modify owners
185
159
  if (auth.organizationRole === 'admin' && targetMember.role === 'owner') {
186
- return json({
160
+ return c.json({
187
161
  success: false,
188
162
  error: 'Forbidden',
189
163
  message: 'Admins cannot modify owner roles'
190
- }, { status: 403 });
164
+ }, 403);
191
165
  }
192
- // Update the role
193
166
  const updatedMember = await databaseAdapter.updateMemberRole(auth.organizationId, body.userId, body.role);
194
167
  if (!updatedMember) {
195
- return json({
196
- success: false,
197
- error: 'Failed to update role'
198
- }, { status: 500 });
168
+ return c.json({ success: false, error: 'Failed to update role' }, 500);
199
169
  }
200
- return json({
201
- success: true,
202
- data: updatedMember
203
- });
170
+ return c.json({ success: true, data: updatedMember });
204
171
  }
205
172
  catch (error) {
206
173
  cmsLogger.error('Failed to update member role:', error);
207
- return json({
174
+ return c.json({
208
175
  success: false,
209
176
  error: 'Failed to update role',
210
177
  message: error instanceof Error ? error.message : 'Unknown error'
211
- }, { status: 500 });
178
+ }, 500);
212
179
  }
213
- };
180
+ });
181
+ //# sourceMappingURL=organizations-members.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations-members.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-members.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 organizationsSwitchRouter: Hono<AphexEnv>;
4
+ //# sourceMappingURL=organizations-switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations-switch.d.ts","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-switch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,yBAAyB,EAAE,IAAI,CAAC,QAAQ,CAwEpD,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { Hono } from 'hono';
2
+ import { zValidator } from '@hono/zod-validator';
3
+ import { cmsLogger } from '../../../utils/logger.js';
4
+ import { switchOrganizationRequest } from '../../../api/schemas/organizations.js';
5
+ export const organizationsSwitchRouter = new Hono().post('/switch', zValidator('json', switchOrganizationRequest, (result, c) => {
6
+ if (!result.success) {
7
+ return c.json({
8
+ success: false,
9
+ error: 'Missing required field',
10
+ message: 'organizationId is required',
11
+ issues: result.error.issues
12
+ }, 400);
13
+ }
14
+ }), async (c) => {
15
+ try {
16
+ const { databaseAdapter } = c.var.aphexCMS;
17
+ const auth = c.var.auth;
18
+ if (!auth || auth.type !== 'session') {
19
+ return c.json({
20
+ success: false,
21
+ error: 'Unauthorized',
22
+ message: 'Session authentication required'
23
+ }, 401);
24
+ }
25
+ const body = c.req.valid('json');
26
+ const membership = await databaseAdapter.findUserMembership(auth.user.id, body.organizationId);
27
+ if (!membership) {
28
+ return c.json({
29
+ success: false,
30
+ error: 'Access denied',
31
+ message: 'You are not a member of this organization'
32
+ }, 403);
33
+ }
34
+ await databaseAdapter.updateUserSession(auth.user.id, body.organizationId);
35
+ const organization = await databaseAdapter.findOrganizationById(body.organizationId);
36
+ return c.json({
37
+ success: true,
38
+ data: {
39
+ organizationId: body.organizationId,
40
+ organizationName: organization?.name,
41
+ role: membership.role
42
+ }
43
+ });
44
+ }
45
+ catch (error) {
46
+ cmsLogger.error('Failed to switch organization:', error);
47
+ return c.json({
48
+ success: false,
49
+ error: 'Failed to switch organization',
50
+ message: error instanceof Error ? error.message : 'Unknown error'
51
+ }, 500);
52
+ }
53
+ });
54
+ //# sourceMappingURL=organizations-switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations-switch.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-switch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAG/E,MAAM,CAAC,MAAM,yBAAyB,GAAmB,IAAI,IAAI,EAAY,CAAC,IAAI,CACjF,SAAS,EACT,UAAU,CAAC,MAAM,EAAE,yBAAyB,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,CAAC,IAAI,CACZ;YACC,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,wBAAwB;YAC/B,OAAO,EAAE,4BAA4B;YACrC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;SAC3B,EACD,GAAG,CACH,CAAC;IACH,CAAC;AACF,CAAC,CAAC,EACF,KAAK,EAAE,CAAC,EAAE,EAAE;IACX,IAAI,CAAC;QACJ,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3C,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QAExB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,CAAC,IAAI,CACZ;gBACC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,iCAAiC;aAC1C,EACD,GAAG,CACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEjC,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,kBAAkB,CAC1D,IAAI,CAAC,IAAI,CAAC,EAAE,EACZ,IAAI,CAAC,cAAc,CACnB,CAAC;QAEF,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,IAAI,CACZ;gBACC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,eAAe;gBACtB,OAAO,EAAE,2CAA2C;aACpD,EACD,GAAG,CACH,CAAC;QACH,CAAC;QAED,MAAM,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3E,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAErF,OAAO,CAAC,CAAC,IAAI,CAAC;YACb,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACL,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,gBAAgB,EAAE,YAAY,EAAE,IAAI;gBACpC,IAAI,EAAE,UAAU,CAAC,IAAI;aACrB;SACD,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,SAAS,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO,CAAC,CAAC,IAAI,CACZ;YACC,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,+BAA+B;YACtC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SACjE,EACD,GAAG,CACH,CAAC;IACH,CAAC;AACF,CAAC,CACD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ import type { AphexEnv } from '../index.js';
3
+ export declare const organizationsRouter: Hono<AphexEnv>;
4
+ //# sourceMappingURL=organizations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations.d.ts","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CA8H7C,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { Hono } from 'hono';
2
+ import { zValidator } from '@hono/zod-validator';
3
+ import { cmsLogger } from '../../../utils/logger.js';
4
+ import { createOrganizationRequest } from '../../../api/schemas/organizations.js';
5
+ export const organizationsRouter = new Hono()
6
+ .get('/', async (c) => {
7
+ try {
8
+ const { databaseAdapter } = c.var.aphexCMS;
9
+ const auth = c.var.auth;
10
+ if (!auth || auth.type !== 'session') {
11
+ return c.json({
12
+ success: false,
13
+ error: 'Unauthorized',
14
+ message: 'Session authentication required'
15
+ }, 401);
16
+ }
17
+ const memberships = await databaseAdapter.findUserOrganizations(auth.user.id);
18
+ const organizations = memberships.map((m) => ({
19
+ id: m.organization.id,
20
+ name: m.organization.name,
21
+ slug: m.organization.slug,
22
+ metadata: m.organization.metadata,
23
+ role: m.member.role,
24
+ joinedAt: m.member.createdAt,
25
+ isActive: m.organization.id === auth.organizationId
26
+ }));
27
+ return c.json({ success: true, data: organizations });
28
+ }
29
+ catch (error) {
30
+ cmsLogger.error('Failed to fetch organizations:', error);
31
+ return c.json({
32
+ success: false,
33
+ error: 'Failed to fetch organizations',
34
+ message: error instanceof Error ? error.message : 'Unknown error'
35
+ }, 500);
36
+ }
37
+ })
38
+ .post('/', zValidator('json', createOrganizationRequest, (result, c) => {
39
+ if (!result.success) {
40
+ return c.json({
41
+ success: false,
42
+ error: 'Invalid request body',
43
+ message: 'Organization name and slug are required',
44
+ issues: result.error.issues
45
+ }, 400);
46
+ }
47
+ }), async (c) => {
48
+ try {
49
+ const { databaseAdapter } = c.var.aphexCMS;
50
+ const auth = c.var.auth;
51
+ if (!auth || auth.type !== 'session') {
52
+ return c.json({
53
+ success: false,
54
+ error: 'Unauthorized',
55
+ message: 'Session authentication required'
56
+ }, 401);
57
+ }
58
+ if (auth.user.role !== 'super_admin') {
59
+ return c.json({
60
+ success: false,
61
+ error: 'Forbidden',
62
+ message: 'Only super admins can create organizations'
63
+ }, 403);
64
+ }
65
+ const body = c.req.valid('json');
66
+ const existingOrg = await databaseAdapter.findOrganizationBySlug(body.slug);
67
+ if (existingOrg) {
68
+ return c.json({
69
+ success: false,
70
+ error: 'Slug already exists',
71
+ message: `Organization with slug '${body.slug}' already exists`
72
+ }, 409);
73
+ }
74
+ const newOrganization = await databaseAdapter.createOrganization({
75
+ name: body.name,
76
+ slug: body.slug,
77
+ metadata: body.metadata || null,
78
+ parentOrganizationId: auth.organizationId,
79
+ createdBy: auth.user.id
80
+ });
81
+ await databaseAdapter.seedBuiltinRoles(newOrganization.id);
82
+ await databaseAdapter.addMember({
83
+ organizationId: newOrganization.id,
84
+ userId: auth.user.id,
85
+ role: 'owner'
86
+ });
87
+ await databaseAdapter.updateUserSession(auth.user.id, newOrganization.id);
88
+ return c.json({ success: true, data: newOrganization }, 201);
89
+ }
90
+ catch (error) {
91
+ cmsLogger.error('Failed to create organization:', error);
92
+ return c.json({
93
+ success: false,
94
+ error: 'Failed to create organization',
95
+ message: error instanceof Error ? error.message : 'Unknown error'
96
+ }, 500);
97
+ }
98
+ });
99
+ //# sourceMappingURL=organizations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Hono } from 'hono';
2
+ import type { AphexEnv } from '../index.js';
3
+ /**
4
+ * Roles router. Combines `/roles` (list, create) and `/roles/:name`
5
+ * (update, delete) so the wire URLs are
6
+ * `/api/roles` and `/api/roles/:name`.
7
+ *
8
+ * Note: built-in role names cannot be deleted; they're seeded on every
9
+ * org and a custom row with the same name would be unreachable.
10
+ */
11
+ export declare const rolesRouter: Hono<AphexEnv>;
12
+ //# sourceMappingURL=roles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,EAAE,IAAI,CAAC,QAAQ,CAuSpC,CAAC"}