@aphexcms/cms-core 0.1.1 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/dist/api/assets.d.ts +48 -0
  2. package/dist/api/assets.d.ts.map +1 -0
  3. package/dist/api/assets.js +52 -0
  4. package/dist/api/client.d.ts +37 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +125 -0
  7. package/dist/api/documents.d.ts +56 -0
  8. package/dist/api/documents.d.ts.map +1 -0
  9. package/dist/api/documents.js +77 -0
  10. package/{src/api/index.ts → dist/api/index.d.ts} +1 -1
  11. package/dist/api/index.d.ts.map +1 -0
  12. package/dist/api/index.js +5 -0
  13. package/dist/api/organizations.d.ts +101 -0
  14. package/dist/api/organizations.d.ts.map +1 -0
  15. package/dist/api/organizations.js +92 -0
  16. package/dist/api/types.d.ts +23 -0
  17. package/dist/api/types.d.ts.map +1 -0
  18. package/dist/api/types.js +1 -0
  19. package/dist/auth/auth-errors.d.ts +7 -0
  20. package/dist/auth/auth-errors.d.ts.map +1 -0
  21. package/dist/auth/auth-errors.js +13 -0
  22. package/dist/auth/auth-hooks.d.ts +6 -0
  23. package/dist/auth/auth-hooks.d.ts.map +1 -0
  24. package/dist/auth/auth-hooks.js +108 -0
  25. package/dist/auth/provider.d.ts +17 -0
  26. package/dist/auth/provider.d.ts.map +1 -0
  27. package/dist/auth/provider.js +1 -0
  28. package/dist/client/index.d.ts +24 -0
  29. package/dist/client/index.d.ts.map +1 -0
  30. package/{src/client/index.ts → dist/client/index.js} +0 -16
  31. package/{src → dist}/components/AdminApp.svelte +7 -8
  32. package/dist/components/AdminApp.svelte.d.ts +24 -0
  33. package/dist/components/AdminApp.svelte.d.ts.map +1 -0
  34. package/dist/components/admin/AdminLayout.svelte.d.ts +15 -0
  35. package/dist/components/admin/AdminLayout.svelte.d.ts.map +1 -0
  36. package/dist/components/admin/DocumentEditor.svelte.d.ts +18 -0
  37. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -0
  38. package/dist/components/admin/DocumentTypesList.svelte.d.ts +14 -0
  39. package/dist/components/admin/DocumentTypesList.svelte.d.ts.map +1 -0
  40. package/dist/components/admin/ObjectModal.svelte.d.ts +15 -0
  41. package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -0
  42. package/dist/components/admin/SchemaField.svelte.d.ts +19 -0
  43. package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -0
  44. package/dist/components/admin/fields/ArrayField.svelte.d.ts +12 -0
  45. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -0
  46. package/dist/components/admin/fields/BooleanField.svelte.d.ts +13 -0
  47. package/dist/components/admin/fields/BooleanField.svelte.d.ts.map +1 -0
  48. package/dist/components/admin/fields/ImageField.svelte.d.ts +15 -0
  49. package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -0
  50. package/dist/components/admin/fields/NumberField.svelte.d.ts +14 -0
  51. package/dist/components/admin/fields/NumberField.svelte.d.ts.map +1 -0
  52. package/dist/components/admin/fields/ReferenceField.svelte.d.ts +12 -0
  53. package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -0
  54. package/dist/components/admin/fields/SlugField.svelte.d.ts +15 -0
  55. package/dist/components/admin/fields/SlugField.svelte.d.ts.map +1 -0
  56. package/dist/components/admin/fields/StringField.svelte.d.ts +14 -0
  57. package/dist/components/admin/fields/StringField.svelte.d.ts.map +1 -0
  58. package/dist/components/admin/fields/TextareaField.svelte.d.ts +14 -0
  59. package/dist/components/admin/fields/TextareaField.svelte.d.ts.map +1 -0
  60. package/dist/components/fields/index.d.ts +9 -0
  61. package/dist/components/fields/index.d.ts.map +1 -0
  62. package/dist/components/index.d.ts +7 -0
  63. package/dist/components/index.d.ts.map +1 -0
  64. package/{src/components/index.ts → dist/components/index.js} +0 -4
  65. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts +11 -0
  66. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -0
  67. package/{src → dist}/components/layout/Sidebar.svelte +7 -7
  68. package/dist/components/layout/Sidebar.svelte.d.ts +14 -0
  69. package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -0
  70. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +11 -0
  71. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -0
  72. package/dist/components/layout/sidebar/NavMain.svelte.d.ts +19 -0
  73. package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -0
  74. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts +9 -0
  75. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts.map +1 -0
  76. package/dist/components/layout/sidebar/NavUser.svelte.d.ts +9 -0
  77. package/dist/components/layout/sidebar/NavUser.svelte.d.ts.map +1 -0
  78. package/dist/config.d.ts +3 -0
  79. package/dist/config.d.ts.map +1 -0
  80. package/dist/config.js +15 -0
  81. package/dist/db/adapters/index.d.ts +1 -0
  82. package/dist/db/adapters/index.d.ts.map +1 -0
  83. package/{src/db/adapters/index.ts → dist/db/adapters/index.js} +1 -0
  84. package/dist/db/index.d.ts +2 -0
  85. package/dist/db/index.d.ts.map +1 -0
  86. package/{src/db/index.ts → dist/db/index.js} +0 -1
  87. package/dist/db/interfaces/asset.d.ts +51 -0
  88. package/dist/db/interfaces/asset.d.ts.map +1 -0
  89. package/dist/db/interfaces/asset.js +1 -0
  90. package/dist/db/interfaces/document.d.ts +36 -0
  91. package/dist/db/interfaces/document.d.ts.map +1 -0
  92. package/dist/db/interfaces/document.js +1 -0
  93. package/dist/db/interfaces/index.d.ts +73 -0
  94. package/dist/db/interfaces/index.d.ts.map +1 -0
  95. package/dist/db/interfaces/index.js +1 -0
  96. package/dist/db/interfaces/organization.d.ts +27 -0
  97. package/dist/db/interfaces/organization.d.ts.map +1 -0
  98. package/dist/db/interfaces/organization.js +1 -0
  99. package/dist/db/interfaces/schema.d.ts +21 -0
  100. package/dist/db/interfaces/schema.d.ts.map +1 -0
  101. package/dist/db/interfaces/schema.js +1 -0
  102. package/dist/db/interfaces/user.d.ts +15 -0
  103. package/dist/db/interfaces/user.d.ts.map +1 -0
  104. package/dist/db/interfaces/user.js +1 -0
  105. package/dist/db/utils/reference-resolver.d.ts +18 -0
  106. package/dist/db/utils/reference-resolver.d.ts.map +1 -0
  107. package/dist/db/utils/reference-resolver.js +80 -0
  108. package/dist/define.d.ts +3 -0
  109. package/dist/define.d.ts.map +1 -0
  110. package/dist/define.js +4 -0
  111. package/dist/email/index.d.ts +2 -0
  112. package/dist/email/index.d.ts.map +1 -0
  113. package/{src/email/index.ts → dist/email/index.js} +0 -1
  114. package/dist/email/interfaces/email.d.ts +42 -0
  115. package/dist/email/interfaces/email.d.ts.map +1 -0
  116. package/dist/email/interfaces/email.js +1 -0
  117. package/dist/engine.d.ts +26 -0
  118. package/dist/engine.d.ts.map +1 -0
  119. package/dist/engine.js +66 -0
  120. package/dist/field-validation/rule.d.ts +51 -0
  121. package/dist/field-validation/rule.d.ts.map +1 -0
  122. package/dist/field-validation/rule.js +221 -0
  123. package/dist/field-validation/utils.d.ts +21 -0
  124. package/dist/field-validation/utils.d.ts.map +1 -0
  125. package/dist/field-validation/utils.js +66 -0
  126. package/dist/hooks.d.ts +23 -0
  127. package/dist/hooks.d.ts.map +1 -0
  128. package/dist/hooks.js +96 -0
  129. package/dist/index.d.ts +2 -0
  130. package/dist/index.d.ts.map +1 -0
  131. package/{src/index.ts → dist/index.js} +0 -1
  132. package/dist/routes/assets-by-id.d.ts +5 -0
  133. package/dist/routes/assets-by-id.d.ts.map +1 -0
  134. package/dist/routes/assets-by-id.js +138 -0
  135. package/dist/routes/assets-cdn.d.ts +3 -0
  136. package/dist/routes/assets-cdn.d.ts.map +1 -0
  137. package/dist/routes/assets-cdn.js +155 -0
  138. package/dist/routes/assets.d.ts +4 -0
  139. package/dist/routes/assets.d.ts.map +1 -0
  140. package/dist/routes/assets.js +94 -0
  141. package/dist/routes/documents-by-id.d.ts +5 -0
  142. package/dist/routes/documents-by-id.d.ts.map +1 -0
  143. package/dist/routes/documents-by-id.js +142 -0
  144. package/dist/routes/documents-publish.d.ts +4 -0
  145. package/dist/routes/documents-publish.d.ts.map +1 -0
  146. package/dist/routes/documents-publish.js +151 -0
  147. package/dist/routes/documents.d.ts +4 -0
  148. package/dist/routes/documents.d.ts.map +1 -0
  149. package/dist/routes/documents.js +131 -0
  150. package/dist/routes/index.d.ts +6 -0
  151. package/dist/routes/index.d.ts.map +1 -0
  152. package/{src/routes/index.ts → dist/routes/index.js} +0 -3
  153. package/dist/routes/organizations-by-id.d.ts +5 -0
  154. package/dist/routes/organizations-by-id.d.ts.map +1 -0
  155. package/dist/routes/organizations-by-id.js +187 -0
  156. package/dist/routes/organizations-invitations.d.ts +4 -0
  157. package/dist/routes/organizations-invitations.d.ts.map +1 -0
  158. package/dist/routes/organizations-invitations.js +125 -0
  159. package/dist/routes/organizations-members.d.ts +5 -0
  160. package/dist/routes/organizations-members.d.ts.map +1 -0
  161. package/dist/routes/organizations-members.js +206 -0
  162. package/dist/routes/organizations-switch.d.ts +3 -0
  163. package/dist/routes/organizations-switch.d.ts.map +1 -0
  164. package/dist/routes/organizations-switch.js +53 -0
  165. package/dist/routes/organizations.d.ts +4 -0
  166. package/dist/routes/organizations.d.ts.map +1 -0
  167. package/dist/routes/organizations.js +108 -0
  168. package/dist/routes/schemas-by-type.d.ts +3 -0
  169. package/dist/routes/schemas-by-type.d.ts.map +1 -0
  170. package/dist/routes/schemas-by-type.js +25 -0
  171. package/dist/routes/schemas.d.ts +3 -0
  172. package/dist/routes/schemas.d.ts.map +1 -0
  173. package/dist/routes/schemas.js +11 -0
  174. package/dist/routes-exports.d.ts +14 -0
  175. package/dist/routes-exports.d.ts.map +1 -0
  176. package/{src/routes-exports.ts → dist/routes-exports.js} +5 -28
  177. package/dist/schema-context.svelte.d.ts +10 -0
  178. package/dist/schema-context.svelte.d.ts.map +1 -0
  179. package/dist/schema-context.svelte.js +18 -0
  180. package/dist/schema-utils/cleanup.d.ts +21 -0
  181. package/dist/schema-utils/cleanup.d.ts.map +1 -0
  182. package/dist/schema-utils/cleanup.js +80 -0
  183. package/dist/schema-utils/index.d.ts +4 -0
  184. package/dist/schema-utils/index.d.ts.map +1 -0
  185. package/dist/schema-utils/utils.d.ts +30 -0
  186. package/dist/schema-utils/utils.d.ts.map +1 -0
  187. package/dist/schema-utils/utils.js +37 -0
  188. package/dist/schema-utils/validator.d.ts +6 -0
  189. package/dist/schema-utils/validator.d.ts.map +1 -0
  190. package/dist/schema-utils/validator.js +45 -0
  191. package/dist/server/index.d.ts +16 -0
  192. package/dist/server/index.d.ts.map +1 -0
  193. package/{src/server/index.ts → dist/server/index.js} +2 -14
  194. package/dist/services/asset-service.d.ts +86 -0
  195. package/dist/services/asset-service.d.ts.map +1 -0
  196. package/dist/services/asset-service.js +187 -0
  197. package/{src/services/index.ts → dist/services/index.d.ts} +1 -4
  198. package/dist/services/index.d.ts.map +1 -0
  199. package/dist/services/index.js +4 -0
  200. package/dist/storage/adapters/index.d.ts +2 -0
  201. package/dist/storage/adapters/index.d.ts.map +1 -0
  202. package/dist/storage/adapters/local-storage-adapter.d.ts +54 -0
  203. package/dist/storage/adapters/local-storage-adapter.d.ts.map +1 -0
  204. package/dist/storage/adapters/local-storage-adapter.js +187 -0
  205. package/dist/storage/index.d.ts +3 -0
  206. package/dist/storage/index.d.ts.map +1 -0
  207. package/{src/storage/index.ts → dist/storage/index.js} +0 -2
  208. package/dist/storage/interfaces/index.d.ts +2 -0
  209. package/dist/storage/interfaces/index.d.ts.map +1 -0
  210. package/dist/storage/interfaces/storage.d.ts +91 -0
  211. package/dist/storage/interfaces/storage.d.ts.map +1 -0
  212. package/dist/storage/interfaces/storage.js +1 -0
  213. package/dist/storage/providers/storage.d.ts +43 -0
  214. package/dist/storage/providers/storage.d.ts.map +1 -0
  215. package/dist/storage/providers/storage.js +64 -0
  216. package/dist/types/asset.d.ts +73 -0
  217. package/dist/types/asset.d.ts.map +1 -0
  218. package/dist/types/asset.js +2 -0
  219. package/dist/types/auth.d.ts +50 -0
  220. package/dist/types/auth.d.ts.map +1 -0
  221. package/dist/types/auth.js +41 -0
  222. package/dist/types/config.d.ts +47 -0
  223. package/dist/types/config.d.ts.map +1 -0
  224. package/dist/types/config.js +1 -0
  225. package/dist/types/document.d.ts +34 -0
  226. package/dist/types/document.d.ts.map +1 -0
  227. package/dist/types/document.js +1 -0
  228. package/dist/types/index.d.ts +9 -0
  229. package/dist/types/index.d.ts.map +1 -0
  230. package/dist/types/organization.d.ts +105 -0
  231. package/dist/types/organization.d.ts.map +1 -0
  232. package/dist/types/organization.js +3 -0
  233. package/dist/types/schemas.d.ts +114 -0
  234. package/dist/types/schemas.d.ts.map +1 -0
  235. package/dist/types/schemas.js +1 -0
  236. package/dist/types/sidebar.d.ts +33 -0
  237. package/dist/types/sidebar.d.ts.map +1 -0
  238. package/dist/types/sidebar.js +1 -0
  239. package/dist/types/user.d.ts +14 -0
  240. package/dist/types/user.d.ts.map +1 -0
  241. package/dist/types/user.js +1 -0
  242. package/dist/utils/content-hash.d.ts +22 -0
  243. package/dist/utils/content-hash.d.ts.map +1 -0
  244. package/dist/utils/content-hash.js +67 -0
  245. package/dist/utils/image-url.d.ts +88 -0
  246. package/dist/utils/image-url.d.ts.map +1 -0
  247. package/dist/utils/image-url.js +165 -0
  248. package/dist/utils/index.d.ts +6 -0
  249. package/dist/utils/index.d.ts.map +1 -0
  250. package/{src/utils/index.ts → dist/utils/index.js} +0 -3
  251. package/dist/utils/slug.d.ts +13 -0
  252. package/dist/utils/slug.d.ts.map +1 -0
  253. package/dist/utils/slug.js +30 -0
  254. package/package.json +12 -25
  255. package/src/api/assets.ts +0 -75
  256. package/src/api/client.ts +0 -150
  257. package/src/api/documents.ts +0 -102
  258. package/src/api/organizations.ts +0 -154
  259. package/src/api/types.ts +0 -34
  260. package/src/auth/auth-errors.ts +0 -23
  261. package/src/auth/auth-hooks.ts +0 -132
  262. package/src/auth/provider.ts +0 -25
  263. package/src/config.ts +0 -18
  264. package/src/db/interfaces/asset.ts +0 -61
  265. package/src/db/interfaces/document.ts +0 -53
  266. package/src/db/interfaces/index.ts +0 -98
  267. package/src/db/interfaces/organization.ts +0 -51
  268. package/src/db/interfaces/schema.ts +0 -13
  269. package/src/db/interfaces/user.ts +0 -16
  270. package/src/db/utils/reference-resolver.ts +0 -119
  271. package/src/define.ts +0 -7
  272. package/src/email/interfaces/email.ts +0 -45
  273. package/src/engine.ts +0 -85
  274. package/src/field-validation/rule.ts +0 -287
  275. package/src/field-validation/utils.ts +0 -91
  276. package/src/hooks.ts +0 -142
  277. package/src/lib/is-mobile.svelte.ts +0 -9
  278. package/src/lib/utils.ts +0 -13
  279. package/src/routes/assets-by-id.ts +0 -161
  280. package/src/routes/assets-cdn.ts +0 -185
  281. package/src/routes/assets.ts +0 -116
  282. package/src/routes/documents-by-id.ts +0 -188
  283. package/src/routes/documents-publish.ts +0 -211
  284. package/src/routes/documents.ts +0 -172
  285. package/src/routes/organizations-by-id.ts +0 -258
  286. package/src/routes/organizations-invitations.ts +0 -183
  287. package/src/routes/organizations-members.ts +0 -301
  288. package/src/routes/organizations-switch.ts +0 -74
  289. package/src/routes/organizations.ts +0 -146
  290. package/src/routes/schemas-by-type.ts +0 -35
  291. package/src/routes/schemas.ts +0 -19
  292. package/src/schema-context.svelte.ts +0 -24
  293. package/src/schema-utils/cleanup.ts +0 -116
  294. package/src/schema-utils/utils.ts +0 -47
  295. package/src/schema-utils/validator.ts +0 -58
  296. package/src/services/asset-service.ts +0 -256
  297. package/src/storage/adapters/local-storage-adapter.ts +0 -215
  298. package/src/storage/interfaces/storage.ts +0 -114
  299. package/src/storage/providers/storage.ts +0 -83
  300. package/src/types/asset.ts +0 -81
  301. package/src/types/auth.ts +0 -80
  302. package/src/types/config.ts +0 -45
  303. package/src/types/document.ts +0 -38
  304. package/src/types/organization.ts +0 -119
  305. package/src/types/schemas.ts +0 -151
  306. package/src/types/sidebar.ts +0 -37
  307. package/src/types/user.ts +0 -17
  308. package/src/utils/content-hash.ts +0 -75
  309. package/src/utils/image-url.ts +0 -204
  310. package/src/utils/slug.ts +0 -33
  311. /package/{src → dist}/app.d.ts +0 -0
  312. /package/{src → dist}/auth/MULTI_TENANCY_PLAN.md +0 -0
  313. /package/{src → dist}/components/admin/AdminLayout.svelte +0 -0
  314. /package/{src → dist}/components/admin/DocumentEditor.svelte +0 -0
  315. /package/{src → dist}/components/admin/DocumentTypesList.svelte +0 -0
  316. /package/{src → dist}/components/admin/ObjectModal.svelte +0 -0
  317. /package/{src → dist}/components/admin/SchemaField.svelte +0 -0
  318. /package/{src → dist}/components/admin/fields/ArrayField.svelte +0 -0
  319. /package/{src → dist}/components/admin/fields/BooleanField.svelte +0 -0
  320. /package/{src → dist}/components/admin/fields/ImageField.svelte +0 -0
  321. /package/{src → dist}/components/admin/fields/NumberField.svelte +0 -0
  322. /package/{src → dist}/components/admin/fields/ReferenceField.svelte +0 -0
  323. /package/{src → dist}/components/admin/fields/SlugField.svelte +0 -0
  324. /package/{src → dist}/components/admin/fields/StringField.svelte +0 -0
  325. /package/{src → dist}/components/admin/fields/TextareaField.svelte +0 -0
  326. /package/{src/components/fields/index.ts → dist/components/fields/index.js} +0 -0
  327. /package/{src → dist}/components/layout/OrganizationSwitcher.svelte +0 -0
  328. /package/{src → dist}/components/layout/sidebar/AppSidebar.svelte +0 -0
  329. /package/{src → dist}/components/layout/sidebar/NavMain.svelte +0 -0
  330. /package/{src → dist}/components/layout/sidebar/NavSecondary.svelte +0 -0
  331. /package/{src → dist}/components/layout/sidebar/NavUser.svelte +0 -0
  332. /package/{src → dist}/plugins/README.md +0 -0
  333. /package/{src/schema-utils/index.ts → dist/schema-utils/index.js} +0 -0
  334. /package/{src/storage/adapters/index.ts → dist/storage/adapters/index.js} +0 -0
  335. /package/{src/storage/interfaces/index.ts → dist/storage/interfaces/index.js} +0 -0
  336. /package/{src/types/index.ts → dist/types/index.js} +0 -0
