@aphexcms/cms-core 4.0.0 → 5.0.1
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/dist/api/schemas/user.d.ts +10 -0
- package/dist/api/schemas/user.d.ts.map +1 -1
- package/dist/api/schemas/user.js +10 -0
- package/dist/cli/generate-types.d.ts.map +1 -1
- package/dist/cli/generate-types.js +14 -9
- package/dist/cli/generate-types.js.map +1 -1
- package/dist/components/AdminApp.svelte +25 -7
- package/dist/components/AdminApp.svelte.d.ts.map +1 -1
- package/dist/components/admin/DocumentEditor.svelte +63 -11
- package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
- package/dist/components/admin/DocumentVersionPanel.svelte +6 -0
- package/dist/components/admin/DocumentVersionPanel.svelte.d.ts +3 -1
- package/dist/components/admin/DocumentVersionPanel.svelte.d.ts.map +1 -1
- package/dist/components/admin/ObjectModal.svelte +55 -12
- package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/ArrayField.svelte +15 -15
- package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -2
- package/dist/hooks.d.ts +3 -4
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +20 -99
- package/dist/lib/api/schemas/user.d.ts +10 -0
- package/dist/lib/api/schemas/user.d.ts.map +1 -1
- package/dist/lib/api/schemas/user.js +10 -0
- package/dist/lib/api/schemas/user.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +1 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/hooks.d.ts +3 -4
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +20 -99
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/server/api/index.d.ts +55 -0
- package/dist/lib/server/api/index.d.ts.map +1 -0
- package/dist/lib/server/api/index.js +107 -0
- package/dist/lib/server/api/index.js.map +1 -0
- package/dist/lib/server/api/routes/assets-bulk.d.ts +4 -0
- package/dist/lib/server/api/routes/assets-bulk.d.ts.map +1 -0
- package/dist/{routes → lib/server/api/routes}/assets-bulk.js +23 -23
- package/dist/lib/server/api/routes/assets-bulk.js.map +1 -0
- package/dist/lib/server/api/routes/assets-by-id.d.ts +4 -0
- package/dist/lib/server/api/routes/assets-by-id.d.ts.map +1 -0
- package/dist/lib/server/api/routes/assets-by-id.js +108 -0
- package/dist/lib/server/api/routes/assets-by-id.js.map +1 -0
- package/dist/lib/server/api/routes/assets-references.d.ts +15 -0
- package/dist/lib/server/api/routes/assets-references.d.ts.map +1 -0
- package/dist/lib/server/api/routes/assets-references.js +78 -0
- package/dist/lib/server/api/routes/assets-references.js.map +1 -0
- package/dist/lib/server/api/routes/assets.d.ts +4 -0
- package/dist/lib/server/api/routes/assets.d.ts.map +1 -0
- package/dist/{routes → lib/server/api/routes}/assets.js +76 -87
- package/dist/lib/server/api/routes/assets.js.map +1 -0
- package/dist/lib/server/api/routes/document-versions.d.ts +4 -0
- package/dist/lib/server/api/routes/document-versions.d.ts.map +1 -0
- package/dist/lib/server/api/routes/document-versions.js +113 -0
- package/dist/lib/server/api/routes/document-versions.js.map +1 -0
- package/dist/lib/server/api/routes/documents-by-id.d.ts +4 -0
- package/dist/lib/server/api/routes/documents-by-id.d.ts.map +1 -0
- package/dist/lib/server/api/routes/documents-by-id.js +148 -0
- package/dist/lib/server/api/routes/documents-by-id.js.map +1 -0
- package/dist/lib/server/api/routes/documents-publish.d.ts +4 -0
- package/dist/lib/server/api/routes/documents-publish.d.ts.map +1 -0
- package/dist/{routes → lib/server/api/routes}/documents-publish.js +42 -58
- package/dist/lib/server/api/routes/documents-publish.js.map +1 -0
- package/dist/lib/server/api/routes/documents-query.d.ts +8 -0
- package/dist/lib/server/api/routes/documents-query.d.ts.map +1 -0
- package/dist/lib/server/api/routes/documents-query.js +75 -0
- package/dist/lib/server/api/routes/documents-query.js.map +1 -0
- package/dist/lib/server/api/routes/documents.d.ts +4 -0
- package/dist/lib/server/api/routes/documents.d.ts.map +1 -0
- package/dist/{routes → lib/server/api/routes}/documents.js +55 -76
- package/dist/lib/server/api/routes/documents.js.map +1 -0
- package/dist/lib/server/api/routes/organizations-by-id.d.ts +4 -0
- package/dist/lib/server/api/routes/organizations-by-id.d.ts.map +1 -0
- package/dist/{routes → lib/server/api/routes}/organizations-by-id.js +62 -91
- package/dist/lib/server/api/routes/organizations-by-id.js.map +1 -0
- package/dist/lib/server/api/routes/organizations-invitations.d.ts +10 -0
- package/dist/lib/server/api/routes/organizations-invitations.d.ts.map +1 -0
- package/dist/{routes → lib/server/api/routes}/organizations-invitations.js +67 -78
- package/dist/lib/server/api/routes/organizations-invitations.js.map +1 -0
- package/dist/lib/server/api/routes/organizations-members.d.ts +4 -0
- package/dist/lib/server/api/routes/organizations-members.d.ts.map +1 -0
- package/dist/{routes → lib/server/api/routes}/organizations-members.js +74 -106
- package/dist/lib/server/api/routes/organizations-members.js.map +1 -0
- package/dist/lib/server/api/routes/organizations-switch.d.ts +4 -0
- package/dist/lib/server/api/routes/organizations-switch.d.ts.map +1 -0
- package/dist/lib/server/api/routes/organizations-switch.js +54 -0
- package/dist/lib/server/api/routes/organizations-switch.js.map +1 -0
- package/dist/lib/server/api/routes/organizations.d.ts +4 -0
- package/dist/lib/server/api/routes/organizations.d.ts.map +1 -0
- package/dist/lib/server/api/routes/organizations.js +99 -0
- package/dist/lib/server/api/routes/organizations.js.map +1 -0
- package/dist/lib/server/api/routes/roles.d.ts +12 -0
- package/dist/lib/server/api/routes/roles.d.ts.map +1 -0
- package/dist/lib/server/api/routes/roles.js +219 -0
- package/dist/lib/server/api/routes/roles.js.map +1 -0
- package/dist/lib/server/api/routes/schemas.d.ts +4 -0
- package/dist/lib/server/api/routes/schemas.d.ts.map +1 -0
- package/dist/lib/server/api/routes/schemas.js +27 -0
- package/dist/lib/server/api/routes/schemas.js.map +1 -0
- package/dist/lib/server/api/routes/user-preferences.d.ts +4 -0
- package/dist/lib/server/api/routes/user-preferences.d.ts.map +1 -0
- package/dist/lib/server/api/routes/user-preferences.js +63 -0
- package/dist/lib/server/api/routes/user-preferences.js.map +1 -0
- package/dist/lib/server/api/routes/user.d.ts +12 -0
- package/dist/lib/server/api/routes/user.d.ts.map +1 -0
- package/dist/lib/server/api/routes/user.js +114 -0
- package/dist/lib/server/api/routes/user.js.map +1 -0
- package/dist/lib/server/index.d.ts +2 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +7 -3
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/types/config.d.ts +28 -29
- package/dist/lib/types/config.d.ts.map +1 -1
- package/dist/server/api/index.d.ts +55 -0
- package/dist/server/api/index.d.ts.map +1 -0
- package/dist/server/api/index.js +106 -0
- package/dist/server/api/routes/assets-bulk.d.ts +4 -0
- package/dist/server/api/routes/assets-bulk.d.ts.map +1 -0
- package/dist/{lib → server/api}/routes/assets-bulk.js +22 -24
- package/dist/server/api/routes/assets-by-id.d.ts +4 -0
- package/dist/server/api/routes/assets-by-id.d.ts.map +1 -0
- package/dist/server/api/routes/assets-by-id.js +107 -0
- package/dist/server/api/routes/assets-references.d.ts +15 -0
- package/dist/server/api/routes/assets-references.d.ts.map +1 -0
- package/dist/server/api/routes/assets-references.js +77 -0
- package/dist/server/api/routes/assets.d.ts +4 -0
- package/dist/server/api/routes/assets.d.ts.map +1 -0
- package/dist/{lib → server/api}/routes/assets.js +75 -88
- package/dist/server/api/routes/document-versions.d.ts +4 -0
- package/dist/server/api/routes/document-versions.d.ts.map +1 -0
- package/dist/server/api/routes/document-versions.js +112 -0
- package/dist/server/api/routes/documents-by-id.d.ts +4 -0
- package/dist/server/api/routes/documents-by-id.d.ts.map +1 -0
- package/dist/server/api/routes/documents-by-id.js +147 -0
- package/dist/server/api/routes/documents-publish.d.ts +4 -0
- package/dist/server/api/routes/documents-publish.d.ts.map +1 -0
- package/dist/{lib → server/api}/routes/documents-publish.js +41 -59
- package/dist/server/api/routes/documents-query.d.ts +8 -0
- package/dist/server/api/routes/documents-query.d.ts.map +1 -0
- package/dist/server/api/routes/documents-query.js +74 -0
- package/dist/server/api/routes/documents.d.ts +4 -0
- package/dist/server/api/routes/documents.d.ts.map +1 -0
- package/dist/{lib → server/api}/routes/documents.js +54 -77
- package/dist/server/api/routes/organizations-by-id.d.ts +4 -0
- package/dist/server/api/routes/organizations-by-id.d.ts.map +1 -0
- package/dist/{lib → server/api}/routes/organizations-by-id.js +61 -92
- package/dist/server/api/routes/organizations-invitations.d.ts +10 -0
- package/dist/server/api/routes/organizations-invitations.d.ts.map +1 -0
- package/dist/{lib → server/api}/routes/organizations-invitations.js +66 -79
- package/dist/server/api/routes/organizations-members.d.ts +4 -0
- package/dist/server/api/routes/organizations-members.d.ts.map +1 -0
- package/dist/{lib → server/api}/routes/organizations-members.js +73 -107
- package/dist/server/api/routes/organizations-switch.d.ts +4 -0
- package/dist/server/api/routes/organizations-switch.d.ts.map +1 -0
- package/dist/server/api/routes/organizations-switch.js +53 -0
- package/dist/server/api/routes/organizations.d.ts +4 -0
- package/dist/server/api/routes/organizations.d.ts.map +1 -0
- package/dist/server/api/routes/organizations.js +98 -0
- package/dist/server/api/routes/roles.d.ts +12 -0
- package/dist/server/api/routes/roles.d.ts.map +1 -0
- package/dist/server/api/routes/roles.js +218 -0
- package/dist/server/api/routes/schemas.d.ts +4 -0
- package/dist/server/api/routes/schemas.d.ts.map +1 -0
- package/dist/server/api/routes/schemas.js +26 -0
- package/dist/server/api/routes/user-preferences.d.ts +4 -0
- package/dist/server/api/routes/user-preferences.d.ts.map +1 -0
- package/dist/server/api/routes/user-preferences.js +62 -0
- package/dist/server/api/routes/user.d.ts +12 -0
- package/dist/server/api/routes/user.d.ts.map +1 -0
- package/dist/server/api/routes/user.js +113 -0
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +7 -3
- package/dist/types/config.d.ts +28 -29
- package/dist/types/config.d.ts.map +1 -1
- package/package.json +4 -2
- package/dist/lib/routes/assets-bulk.d.ts +0 -3
- package/dist/lib/routes/assets-bulk.d.ts.map +0 -1
- package/dist/lib/routes/assets-bulk.js.map +0 -1
- package/dist/lib/routes/assets-by-id.d.ts +0 -5
- package/dist/lib/routes/assets-by-id.d.ts.map +0 -1
- package/dist/lib/routes/assets-by-id.js +0 -116
- package/dist/lib/routes/assets-by-id.js.map +0 -1
- package/dist/lib/routes/assets-references-counts.d.ts +0 -7
- package/dist/lib/routes/assets-references-counts.d.ts.map +0 -1
- package/dist/lib/routes/assets-references-counts.js +0 -42
- package/dist/lib/routes/assets-references-counts.js.map +0 -1
- package/dist/lib/routes/assets-references.d.ts +0 -7
- package/dist/lib/routes/assets-references.d.ts.map +0 -1
- package/dist/lib/routes/assets-references.js +0 -35
- package/dist/lib/routes/assets-references.js.map +0 -1
- package/dist/lib/routes/assets.d.ts +0 -4
- package/dist/lib/routes/assets.d.ts.map +0 -1
- package/dist/lib/routes/assets.js.map +0 -1
- package/dist/lib/routes/document-versions.d.ts +0 -5
- package/dist/lib/routes/document-versions.d.ts.map +0 -1
- package/dist/lib/routes/document-versions.js +0 -114
- package/dist/lib/routes/document-versions.js.map +0 -1
- package/dist/lib/routes/documents-by-id.d.ts +0 -5
- package/dist/lib/routes/documents-by-id.d.ts.map +0 -1
- package/dist/lib/routes/documents-by-id.js +0 -188
- package/dist/lib/routes/documents-by-id.js.map +0 -1
- package/dist/lib/routes/documents-publish.d.ts +0 -4
- package/dist/lib/routes/documents-publish.d.ts.map +0 -1
- package/dist/lib/routes/documents-publish.js.map +0 -1
- package/dist/lib/routes/documents-query.d.ts +0 -26
- package/dist/lib/routes/documents-query.d.ts.map +0 -1
- package/dist/lib/routes/documents-query.js +0 -104
- package/dist/lib/routes/documents-query.js.map +0 -1
- package/dist/lib/routes/documents.d.ts +0 -4
- package/dist/lib/routes/documents.d.ts.map +0 -1
- package/dist/lib/routes/documents.js.map +0 -1
- package/dist/lib/routes/index.d.ts +0 -9
- package/dist/lib/routes/index.d.ts.map +0 -1
- package/dist/lib/routes/index.js +0 -15
- package/dist/lib/routes/index.js.map +0 -1
- package/dist/lib/routes/organizations-by-id.d.ts +0 -5
- package/dist/lib/routes/organizations-by-id.d.ts.map +0 -1
- package/dist/lib/routes/organizations-by-id.js.map +0 -1
- package/dist/lib/routes/organizations-invitations.d.ts +0 -4
- package/dist/lib/routes/organizations-invitations.d.ts.map +0 -1
- package/dist/lib/routes/organizations-invitations.js.map +0 -1
- package/dist/lib/routes/organizations-members.d.ts +0 -5
- package/dist/lib/routes/organizations-members.d.ts.map +0 -1
- package/dist/lib/routes/organizations-members.js.map +0 -1
- package/dist/lib/routes/organizations-switch.d.ts +0 -3
- package/dist/lib/routes/organizations-switch.d.ts.map +0 -1
- package/dist/lib/routes/organizations-switch.js +0 -59
- package/dist/lib/routes/organizations-switch.js.map +0 -1
- package/dist/lib/routes/organizations.d.ts +0 -4
- package/dist/lib/routes/organizations.d.ts.map +0 -1
- package/dist/lib/routes/organizations.js +0 -117
- package/dist/lib/routes/organizations.js.map +0 -1
- package/dist/lib/routes/roles-by-name.d.ts +0 -4
- package/dist/lib/routes/roles-by-name.d.ts.map +0 -1
- package/dist/lib/routes/roles-by-name.js +0 -112
- package/dist/lib/routes/roles-by-name.js.map +0 -1
- package/dist/lib/routes/roles.d.ts +0 -4
- package/dist/lib/routes/roles.d.ts.map +0 -1
- package/dist/lib/routes/roles.js +0 -91
- package/dist/lib/routes/roles.js.map +0 -1
- package/dist/lib/routes/schemas-by-type.d.ts +0 -3
- package/dist/lib/routes/schemas-by-type.d.ts.map +0 -1
- package/dist/lib/routes/schemas-by-type.js +0 -27
- package/dist/lib/routes/schemas-by-type.js.map +0 -1
- package/dist/lib/routes/schemas.d.ts +0 -3
- package/dist/lib/routes/schemas.d.ts.map +0 -1
- package/dist/lib/routes/schemas.js +0 -12
- package/dist/lib/routes/schemas.js.map +0 -1
- package/dist/lib/routes/user-preferences.d.ts +0 -4
- package/dist/lib/routes/user-preferences.d.ts.map +0 -1
- package/dist/lib/routes/user-preferences.js +0 -73
- package/dist/lib/routes/user-preferences.js.map +0 -1
- package/dist/lib/routes-exports.d.ts +0 -20
- package/dist/lib/routes-exports.d.ts.map +0 -1
- package/dist/lib/routes-exports.js +0 -27
- package/dist/lib/routes-exports.js.map +0 -1
- package/dist/routes/assets-bulk.d.ts +0 -3
- package/dist/routes/assets-bulk.d.ts.map +0 -1
- package/dist/routes/assets-by-id.d.ts +0 -5
- package/dist/routes/assets-by-id.d.ts.map +0 -1
- package/dist/routes/assets-by-id.js +0 -115
- package/dist/routes/assets-references-counts.d.ts +0 -7
- package/dist/routes/assets-references-counts.d.ts.map +0 -1
- package/dist/routes/assets-references-counts.js +0 -41
- package/dist/routes/assets-references.d.ts +0 -7
- package/dist/routes/assets-references.d.ts.map +0 -1
- package/dist/routes/assets-references.js +0 -34
- package/dist/routes/assets.d.ts +0 -4
- package/dist/routes/assets.d.ts.map +0 -1
- package/dist/routes/document-versions.d.ts +0 -5
- package/dist/routes/document-versions.d.ts.map +0 -1
- package/dist/routes/document-versions.js +0 -113
- package/dist/routes/documents-by-id.d.ts +0 -5
- package/dist/routes/documents-by-id.d.ts.map +0 -1
- package/dist/routes/documents-by-id.js +0 -187
- package/dist/routes/documents-publish.d.ts +0 -4
- package/dist/routes/documents-publish.d.ts.map +0 -1
- package/dist/routes/documents-query.d.ts +0 -26
- package/dist/routes/documents-query.d.ts.map +0 -1
- package/dist/routes/documents-query.js +0 -103
- package/dist/routes/documents.d.ts +0 -4
- package/dist/routes/documents.d.ts.map +0 -1
- package/dist/routes/index.d.ts +0 -9
- package/dist/routes/index.d.ts.map +0 -1
- package/dist/routes/index.js +0 -14
- package/dist/routes/organizations-by-id.d.ts +0 -5
- package/dist/routes/organizations-by-id.d.ts.map +0 -1
- package/dist/routes/organizations-invitations.d.ts +0 -4
- package/dist/routes/organizations-invitations.d.ts.map +0 -1
- package/dist/routes/organizations-members.d.ts +0 -5
- package/dist/routes/organizations-members.d.ts.map +0 -1
- package/dist/routes/organizations-switch.d.ts +0 -3
- package/dist/routes/organizations-switch.d.ts.map +0 -1
- package/dist/routes/organizations-switch.js +0 -58
- package/dist/routes/organizations.d.ts +0 -4
- package/dist/routes/organizations.d.ts.map +0 -1
- package/dist/routes/organizations.js +0 -116
- package/dist/routes/roles-by-name.d.ts +0 -4
- package/dist/routes/roles-by-name.d.ts.map +0 -1
- package/dist/routes/roles-by-name.js +0 -111
- package/dist/routes/roles.d.ts +0 -4
- package/dist/routes/roles.d.ts.map +0 -1
- package/dist/routes/roles.js +0 -90
- package/dist/routes/schemas-by-type.d.ts +0 -3
- package/dist/routes/schemas-by-type.d.ts.map +0 -1
- package/dist/routes/schemas-by-type.js +0 -26
- package/dist/routes/schemas.d.ts +0 -3
- package/dist/routes/schemas.d.ts.map +0 -1
- package/dist/routes/schemas.js +0 -11
- package/dist/routes/user-preferences.d.ts +0 -4
- package/dist/routes/user-preferences.d.ts.map +0 -1
- package/dist/routes/user-preferences.js +0 -72
- package/dist/routes-exports.d.ts +0 -20
- package/dist/routes-exports.d.ts.map +0 -1
- package/dist/routes-exports.js +0 -26
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { zValidator } from '@hono/zod-validator';
|
|
3
|
+
import { cmsLogger } from '../../../utils/logger.js';
|
|
4
|
+
import { createOrganizationRequest } from '../../../api/schemas/organizations.js';
|
|
5
|
+
export const organizationsRouter = new Hono()
|
|
6
|
+
.get('/', async (c) => {
|
|
7
|
+
try {
|
|
8
|
+
const { databaseAdapter } = c.var.aphexCMS;
|
|
9
|
+
const auth = c.var.auth;
|
|
10
|
+
if (!auth || auth.type !== 'session') {
|
|
11
|
+
return c.json({
|
|
12
|
+
success: false,
|
|
13
|
+
error: 'Unauthorized',
|
|
14
|
+
message: 'Session authentication required'
|
|
15
|
+
}, 401);
|
|
16
|
+
}
|
|
17
|
+
const memberships = await databaseAdapter.findUserOrganizations(auth.user.id);
|
|
18
|
+
const organizations = memberships.map((m) => ({
|
|
19
|
+
id: m.organization.id,
|
|
20
|
+
name: m.organization.name,
|
|
21
|
+
slug: m.organization.slug,
|
|
22
|
+
metadata: m.organization.metadata,
|
|
23
|
+
role: m.member.role,
|
|
24
|
+
joinedAt: m.member.createdAt,
|
|
25
|
+
isActive: m.organization.id === auth.organizationId
|
|
26
|
+
}));
|
|
27
|
+
return c.json({ success: true, data: organizations });
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
cmsLogger.error('Failed to fetch organizations:', error);
|
|
31
|
+
return c.json({
|
|
32
|
+
success: false,
|
|
33
|
+
error: 'Failed to fetch organizations',
|
|
34
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
35
|
+
}, 500);
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
.post('/', zValidator('json', createOrganizationRequest, (result, c) => {
|
|
39
|
+
if (!result.success) {
|
|
40
|
+
return c.json({
|
|
41
|
+
success: false,
|
|
42
|
+
error: 'Invalid request body',
|
|
43
|
+
message: 'Organization name and slug are required',
|
|
44
|
+
issues: result.error.issues
|
|
45
|
+
}, 400);
|
|
46
|
+
}
|
|
47
|
+
}), async (c) => {
|
|
48
|
+
try {
|
|
49
|
+
const { databaseAdapter } = c.var.aphexCMS;
|
|
50
|
+
const auth = c.var.auth;
|
|
51
|
+
if (!auth || auth.type !== 'session') {
|
|
52
|
+
return c.json({
|
|
53
|
+
success: false,
|
|
54
|
+
error: 'Unauthorized',
|
|
55
|
+
message: 'Session authentication required'
|
|
56
|
+
}, 401);
|
|
57
|
+
}
|
|
58
|
+
if (auth.user.role !== 'super_admin') {
|
|
59
|
+
return c.json({
|
|
60
|
+
success: false,
|
|
61
|
+
error: 'Forbidden',
|
|
62
|
+
message: 'Only super admins can create organizations'
|
|
63
|
+
}, 403);
|
|
64
|
+
}
|
|
65
|
+
const body = c.req.valid('json');
|
|
66
|
+
const existingOrg = await databaseAdapter.findOrganizationBySlug(body.slug);
|
|
67
|
+
if (existingOrg) {
|
|
68
|
+
return c.json({
|
|
69
|
+
success: false,
|
|
70
|
+
error: 'Slug already exists',
|
|
71
|
+
message: `Organization with slug '${body.slug}' already exists`
|
|
72
|
+
}, 409);
|
|
73
|
+
}
|
|
74
|
+
const newOrganization = await databaseAdapter.createOrganization({
|
|
75
|
+
name: body.name,
|
|
76
|
+
slug: body.slug,
|
|
77
|
+
metadata: body.metadata || null,
|
|
78
|
+
parentOrganizationId: auth.organizationId,
|
|
79
|
+
createdBy: auth.user.id
|
|
80
|
+
});
|
|
81
|
+
await databaseAdapter.seedBuiltinRoles(newOrganization.id);
|
|
82
|
+
await databaseAdapter.addMember({
|
|
83
|
+
organizationId: newOrganization.id,
|
|
84
|
+
userId: auth.user.id,
|
|
85
|
+
role: 'owner'
|
|
86
|
+
});
|
|
87
|
+
await databaseAdapter.updateUserSession(auth.user.id, newOrganization.id);
|
|
88
|
+
return c.json({ success: true, data: newOrganization }, 201);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
cmsLogger.error('Failed to create organization:', error);
|
|
92
|
+
return c.json({
|
|
93
|
+
success: false,
|
|
94
|
+
error: 'Failed to create organization',
|
|
95
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
96
|
+
}, 500);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import type { AphexEnv } from '../index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Roles router. Combines `/roles` (list, create) and `/roles/:name`
|
|
5
|
+
* (update, delete) so the wire URLs are
|
|
6
|
+
* `/api/roles` and `/api/roles/:name`.
|
|
7
|
+
*
|
|
8
|
+
* Note: built-in role names cannot be deleted; they're seeded on every
|
|
9
|
+
* org and a custom row with the same name would be unreachable.
|
|
10
|
+
*/
|
|
11
|
+
export declare const rolesRouter: Hono<AphexEnv>;
|
|
12
|
+
//# sourceMappingURL=roles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,EAAE,IAAI,CAAC,QAAQ,CAuSpC,CAAC"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { zValidator } from '@hono/zod-validator';
|
|
3
|
+
import { cmsLogger } from '../../../utils/logger.js';
|
|
4
|
+
import { hasCapability, BUILTIN_ROLE_NAMES } from '../../../types/capabilities.js';
|
|
5
|
+
import { createRoleRequest, updateRoleRequest } from '../../../api/schemas/roles.js';
|
|
6
|
+
/**
|
|
7
|
+
* Roles router. Combines `/roles` (list, create) and `/roles/:name`
|
|
8
|
+
* (update, delete) so the wire URLs are
|
|
9
|
+
* `/api/roles` and `/api/roles/:name`.
|
|
10
|
+
*
|
|
11
|
+
* Note: built-in role names cannot be deleted; they're seeded on every
|
|
12
|
+
* org and a custom row with the same name would be unreachable.
|
|
13
|
+
*/
|
|
14
|
+
export const rolesRouter = new Hono()
|
|
15
|
+
.get('/', async (c) => {
|
|
16
|
+
try {
|
|
17
|
+
const { rolesService } = c.var.aphexCMS;
|
|
18
|
+
const auth = c.var.auth;
|
|
19
|
+
if (!auth || auth.type !== 'session') {
|
|
20
|
+
return c.json({
|
|
21
|
+
success: false,
|
|
22
|
+
error: 'Unauthorized',
|
|
23
|
+
message: 'Session authentication required'
|
|
24
|
+
}, 401);
|
|
25
|
+
}
|
|
26
|
+
const roles = await rolesService.listRoles(auth.organizationId);
|
|
27
|
+
return c.json({ success: true, data: roles });
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
cmsLogger.error('Failed to list roles:', error);
|
|
31
|
+
return c.json({
|
|
32
|
+
success: false,
|
|
33
|
+
error: 'Failed to list roles',
|
|
34
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
35
|
+
}, 500);
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
.post('/', zValidator('json', createRoleRequest, (result, c) => {
|
|
39
|
+
if (!result.success) {
|
|
40
|
+
return c.json({
|
|
41
|
+
success: false,
|
|
42
|
+
error: 'Invalid request body',
|
|
43
|
+
message: 'name and capabilities are required',
|
|
44
|
+
issues: result.error.issues
|
|
45
|
+
}, 400);
|
|
46
|
+
}
|
|
47
|
+
}), async (c) => {
|
|
48
|
+
try {
|
|
49
|
+
const { databaseAdapter, rolesService } = c.var.aphexCMS;
|
|
50
|
+
const auth = c.var.auth;
|
|
51
|
+
if (!auth || auth.type !== 'session') {
|
|
52
|
+
return c.json({
|
|
53
|
+
success: false,
|
|
54
|
+
error: 'Unauthorized',
|
|
55
|
+
message: 'Session authentication required'
|
|
56
|
+
}, 401);
|
|
57
|
+
}
|
|
58
|
+
if (!hasCapability(auth, 'role.manage')) {
|
|
59
|
+
return c.json({
|
|
60
|
+
success: false,
|
|
61
|
+
error: 'Forbidden',
|
|
62
|
+
message: 'You do not have permission to manage roles'
|
|
63
|
+
}, 403);
|
|
64
|
+
}
|
|
65
|
+
const body = c.req.valid('json');
|
|
66
|
+
if (BUILTIN_ROLE_NAMES.includes(body.name)) {
|
|
67
|
+
return c.json({
|
|
68
|
+
success: false,
|
|
69
|
+
error: 'Reserved name',
|
|
70
|
+
message: `"${body.name}" is a built-in role name. Edit the existing role instead.`
|
|
71
|
+
}, 409);
|
|
72
|
+
}
|
|
73
|
+
const existing = await databaseAdapter.findRoleByName(auth.organizationId, body.name);
|
|
74
|
+
if (existing) {
|
|
75
|
+
return c.json({
|
|
76
|
+
success: false,
|
|
77
|
+
error: 'Conflict',
|
|
78
|
+
message: `A role named "${body.name}" already exists in this organization.`
|
|
79
|
+
}, 409);
|
|
80
|
+
}
|
|
81
|
+
const role = await databaseAdapter.createRole({
|
|
82
|
+
organizationId: auth.organizationId,
|
|
83
|
+
name: body.name,
|
|
84
|
+
description: body.description ?? null,
|
|
85
|
+
capabilities: body.capabilities,
|
|
86
|
+
isBuiltIn: false
|
|
87
|
+
});
|
|
88
|
+
await rolesService.invalidate(auth.organizationId, body.name);
|
|
89
|
+
return c.json({ success: true, data: role }, 201);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
cmsLogger.error('Failed to create role:', error);
|
|
93
|
+
return c.json({
|
|
94
|
+
success: false,
|
|
95
|
+
error: 'Failed to create role',
|
|
96
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
97
|
+
}, 500);
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
.patch('/:name', zValidator('json', updateRoleRequest, (result, c) => {
|
|
101
|
+
if (!result.success) {
|
|
102
|
+
return c.json({
|
|
103
|
+
success: false,
|
|
104
|
+
error: 'Invalid request body',
|
|
105
|
+
issues: result.error.issues
|
|
106
|
+
}, 400);
|
|
107
|
+
}
|
|
108
|
+
}), async (c) => {
|
|
109
|
+
try {
|
|
110
|
+
const { databaseAdapter, rolesService } = c.var.aphexCMS;
|
|
111
|
+
const auth = c.var.auth;
|
|
112
|
+
if (!auth || auth.type !== 'session') {
|
|
113
|
+
return c.json({
|
|
114
|
+
success: false,
|
|
115
|
+
error: 'Unauthorized',
|
|
116
|
+
message: 'Session authentication required'
|
|
117
|
+
}, 401);
|
|
118
|
+
}
|
|
119
|
+
if (!hasCapability(auth, 'role.manage')) {
|
|
120
|
+
return c.json({
|
|
121
|
+
success: false,
|
|
122
|
+
error: 'Forbidden',
|
|
123
|
+
message: 'You do not have permission to manage roles'
|
|
124
|
+
}, 403);
|
|
125
|
+
}
|
|
126
|
+
const name = c.req.param('name');
|
|
127
|
+
if (!name) {
|
|
128
|
+
return c.json({
|
|
129
|
+
success: false,
|
|
130
|
+
error: 'Invalid request',
|
|
131
|
+
message: 'Role name is required'
|
|
132
|
+
}, 400);
|
|
133
|
+
}
|
|
134
|
+
const body = c.req.valid('json');
|
|
135
|
+
const updated = await databaseAdapter.updateRole(auth.organizationId, name, body);
|
|
136
|
+
if (!updated) {
|
|
137
|
+
return c.json({
|
|
138
|
+
success: false,
|
|
139
|
+
error: 'Not found',
|
|
140
|
+
message: `No role named "${name}" in this organization`
|
|
141
|
+
}, 404);
|
|
142
|
+
}
|
|
143
|
+
await rolesService.invalidate(auth.organizationId, name);
|
|
144
|
+
return c.json({ success: true, data: updated });
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
cmsLogger.error('Failed to update role:', error);
|
|
148
|
+
return c.json({
|
|
149
|
+
success: false,
|
|
150
|
+
error: 'Failed to update role',
|
|
151
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
152
|
+
}, 500);
|
|
153
|
+
}
|
|
154
|
+
})
|
|
155
|
+
.delete('/:name', async (c) => {
|
|
156
|
+
try {
|
|
157
|
+
const { databaseAdapter, rolesService } = c.var.aphexCMS;
|
|
158
|
+
const auth = c.var.auth;
|
|
159
|
+
if (!auth || auth.type !== 'session') {
|
|
160
|
+
return c.json({
|
|
161
|
+
success: false,
|
|
162
|
+
error: 'Unauthorized',
|
|
163
|
+
message: 'Session authentication required'
|
|
164
|
+
}, 401);
|
|
165
|
+
}
|
|
166
|
+
if (!hasCapability(auth, 'role.manage')) {
|
|
167
|
+
return c.json({
|
|
168
|
+
success: false,
|
|
169
|
+
error: 'Forbidden',
|
|
170
|
+
message: 'You do not have permission to manage roles'
|
|
171
|
+
}, 403);
|
|
172
|
+
}
|
|
173
|
+
const name = c.req.param('name');
|
|
174
|
+
if (!name) {
|
|
175
|
+
return c.json({
|
|
176
|
+
success: false,
|
|
177
|
+
error: 'Invalid request',
|
|
178
|
+
message: 'Role name is required'
|
|
179
|
+
}, 400);
|
|
180
|
+
}
|
|
181
|
+
if (BUILTIN_ROLE_NAMES.includes(name)) {
|
|
182
|
+
return c.json({
|
|
183
|
+
success: false,
|
|
184
|
+
error: 'Forbidden',
|
|
185
|
+
message: `"${name}" is a built-in role and cannot be deleted.`
|
|
186
|
+
}, 403);
|
|
187
|
+
}
|
|
188
|
+
const members = await databaseAdapter.findOrganizationMembers(auth.organizationId);
|
|
189
|
+
const inUseByMember = members.some((m) => m.role === name);
|
|
190
|
+
const invitations = await databaseAdapter.findOrganizationInvitations(auth.organizationId);
|
|
191
|
+
const inUseByInvitation = invitations.some((i) => i.role === name && !i.acceptedAt);
|
|
192
|
+
if (inUseByMember || inUseByInvitation) {
|
|
193
|
+
return c.json({
|
|
194
|
+
success: false,
|
|
195
|
+
error: 'Role in use',
|
|
196
|
+
message: `Cannot delete "${name}": reassign affected members or invitations first.`
|
|
197
|
+
}, 409);
|
|
198
|
+
}
|
|
199
|
+
const deleted = await databaseAdapter.deleteRole(auth.organizationId, name);
|
|
200
|
+
if (!deleted) {
|
|
201
|
+
return c.json({
|
|
202
|
+
success: false,
|
|
203
|
+
error: 'Not found',
|
|
204
|
+
message: `No role named "${name}" in this organization`
|
|
205
|
+
}, 404);
|
|
206
|
+
}
|
|
207
|
+
await rolesService.invalidate(auth.organizationId, name);
|
|
208
|
+
return c.json({ success: true, message: 'Role deleted' });
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
cmsLogger.error('Failed to delete role:', error);
|
|
212
|
+
return c.json({
|
|
213
|
+
success: false,
|
|
214
|
+
error: 'Failed to delete role',
|
|
215
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
216
|
+
}, 500);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKzC,eAAO,MAAM,aAAa,EAAE,IAAI,CAAC,QAAQ,CAwBtC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { cmsLogger } from '../../../utils/logger.js';
|
|
3
|
+
// Annotated as Hono<AphexEnv> (not the full chained type) so cms-core's
|
|
4
|
+
// .d.ts emit doesn't blow up under TS7056. Chained-route inference would
|
|
5
|
+
// only matter for hono/client RPC, which is out of scope here.
|
|
6
|
+
export const schemasRouter = new Hono()
|
|
7
|
+
.get('/', (c) => {
|
|
8
|
+
const { cmsEngine } = c.var.aphexCMS;
|
|
9
|
+
// Read from config so validation functions survive (not from DB).
|
|
10
|
+
const schemas = cmsEngine.config.schemaTypes;
|
|
11
|
+
return c.json({ success: true, data: schemas });
|
|
12
|
+
})
|
|
13
|
+
.get('/:type', (c) => {
|
|
14
|
+
const type = c.req.param('type');
|
|
15
|
+
const { cmsEngine } = c.var.aphexCMS;
|
|
16
|
+
if (!type) {
|
|
17
|
+
return c.json({ error: 'Schema type is required' }, 400);
|
|
18
|
+
}
|
|
19
|
+
cmsLogger.debug('GETTING SCHEMA TYPE FROM: ', type);
|
|
20
|
+
const schema = cmsEngine.getSchemaTypeByName(type);
|
|
21
|
+
cmsLogger.debug('SCHEMA: ', schema);
|
|
22
|
+
if (!schema) {
|
|
23
|
+
return c.json({ error: `Schema type '${type}' not found` }, 404);
|
|
24
|
+
}
|
|
25
|
+
return c.json({ success: true, data: schema });
|
|
26
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-preferences.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/user-preferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,qBAAqB,EAAE,IAAI,CAAC,QAAQ,CAkF/C,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { zValidator } from '@hono/zod-validator';
|
|
3
|
+
import { cmsLogger } from '../../../utils/logger.js';
|
|
4
|
+
import { updateUserPreferencesRequest } from '../../../api/schemas/user.js';
|
|
5
|
+
export const userPreferencesRouter = new Hono()
|
|
6
|
+
.get('/cms-preference', async (c) => {
|
|
7
|
+
try {
|
|
8
|
+
const { databaseAdapter } = c.var.aphexCMS;
|
|
9
|
+
const auth = c.var.auth;
|
|
10
|
+
if (!auth || auth.type !== 'session') {
|
|
11
|
+
return c.json({
|
|
12
|
+
success: false,
|
|
13
|
+
error: 'Unauthorized',
|
|
14
|
+
message: 'Session authentication required'
|
|
15
|
+
}, 401);
|
|
16
|
+
}
|
|
17
|
+
const userProfile = await databaseAdapter.findUserProfileById(auth.user.id);
|
|
18
|
+
return c.json({ success: true, data: userProfile?.preferences || {} });
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
cmsLogger.error('Failed to get user preferences:', error);
|
|
22
|
+
return c.json({
|
|
23
|
+
success: false,
|
|
24
|
+
error: 'Failed to get user preferences',
|
|
25
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
26
|
+
}, 500);
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
.patch('/cms-preference', zValidator('json', updateUserPreferencesRequest, (result, c) => {
|
|
30
|
+
if (!result.success) {
|
|
31
|
+
return c.json({
|
|
32
|
+
success: false,
|
|
33
|
+
error: 'Invalid request body',
|
|
34
|
+
message: 'Invalid preference values',
|
|
35
|
+
issues: result.error.issues
|
|
36
|
+
}, 400);
|
|
37
|
+
}
|
|
38
|
+
}), async (c) => {
|
|
39
|
+
try {
|
|
40
|
+
const { databaseAdapter } = c.var.aphexCMS;
|
|
41
|
+
const auth = c.var.auth;
|
|
42
|
+
if (!auth || auth.type !== 'session') {
|
|
43
|
+
return c.json({
|
|
44
|
+
success: false,
|
|
45
|
+
error: 'Unauthorized',
|
|
46
|
+
message: 'Session authentication required'
|
|
47
|
+
}, 401);
|
|
48
|
+
}
|
|
49
|
+
const body = c.req.valid('json');
|
|
50
|
+
await databaseAdapter.updateUserPreferences(auth.user.id, body);
|
|
51
|
+
const userProfile = await databaseAdapter.findUserProfileById(auth.user.id);
|
|
52
|
+
return c.json({ success: true, data: userProfile?.preferences || {} });
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
cmsLogger.error('Failed to update user preferences:', error);
|
|
56
|
+
return c.json({
|
|
57
|
+
success: false,
|
|
58
|
+
error: 'Failed to update user preferences',
|
|
59
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
60
|
+
}, 500);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import type { AphexEnv } from '../index.js';
|
|
3
|
+
/**
|
|
4
|
+
* User account routes that delegate to the configured AuthProvider.
|
|
5
|
+
*
|
|
6
|
+
* cms-core ships these as Hono routers so studio doesn't need to maintain
|
|
7
|
+
* SvelteKit `+server.ts` files for them. The wire format and side effects
|
|
8
|
+
* (e.g. the password-reset email) are owned by the AuthProvider impl —
|
|
9
|
+
* cms-core's role is just to expose them over HTTP.
|
|
10
|
+
*/
|
|
11
|
+
export declare const userRouter: Hono<AphexEnv>;
|
|
12
|
+
//# sourceMappingURL=user.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,EAAE,IAAI,CAAC,QAAQ,CA6IpC,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { zValidator } from '@hono/zod-validator';
|
|
3
|
+
import { cmsLogger } from '../../../utils/logger.js';
|
|
4
|
+
import { updateUserRequest, requestPasswordResetRequest, resetPasswordRequest } from '../../../api/schemas/user.js';
|
|
5
|
+
/**
|
|
6
|
+
* User account routes that delegate to the configured AuthProvider.
|
|
7
|
+
*
|
|
8
|
+
* cms-core ships these as Hono routers so studio doesn't need to maintain
|
|
9
|
+
* SvelteKit `+server.ts` files for them. The wire format and side effects
|
|
10
|
+
* (e.g. the password-reset email) are owned by the AuthProvider impl —
|
|
11
|
+
* cms-core's role is just to expose them over HTTP.
|
|
12
|
+
*/
|
|
13
|
+
export const userRouter = new Hono()
|
|
14
|
+
.patch('/', zValidator('json', updateUserRequest, (result, c) => {
|
|
15
|
+
if (!result.success) {
|
|
16
|
+
return c.json({
|
|
17
|
+
success: false,
|
|
18
|
+
error: 'Invalid request body',
|
|
19
|
+
message: 'name is required',
|
|
20
|
+
issues: result.error.issues
|
|
21
|
+
}, 400);
|
|
22
|
+
}
|
|
23
|
+
}), async (c) => {
|
|
24
|
+
try {
|
|
25
|
+
const auth = c.var.auth;
|
|
26
|
+
const provider = c.var.aphexCMS.auth;
|
|
27
|
+
if (!auth || auth.type !== 'session') {
|
|
28
|
+
return c.json({
|
|
29
|
+
success: false,
|
|
30
|
+
error: 'Unauthorized',
|
|
31
|
+
message: 'Session authentication required'
|
|
32
|
+
}, 401);
|
|
33
|
+
}
|
|
34
|
+
if (!provider) {
|
|
35
|
+
return c.json({
|
|
36
|
+
success: false,
|
|
37
|
+
error: 'Auth provider not configured'
|
|
38
|
+
}, 500);
|
|
39
|
+
}
|
|
40
|
+
const { name } = c.req.valid('json');
|
|
41
|
+
await provider.changeUserName(auth.user.id, name);
|
|
42
|
+
return c.json({ success: true, message: 'User updated successfully' });
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
cmsLogger.error('Failed to update user:', error);
|
|
46
|
+
return c.json({
|
|
47
|
+
success: false,
|
|
48
|
+
error: 'Failed to update user',
|
|
49
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
50
|
+
}, 500);
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
.post('/request-password-reset', zValidator('json', requestPasswordResetRequest, (result, c) => {
|
|
54
|
+
if (!result.success) {
|
|
55
|
+
return c.json({
|
|
56
|
+
success: false,
|
|
57
|
+
error: 'Missing required field',
|
|
58
|
+
message: 'email is required',
|
|
59
|
+
issues: result.error.issues
|
|
60
|
+
}, 400);
|
|
61
|
+
}
|
|
62
|
+
}), async (c) => {
|
|
63
|
+
try {
|
|
64
|
+
const provider = c.var.aphexCMS.auth;
|
|
65
|
+
if (!provider) {
|
|
66
|
+
return c.json({ success: false, error: 'Auth provider not configured' }, 500);
|
|
67
|
+
}
|
|
68
|
+
const { email, redirectTo } = c.req.valid('json');
|
|
69
|
+
await provider.requestPasswordReset(email, redirectTo);
|
|
70
|
+
// Constant response shape regardless of whether the email exists,
|
|
71
|
+
// to avoid account enumeration via the API.
|
|
72
|
+
return c.json({
|
|
73
|
+
success: true,
|
|
74
|
+
message: 'If an account exists with that email, a password reset link has been sent'
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
cmsLogger.error('Failed to request password reset:', error);
|
|
79
|
+
return c.json({
|
|
80
|
+
success: false,
|
|
81
|
+
error: 'Failed to request password reset',
|
|
82
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
83
|
+
}, 500);
|
|
84
|
+
}
|
|
85
|
+
})
|
|
86
|
+
.post('/reset-password', zValidator('json', resetPasswordRequest, (result, c) => {
|
|
87
|
+
if (!result.success) {
|
|
88
|
+
return c.json({
|
|
89
|
+
success: false,
|
|
90
|
+
error: 'Missing required fields',
|
|
91
|
+
message: 'token and newPassword are required',
|
|
92
|
+
issues: result.error.issues
|
|
93
|
+
}, 400);
|
|
94
|
+
}
|
|
95
|
+
}), async (c) => {
|
|
96
|
+
try {
|
|
97
|
+
const provider = c.var.aphexCMS.auth;
|
|
98
|
+
if (!provider) {
|
|
99
|
+
return c.json({ success: false, error: 'Auth provider not configured' }, 500);
|
|
100
|
+
}
|
|
101
|
+
const { token, newPassword } = c.req.valid('json');
|
|
102
|
+
await provider.resetPassword(token, newPassword);
|
|
103
|
+
return c.json({ success: true, message: 'Password reset successfully' });
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
cmsLogger.error('Failed to reset password:', error);
|
|
107
|
+
return c.json({
|
|
108
|
+
success: false,
|
|
109
|
+
error: 'Failed to reset password',
|
|
110
|
+
message: error instanceof Error ? error.message : 'Invalid or expired token'
|
|
111
|
+
}, 500);
|
|
112
|
+
}
|
|
113
|
+
});
|
package/dist/server/index.d.ts
CHANGED
|
@@ -13,7 +13,8 @@ export * from '../storage/providers/storage.js';
|
|
|
13
13
|
export * from '../services/index.js';
|
|
14
14
|
export { AssetService } from '../services/asset-service.js';
|
|
15
15
|
export { RolesService } from '../services/roles-service.js';
|
|
16
|
-
export
|
|
16
|
+
export { GET as serveAssetCDN } from '../routes/assets-cdn.js';
|
|
17
|
+
export { createAphexApi, mountAphexBuiltins, toHonoHandler, type AphexEnv } from './api/index.js';
|
|
17
18
|
export * from '../schema-utils/index.js';
|
|
18
19
|
export { createHashForPublishing } from '../utils/content-hash.js';
|
|
19
20
|
export { createGraphQLHandler, type GraphQLConfig, type GraphQLSettings, type GraphQLHandlerResult } from '../graphql/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAG5D,cAAc,wBAAwB,CAAC;AAGvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAG5D,cAAc,wBAAwB,CAAC;AAGvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAKzD,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI5D,OAAO,EACN,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,KAAK,QAAQ,EACb,MAAM,aAAa,CAAC;AAGrB,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EACN,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACN,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,MAAM,oBAAoB,CAAC"}
|
package/dist/server/index.js
CHANGED
|
@@ -23,9 +23,13 @@ export * from '../storage/providers/storage.js';
|
|
|
23
23
|
export * from '../services/index.js';
|
|
24
24
|
export { AssetService } from '../services/asset-service.js';
|
|
25
25
|
export { RolesService } from '../services/roles-service.js';
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
|
|
26
|
+
// CDN handler — re-exported for the studio/template `media/[id]/[filename]/
|
|
27
|
+
// +server.ts` shim. Lives outside `/api` (URLs are baked into published
|
|
28
|
+
// documents, can't move onto the catch-all without breaking links).
|
|
29
|
+
export { GET as serveAssetCDN } from '../routes/assets-cdn.js';
|
|
30
|
+
// Hono API app — exposed so user apps (and tests) can construct or extend
|
|
31
|
+
// the same router the SK catch-all forwards to.
|
|
32
|
+
export { createAphexApi, mountAphexBuiltins, toHonoHandler } from './api/index.js';
|
|
29
33
|
// Schema utilities
|
|
30
34
|
export * from '../schema-utils/index.js';
|
|
31
35
|
// Content hash utilities (server-side)
|