@aphexcms/cms-core 2.0.9 → 2.0.10

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 (169) hide show
  1. package/LICENSE +21 -0
  2. package/dist/api/api-keys.d.ts +4 -7
  3. package/dist/api/api-keys.d.ts.map +1 -1
  4. package/dist/api/assets.d.ts +7 -22
  5. package/dist/api/assets.d.ts.map +1 -1
  6. package/dist/api/assets.js +1 -10
  7. package/dist/api/documents.d.ts +17 -16
  8. package/dist/api/documents.d.ts.map +1 -1
  9. package/dist/api/documents.js +2 -2
  10. package/dist/api/organizations.d.ts +15 -35
  11. package/dist/api/organizations.d.ts.map +1 -1
  12. package/dist/api/schemas/api-keys.d.ts +16 -0
  13. package/dist/api/schemas/api-keys.d.ts.map +1 -0
  14. package/dist/api/schemas/api-keys.js +9 -0
  15. package/dist/api/schemas/assets.d.ts +174 -0
  16. package/dist/api/schemas/assets.d.ts.map +1 -0
  17. package/dist/api/schemas/assets.js +99 -0
  18. package/dist/api/schemas/documents.d.ts +325 -0
  19. package/dist/api/schemas/documents.d.ts.map +1 -0
  20. package/dist/api/schemas/documents.js +161 -0
  21. package/dist/api/schemas/organizations.d.ts +59 -0
  22. package/dist/api/schemas/organizations.d.ts.map +1 -0
  23. package/dist/api/schemas/organizations.js +45 -0
  24. package/dist/api/schemas/user.d.ts +10 -0
  25. package/dist/api/schemas/user.d.ts.map +1 -0
  26. package/dist/api/schemas/user.js +11 -0
  27. package/dist/api/user.d.ts +4 -6
  28. package/dist/api/user.d.ts.map +1 -1
  29. package/dist/auth/provider.d.ts +5 -0
  30. package/dist/auth/provider.d.ts.map +1 -1
  31. package/dist/cli/index.js +0 -0
  32. package/dist/client/index.d.ts +2 -0
  33. package/dist/client/index.d.ts.map +1 -1
  34. package/dist/client/index.js +3 -0
  35. package/dist/components/AdminApp.svelte +8 -4
  36. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  37. package/dist/components/admin/DocumentEditor.svelte +23 -18
  38. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
  39. package/dist/components/admin/DocumentVersionPanel.svelte +18 -31
  40. package/dist/components/admin/DocumentVersionPanel.svelte.d.ts.map +1 -1
  41. package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte +37 -0
  42. package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte.d.ts +19 -0
  43. package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte.d.ts.map +1 -0
  44. package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts +16 -0
  45. package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts.map +1 -0
  46. package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.js +29 -0
  47. package/dist/hooks.d.ts.map +1 -1
  48. package/dist/hooks.js +4 -0
  49. package/dist/lib/api/api-keys.d.ts +4 -7
  50. package/dist/lib/api/api-keys.d.ts.map +1 -1
  51. package/dist/lib/api/api-keys.js.map +1 -1
  52. package/dist/lib/api/assets.d.ts +7 -22
  53. package/dist/lib/api/assets.d.ts.map +1 -1
  54. package/dist/lib/api/assets.js +1 -10
  55. package/dist/lib/api/assets.js.map +1 -1
  56. package/dist/lib/api/documents.d.ts +17 -16
  57. package/dist/lib/api/documents.d.ts.map +1 -1
  58. package/dist/lib/api/documents.js +2 -2
  59. package/dist/lib/api/documents.js.map +1 -1
  60. package/dist/lib/api/organizations.d.ts +15 -35
  61. package/dist/lib/api/organizations.d.ts.map +1 -1
  62. package/dist/lib/api/organizations.js.map +1 -1
  63. package/dist/lib/api/schemas/api-keys.d.ts +16 -0
  64. package/dist/lib/api/schemas/api-keys.d.ts.map +1 -0
  65. package/dist/lib/api/schemas/api-keys.js +10 -0
  66. package/dist/lib/api/schemas/api-keys.js.map +1 -0
  67. package/dist/lib/api/schemas/assets.d.ts +174 -0
  68. package/dist/lib/api/schemas/assets.d.ts.map +1 -0
  69. package/dist/lib/api/schemas/assets.js +100 -0
  70. package/dist/lib/api/schemas/assets.js.map +1 -0
  71. package/dist/lib/api/schemas/documents.d.ts +325 -0
  72. package/dist/lib/api/schemas/documents.d.ts.map +1 -0
  73. package/dist/lib/api/schemas/documents.js +162 -0
  74. package/dist/lib/api/schemas/documents.js.map +1 -0
  75. package/dist/lib/api/schemas/organizations.d.ts +59 -0
  76. package/dist/lib/api/schemas/organizations.d.ts.map +1 -0
  77. package/dist/lib/api/schemas/organizations.js +46 -0
  78. package/dist/lib/api/schemas/organizations.js.map +1 -0
  79. package/dist/lib/api/schemas/user.d.ts +10 -0
  80. package/dist/lib/api/schemas/user.d.ts.map +1 -0
  81. package/dist/lib/api/schemas/user.js +12 -0
  82. package/dist/lib/api/schemas/user.js.map +1 -0
  83. package/dist/lib/api/user.d.ts +4 -6
  84. package/dist/lib/api/user.d.ts.map +1 -1
  85. package/dist/lib/api/user.js.map +1 -1
  86. package/dist/lib/auth/provider.d.ts +5 -0
  87. package/dist/lib/auth/provider.d.ts.map +1 -1
  88. package/dist/lib/client/index.d.ts +2 -0
  89. package/dist/lib/client/index.d.ts.map +1 -1
  90. package/dist/lib/client/index.js +3 -0
  91. package/dist/lib/client/index.js.map +1 -1
  92. package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts +16 -0
  93. package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts.map +1 -0
  94. package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.js +30 -0
  95. package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.js.map +1 -0
  96. package/dist/lib/hooks.d.ts.map +1 -1
  97. package/dist/lib/hooks.js +4 -0
  98. package/dist/lib/hooks.js.map +1 -1
  99. package/dist/lib/routes/assets-bulk.d.ts.map +1 -1
  100. package/dist/lib/routes/assets-bulk.js +10 -3
  101. package/dist/lib/routes/assets-bulk.js.map +1 -1
  102. package/dist/lib/routes/assets-by-id.d.ts.map +1 -1
  103. package/dist/lib/routes/assets-by-id.js +11 -1
  104. package/dist/lib/routes/assets-by-id.js.map +1 -1
  105. package/dist/lib/routes/assets-references-counts.d.ts.map +1 -1
  106. package/dist/lib/routes/assets-references-counts.js +12 -2
  107. package/dist/lib/routes/assets-references-counts.js.map +1 -1
  108. package/dist/lib/routes/assets.d.ts.map +1 -1
  109. package/dist/lib/routes/assets.js +14 -13
  110. package/dist/lib/routes/assets.js.map +1 -1
  111. package/dist/lib/routes/document-versions.d.ts.map +1 -1
  112. package/dist/lib/routes/document-versions.js +16 -2
  113. package/dist/lib/routes/document-versions.js.map +1 -1
  114. package/dist/lib/routes/documents-by-id.d.ts.map +1 -1
  115. package/dist/lib/routes/documents-by-id.js +15 -3
  116. package/dist/lib/routes/documents-by-id.js.map +1 -1
  117. package/dist/lib/routes/documents-query.d.ts.map +1 -1
  118. package/dist/lib/routes/documents-query.js +13 -10
  119. package/dist/lib/routes/documents-query.js.map +1 -1
  120. package/dist/lib/routes/documents.d.ts.map +1 -1
  121. package/dist/lib/routes/documents.js +29 -26
  122. package/dist/lib/routes/documents.js.map +1 -1
  123. package/dist/lib/routes/organizations-by-id.d.ts.map +1 -1
  124. package/dist/lib/routes/organizations-by-id.js +11 -1
  125. package/dist/lib/routes/organizations-by-id.js.map +1 -1
  126. package/dist/lib/routes/organizations-invitations.d.ts.map +1 -1
  127. package/dist/lib/routes/organizations-invitations.js +32 -12
  128. package/dist/lib/routes/organizations-invitations.js.map +1 -1
  129. package/dist/lib/routes/organizations-members.d.ts.map +1 -1
  130. package/dist/lib/routes/organizations-members.js +14 -16
  131. package/dist/lib/routes/organizations-members.js.map +1 -1
  132. package/dist/lib/routes/organizations-switch.d.ts.map +1 -1
  133. package/dist/lib/routes/organizations-switch.js +7 -3
  134. package/dist/lib/routes/organizations-switch.js.map +1 -1
  135. package/dist/lib/routes/organizations.d.ts.map +1 -1
  136. package/dist/lib/routes/organizations.js +8 -5
  137. package/dist/lib/routes/organizations.js.map +1 -1
  138. package/dist/lib/routes/user-preferences.d.ts.map +1 -1
  139. package/dist/lib/routes/user-preferences.js +7 -13
  140. package/dist/lib/routes/user-preferences.js.map +1 -1
  141. package/dist/routes/assets-bulk.d.ts.map +1 -1
  142. package/dist/routes/assets-bulk.js +10 -3
  143. package/dist/routes/assets-by-id.d.ts.map +1 -1
  144. package/dist/routes/assets-by-id.js +11 -1
  145. package/dist/routes/assets-references-counts.d.ts.map +1 -1
  146. package/dist/routes/assets-references-counts.js +12 -2
  147. package/dist/routes/assets.d.ts.map +1 -1
  148. package/dist/routes/assets.js +14 -13
  149. package/dist/routes/document-versions.d.ts.map +1 -1
  150. package/dist/routes/document-versions.js +16 -2
  151. package/dist/routes/documents-by-id.d.ts.map +1 -1
  152. package/dist/routes/documents-by-id.js +15 -3
  153. package/dist/routes/documents-query.d.ts.map +1 -1
  154. package/dist/routes/documents-query.js +13 -10
  155. package/dist/routes/documents.d.ts.map +1 -1
  156. package/dist/routes/documents.js +29 -26
  157. package/dist/routes/organizations-by-id.d.ts.map +1 -1
  158. package/dist/routes/organizations-by-id.js +11 -1
  159. package/dist/routes/organizations-invitations.d.ts.map +1 -1
  160. package/dist/routes/organizations-invitations.js +32 -12
  161. package/dist/routes/organizations-members.d.ts.map +1 -1
  162. package/dist/routes/organizations-members.js +14 -16
  163. package/dist/routes/organizations-switch.d.ts.map +1 -1
  164. package/dist/routes/organizations-switch.js +7 -3
  165. package/dist/routes/organizations.d.ts.map +1 -1
  166. package/dist/routes/organizations.js +8 -5
  167. package/dist/routes/user-preferences.d.ts.map +1 -1
  168. package/dist/routes/user-preferences.js +7 -13
  169. package/package.json +138 -138
