@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.
- package/LICENSE +21 -0
- package/dist/api/api-keys.d.ts +4 -7
- package/dist/api/api-keys.d.ts.map +1 -1
- package/dist/api/assets.d.ts +7 -22
- package/dist/api/assets.d.ts.map +1 -1
- package/dist/api/assets.js +1 -10
- package/dist/api/documents.d.ts +17 -16
- package/dist/api/documents.d.ts.map +1 -1
- package/dist/api/documents.js +2 -2
- package/dist/api/organizations.d.ts +15 -35
- package/dist/api/organizations.d.ts.map +1 -1
- package/dist/api/schemas/api-keys.d.ts +16 -0
- package/dist/api/schemas/api-keys.d.ts.map +1 -0
- package/dist/api/schemas/api-keys.js +9 -0
- package/dist/api/schemas/assets.d.ts +174 -0
- package/dist/api/schemas/assets.d.ts.map +1 -0
- package/dist/api/schemas/assets.js +99 -0
- package/dist/api/schemas/documents.d.ts +325 -0
- package/dist/api/schemas/documents.d.ts.map +1 -0
- package/dist/api/schemas/documents.js +161 -0
- package/dist/api/schemas/organizations.d.ts +59 -0
- package/dist/api/schemas/organizations.d.ts.map +1 -0
- package/dist/api/schemas/organizations.js +45 -0
- package/dist/api/schemas/user.d.ts +10 -0
- package/dist/api/schemas/user.d.ts.map +1 -0
- package/dist/api/schemas/user.js +11 -0
- package/dist/api/user.d.ts +4 -6
- package/dist/api/user.d.ts.map +1 -1
- package/dist/auth/provider.d.ts +5 -0
- package/dist/auth/provider.d.ts.map +1 -1
- package/dist/cli/index.js +0 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -0
- package/dist/components/AdminApp.svelte +8 -4
- package/dist/components/AdminApp.svelte.d.ts.map +1 -1
- package/dist/components/admin/DocumentEditor.svelte +23 -18
- package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
- package/dist/components/admin/DocumentVersionPanel.svelte +18 -31
- package/dist/components/admin/DocumentVersionPanel.svelte.d.ts.map +1 -1
- package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte +37 -0
- package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte.d.ts +19 -0
- package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte.d.ts.map +1 -0
- package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts +16 -0
- package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts.map +1 -0
- package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.js +29 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +4 -0
- package/dist/lib/api/api-keys.d.ts +4 -7
- package/dist/lib/api/api-keys.d.ts.map +1 -1
- package/dist/lib/api/api-keys.js.map +1 -1
- package/dist/lib/api/assets.d.ts +7 -22
- package/dist/lib/api/assets.d.ts.map +1 -1
- package/dist/lib/api/assets.js +1 -10
- package/dist/lib/api/assets.js.map +1 -1
- package/dist/lib/api/documents.d.ts +17 -16
- package/dist/lib/api/documents.d.ts.map +1 -1
- package/dist/lib/api/documents.js +2 -2
- package/dist/lib/api/documents.js.map +1 -1
- package/dist/lib/api/organizations.d.ts +15 -35
- package/dist/lib/api/organizations.d.ts.map +1 -1
- package/dist/lib/api/organizations.js.map +1 -1
- package/dist/lib/api/schemas/api-keys.d.ts +16 -0
- package/dist/lib/api/schemas/api-keys.d.ts.map +1 -0
- package/dist/lib/api/schemas/api-keys.js +10 -0
- package/dist/lib/api/schemas/api-keys.js.map +1 -0
- package/dist/lib/api/schemas/assets.d.ts +174 -0
- package/dist/lib/api/schemas/assets.d.ts.map +1 -0
- package/dist/lib/api/schemas/assets.js +100 -0
- package/dist/lib/api/schemas/assets.js.map +1 -0
- package/dist/lib/api/schemas/documents.d.ts +325 -0
- package/dist/lib/api/schemas/documents.d.ts.map +1 -0
- package/dist/lib/api/schemas/documents.js +162 -0
- package/dist/lib/api/schemas/documents.js.map +1 -0
- package/dist/lib/api/schemas/organizations.d.ts +59 -0
- package/dist/lib/api/schemas/organizations.d.ts.map +1 -0
- package/dist/lib/api/schemas/organizations.js +46 -0
- package/dist/lib/api/schemas/organizations.js.map +1 -0
- package/dist/lib/api/schemas/user.d.ts +10 -0
- package/dist/lib/api/schemas/user.d.ts.map +1 -0
- package/dist/lib/api/schemas/user.js +12 -0
- package/dist/lib/api/schemas/user.js.map +1 -0
- package/dist/lib/api/user.d.ts +4 -6
- package/dist/lib/api/user.d.ts.map +1 -1
- package/dist/lib/api/user.js.map +1 -1
- package/dist/lib/auth/provider.d.ts +5 -0
- package/dist/lib/auth/provider.d.ts.map +1 -1
- package/dist/lib/client/index.d.ts +2 -0
- package/dist/lib/client/index.d.ts.map +1 -1
- package/dist/lib/client/index.js +3 -0
- package/dist/lib/client/index.js.map +1 -1
- package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts +16 -0
- package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts.map +1 -0
- package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.js +30 -0
- package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.js.map +1 -0
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +4 -0
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/routes/assets-bulk.d.ts.map +1 -1
- package/dist/lib/routes/assets-bulk.js +10 -3
- package/dist/lib/routes/assets-bulk.js.map +1 -1
- package/dist/lib/routes/assets-by-id.d.ts.map +1 -1
- package/dist/lib/routes/assets-by-id.js +11 -1
- package/dist/lib/routes/assets-by-id.js.map +1 -1
- package/dist/lib/routes/assets-references-counts.d.ts.map +1 -1
- package/dist/lib/routes/assets-references-counts.js +12 -2
- package/dist/lib/routes/assets-references-counts.js.map +1 -1
- package/dist/lib/routes/assets.d.ts.map +1 -1
- package/dist/lib/routes/assets.js +14 -13
- package/dist/lib/routes/assets.js.map +1 -1
- package/dist/lib/routes/document-versions.d.ts.map +1 -1
- package/dist/lib/routes/document-versions.js +16 -2
- package/dist/lib/routes/document-versions.js.map +1 -1
- package/dist/lib/routes/documents-by-id.d.ts.map +1 -1
- package/dist/lib/routes/documents-by-id.js +15 -3
- package/dist/lib/routes/documents-by-id.js.map +1 -1
- package/dist/lib/routes/documents-query.d.ts.map +1 -1
- package/dist/lib/routes/documents-query.js +13 -10
- package/dist/lib/routes/documents-query.js.map +1 -1
- package/dist/lib/routes/documents.d.ts.map +1 -1
- package/dist/lib/routes/documents.js +29 -26
- package/dist/lib/routes/documents.js.map +1 -1
- package/dist/lib/routes/organizations-by-id.d.ts.map +1 -1
- package/dist/lib/routes/organizations-by-id.js +11 -1
- package/dist/lib/routes/organizations-by-id.js.map +1 -1
- package/dist/lib/routes/organizations-invitations.d.ts.map +1 -1
- package/dist/lib/routes/organizations-invitations.js +32 -12
- package/dist/lib/routes/organizations-invitations.js.map +1 -1
- package/dist/lib/routes/organizations-members.d.ts.map +1 -1
- package/dist/lib/routes/organizations-members.js +14 -16
- package/dist/lib/routes/organizations-members.js.map +1 -1
- package/dist/lib/routes/organizations-switch.d.ts.map +1 -1
- package/dist/lib/routes/organizations-switch.js +7 -3
- package/dist/lib/routes/organizations-switch.js.map +1 -1
- package/dist/lib/routes/organizations.d.ts.map +1 -1
- package/dist/lib/routes/organizations.js +8 -5
- package/dist/lib/routes/organizations.js.map +1 -1
- package/dist/lib/routes/user-preferences.d.ts.map +1 -1
- package/dist/lib/routes/user-preferences.js +7 -13
- package/dist/lib/routes/user-preferences.js.map +1 -1
- package/dist/routes/assets-bulk.d.ts.map +1 -1
- package/dist/routes/assets-bulk.js +10 -3
- package/dist/routes/assets-by-id.d.ts.map +1 -1
- package/dist/routes/assets-by-id.js +11 -1
- package/dist/routes/assets-references-counts.d.ts.map +1 -1
- package/dist/routes/assets-references-counts.js +12 -2
- package/dist/routes/assets.d.ts.map +1 -1
- package/dist/routes/assets.js +14 -13
- package/dist/routes/document-versions.d.ts.map +1 -1
- package/dist/routes/document-versions.js +16 -2
- package/dist/routes/documents-by-id.d.ts.map +1 -1
- package/dist/routes/documents-by-id.js +15 -3
- package/dist/routes/documents-query.d.ts.map +1 -1
- package/dist/routes/documents-query.js +13 -10
- package/dist/routes/documents.d.ts.map +1 -1
- package/dist/routes/documents.js +29 -26
- package/dist/routes/organizations-by-id.d.ts.map +1 -1
- package/dist/routes/organizations-by-id.js +11 -1
- package/dist/routes/organizations-invitations.d.ts.map +1 -1
- package/dist/routes/organizations-invitations.js +32 -12
- package/dist/routes/organizations-members.d.ts.map +1 -1
- package/dist/routes/organizations-members.js +14 -16
- package/dist/routes/organizations-switch.d.ts.map +1 -1
- package/dist/routes/organizations-switch.js +7 -3
- package/dist/routes/organizations.d.ts.map +1 -1
- package/dist/routes/organizations.js +8 -5
- package/dist/routes/user-preferences.d.ts.map +1 -1
- package/dist/routes/user-preferences.js +7 -13
- 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;
|
|
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
|
|
25
|
-
|
|
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: '
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
if (
|
|
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
|
|
38
|
-
message: '
|
|
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
|
|
98
|
-
|
|
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;
|
|
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
|
|
53
|
-
|
|
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
|
|
145
|
-
|
|
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: '
|
|
149
|
-
message: 'userId and role are required'
|
|
150
|
-
|
|
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;
|
|
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
|
|
17
|
-
|
|
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;
|
|
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
|
|
63
|
-
|
|
64
|
-
if (!
|
|
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: '
|
|
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,
|
|
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
|
|
44
|
-
|
|
45
|
-
if (
|
|
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: '
|
|
50
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
+
}
|