@@ -1,301 +0,0 @@
1
- // Aphex CMS Organization Members API Handlers
2
- import { json } from '@sveltejs/kit';
3
- import type { RequestHandler } from '@sveltejs/kit';
4
-
5
- // GET /api/organizations/members - List organization members
6
- export const GET: RequestHandler = async ({ locals }) => {
7
- try {
8
- const { databaseAdapter } = locals.aphexCMS;
9
- const auth = locals.auth;
10
-
11
- if (!auth || auth.type !== 'session') {
12
- return json(
13
- {
14
- success: false,
15
- error: 'Unauthorized',
16
- message: 'Session authentication required'
17
- },
18
- { status: 401 }
19
- );
20
- }
21
-
22
- // Get members of the current active organization
23
- const members = await databaseAdapter.findOrganizationMembers(auth.organizationId);
24
-
25
- return json({
26
- success: true,
27
- data: members
28
- });
29
- } catch (error) {
30
- console.error('Failed to fetch organization members:', error);
31
- return json(
32
- {
33
- success: false,
34
- error: 'Failed to fetch members',
35
- message: error instanceof Error ? error.message : 'Unknown error'
36
- },
37
- { status: 500 }
38
- );
39
- }
40
- };
41
-
42
- // DELETE /api/organizations/members - Remove a member
43
- export const DELETE: RequestHandler = async ({ request, locals }) => {
44
- try {
45
- const { databaseAdapter } = locals.aphexCMS;
46
- const auth = locals.auth;
47
-
48
- if (!auth || auth.type !== 'session') {
49
- return json(
50
- {
51
- success: false,
52
- error: 'Unauthorized',
53
- message: 'Session authentication required'
54
- },
55
- { status: 401 }
56
- );
57
- }
58
-
59
- // Only owners and admins can remove members
60
- if (auth.organizationRole !== 'owner' && auth.organizationRole !== 'admin') {
61
- return json(
62
- {
63
- success: false,
64
- error: 'Forbidden',
65
- message: 'Only owners and admins can remove members'
66
- },
67
- { status: 403 }
68
- );
69
- }
70
-
71
- const body = await request.json();
72
-
73
- if (!body.userId) {
74
- return json(
75
- {
76
- success: false,
77
- error: 'Missing required field',
78
- message: 'userId is required'
79
- },
80
- { status: 400 }
81
- );
82
- }
83
-
84
- // Prevent removing yourself
85
- if (body.userId === auth.user.id) {
86
- return json(
87
- {
88
- success: false,
89
- error: 'Invalid operation',
90
- message: 'You cannot remove yourself from the organization'
91
- },
92
- { status: 400 }
93
- );
94
- }
95
-
96
- // Get the target member's role
97
- const targetMember = await databaseAdapter.findUserMembership(body.userId, auth.organizationId);
98
-
99
- if (!targetMember) {
100
- return json(
101
- {
102
- success: false,
103
- error: 'Member not found',
104
- message: 'User is not a member of this organization'
105
- },
106
- { status: 404 }
107
- );
108
- }
109
-
110
- // Admins cannot remove owners
111
- if (auth.organizationRole === 'admin' && targetMember.role === 'owner') {
112
- return json(
113
- {
114
- success: false,
115
- error: 'Forbidden',
116
- message: 'Admins cannot remove owners'
117
- },
118
- { status: 403 }
119
- );
120
- }
121
-
122
- // Remove the member
123
- const removed = await databaseAdapter.removeMember(auth.organizationId, body.userId);
124
-
125
- if (!removed) {
126
- return json(
127
- {
128
- success: false,
129
- error: 'Failed to remove member'
130
- },
131
- { status: 500 }
132
- );
133
- }
134
-
135
- // Clear the user's session if their active org is the one they were removed from
136
- const userSession = await databaseAdapter.findUserSession(body.userId);
137
- if (userSession?.activeOrganizationId === auth.organizationId) {
138
- console.log(
139
- `[Organizations]: Clearing user session for ${body.userId} - removed from active org ${auth.organizationId}`
140
- );
141
-
142
- // Check if user has other organizations
143
- const otherOrgs = await databaseAdapter.findUserOrganizations(body.userId);
144
- if (otherOrgs.length > 0 && otherOrgs[0]) {
145
- // Set their first remaining org as active
146
- await databaseAdapter.updateUserSession(body.userId, otherOrgs[0].organization.id);
147
- console.log(
148
- `[Organizations]: Set org ${otherOrgs[0].organization.id} as new active org for ${body.userId}`
149
- );
150
- } else {
151
- // No other orgs - delete the session so invitations can be processed on next login
152
- await databaseAdapter.deleteUserSession(body.userId);
153
- console.log(
154
- `[Organizations]: Deleted user session for ${body.userId} - no remaining organizations`
155
- );
156
- }
157
- }
158
-
159
- return json({
160
- success: true,
161
- message: 'Member removed successfully'
162
- });
163
- } catch (error) {
164
- console.error('Failed to remove member:', error);
165
- return json(
166
- {
167
- success: false,
168
- error: 'Failed to remove member',
169
- message: error instanceof Error ? error.message : 'Unknown error'
170
- },
171
- { status: 500 }
172
- );
173
- }
174
- };
175
-
176
- // PATCH /api/organizations/members - Update member role
177
- export const PATCH: RequestHandler = async ({ request, locals }) => {
178
- try {
179
- const { databaseAdapter } = locals.aphexCMS;
180
- const auth = locals.auth;
181
-
182
- if (!auth || auth.type !== 'session') {
183
- return json(
184
- {
185
- success: false,
186
- error: 'Unauthorized',
187
- message: 'Session authentication required'
188
- },
189
- { status: 401 }
190
- );
191
- }
192
-
193
- // Only owners and admins can update roles
194
- if (auth.organizationRole !== 'owner' && auth.organizationRole !== 'admin') {
195
- return json(
196
- {
197
- success: false,
198
- error: 'Forbidden',
199
- message: 'Only owners and admins can update member roles'
200
- },
201
- { status: 403 }
202
- );
203
- }
204
-
205
- const body = await request.json();
206
-
207
- if (!body.userId || !body.role) {
208
- return json(
209
- {
210
- success: false,
211
- error: 'Missing required fields',
212
- message: 'userId and role are required'
213
- },
214
- { status: 400 }
215
- );
216
- }
217
-
218
- // Validate role
219
- const validRoles = ['owner', 'admin', 'editor', 'viewer'];
220
- if (!validRoles.includes(body.role)) {
221
- return json(
222
- {
223
- success: false,
224
- error: 'Invalid role',
225
- message: 'Role must be one of: owner, admin, editor, viewer'
226
- },
227
- { status: 400 }
228
- );
229
- }
230
-
231
- // Prevent changing your own role
232
- if (body.userId === auth.user.id) {
233
- return json(
234
- {
235
- success: false,
236
- error: 'Invalid operation',
237
- message: 'You cannot change your own role'
238
- },
239
- { status: 400 }
240
- );
241
- }
242
-
243
- // Get the target member's current role
244
- const targetMember = await databaseAdapter.findUserMembership(body.userId, auth.organizationId);
245
-
246
- if (!targetMember) {
247
- return json(
248
- {
249
- success: false,
250
- error: 'Member not found',
251
- message: 'User is not a member of this organization'
252
- },
253
- { status: 404 }
254
- );
255
- }
256
-
257
- // Admins cannot modify owners
258
- if (auth.organizationRole === 'admin' && targetMember.role === 'owner') {
259
- return json(
260
- {
261
- success: false,
262
- error: 'Forbidden',
263
- message: 'Admins cannot modify owner roles'
264
- },
265
- { status: 403 }
266
- );
267
- }
268
-
269
- // Update the role
270
- const updatedMember = await databaseAdapter.updateMemberRole(
271
- auth.organizationId,
272
- body.userId,
273
- body.role
274
- );
275
-
276
- if (!updatedMember) {
277
- return json(
278
- {
279
- success: false,
280
- error: 'Failed to update role'
281
- },
282
- { status: 500 }
283
- );
284
- }
285
-
286
- return json({
287
- success: true,
288
- data: updatedMember
289
- });
290
- } catch (error) {
291
- console.error('Failed to update member role:', error);
292
- return json(
293
- {
294
- success: false,
295
- error: 'Failed to update role',
296
- message: error instanceof Error ? error.message : 'Unknown error'
297
- },
298
- { status: 500 }
299
- );
300
- }
301
- };
@@ -1,74 +0,0 @@
1
- // Aphex CMS Organization Switch API Handler
2
- import { json } from '@sveltejs/kit';
3
- import type { RequestHandler } from '@sveltejs/kit';
4
-
5
- // POST /api/organizations/switch - Switch active organization
6
- export const POST: RequestHandler = async ({ request, locals }) => {
7
- try {
8
- const { databaseAdapter } = locals.aphexCMS;
9
- const auth = locals.auth;
10
-
11
- if (!auth || auth.type !== 'session') {
12
- return json(
13
- {
14
- success: false,
15
- error: 'Unauthorized',
16
- message: 'Session authentication required'
17
- },
18
- { status: 401 }
19
- );
20
- }
21
-
22
- const body = await request.json();
23
-
24
- if (!body.organizationId) {
25
- return json(
26
- {
27
- success: false,
28
- error: 'Missing required field',
29
- message: 'organizationId is required'
30
- },
31
- { status: 400 }
32
- );
33
- }
34
-
35
- // Verify user is a member of the target organization
36
- const membership = await databaseAdapter.findUserMembership(auth.user.id, body.organizationId);
37
-
38
- if (!membership) {
39
- return json(
40
- {
41
- success: false,
42
- error: 'Access denied',
43
- message: 'You are not a member of this organization'
44
- },
45
- { status: 403 }
46
- );
47
- }
48
-
49
- // Update user's active organization
50
- await databaseAdapter.updateUserSession(auth.user.id, body.organizationId);
51
-
52
- // Get the organization details
53
- const organization = await databaseAdapter.findOrganizationById(body.organizationId);
54
-
55
- return json({
56
- success: true,
57
- data: {
58
- organizationId: body.organizationId,
59
- organizationName: organization?.name,
60
- role: membership.role
61
- }
62
- });
63
- } catch (error) {
64
- console.error('Failed to switch organization:', error);
65
- return json(
66
- {
67
- success: false,
68
- error: 'Failed to switch organization',
69
- message: error instanceof Error ? error.message : 'Unknown error'
70
- },
71
- { status: 500 }
72
- );
73
- }
74
- };
@@ -1,146 +0,0 @@
1
- // Aphex CMS Organization API Handlers
2
- import { json } from '@sveltejs/kit';
3
- import type { RequestHandler } from '@sveltejs/kit';
4
-
5
- // GET /api/organizations - List user's organizations
6
- export const GET: RequestHandler = async ({ locals }) => {
7
- try {
8
- const { databaseAdapter } = locals.aphexCMS;
9
- const auth = locals.auth;
10
-
11
- if (!auth || auth.type !== 'session') {
12
- return json(
13
- {
14
- success: false,
15
- error: 'Unauthorized',
16
- message: 'Session authentication required'
17
- },
18
- { status: 401 }
19
- );
20
- }
21
-
22
- // Get all organizations the user belongs to
23
- const memberships = await databaseAdapter.findUserOrganizations(auth.user.id);
24
-
25
- // Map to a cleaner format with organization details and user's role
26
- const organizations = memberships.map((membership) => ({
27
- id: membership.organization.id,
28
- name: membership.organization.name,
29
- slug: membership.organization.slug,
30
- metadata: membership.organization.metadata,
31
- role: membership.member.role,
32
- joinedAt: membership.member.createdAt,
33
- isActive: membership.organization.id === auth.organizationId
34
- }));
35
-
36
- return json({
37
- success: true,
38
- data: organizations
39
- });
40
- } catch (error) {
41
- console.error('Failed to fetch organizations:', error);
42
- return json(
43
- {
44
- success: false,
45
- error: 'Failed to fetch organizations',
46
- message: error instanceof Error ? error.message : 'Unknown error'
47
- },
48
- { status: 500 }
49
- );
50
- }
51
- };
52
-
53
- // POST /api/organizations - Create new organization
54
- export const POST: RequestHandler = async ({ request, locals }) => {
55
- try {
56
- const { databaseAdapter } = locals.aphexCMS;
57
- const auth = locals.auth;
58
-
59
- if (!auth || auth.type !== 'session') {
60
- return json(
61
- {
62
- success: false,
63
- error: 'Unauthorized',
64
- message: 'Session authentication required'
65
- },
66
- { status: 401 }
67
- );
68
- }
69
-
70
- // Only SUPER_ADMIN can create organizations
71
- if (auth.user.role !== 'super_admin') {
72
- return json(
73
- {
74
- success: false,
75
- error: 'Forbidden',
76
- message: 'Only super admins can create organizations'
77
- },
78
- { status: 403 }
79
- );
80
- }
81
-
82
- const body = await request.json();
83
-
84
- // Validate required fields
85
- if (!body.name || !body.slug) {
86
- return json(
87
- {
88
- success: false,
89
- error: 'Missing required fields',
90
- message: 'Organization name and slug are required'
91
- },
92
- { status: 400 }
93
- );
94
- }
95
-
96
- // Check if slug is already taken
97
- const existingOrg = await databaseAdapter.findOrganizationBySlug(body.slug);
98
- if (existingOrg) {
99
- return json(
100
- {
101
- success: false,
102
- error: 'Slug already exists',
103
- message: `Organization with slug '${body.slug}' already exists`
104
- },
105
- { status: 409 }
106
- );
107
- }
108
-
109
- // Create the organization
110
- const newOrganization = await databaseAdapter.createOrganization({
111
- name: body.name,
112
- slug: body.slug,
113
- metadata: body.metadata || null,
114
- parentOrganizationId: body.parentOrganizationId || null,
115
- createdBy: auth.user.id
116
- });
117
-
118
- // Add the creator as owner
119
- await databaseAdapter.addMember({
120
- organizationId: newOrganization.id,
121
- userId: auth.user.id,
122
- role: 'owner'
123
- });
124
-
125
- // Set as active organization for this user
126
- await databaseAdapter.updateUserSession(auth.user.id, newOrganization.id);
127
-
128
- return json(
129
- {
130
- success: true,
131
- data: newOrganization
132
- },
133
- { status: 201 }
134
- );
135
- } catch (error) {
136
- console.error('Failed to create organization:', error);
137
- return json(
138
- {
139
- success: false,
140
- error: 'Failed to create organization',
141
- message: error instanceof Error ? error.message : 'Unknown error'
142
- },
143
- { status: 500 }
144
- );
145
- }
146
- };
@@ -1,35 +0,0 @@
1
- // Aphex CMS Schema API Handlers - Get schema by type
2
- import type { RequestHandler } from '@sveltejs/kit';
3
-
4
- export const GET: RequestHandler = async ({ locals, params }) => {
5
- const { type } = params;
6
- const { cmsEngine } = locals.aphexCMS;
7
-
8
- if (!type) {
9
- return new Response(JSON.stringify({ error: 'Schema type is required' }), {
10
- status: 400,
11
- headers: { 'content-type': 'application/json' }
12
- });
13
- }
14
-
15
- console.log('GETTING SCHEMA TYPE FROM: ', type);
16
- const schema = cmsEngine.getSchemaTypeByName(type);
17
- console.log('SCHEMA: ', schema);
18
-
19
- if (!schema) {
20
- return new Response(JSON.stringify({ error: `Schema type '${type}' not found` }), {
21
- status: 404,
22
- headers: { 'content-type': 'application/json' }
23
- });
24
- }
25
-
26
- return new Response(
27
- JSON.stringify({
28
- success: true,
29
- data: schema
30
- }),
31
- {
32
- headers: { 'content-type': 'application/json' }
33
- }
34
- );
35
- };
@@ -1,19 +0,0 @@
1
- // Aphex CMS Schema API Handlers
2
- import type { RequestHandler } from '@sveltejs/kit';
3
-
4
- export const GET: RequestHandler = async ({ locals }) => {
5
- const { cmsEngine } = locals.aphexCMS;
6
-
7
- // Get schemas from config (not database) to preserve validation functions
8
- const schemas = cmsEngine.config.schemaTypes;
9
-
10
- return new Response(
11
- JSON.stringify({
12
- success: true,
13
- data: schemas
14
- }),
15
- {
16
- headers: { 'content-type': 'application/json' }
17
- }
18
- );
19
- };
@@ -1,24 +0,0 @@
1
- import { getContext, setContext } from 'svelte';
2
- import type { SchemaType } from './types/index.js';
3
-
4
- const SCHEMA_CONTEXT_KEY = Symbol('aphex-schemas');
5
-
6
- /**
7
- * Provides schemas to child components via Svelte context
8
- */
9
- export function setSchemaContext(schemas: SchemaType[]) {
10
- setContext(SCHEMA_CONTEXT_KEY, schemas);
11
- }
12
-
13
- /**
14
- * Gets schemas from Svelte context
15
- */
16
- export function getSchemaContext(): SchemaType[] {
17
- const schemas = getContext<SchemaType[]>(SCHEMA_CONTEXT_KEY);
18
- if (!schemas) {
19
- throw new Error(
20
- 'Schema context not found. Make sure to call setSchemaContext() in a parent component.'
21
- );
22
- }
23
- return schemas;
24
- }
@@ -1,116 +0,0 @@
1
- import type { SchemaType, Field, ArrayField } from '../types/schemas.js';
2
-
3
- export interface OrphanedField {
4
- path: string;
5
- key: string;
6
- value: any;
7
- level: 'document' | 'nested';
8
- }
9
-
10
- export interface SchemaCleanupResult {
11
- hasOrphanedFields: boolean;
12
- orphanedFields: OrphanedField[];
13
- cleanedData: Record<string, any>;
14
- }
15
-
16
- /**
17
- * Find orphaned fields in document data that no longer exist in the schema
18
- */
19
- export function findOrphanedFields(
20
- documentData: Record<string, any>,
21
- schema: SchemaType
22
- ): SchemaCleanupResult {
23
- const orphanedFields: OrphanedField[] = [];
24
-
25
- function checkObject(
26
- obj: Record<string, any>,
27
- fields: Field[],
28
- pathPrefix = ''
29
- ): Record<string, any> {
30
- const cleaned: Record<string, any> = {};
31
- const fieldMap = new Map(fields.map((field) => [field.name, field]));
32
-
33
- for (const [key, value] of Object.entries(obj)) {
34
- const currentPath = pathPrefix ? `${pathPrefix}.${key}` : key;
35
- const field = fieldMap.get(key);
36
-
37
- if (!field) {
38
- // Orphaned field found
39
- orphanedFields.push({
40
- path: currentPath,
41
- key,
42
- value,
43
- level: pathPrefix ? 'nested' : 'document'
44
- });
45
- continue; // Skip this field in cleaned data
46
- }
47
-
48
- // Recursively check nested objects and arrays
49
- if (field.type === 'object' && field.fields && value && typeof value === 'object') {
50
- cleaned[key] = checkObject(value, field.fields, currentPath);
51
- } else if (field.type === 'array' && Array.isArray(value)) {
52
- cleaned[key] = checkArray(value, field, currentPath);
53
- } else {
54
- cleaned[key] = value;
55
- }
56
- }
57
-
58
- return cleaned;
59
- }
60
-
61
- function checkArray(array: any[], arrayField: Field, pathPrefix: string): any[] {
62
- if (arrayField.type !== 'array' || !arrayField.of) {
63
- return array;
64
- }
65
-
66
- return array.map((item, index) => {
67
- const itemPath = `${pathPrefix}[${index}]`;
68
-
69
- if (item && typeof item === 'object' && item._type) {
70
- // Find the schema for this array item type
71
- const itemTypeSchema = getSchemaForArrayItem(item._type, arrayField);
72
- if (itemTypeSchema && itemTypeSchema.fields) {
73
- return checkObject(item, itemTypeSchema.fields, itemPath);
74
- }
75
- }
76
-
77
- return item;
78
- });
79
- }
80
-
81
- const cleanedData = checkObject(documentData, schema.fields);
82
-
83
- return {
84
- hasOrphanedFields: orphanedFields.length > 0,
85
- orphanedFields,
86
- cleanedData
87
- };
88
- }
89
-
90
- /**
91
- * Get the schema for an array item type (helper function)
92
- * This would need to be integrated with your schema registry
93
- */
94
- function getSchemaForArrayItem(typeName: string, arrayField: ArrayField): SchemaType | null {
95
- // This is a placeholder - you'd need to integrate with your actual schema registry
96
- // For now, we'll assume inline object schemas
97
- if (arrayField.of) {
98
- const typeRef = arrayField.of.find((ref) => ref.type === typeName);
99
- if (typeRef && typeof typeRef !== 'string') {
100
- // Handle inline schema definitions if needed
101
- return null;
102
- }
103
- }
104
- return null;
105
- }
106
-
107
- /**
108
- * Apply cleanup by removing orphaned fields from document data
109
- */
110
- export function applySchemaCleanup(
111
- documentData: Record<string, any>,
112
- schema: SchemaType
113
- ): Record<string, any> {
114
- const result = findOrphanedFields(documentData, schema);
115
- return result.cleanedData;
116
- }