@@ -1 +1 @@
1
- {"version":3,"file":"organizations-invitations.d.ts","sourceRoot":"","sources":["../../src/lib/routes/organizations-invitations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpD,eAAO,MAAM,IAAI,EAAE,cAyGlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,cAqEpB,CAAC"}
1
+ {"version":3,"file":"organizations-invitations.d.ts","sourceRoot":"","sources":["../../src/lib/routes/organizations-invitations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD,eAAO,MAAM,IAAI,EAAE,cA+HlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,cAuEpB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  // Aphex CMS Organization Invitations API Handlers
2
2
  import { json } from '@sveltejs/kit';
3
3
  import { cmsLogger } from '../utils/logger.js';
4
+ import { inviteMemberRequest, cancelInvitationRequest } from '../api/schemas/organizations.js';
4
5
  // POST /api/organizations/invitations - Create/send an invitation
5
6
  export const POST = async ({ request, locals }) => {
6
7
  try {
@@ -21,23 +22,39 @@ export const POST = async ({ request, locals }) => {
21
22
  message: 'Only owners and admins can invite members'
22
23
  }, { status: 403 });
23
24
  }
24
- const body = await request.json();
25
- if (!body.email || !body.role) {
25
+ const rawBody = await request.json();
26
+ const parsed = inviteMemberRequest.safeParse(rawBody);
27
+ if (!parsed.success) {
26
28
  return json({
27
29
  success: false,
28
- error: 'Missing required fields',
29
- message: 'email and role are required'
30
+ error: 'Invalid request body',
31
+ message: 'email and role (admin|editor|viewer) are required',
32
+ issues: parsed.error.issues
30
33
  }, { status: 400 });
31
34
  }
32
- // Validate role
33
- const validRoles = ['admin', 'editor', 'viewer'];
34
- if (!validRoles.includes(body.role)) {
35
+ const body = parsed.data;
36
+ // Reject self-invitation
37
+ if (body.email.toLowerCase() === auth.user.email.toLowerCase()) {
35
38
  return json({
36
39
  success: false,
37
- error: 'Invalid role',
38
- message: 'Role must be one of: admin, editor, viewer'
40
+ error: 'Invalid invitation',
41
+ message: 'You cannot invite yourself'
39
42
  }, { status: 400 });
40
43
  }
44
+ // Reject if the invitee is already a member of the organization
45
+ if (locals.aphexCMS.auth) {
46
+ const existingUser = await locals.aphexCMS.auth.getUserByEmail(body.email);
47
+ if (existingUser) {
48
+ const existingMembership = await databaseAdapter.findUserMembership(existingUser.id, auth.organizationId);
49
+ if (existingMembership) {
50
+ return json({
51
+ success: false,
52
+ error: 'Already a member',
53
+ message: 'This user is already a member of the organization'
54
+ }, { status: 400 });
55
+ }
56
+ }
57
+ }
41
58
  // Check if there's already a pending invitation for this email
42
59
  const existingInvitations = await databaseAdapter.findOrganizationInvitations(auth.organizationId);
43
60
  const pendingInvitation = existingInvitations.find((inv) => inv.email.toLowerCase() === body.email.toLowerCase() && inv.acceptedAt === null);
@@ -94,14 +111,17 @@ export const DELETE = async ({ request, locals }) => {
94
111
  message: 'Only owners and admins can cancel invitations'
95
112
  }, { status: 403 });
96
113
  }
97
- const body = await request.json();
98
- if (!body.invitationId) {
114
+ const rawBody = await request.json();
115
+ const parsed = cancelInvitationRequest.safeParse(rawBody);
116
+ if (!parsed.success) {
99
117
  return json({
100
118
  success: false,
101
119
  error: 'Missing required field',
102
- message: 'invitationId is required'
120
+ message: 'invitationId is required',
121
+ issues: parsed.error.issues
103
122
  }, { status: 400 });
104
123
  }
124
+ const body = parsed.data;
105
125
  // Delete the invitation
106
126
  const deleted = await databaseAdapter.deleteInvitation(body.invitationId);
107
127
  if (!deleted) {
@@ -1 +1 @@
1
- {"version":3,"file":"organizations-members.d.ts","sourceRoot":"","sources":["../../src/lib/routes/organizations-members.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpD,eAAO,MAAM,GAAG,EAAE,cAkCjB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,cAmIpB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,cA4HnB,CAAC"}
1
+ {"version":3,"file":"organizations-members.d.ts","sourceRoot":"","sources":["../../src/lib/routes/organizations-members.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD,eAAO,MAAM,GAAG,EAAE,cAkCjB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,cAqIpB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,cAiHnB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  // Aphex CMS Organization Members API Handlers
2
2
  import { json } from '@sveltejs/kit';
3
3
  import { cmsLogger } from '../utils/logger.js';
4
+ import { removeMemberRequest, updateMemberRoleRequest } from '../api/schemas/organizations.js';
4
5
  // GET /api/organizations/members - List organization members
5
6
  export const GET = async ({ locals }) => {
6
7
  try {
@@ -49,14 +50,17 @@ export const DELETE = async ({ request, locals }) => {
49
50
  message: 'Only owners and admins can remove members'
50
51
  }, { status: 403 });
51
52
  }
52
- const body = await request.json();
53
- if (!body.userId) {
53
+ const rawBody = await request.json();
54
+ const parsed = removeMemberRequest.safeParse(rawBody);
55
+ if (!parsed.success) {
54
56
  return json({
55
57
  success: false,
56
58
  error: 'Missing required field',
57
- message: 'userId is required'
59
+ message: 'userId is required',
60
+ issues: parsed.error.issues
58
61
  }, { status: 400 });
59
62
  }
63
+ const body = parsed.data;
60
64
  // Prevent removing yourself
61
65
  if (body.userId === auth.user.id) {
62
66
  return json({
@@ -141,23 +145,17 @@ export const PATCH = async ({ request, locals }) => {
141
145
  message: 'Only owners and admins can update member roles'
142
146
  }, { status: 403 });
143
147
  }
144
- const body = await request.json();
145
- if (!body.userId || !body.role) {
148
+ const rawBody = await request.json();
149
+ const parsed = updateMemberRoleRequest.safeParse(rawBody);
150
+ if (!parsed.success) {
146
151
  return json({
147
152
  success: false,
148
- error: 'Missing required fields',
149
- message: 'userId and role are required'
150
- }, { status: 400 });
151
- }
152
- // Validate role
153
- const validRoles = ['owner', 'admin', 'editor', 'viewer'];
154
- if (!validRoles.includes(body.role)) {
155
- return json({
156
- success: false,
157
- error: 'Invalid role',
158
- message: 'Role must be one of: owner, admin, editor, viewer'
153
+ error: 'Invalid request body',
154
+ message: 'userId and role (owner|admin|editor|viewer) are required',
155
+ issues: parsed.error.issues
159
156
  }, { status: 400 });
160
157
  }
158
+ const body = parsed.data;
161
159
  // Prevent changing your own role
162
160
  if (body.userId === auth.user.id) {
163
161
  return json({
@@ -1 +1 @@
1
- {"version":3,"file":"organizations-switch.d.ts","sourceRoot":"","sources":["../../src/lib/routes/organizations-switch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpD,eAAO,MAAM,IAAI,EAAE,cAoElB,CAAC"}
1
+ {"version":3,"file":"organizations-switch.d.ts","sourceRoot":"","sources":["../../src/lib/routes/organizations-switch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD,eAAO,MAAM,IAAI,EAAE,cAsElB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  // Aphex CMS Organization Switch API Handler
2
2
  import { json } from '@sveltejs/kit';
3
3
  import { cmsLogger } from '../utils/logger.js';
4
+ import { switchOrganizationRequest } from '../api/schemas/organizations.js';
4
5
  // POST /api/organizations/switch - Switch active organization
5
6
  export const POST = async ({ request, locals }) => {
6
7
  try {
@@ -13,14 +14,17 @@ export const POST = async ({ request, locals }) => {
13
14
  message: 'Session authentication required'
14
15
  }, { status: 401 });
15
16
  }
16
- const body = await request.json();
17
- if (!body.organizationId) {
17
+ const rawBody = await request.json();
18
+ const parsed = switchOrganizationRequest.safeParse(rawBody);
19
+ if (!parsed.success) {
18
20
  return json({
19
21
  success: false,
20
22
  error: 'Missing required field',
21
- message: 'organizationId is required'
23
+ message: 'organizationId is required',
24
+ issues: parsed.error.issues
22
25
  }, { status: 400 });
23
26
  }
27
+ const body = parsed.data;
24
28
  // Verify user is a member of the target organization
25
29
  const membership = await databaseAdapter.findUserMembership(auth.user.id, body.organizationId);
26
30
  if (!membership) {
@@ -1 +1 @@
1
- {"version":3,"file":"organizations.d.ts","sourceRoot":"","sources":["../../src/lib/routes/organizations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpD,eAAO,MAAM,GAAG,EAAE,cA6CjB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,cA6FlB,CAAC"}
1
+ {"version":3,"file":"organizations.d.ts","sourceRoot":"","sources":["../../src/lib/routes/organizations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD,eAAO,MAAM,GAAG,EAAE,cA6CjB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,cA8FlB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  // Aphex CMS Organization API Handlers
2
2
  import { json } from '@sveltejs/kit';
3
3
  import { cmsLogger } from '../utils/logger.js';
4
+ import { createOrganizationRequest } from '../api/schemas/organizations.js';
4
5
  // GET /api/organizations - List user's organizations
5
6
  export const GET = async ({ locals }) => {
6
7
  try {
@@ -59,15 +60,17 @@ export const POST = async ({ request, locals }) => {
59
60
  message: 'Only super admins can create organizations'
60
61
  }, { status: 403 });
61
62
  }
62
- const body = await request.json();
63
- // Validate required fields
64
- if (!body.name || !body.slug) {
63
+ const rawBody = await request.json();
64
+ const parsed = createOrganizationRequest.safeParse(rawBody);
65
+ if (!parsed.success) {
65
66
  return json({
66
67
  success: false,
67
- error: 'Missing required fields',
68
- message: 'Organization name and slug are required'
68
+ error: 'Invalid request body',
69
+ message: 'Organization name and slug are required',
70
+ issues: parsed.error.issues
69
71
  }, { status: 400 });
70
72
  }
73
+ const body = parsed.data;
71
74
  // Check if slug is already taken
72
75
  const existingOrg = await databaseAdapter.findOrganizationBySlug(body.slug);
73
76
  if (existingOrg) {
@@ -1 +1 @@
1
- {"version":3,"file":"user-preferences.d.ts","sourceRoot":"","sources":["../../src/lib/routes/user-preferences.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD,eAAO,MAAM,GAAG,EAAE,cAiCjB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,cAkEnB,CAAC"}
1
+ {"version":3,"file":"user-preferences.d.ts","sourceRoot":"","sources":["../../src/lib/routes/user-preferences.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD,eAAO,MAAM,GAAG,EAAE,cAiCjB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,cAoDnB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  // Aphex CMS User Preferences API Handler
2
2
  import { json } from '@sveltejs/kit';
3
3
  import { cmsLogger } from '../utils/logger.js';
4
+ import { updateUserPreferencesRequest } from '../api/schemas/user.js';
4
5
  // GET /api/user/preferences - Get user preferences
5
6
  export const GET = async ({ locals }) => {
6
7
  try {
@@ -40,24 +41,17 @@ export const PATCH = async ({ request, locals }) => {
40
41
  message: 'Session authentication required'
41
42
  }, { status: 401 });
42
43
  }
43
- const body = (await request.json());
44
- // Validate the preferences object
45
- if (typeof body !== 'object' || body === null) {
44
+ const rawBody = await request.json();
45
+ const parsed = updateUserPreferencesRequest.safeParse(rawBody);
46
+ if (!parsed.success) {
46
47
  return json({
47
48
  success: false,
48
49
  error: 'Invalid request body',
49
- message: 'Expected an object with preference values'
50
- }, { status: 400 });
51
- }
52
- // Validate individual preference types
53
- if (body.includeChildOrganizations !== undefined &&
54
- typeof body.includeChildOrganizations !== 'boolean') {
55
- return json({
56
- success: false,
57
- error: 'Invalid preference value',
58
- message: 'includeChildOrganizations must be a boolean'
50
+ message: 'Invalid preference values',
51
+ issues: parsed.error.issues
59
52
  }, { status: 400 });
60
53
  }
54
+ const body = parsed.data;
61
55
  // Update preferences
62
56
  await databaseAdapter.updateUserPreferences(auth.user.id, body);
63
57
  // Get updated profile
package/package.json CHANGED
@@ -1,139 +1,139 @@
1
1
  {
2
- "name": "@aphexcms/cms-core",
3
- "version": "2.0.9",
4
- "description": "Aphex CMS Core - A Sanity-style CMS with ports and adapters architecture",
5
- "publishConfig": {
6
- "access": "public",
7
- "provenance": true
8
- },
9
- "repository": {
10
- "type": "git",
11
- "url": "https://github.com/IcelandicIcecream/aphex.git",
12
- "directory": "packages/cms-core"
13
- },
14
- "type": "module",
15
- "main": "./dist/index.js",
16
- "types": "./dist/index.d.ts",
17
- "svelte": "./dist/index.js",
18
- "bin": {
19
- "aphex": "./dist/cli/index.js"
20
- },
21
- "exports": {
22
- ".": {
23
- "types": "./dist/index.d.ts",
24
- "svelte": "./dist/index.js",
25
- "default": "./dist/index.js"
26
- },
27
- "./server": {
28
- "types": "./dist/server/index.d.ts",
29
- "default": "./dist/server/index.js"
30
- },
31
- "./client": {
32
- "types": "./dist/client/index.d.ts",
33
- "default": "./dist/client/index.js"
34
- },
35
- "./schema": {
36
- "types": "./dist/schema/index.d.ts",
37
- "default": "./dist/schema/index.js"
38
- },
39
- "./routes/*": {
40
- "types": "./dist/routes/*.d.ts",
41
- "default": "./dist/routes/*.js"
42
- },
43
- "./*": {
44
- "types": "./dist/*.d.ts",
45
- "default": "./dist/*.js"
46
- }
47
- },
48
- "files": [
49
- "dist",
50
- "dist/cli"
51
- ],
52
- "scripts": {
53
- "build": "svelte-package && tsc && node ../../scripts/fix-imports.js ./dist",
54
- "check": "svelte-check --tsconfig ./tsconfig.json",
55
- "format": "prettier --write .",
56
- "lint": "prettier --check . && eslint .",
57
- "package": "pnpm build && pnpm pack",
58
- "dev:local": "node ../../scripts/swap-package-paths.js ./package.json src lib",
59
- "prepack": "node ../../scripts/swap-package-paths.js ./package.json dist lib",
60
- "postpack": "node ../../scripts/swap-package-paths.js ./package.json src lib"
61
- },
62
- "keywords": [
63
- "cms",
64
- "svelte",
65
- "sveltekit",
66
- "content-management",
67
- "sanity-style",
68
- "typescript",
69
- "aphex"
70
- ],
71
- "author": "Benjamin Sinidol",
72
- "license": "MIT",
73
- "peerDependencies": {
74
- "@aphexcms/ui": "workspace:*",
75
- "@envelop/graphql-jit": "^11.0.0",
76
- "@graphql-yoga/render-graphiql": "^5.16.2",
77
- "@lucide/svelte": "^0.554.0",
78
- "@sveltejs/kit": "^2.49.0",
79
- "bits-ui": "^2.14.4",
80
- "clsx": "^2.1.1",
81
- "graphql": "^16.12.0",
82
- "graphql-yoga": "^5.16.2",
83
- "mode-watcher": "^1.1.0",
84
- "svelte": "^5.44.0",
85
- "tailwind-merge": "^3.4.0",
86
- "tailwind-variants": "^3.2.2"
87
- },
88
- "peerDependenciesMeta": {
89
- "graphql": {
90
- "optional": true
91
- },
92
- "graphql-yoga": {
93
- "optional": true
94
- },
95
- "@envelop/graphql-jit": {
96
- "optional": true
97
- },
98
- "@graphql-yoga/render-graphiql": {
99
- "optional": true
100
- }
101
- },
102
- "dependencies": {
103
- "@clack/prompts": "^0.11.0",
104
- "@dnd-kit/helpers": "^0.3.0",
105
- "@dnd-kit/svelte": "^0.3.0",
106
- "cac": "^6.7.14",
107
- "dayjs": "^1.11.19",
108
- "esbuild": "^0.27.0",
109
- "picocolors": "^1.1.1",
110
- "s3mini": "^0.7.0",
111
- "sharp": "^0.34.5",
112
- "svelte-sonner": "^1.0.7",
113
- "tsx": "^4.20.6"
114
- },
115
- "devDependencies": {
116
- "@eslint/compat": "^2.0.0",
117
- "@eslint/js": "^9.39.1",
118
- "@internationalized/date": "^3.10.0",
119
- "@sveltejs/adapter-auto": "^7.0.0",
120
- "@sveltejs/kit": "^2.49.0",
121
- "@sveltejs/package": "^2.5.6",
122
- "@sveltejs/vite-plugin-svelte": "^6.2.1",
123
- "@tailwindcss/vite": "^4.1.17",
124
- "@types/node": "^22.0.0",
125
- "eslint": "^9.39.1",
126
- "eslint-config-prettier": "^10.1.8",
127
- "eslint-plugin-svelte": "^3.13.0",
128
- "globals": "^16.5.0",
129
- "prettier": "^3.6.2",
130
- "prettier-plugin-svelte": "^3.4.0",
131
- "prettier-plugin-tailwindcss": "^0.7.1",
132
- "svelte": "^5.44.0",
133
- "svelte-check": "^4.3.4",
134
- "tailwindcss": "^4.1.17",
135
- "typescript": "^5.9.3",
136
- "typescript-eslint": "^8.48.0",
137
- "vite": "^7.2.4"
138
- }
139
- }
2
+ "name": "@aphexcms/cms-core",
3
+ "version": "2.0.10",
4
+ "description": "Aphex CMS Core - A Sanity-style CMS with ports and adapters architecture",
5
+ "publishConfig": {
6
+ "access": "public",
7
+ "provenance": true
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/IcelandicIcecream/aphex.git",
12
+ "directory": "packages/cms-core"
13
+ },
14
+ "type": "module",
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "svelte": "./dist/index.js",
18
+ "bin": {
19
+ "aphex": "./dist/cli/index.js"
20
+ },
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "svelte": "./dist/index.js",
25
+ "default": "./dist/index.js"
26
+ },
27
+ "./server": {
28
+ "types": "./dist/server/index.d.ts",
29
+ "default": "./dist/server/index.js"
30
+ },
31
+ "./client": {
32
+ "types": "./dist/client/index.d.ts",
33
+ "default": "./dist/client/index.js"
34
+ },
35
+ "./schema": {
36
+ "types": "./dist/schema/index.d.ts",
37
+ "default": "./dist/schema/index.js"
38
+ },
39
+ "./routes/*": {
40
+ "types": "./dist/routes/*.d.ts",
41
+ "default": "./dist/routes/*.js"
42
+ },
43
+ "./*": {
44
+ "types": "./dist/*.d.ts",
45
+ "default": "./dist/*.js"
46
+ }
47
+ },
48
+ "files": [
49
+ "dist",
50
+ "dist/cli"
51
+ ],
52
+ "keywords": [
53
+ "cms",
54
+ "svelte",
55
+ "sveltekit",
56
+ "content-management",
57
+ "sanity-style",
58
+ "typescript",
59
+ "aphex"
60
+ ],
61
+ "author": "Benjamin Sinidol",
62
+ "license": "MIT",
63
+ "peerDependencies": {
64
+ "@envelop/graphql-jit": "^11.0.0",
65
+ "@graphql-yoga/render-graphiql": "^5.16.2",
66
+ "@lucide/svelte": "^0.554.0",
67
+ "@sveltejs/kit": "^2.49.0",
68
+ "bits-ui": "^2.14.4",
69
+ "clsx": "^2.1.1",
70
+ "graphql": "^16.12.0",
71
+ "graphql-yoga": "^5.16.2",
72
+ "mode-watcher": "^1.1.0",
73
+ "svelte": "^5.44.0",
74
+ "tailwind-merge": "^3.4.0",
75
+ "tailwind-variants": "^3.2.2",
76
+ "@aphexcms/ui": "0.3.2"
77
+ },
78
+ "peerDependenciesMeta": {
79
+ "graphql": {
80
+ "optional": true
81
+ },
82
+ "graphql-yoga": {
83
+ "optional": true
84
+ },
85
+ "@envelop/graphql-jit": {
86
+ "optional": true
87
+ },
88
+ "@graphql-yoga/render-graphiql": {
89
+ "optional": true
90
+ }
91
+ },
92
+ "dependencies": {
93
+ "@clack/prompts": "^0.11.0",
94
+ "@dnd-kit/helpers": "^0.3.0",
95
+ "@dnd-kit/svelte": "^0.3.0",
96
+ "cac": "^6.7.14",
97
+ "dayjs": "^1.11.19",
98
+ "esbuild": "^0.27.0",
99
+ "picocolors": "^1.1.1",
100
+ "s3mini": "^0.7.0",
101
+ "sharp": "^0.34.5",
102
+ "svelte-sonner": "^1.0.7",
103
+ "tsx": "^4.20.6",
104
+ "zod": "^4.1.11"
105
+ },
106
+ "devDependencies": {
107
+ "@eslint/compat": "^2.0.0",
108
+ "@eslint/js": "^9.39.1",
109
+ "@internationalized/date": "^3.10.0",
110
+ "@sveltejs/adapter-auto": "^7.0.0",
111
+ "@sveltejs/kit": "^2.49.0",
112
+ "@sveltejs/package": "^2.5.6",
113
+ "@sveltejs/vite-plugin-svelte": "^6.2.1",
114
+ "@tailwindcss/vite": "^4.1.17",
115
+ "@types/node": "^22.0.0",
116
+ "eslint": "^9.39.1",
117
+ "eslint-config-prettier": "^10.1.8",
118
+ "eslint-plugin-svelte": "^3.13.0",
119
+ "globals": "^16.5.0",
120
+ "prettier": "^3.6.2",
121
+ "prettier-plugin-svelte": "^3.4.0",
122
+ "prettier-plugin-tailwindcss": "^0.7.1",
123
+ "svelte": "^5.44.0",
124
+ "svelte-check": "^4.3.4",
125
+ "tailwindcss": "^4.1.17",
126
+ "typescript": "^5.9.3",
127
+ "typescript-eslint": "^8.48.0",
128
+ "vite": "^7.2.4"
129
+ },
130
+ "scripts": {
131
+ "build": "svelte-package && tsc && node ../../scripts/fix-imports.js ./dist",
132
+ "dev": "tsc --watch --preserveWatchOutput",
133
+ "check": "svelte-check --tsconfig ./tsconfig.json",
134
+ "format": "prettier --write .",
135
+ "lint": "prettier --check . && eslint .",
136
+ "package": "pnpm build && pnpm pack",
137
+ "dev:local": "node ../../scripts/swap-package-paths.js ./package.json src lib"
138
+ }
139
+ }