@aphexcms/cms-core 3.0.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -4
- 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/index.d.ts +9 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +43 -4
- package/dist/lib/index.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
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
// Aphex CMS Document Query API - Complex filtering with POST
|
|
2
|
-
import { json } from '@sveltejs/kit';
|
|
3
|
-
import { authToContext } from '../local-api/auth-helpers.js';
|
|
4
|
-
import { PermissionError } from '../local-api/permissions.js';
|
|
5
|
-
import { cmsLogger } from '../utils/logger.js';
|
|
6
|
-
import { queryDocumentsRequest } from '../api/schemas/documents.js';
|
|
7
|
-
// Default values
|
|
8
|
-
const DEFAULT_PAGE_SIZE = 20;
|
|
9
|
-
const DEFAULT_PAGE = 1;
|
|
10
|
-
/**
|
|
11
|
-
* POST /api/documents/query - Advanced document querying with complex filters
|
|
12
|
-
*
|
|
13
|
-
* Accepts LocalAPI FindOptions in request body for full filtering power
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* POST /api/documents/query
|
|
17
|
-
* {
|
|
18
|
-
* "type": "page",
|
|
19
|
-
* "where": {
|
|
20
|
-
* "status": { "equals": "published" },
|
|
21
|
-
* "hero.heading": { "contains": "Welcome" },
|
|
22
|
-
* "publishedAt": { "gte": "2024-01-01" }
|
|
23
|
-
* },
|
|
24
|
-
* "limit": 20,
|
|
25
|
-
* "page": 1,
|
|
26
|
-
* "sort": ["-publishedAt", "title"],
|
|
27
|
-
* "depth": 1,
|
|
28
|
-
* "perspective": "published",
|
|
29
|
-
* "filterOrganizationIds": ["org_child1", "org_child2"],
|
|
30
|
-
* "includeChildOrganizations": false
|
|
31
|
-
* }
|
|
32
|
-
*/
|
|
33
|
-
export const POST = async ({ request, locals }) => {
|
|
34
|
-
try {
|
|
35
|
-
const { localAPI } = locals.aphexCMS;
|
|
36
|
-
const context = authToContext(locals.auth);
|
|
37
|
-
const rawBody = await request.json();
|
|
38
|
-
const parsed = queryDocumentsRequest.safeParse(rawBody);
|
|
39
|
-
if (!parsed.success) {
|
|
40
|
-
return json({
|
|
41
|
-
success: false,
|
|
42
|
-
error: 'Bad Request',
|
|
43
|
-
message: 'Document type is required in request body',
|
|
44
|
-
issues: parsed.error.issues
|
|
45
|
-
}, { status: 400 });
|
|
46
|
-
}
|
|
47
|
-
const body = parsed.data;
|
|
48
|
-
const documentType = body.type;
|
|
49
|
-
// Check if collection exists
|
|
50
|
-
if (!localAPI.hasCollection(documentType)) {
|
|
51
|
-
return json({
|
|
52
|
-
success: false,
|
|
53
|
-
error: 'Invalid document type',
|
|
54
|
-
message: `Collection '${documentType}' not found. Available: ${localAPI.getCollectionNames().join(', ')}`
|
|
55
|
-
}, { status: 400 });
|
|
56
|
-
}
|
|
57
|
-
// Parse pagination - support both page-based and offset-based
|
|
58
|
-
const page = body.page ?? DEFAULT_PAGE;
|
|
59
|
-
const pageSize = body.pageSize ?? body.limit ?? DEFAULT_PAGE_SIZE;
|
|
60
|
-
const offset = body.offset !== undefined ? body.offset : (page - 1) * pageSize;
|
|
61
|
-
// Build FindOptions from request body
|
|
62
|
-
const findOptions = {
|
|
63
|
-
where: body.where,
|
|
64
|
-
limit: pageSize,
|
|
65
|
-
offset,
|
|
66
|
-
sort: body.sort,
|
|
67
|
-
depth: body.depth ?? 0,
|
|
68
|
-
select: body.select,
|
|
69
|
-
perspective: body.perspective ?? 'draft',
|
|
70
|
-
includeChildOrganizations: body.includeChildOrganizations,
|
|
71
|
-
filterOrganizationIds: body.filterOrganizationIds
|
|
72
|
-
};
|
|
73
|
-
// Query via LocalAPI
|
|
74
|
-
const result = await localAPI.collections[documentType].find(context, findOptions);
|
|
75
|
-
return json({
|
|
76
|
-
success: true,
|
|
77
|
-
data: result.docs,
|
|
78
|
-
pagination: {
|
|
79
|
-
total: result.totalDocs,
|
|
80
|
-
page: result.page,
|
|
81
|
-
pageSize: result.limit,
|
|
82
|
-
totalPages: result.totalPages,
|
|
83
|
-
hasNextPage: result.hasNextPage,
|
|
84
|
-
hasPrevPage: result.hasPrevPage
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
catch (error) {
|
|
89
|
-
cmsLogger.error('Failed to query documents:', error);
|
|
90
|
-
if (error instanceof PermissionError) {
|
|
91
|
-
return json({
|
|
92
|
-
success: false,
|
|
93
|
-
error: 'Forbidden',
|
|
94
|
-
message: error.message
|
|
95
|
-
}, { status: 403 });
|
|
96
|
-
}
|
|
97
|
-
return json({
|
|
98
|
-
success: false,
|
|
99
|
-
error: 'Failed to query documents',
|
|
100
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
101
|
-
}, { status: 500 });
|
|
102
|
-
}
|
|
103
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/lib/routes/documents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAWpD,eAAO,MAAM,GAAG,EAAE,cA6GjB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,cAkFlB,CAAC"}
|
package/dist/routes/index.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export * as documents from './documents.js';
|
|
2
|
-
export * as documentsById from './documents-by-id.js';
|
|
3
|
-
export * as documentsQuery from './documents-query.js';
|
|
4
|
-
export * as documentsPublish from './documents-publish.js';
|
|
5
|
-
export * as assets from './assets.js';
|
|
6
|
-
export * as schemas from './schemas.js';
|
|
7
|
-
export * as schemasByType from './schemas-by-type.js';
|
|
8
|
-
export * as userPreferences from './user-preferences.js';
|
|
9
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/routes/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,gBAAgB,MAAM,qBAAqB,CAAC;AAGxD,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAGnC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAC;AAGnD,OAAO,KAAK,eAAe,MAAM,oBAAoB,CAAC"}
|
package/dist/routes/index.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
// Aphex CMS API Route Handlers
|
|
2
|
-
// These will be imported and re-exported by your app's API routes
|
|
3
|
-
// Document management routes
|
|
4
|
-
export * as documents from './documents.js';
|
|
5
|
-
export * as documentsById from './documents-by-id.js';
|
|
6
|
-
export * as documentsQuery from './documents-query.js';
|
|
7
|
-
export * as documentsPublish from './documents-publish.js';
|
|
8
|
-
// Asset management routes
|
|
9
|
-
export * as assets from './assets.js';
|
|
10
|
-
// Schema information routes
|
|
11
|
-
export * as schemas from './schemas.js';
|
|
12
|
-
export * as schemasByType from './schemas-by-type.js';
|
|
13
|
-
// User management routes
|
|
14
|
-
export * as userPreferences from './user-preferences.js';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"organizations-by-id.d.ts","sourceRoot":"","sources":["../../src/lib/routes/organizations-by-id.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAMpD,eAAO,MAAM,GAAG,EAAE,cAmEjB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,cA8GnB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,cAmFpB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
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;AAMpD,eAAO,MAAM,IAAI,EAAE,cA6IlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,cAsEpB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
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;AAMpD,eAAO,MAAM,GAAG,EAAE,cAkCjB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,cAoIpB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,cA6HnB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
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,58 +0,0 @@
|
|
|
1
|
-
// Aphex CMS Organization Switch API Handler
|
|
2
|
-
import { json } from '@sveltejs/kit';
|
|
3
|
-
import { cmsLogger } from '../utils/logger.js';
|
|
4
|
-
import { switchOrganizationRequest } from '../api/schemas/organizations.js';
|
|
5
|
-
// POST /api/organizations/switch - Switch active organization
|
|
6
|
-
export const POST = async ({ request, locals }) => {
|
|
7
|
-
try {
|
|
8
|
-
const { databaseAdapter } = locals.aphexCMS;
|
|
9
|
-
const auth = locals.auth;
|
|
10
|
-
if (!auth || auth.type !== 'session') {
|
|
11
|
-
return json({
|
|
12
|
-
success: false,
|
|
13
|
-
error: 'Unauthorized',
|
|
14
|
-
message: 'Session authentication required'
|
|
15
|
-
}, { status: 401 });
|
|
16
|
-
}
|
|
17
|
-
const rawBody = await request.json();
|
|
18
|
-
const parsed = switchOrganizationRequest.safeParse(rawBody);
|
|
19
|
-
if (!parsed.success) {
|
|
20
|
-
return json({
|
|
21
|
-
success: false,
|
|
22
|
-
error: 'Missing required field',
|
|
23
|
-
message: 'organizationId is required',
|
|
24
|
-
issues: parsed.error.issues
|
|
25
|
-
}, { status: 400 });
|
|
26
|
-
}
|
|
27
|
-
const body = parsed.data;
|
|
28
|
-
// Verify user is a member of the target organization
|
|
29
|
-
const membership = await databaseAdapter.findUserMembership(auth.user.id, body.organizationId);
|
|
30
|
-
if (!membership) {
|
|
31
|
-
return json({
|
|
32
|
-
success: false,
|
|
33
|
-
error: 'Access denied',
|
|
34
|
-
message: 'You are not a member of this organization'
|
|
35
|
-
}, { status: 403 });
|
|
36
|
-
}
|
|
37
|
-
// Update user's active organization
|
|
38
|
-
await databaseAdapter.updateUserSession(auth.user.id, body.organizationId);
|
|
39
|
-
// Get the organization details
|
|
40
|
-
const organization = await databaseAdapter.findOrganizationById(body.organizationId);
|
|
41
|
-
return json({
|
|
42
|
-
success: true,
|
|
43
|
-
data: {
|
|
44
|
-
organizationId: body.organizationId,
|
|
45
|
-
organizationName: organization?.name,
|
|
46
|
-
role: membership.role
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
cmsLogger.error('Failed to switch organization:', error);
|
|
52
|
-
return json({
|
|
53
|
-
success: false,
|
|
54
|
-
error: 'Failed to switch organization',
|
|
55
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
56
|
-
}, { status: 500 });
|
|
57
|
-
}
|
|
58
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
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,cAkGlB,CAAC"}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
// Aphex CMS Organization API Handlers
|
|
2
|
-
import { json } from '@sveltejs/kit';
|
|
3
|
-
import { cmsLogger } from '../utils/logger.js';
|
|
4
|
-
import { createOrganizationRequest } from '../api/schemas/organizations.js';
|
|
5
|
-
// GET /api/organizations - List user's organizations
|
|
6
|
-
export const GET = async ({ locals }) => {
|
|
7
|
-
try {
|
|
8
|
-
const { databaseAdapter } = locals.aphexCMS;
|
|
9
|
-
const auth = locals.auth;
|
|
10
|
-
if (!auth || auth.type !== 'session') {
|
|
11
|
-
return json({
|
|
12
|
-
success: false,
|
|
13
|
-
error: 'Unauthorized',
|
|
14
|
-
message: 'Session authentication required'
|
|
15
|
-
}, { status: 401 });
|
|
16
|
-
}
|
|
17
|
-
// Get all organizations the user belongs to
|
|
18
|
-
const memberships = await databaseAdapter.findUserOrganizations(auth.user.id);
|
|
19
|
-
// Map to a cleaner format with organization details and user's role
|
|
20
|
-
const organizations = memberships.map((membership) => ({
|
|
21
|
-
id: membership.organization.id,
|
|
22
|
-
name: membership.organization.name,
|
|
23
|
-
slug: membership.organization.slug,
|
|
24
|
-
metadata: membership.organization.metadata,
|
|
25
|
-
role: membership.member.role,
|
|
26
|
-
joinedAt: membership.member.createdAt,
|
|
27
|
-
isActive: membership.organization.id === auth.organizationId
|
|
28
|
-
}));
|
|
29
|
-
return json({
|
|
30
|
-
success: true,
|
|
31
|
-
data: organizations
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
cmsLogger.error('Failed to fetch organizations:', error);
|
|
36
|
-
return json({
|
|
37
|
-
success: false,
|
|
38
|
-
error: 'Failed to fetch organizations',
|
|
39
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
40
|
-
}, { status: 500 });
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
// POST /api/organizations - Create new organization
|
|
44
|
-
export const POST = async ({ request, locals }) => {
|
|
45
|
-
try {
|
|
46
|
-
const { databaseAdapter } = locals.aphexCMS;
|
|
47
|
-
const auth = locals.auth;
|
|
48
|
-
if (!auth || auth.type !== 'session') {
|
|
49
|
-
return json({
|
|
50
|
-
success: false,
|
|
51
|
-
error: 'Unauthorized',
|
|
52
|
-
message: 'Session authentication required'
|
|
53
|
-
}, { status: 401 });
|
|
54
|
-
}
|
|
55
|
-
// Only SUPER_ADMIN can create organizations
|
|
56
|
-
if (auth.user.role !== 'super_admin') {
|
|
57
|
-
return json({
|
|
58
|
-
success: false,
|
|
59
|
-
error: 'Forbidden',
|
|
60
|
-
message: 'Only super admins can create organizations'
|
|
61
|
-
}, { status: 403 });
|
|
62
|
-
}
|
|
63
|
-
const rawBody = await request.json();
|
|
64
|
-
const parsed = createOrganizationRequest.safeParse(rawBody);
|
|
65
|
-
if (!parsed.success) {
|
|
66
|
-
return json({
|
|
67
|
-
success: false,
|
|
68
|
-
error: 'Invalid request body',
|
|
69
|
-
message: 'Organization name and slug are required',
|
|
70
|
-
issues: parsed.error.issues
|
|
71
|
-
}, { status: 400 });
|
|
72
|
-
}
|
|
73
|
-
const body = parsed.data;
|
|
74
|
-
// Check if slug is already taken
|
|
75
|
-
const existingOrg = await databaseAdapter.findOrganizationBySlug(body.slug);
|
|
76
|
-
if (existingOrg) {
|
|
77
|
-
return json({
|
|
78
|
-
success: false,
|
|
79
|
-
error: 'Slug already exists',
|
|
80
|
-
message: `Organization with slug '${body.slug}' already exists`
|
|
81
|
-
}, { status: 409 });
|
|
82
|
-
}
|
|
83
|
-
// Create the organization with current active org as parent
|
|
84
|
-
// Note: Only supports 1-level hierarchy for performance
|
|
85
|
-
const newOrganization = await databaseAdapter.createOrganization({
|
|
86
|
-
name: body.name,
|
|
87
|
-
slug: body.slug,
|
|
88
|
-
metadata: body.metadata || null,
|
|
89
|
-
parentOrganizationId: auth.organizationId, // Current active org becomes parent
|
|
90
|
-
createdBy: auth.user.id
|
|
91
|
-
});
|
|
92
|
-
// Seed the four built-in roles for this org before assigning membership.
|
|
93
|
-
// The member row references the role by name, so the rows must exist.
|
|
94
|
-
await databaseAdapter.seedBuiltinRoles(newOrganization.id);
|
|
95
|
-
// Add the creator as owner
|
|
96
|
-
await databaseAdapter.addMember({
|
|
97
|
-
organizationId: newOrganization.id,
|
|
98
|
-
userId: auth.user.id,
|
|
99
|
-
role: 'owner'
|
|
100
|
-
});
|
|
101
|
-
// Set as active organization for this user
|
|
102
|
-
await databaseAdapter.updateUserSession(auth.user.id, newOrganization.id);
|
|
103
|
-
return json({
|
|
104
|
-
success: true,
|
|
105
|
-
data: newOrganization
|
|
106
|
-
}, { status: 201 });
|
|
107
|
-
}
|
|
108
|
-
catch (error) {
|
|
109
|
-
cmsLogger.error('Failed to create organization:', error);
|
|
110
|
-
return json({
|
|
111
|
-
success: false,
|
|
112
|
-
error: 'Failed to create organization',
|
|
113
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
114
|
-
}, { status: 500 });
|
|
115
|
-
}
|
|
116
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"roles-by-name.d.ts","sourceRoot":"","sources":["../../src/lib/routes/roles-by-name.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAgBpD,eAAO,MAAM,KAAK,EAAE,cA4DnB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,cAoEpB,CAAC"}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
// Aphex CMS Roles API Handlers (by-name)
|
|
2
|
-
//
|
|
3
|
-
// PATCH /api/roles/[name] — edit description / capabilities
|
|
4
|
-
// DELETE /api/roles/[name] — delete a custom role (built-ins cannot be deleted)
|
|
5
|
-
import { json } from '@sveltejs/kit';
|
|
6
|
-
import { cmsLogger } from '../utils/logger.js';
|
|
7
|
-
import { hasCapability, BUILTIN_ROLE_NAMES } from '../types/capabilities.js';
|
|
8
|
-
import { updateRoleRequest } from '../api/schemas/roles.js';
|
|
9
|
-
function unauthorized() {
|
|
10
|
-
return json({ success: false, error: 'Unauthorized', message: 'Session authentication required' }, { status: 401 });
|
|
11
|
-
}
|
|
12
|
-
function forbidden(message) {
|
|
13
|
-
return json({ success: false, error: 'Forbidden', message }, { status: 403 });
|
|
14
|
-
}
|
|
15
|
-
export const PATCH = async ({ params, request, locals }) => {
|
|
16
|
-
try {
|
|
17
|
-
const { databaseAdapter, rolesService } = locals.aphexCMS;
|
|
18
|
-
const auth = locals.auth;
|
|
19
|
-
if (!auth || auth.type !== 'session')
|
|
20
|
-
return unauthorized();
|
|
21
|
-
if (!hasCapability(auth, 'role.manage')) {
|
|
22
|
-
return forbidden('You do not have permission to manage roles');
|
|
23
|
-
}
|
|
24
|
-
const name = params.name;
|
|
25
|
-
if (!name) {
|
|
26
|
-
return json({ success: false, error: 'Invalid request', message: 'Role name is required' }, { status: 400 });
|
|
27
|
-
}
|
|
28
|
-
const rawBody = await request.json();
|
|
29
|
-
const parsed = updateRoleRequest.safeParse(rawBody);
|
|
30
|
-
if (!parsed.success) {
|
|
31
|
-
return json({
|
|
32
|
-
success: false,
|
|
33
|
-
error: 'Invalid request body',
|
|
34
|
-
issues: parsed.error.issues
|
|
35
|
-
}, { status: 400 });
|
|
36
|
-
}
|
|
37
|
-
const body = parsed.data;
|
|
38
|
-
const updated = await databaseAdapter.updateRole(auth.organizationId, name, body);
|
|
39
|
-
if (!updated) {
|
|
40
|
-
return json({
|
|
41
|
-
success: false,
|
|
42
|
-
error: 'Not found',
|
|
43
|
-
message: `No role named "${name}" in this organization`
|
|
44
|
-
}, { status: 404 });
|
|
45
|
-
}
|
|
46
|
-
// Bust the capability cache so open sessions pick up the change on
|
|
47
|
-
// their next request instead of waiting for TTL.
|
|
48
|
-
await rolesService.invalidate(auth.organizationId, name);
|
|
49
|
-
return json({ success: true, data: updated });
|
|
50
|
-
}
|
|
51
|
-
catch (error) {
|
|
52
|
-
cmsLogger.error('Failed to update role:', error);
|
|
53
|
-
return json({
|
|
54
|
-
success: false,
|
|
55
|
-
error: 'Failed to update role',
|
|
56
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
57
|
-
}, { status: 500 });
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
export const DELETE = async ({ params, locals }) => {
|
|
61
|
-
try {
|
|
62
|
-
const { databaseAdapter, rolesService } = locals.aphexCMS;
|
|
63
|
-
const auth = locals.auth;
|
|
64
|
-
if (!auth || auth.type !== 'session')
|
|
65
|
-
return unauthorized();
|
|
66
|
-
if (!hasCapability(auth, 'role.manage')) {
|
|
67
|
-
return forbidden('You do not have permission to manage roles');
|
|
68
|
-
}
|
|
69
|
-
const name = params.name;
|
|
70
|
-
if (!name) {
|
|
71
|
-
return json({ success: false, error: 'Invalid request', message: 'Role name is required' }, { status: 400 });
|
|
72
|
-
}
|
|
73
|
-
// Built-ins are part of the org's guaranteed floor — deleting one
|
|
74
|
-
// would let a seed run re-create it with stale capabilities. Force the
|
|
75
|
-
// user to edit instead.
|
|
76
|
-
if (BUILTIN_ROLE_NAMES.includes(name)) {
|
|
77
|
-
return forbidden(`"${name}" is a built-in role and cannot be deleted.`);
|
|
78
|
-
}
|
|
79
|
-
// Block deletion while the role is assigned to any member or invitation.
|
|
80
|
-
// Avoids silently orphaning memberships to an unknown role name.
|
|
81
|
-
const members = await databaseAdapter.findOrganizationMembers(auth.organizationId);
|
|
82
|
-
const inUseByMember = members.some((m) => m.role === name);
|
|
83
|
-
const invitations = await databaseAdapter.findOrganizationInvitations(auth.organizationId);
|
|
84
|
-
const inUseByInvitation = invitations.some((i) => i.role === name && !i.acceptedAt);
|
|
85
|
-
if (inUseByMember || inUseByInvitation) {
|
|
86
|
-
return json({
|
|
87
|
-
success: false,
|
|
88
|
-
error: 'Role in use',
|
|
89
|
-
message: `Cannot delete "${name}": reassign affected members or invitations first.`
|
|
90
|
-
}, { status: 409 });
|
|
91
|
-
}
|
|
92
|
-
const deleted = await databaseAdapter.deleteRole(auth.organizationId, name);
|
|
93
|
-
if (!deleted) {
|
|
94
|
-
return json({
|
|
95
|
-
success: false,
|
|
96
|
-
error: 'Not found',
|
|
97
|
-
message: `No role named "${name}" in this organization`
|
|
98
|
-
}, { status: 404 });
|
|
99
|
-
}
|
|
100
|
-
await rolesService.invalidate(auth.organizationId, name);
|
|
101
|
-
return json({ success: true, message: 'Role deleted' });
|
|
102
|
-
}
|
|
103
|
-
catch (error) {
|
|
104
|
-
cmsLogger.error('Failed to delete role:', error);
|
|
105
|
-
return json({
|
|
106
|
-
success: false,
|
|
107
|
-
error: 'Failed to delete role',
|
|
108
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
109
|
-
}, { status: 500 });
|
|
110
|
-
}
|
|
111
|
-
};
|
package/dist/routes/roles.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../src/lib/routes/roles.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAgBpD,eAAO,MAAM,GAAG,EAAE,cAoBjB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,cA0ElB,CAAC"}
|
package/dist/routes/roles.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
// Aphex CMS Roles API Handlers
|
|
2
|
-
//
|
|
3
|
-
// GET /api/roles — list roles for the active org
|
|
4
|
-
// POST /api/roles — create a custom role (requires role.manage)
|
|
5
|
-
import { json } from '@sveltejs/kit';
|
|
6
|
-
import { cmsLogger } from '../utils/logger.js';
|
|
7
|
-
import { hasCapability, BUILTIN_ROLE_NAMES } from '../types/capabilities.js';
|
|
8
|
-
import { createRoleRequest } from '../api/schemas/roles.js';
|
|
9
|
-
function unauthorized() {
|
|
10
|
-
return json({ success: false, error: 'Unauthorized', message: 'Session authentication required' }, { status: 401 });
|
|
11
|
-
}
|
|
12
|
-
function forbidden(message) {
|
|
13
|
-
return json({ success: false, error: 'Forbidden', message }, { status: 403 });
|
|
14
|
-
}
|
|
15
|
-
export const GET = async ({ locals }) => {
|
|
16
|
-
try {
|
|
17
|
-
const { rolesService } = locals.aphexCMS;
|
|
18
|
-
const auth = locals.auth;
|
|
19
|
-
if (!auth || auth.type !== 'session')
|
|
20
|
-
return unauthorized();
|
|
21
|
-
const roles = await rolesService.listRoles(auth.organizationId);
|
|
22
|
-
return json({ success: true, data: roles });
|
|
23
|
-
}
|
|
24
|
-
catch (error) {
|
|
25
|
-
cmsLogger.error('Failed to list roles:', error);
|
|
26
|
-
return json({
|
|
27
|
-
success: false,
|
|
28
|
-
error: 'Failed to list roles',
|
|
29
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
30
|
-
}, { status: 500 });
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
export const POST = async ({ request, locals }) => {
|
|
34
|
-
try {
|
|
35
|
-
const { databaseAdapter, rolesService } = locals.aphexCMS;
|
|
36
|
-
const auth = locals.auth;
|
|
37
|
-
if (!auth || auth.type !== 'session')
|
|
38
|
-
return unauthorized();
|
|
39
|
-
if (!hasCapability(auth, 'role.manage')) {
|
|
40
|
-
return forbidden('You do not have permission to manage roles');
|
|
41
|
-
}
|
|
42
|
-
const rawBody = await request.json();
|
|
43
|
-
const parsed = createRoleRequest.safeParse(rawBody);
|
|
44
|
-
if (!parsed.success) {
|
|
45
|
-
return json({
|
|
46
|
-
success: false,
|
|
47
|
-
error: 'Invalid request body',
|
|
48
|
-
message: 'name and capabilities are required',
|
|
49
|
-
issues: parsed.error.issues
|
|
50
|
-
}, { status: 400 });
|
|
51
|
-
}
|
|
52
|
-
const body = parsed.data;
|
|
53
|
-
// Reject collisions with reserved built-in names — built-ins are seeded
|
|
54
|
-
// on every org; a matching custom row would never be reachable.
|
|
55
|
-
if (BUILTIN_ROLE_NAMES.includes(body.name)) {
|
|
56
|
-
return json({
|
|
57
|
-
success: false,
|
|
58
|
-
error: 'Reserved name',
|
|
59
|
-
message: `"${body.name}" is a built-in role name. Edit the existing role instead.`
|
|
60
|
-
}, { status: 409 });
|
|
61
|
-
}
|
|
62
|
-
const existing = await databaseAdapter.findRoleByName(auth.organizationId, body.name);
|
|
63
|
-
if (existing) {
|
|
64
|
-
return json({
|
|
65
|
-
success: false,
|
|
66
|
-
error: 'Conflict',
|
|
67
|
-
message: `A role named "${body.name}" already exists in this organization.`
|
|
68
|
-
}, { status: 409 });
|
|
69
|
-
}
|
|
70
|
-
const role = await databaseAdapter.createRole({
|
|
71
|
-
organizationId: auth.organizationId,
|
|
72
|
-
name: body.name,
|
|
73
|
-
description: body.description ?? null,
|
|
74
|
-
capabilities: body.capabilities,
|
|
75
|
-
isBuiltIn: false
|
|
76
|
-
});
|
|
77
|
-
// New role can't be in use yet, but invalidate the prefix just in case
|
|
78
|
-
// a prior lookup populated the cache with an empty fallback entry.
|
|
79
|
-
await rolesService.invalidate(auth.organizationId, body.name);
|
|
80
|
-
return json({ success: true, data: role }, { status: 201 });
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
cmsLogger.error('Failed to create role:', error);
|
|
84
|
-
return json({
|
|
85
|
-
success: false,
|
|
86
|
-
error: 'Failed to create role',
|
|
87
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
88
|
-
}, { status: 500 });
|
|
89
|
-
}
|
|
90
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schemas-by-type.d.ts","sourceRoot":"","sources":["../../src/lib/routes/schemas-by-type.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,eAAO,MAAM,GAAG,EAAE,cA+BjB,CAAC"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { cmsLogger } from '../utils/logger.js';
|
|
2
|
-
export const GET = async ({ locals, params }) => {
|
|
3
|
-
const { type } = params;
|
|
4
|
-
const { cmsEngine } = locals.aphexCMS;
|
|
5
|
-
if (!type) {
|
|
6
|
-
return new Response(JSON.stringify({ error: 'Schema type is required' }), {
|
|
7
|
-
status: 400,
|
|
8
|
-
headers: { 'content-type': 'application/json' }
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
cmsLogger.debug('GETTING SCHEMA TYPE FROM: ', type);
|
|
12
|
-
const schema = cmsEngine.getSchemaTypeByName(type);
|
|
13
|
-
cmsLogger.debug('SCHEMA: ', schema);
|
|
14
|
-
if (!schema) {
|
|
15
|
-
return new Response(JSON.stringify({ error: `Schema type '${type}' not found` }), {
|
|
16
|
-
status: 404,
|
|
17
|
-
headers: { 'content-type': 'application/json' }
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
return new Response(JSON.stringify({
|
|
21
|
-
success: true,
|
|
22
|
-
data: schema
|
|
23
|
-
}), {
|
|
24
|
-
headers: { 'content-type': 'application/json' }
|
|
25
|
-
});
|
|
26
|
-
};
|
package/dist/routes/schemas.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/lib/routes/schemas.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,eAAO,MAAM,GAAG,EAAE,cAejB,CAAC"}
|
package/dist/routes/schemas.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export const GET = async ({ locals }) => {
|
|
2
|
-
const { cmsEngine } = locals.aphexCMS;
|
|
3
|
-
// Get schemas from config (not database) to preserve validation functions
|
|
4
|
-
const schemas = cmsEngine.config.schemaTypes;
|
|
5
|
-
return new Response(JSON.stringify({
|
|
6
|
-
success: true,
|
|
7
|
-
data: schemas
|
|
8
|
-
}), {
|
|
9
|
-
headers: { 'content-type': 'application/json' }
|
|
10
|
-
});
|
|
11
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|