@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,111 +1,97 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import { cmsLogger } from '
|
|
4
|
-
import { updateOrganizationRequest } from '
|
|
5
|
-
import { hasCapability } from '
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { zValidator } from '@hono/zod-validator';
|
|
3
|
+
import { cmsLogger } from '../../../utils/logger.js';
|
|
4
|
+
import { updateOrganizationRequest } from '../../../api/schemas/organizations.js';
|
|
5
|
+
import { hasCapability } from '../../../types/capabilities.js';
|
|
6
|
+
export const organizationsByIdRouter = new Hono()
|
|
7
|
+
.get('/:id', async (c) => {
|
|
8
8
|
try {
|
|
9
|
-
const { databaseAdapter } =
|
|
10
|
-
const auth =
|
|
11
|
-
const
|
|
9
|
+
const { databaseAdapter } = c.var.aphexCMS;
|
|
10
|
+
const auth = c.var.auth;
|
|
11
|
+
const id = c.req.param('id');
|
|
12
12
|
if (!auth || auth.type !== 'session') {
|
|
13
|
-
return json({
|
|
13
|
+
return c.json({
|
|
14
14
|
success: false,
|
|
15
15
|
error: 'Unauthorized',
|
|
16
16
|
message: 'Session authentication required'
|
|
17
|
-
},
|
|
17
|
+
}, 401);
|
|
18
18
|
}
|
|
19
19
|
if (!id) {
|
|
20
|
-
return json({
|
|
20
|
+
return c.json({
|
|
21
21
|
success: false,
|
|
22
22
|
error: 'Missing required field',
|
|
23
23
|
message: 'Organization ID is required'
|
|
24
|
-
},
|
|
24
|
+
}, 400);
|
|
25
25
|
}
|
|
26
|
-
// Check if user is a member of this organization
|
|
27
26
|
const membership = await databaseAdapter.findUserMembership(auth.user.id, id);
|
|
28
27
|
if (!membership) {
|
|
29
|
-
return json({
|
|
28
|
+
return c.json({
|
|
30
29
|
success: false,
|
|
31
30
|
error: 'Forbidden',
|
|
32
31
|
message: 'You are not a member of this organization'
|
|
33
|
-
},
|
|
32
|
+
}, 403);
|
|
34
33
|
}
|
|
35
34
|
const organization = await databaseAdapter.findOrganizationById(id);
|
|
36
35
|
if (!organization) {
|
|
37
|
-
return json({
|
|
38
|
-
success: false,
|
|
39
|
-
error: 'Organization not found'
|
|
40
|
-
}, { status: 404 });
|
|
36
|
+
return c.json({ success: false, error: 'Organization not found' }, 404);
|
|
41
37
|
}
|
|
42
|
-
return json({
|
|
43
|
-
success: true,
|
|
44
|
-
data: organization
|
|
45
|
-
});
|
|
38
|
+
return c.json({ success: true, data: organization });
|
|
46
39
|
}
|
|
47
40
|
catch (error) {
|
|
48
41
|
cmsLogger.error('Failed to fetch organization:', error);
|
|
49
|
-
return json({
|
|
42
|
+
return c.json({
|
|
50
43
|
success: false,
|
|
51
44
|
error: 'Failed to fetch organization',
|
|
52
45
|
message: error instanceof Error ? error.message : 'Unknown error'
|
|
53
|
-
},
|
|
46
|
+
}, 500);
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
.patch('/:id', zValidator('json', updateOrganizationRequest, (result, c) => {
|
|
50
|
+
if (!result.success) {
|
|
51
|
+
return c.json({
|
|
52
|
+
success: false,
|
|
53
|
+
error: 'Invalid request body',
|
|
54
|
+
issues: result.error.issues
|
|
55
|
+
}, 400);
|
|
54
56
|
}
|
|
55
|
-
}
|
|
56
|
-
// PATCH /api/organizations/[id] - Update organization
|
|
57
|
-
export const PATCH = async ({ params, request, locals }) => {
|
|
57
|
+
}), async (c) => {
|
|
58
58
|
try {
|
|
59
|
-
const { databaseAdapter } =
|
|
60
|
-
const auth =
|
|
61
|
-
const
|
|
59
|
+
const { databaseAdapter } = c.var.aphexCMS;
|
|
60
|
+
const auth = c.var.auth;
|
|
61
|
+
const id = c.req.param('id');
|
|
62
62
|
if (!auth || auth.type !== 'session') {
|
|
63
|
-
return json({
|
|
63
|
+
return c.json({
|
|
64
64
|
success: false,
|
|
65
65
|
error: 'Unauthorized',
|
|
66
66
|
message: 'Session authentication required'
|
|
67
|
-
},
|
|
67
|
+
}, 401);
|
|
68
68
|
}
|
|
69
69
|
if (!id) {
|
|
70
|
-
return json({
|
|
70
|
+
return c.json({
|
|
71
71
|
success: false,
|
|
72
72
|
error: 'Missing required field',
|
|
73
73
|
message: 'Organization ID is required'
|
|
74
|
-
},
|
|
74
|
+
}, 400);
|
|
75
75
|
}
|
|
76
|
-
// Require `org.settings` capability + membership in the target org.
|
|
77
|
-
// Membership check stands regardless — even a capability holder can only
|
|
78
|
-
// edit orgs they actually belong to.
|
|
79
76
|
const membership = await databaseAdapter.findUserMembership(auth.user.id, id);
|
|
80
77
|
if (!membership || !hasCapability(auth, 'org.settings')) {
|
|
81
|
-
return json({
|
|
78
|
+
return c.json({
|
|
82
79
|
success: false,
|
|
83
80
|
error: 'Forbidden',
|
|
84
81
|
message: 'You do not have permission to update organization settings'
|
|
85
|
-
},
|
|
82
|
+
}, 403);
|
|
86
83
|
}
|
|
87
|
-
const
|
|
88
|
-
const parsed = updateOrganizationRequest.safeParse(rawBody);
|
|
89
|
-
if (!parsed.success) {
|
|
90
|
-
return json({
|
|
91
|
-
success: false,
|
|
92
|
-
error: 'Invalid request body',
|
|
93
|
-
issues: parsed.error.issues
|
|
94
|
-
}, { status: 400 });
|
|
95
|
-
}
|
|
96
|
-
const body = parsed.data;
|
|
97
|
-
// Validate: if slug is being changed, check it's not already taken
|
|
84
|
+
const body = c.req.valid('json');
|
|
98
85
|
if (body.slug) {
|
|
99
86
|
const existingOrg = await databaseAdapter.findOrganizationBySlug(body.slug);
|
|
100
87
|
if (existingOrg && existingOrg.id !== id) {
|
|
101
|
-
return json({
|
|
88
|
+
return c.json({
|
|
102
89
|
success: false,
|
|
103
90
|
error: 'Slug already exists',
|
|
104
91
|
message: `Organization with slug '${body.slug}' already exists`
|
|
105
|
-
},
|
|
92
|
+
}, 409);
|
|
106
93
|
}
|
|
107
94
|
}
|
|
108
|
-
// Update organization
|
|
109
95
|
const updateData = {};
|
|
110
96
|
if (body.name !== undefined)
|
|
111
97
|
updateData.name = body.name;
|
|
@@ -115,57 +101,47 @@ export const PATCH = async ({ params, request, locals }) => {
|
|
|
115
101
|
updateData.metadata = body.metadata;
|
|
116
102
|
const updatedOrganization = await databaseAdapter.updateOrganization(id, updateData);
|
|
117
103
|
if (!updatedOrganization) {
|
|
118
|
-
return json({
|
|
119
|
-
success: false,
|
|
120
|
-
error: 'Organization not found'
|
|
121
|
-
}, { status: 404 });
|
|
104
|
+
return c.json({ success: false, error: 'Organization not found' }, 404);
|
|
122
105
|
}
|
|
123
|
-
return json({
|
|
124
|
-
success: true,
|
|
125
|
-
data: updatedOrganization
|
|
126
|
-
});
|
|
106
|
+
return c.json({ success: true, data: updatedOrganization });
|
|
127
107
|
}
|
|
128
108
|
catch (error) {
|
|
129
109
|
cmsLogger.error('Failed to update organization:', error);
|
|
130
|
-
return json({
|
|
110
|
+
return c.json({
|
|
131
111
|
success: false,
|
|
132
112
|
error: 'Failed to update organization',
|
|
133
113
|
message: error instanceof Error ? error.message : 'Unknown error'
|
|
134
|
-
},
|
|
114
|
+
}, 500);
|
|
135
115
|
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export const DELETE = async ({ params, locals }) => {
|
|
116
|
+
})
|
|
117
|
+
.delete('/:id', async (c) => {
|
|
139
118
|
try {
|
|
140
|
-
const { databaseAdapter } =
|
|
141
|
-
const auth =
|
|
142
|
-
const
|
|
119
|
+
const { databaseAdapter } = c.var.aphexCMS;
|
|
120
|
+
const auth = c.var.auth;
|
|
121
|
+
const id = c.req.param('id');
|
|
143
122
|
if (!auth || auth.type !== 'session') {
|
|
144
|
-
return json({
|
|
123
|
+
return c.json({
|
|
145
124
|
success: false,
|
|
146
125
|
error: 'Unauthorized',
|
|
147
126
|
message: 'Session authentication required'
|
|
148
|
-
},
|
|
127
|
+
}, 401);
|
|
149
128
|
}
|
|
150
129
|
if (!id) {
|
|
151
|
-
return json({
|
|
130
|
+
return c.json({
|
|
152
131
|
success: false,
|
|
153
132
|
error: 'Missing required field',
|
|
154
133
|
message: 'Organization ID is required'
|
|
155
|
-
},
|
|
134
|
+
}, 400);
|
|
156
135
|
}
|
|
157
|
-
// Only owners can delete an organization
|
|
158
136
|
const membership = await databaseAdapter.findUserMembership(auth.user.id, id);
|
|
159
137
|
if (!membership || membership.role !== 'owner') {
|
|
160
|
-
return json({
|
|
138
|
+
return c.json({
|
|
161
139
|
success: false,
|
|
162
140
|
error: 'Forbidden',
|
|
163
141
|
message: 'Only owners can delete an organization'
|
|
164
|
-
},
|
|
142
|
+
}, 403);
|
|
165
143
|
}
|
|
166
|
-
// Get all members of the organization
|
|
167
144
|
const members = await databaseAdapter.findOrganizationMembers(id);
|
|
168
|
-
// Handle member lifecycle
|
|
169
145
|
for (const member of members) {
|
|
170
146
|
const userSession = await databaseAdapter.findUserSession(member.userId);
|
|
171
147
|
if (userSession?.activeOrganizationId === id) {
|
|
@@ -179,23 +155,18 @@ export const DELETE = async ({ params, locals }) => {
|
|
|
179
155
|
}
|
|
180
156
|
}
|
|
181
157
|
}
|
|
182
|
-
// Delete all members from the organization
|
|
183
158
|
await databaseAdapter.removeAllMembers(id);
|
|
184
|
-
// Delete all invitations for the organization
|
|
185
159
|
await databaseAdapter.removeAllInvitations(id);
|
|
186
|
-
// Delete the organization
|
|
187
160
|
await databaseAdapter.deleteOrganization(id);
|
|
188
|
-
return json({
|
|
189
|
-
success: true,
|
|
190
|
-
message: 'Organization deleted successfully'
|
|
191
|
-
});
|
|
161
|
+
return c.json({ success: true, message: 'Organization deleted successfully' });
|
|
192
162
|
}
|
|
193
163
|
catch (error) {
|
|
194
164
|
cmsLogger.error('Failed to delete organization:', error);
|
|
195
|
-
return json({
|
|
165
|
+
return c.json({
|
|
196
166
|
success: false,
|
|
197
167
|
error: 'Failed to delete organization',
|
|
198
168
|
message: error instanceof Error ? error.message : 'Unknown error'
|
|
199
|
-
},
|
|
169
|
+
}, 500);
|
|
200
170
|
}
|
|
201
|
-
};
|
|
171
|
+
});
|
|
172
|
+
//# sourceMappingURL=organizations-by-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organizations-by-id.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-by-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import type { AphexEnv } from '../index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Note: in studio, invitations are wrapped by a SvelteKit `+server.ts`
|
|
5
|
+
* that adds email sending after the invite row is created. While that
|
|
6
|
+
* shim exists, this Hono router sits dormant (specific SK routes win
|
|
7
|
+
* over the catch-all). Phase 5 moves the wrapper into `config.api`.
|
|
8
|
+
*/
|
|
9
|
+
export declare const organizationsInvitationsRouter: Hono<AphexEnv>;
|
|
10
|
+
//# sourceMappingURL=organizations-invitations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organizations-invitations.d.ts","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-invitations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,EAAE,IAAI,CAAC,QAAQ,CA0MxD,CAAC"}
|
|
@@ -1,84 +1,81 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import { cmsLogger } from '
|
|
4
|
-
import { inviteMemberRequest, cancelInvitationRequest } from '
|
|
5
|
-
import { hasCapability } from '
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { zValidator } from '@hono/zod-validator';
|
|
3
|
+
import { cmsLogger } from '../../../utils/logger.js';
|
|
4
|
+
import { inviteMemberRequest, cancelInvitationRequest } from '../../../api/schemas/organizations.js';
|
|
5
|
+
import { hasCapability } from '../../../types/capabilities.js';
|
|
6
|
+
/**
|
|
7
|
+
* Note: in studio, invitations are wrapped by a SvelteKit `+server.ts`
|
|
8
|
+
* that adds email sending after the invite row is created. While that
|
|
9
|
+
* shim exists, this Hono router sits dormant (specific SK routes win
|
|
10
|
+
* over the catch-all). Phase 5 moves the wrapper into `config.api`.
|
|
11
|
+
*/
|
|
12
|
+
export const organizationsInvitationsRouter = new Hono()
|
|
13
|
+
.post('/invitations', zValidator('json', inviteMemberRequest, (result, c) => {
|
|
14
|
+
if (!result.success) {
|
|
15
|
+
return c.json({
|
|
16
|
+
success: false,
|
|
17
|
+
error: 'Invalid request body',
|
|
18
|
+
message: 'email and role are required',
|
|
19
|
+
issues: result.error.issues
|
|
20
|
+
}, 400);
|
|
21
|
+
}
|
|
22
|
+
}), async (c) => {
|
|
8
23
|
try {
|
|
9
|
-
const { databaseAdapter } =
|
|
10
|
-
const auth =
|
|
24
|
+
const { databaseAdapter } = c.var.aphexCMS;
|
|
25
|
+
const auth = c.var.auth;
|
|
11
26
|
if (!auth || auth.type !== 'session') {
|
|
12
|
-
return json({
|
|
27
|
+
return c.json({
|
|
13
28
|
success: false,
|
|
14
29
|
error: 'Unauthorized',
|
|
15
30
|
message: 'Session authentication required'
|
|
16
|
-
},
|
|
31
|
+
}, 401);
|
|
17
32
|
}
|
|
18
33
|
if (!hasCapability(auth, 'member.invite')) {
|
|
19
|
-
return json({
|
|
34
|
+
return c.json({
|
|
20
35
|
success: false,
|
|
21
36
|
error: 'Forbidden',
|
|
22
37
|
message: 'You do not have permission to invite members'
|
|
23
|
-
},
|
|
24
|
-
}
|
|
25
|
-
const rawBody = await request.json();
|
|
26
|
-
const parsed = inviteMemberRequest.safeParse(rawBody);
|
|
27
|
-
if (!parsed.success) {
|
|
28
|
-
return json({
|
|
29
|
-
success: false,
|
|
30
|
-
error: 'Invalid request body',
|
|
31
|
-
message: 'email and role are required',
|
|
32
|
-
issues: parsed.error.issues
|
|
33
|
-
}, { status: 400 });
|
|
38
|
+
}, 403);
|
|
34
39
|
}
|
|
35
|
-
const body =
|
|
36
|
-
// Verify the role exists in this organization. Defends against
|
|
37
|
-
// clients sending a role name that was deleted between page load
|
|
38
|
-
// and submit, or against typos slipping past the format regex.
|
|
40
|
+
const body = c.req.valid('json');
|
|
39
41
|
const roleRow = await databaseAdapter.findRoleByName(auth.organizationId, body.role);
|
|
40
42
|
if (!roleRow) {
|
|
41
|
-
return json({
|
|
43
|
+
return c.json({
|
|
42
44
|
success: false,
|
|
43
45
|
error: 'Unknown role',
|
|
44
46
|
message: `No role named "${body.role}" in this organization`
|
|
45
|
-
},
|
|
47
|
+
}, 400);
|
|
46
48
|
}
|
|
47
|
-
// Reject self-invitation
|
|
48
49
|
if (body.email.toLowerCase() === auth.user.email.toLowerCase()) {
|
|
49
|
-
return json({
|
|
50
|
+
return c.json({
|
|
50
51
|
success: false,
|
|
51
52
|
error: 'Invalid invitation',
|
|
52
53
|
message: 'You cannot invite yourself'
|
|
53
|
-
},
|
|
54
|
+
}, 400);
|
|
54
55
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const existingUser = await locals.aphexCMS.auth.getUserByEmail(body.email);
|
|
56
|
+
if (c.var.aphexCMS.auth) {
|
|
57
|
+
const existingUser = await c.var.aphexCMS.auth.getUserByEmail(body.email);
|
|
58
58
|
if (existingUser) {
|
|
59
59
|
const existingMembership = await databaseAdapter.findUserMembership(existingUser.id, auth.organizationId);
|
|
60
60
|
if (existingMembership) {
|
|
61
|
-
return json({
|
|
61
|
+
return c.json({
|
|
62
62
|
success: false,
|
|
63
63
|
error: 'Already a member',
|
|
64
64
|
message: 'This user is already a member of the organization'
|
|
65
|
-
},
|
|
65
|
+
}, 400);
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
-
// Check if there's already a pending invitation for this email
|
|
70
69
|
const existingInvitations = await databaseAdapter.findOrganizationInvitations(auth.organizationId);
|
|
71
70
|
const pendingInvitation = existingInvitations.find((inv) => inv.email.toLowerCase() === body.email.toLowerCase() && inv.acceptedAt === null);
|
|
72
71
|
if (pendingInvitation) {
|
|
73
|
-
return json({
|
|
72
|
+
return c.json({
|
|
74
73
|
success: false,
|
|
75
74
|
error: 'Already invited',
|
|
76
75
|
message: 'This email has already been invited to the organization'
|
|
77
|
-
},
|
|
76
|
+
}, 400);
|
|
78
77
|
}
|
|
79
|
-
// Generate a unique invitation token
|
|
80
78
|
const token = crypto.randomUUID();
|
|
81
|
-
// Create invitation - email sending is handled by the app layer
|
|
82
79
|
const invitation = await databaseAdapter.createInvitation({
|
|
83
80
|
organizationId: auth.organizationId,
|
|
84
81
|
email: body.email.toLowerCase(),
|
|
@@ -87,70 +84,62 @@ export const POST = async ({ request, locals }) => {
|
|
|
87
84
|
token,
|
|
88
85
|
expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) // 7 days
|
|
89
86
|
});
|
|
90
|
-
return json({
|
|
87
|
+
return c.json({
|
|
91
88
|
success: true,
|
|
92
89
|
data: invitation,
|
|
93
90
|
message: 'Invitation created successfully.'
|
|
94
|
-
},
|
|
91
|
+
}, 201);
|
|
95
92
|
}
|
|
96
93
|
catch (error) {
|
|
97
94
|
cmsLogger.error('Failed to create invitation:', error);
|
|
98
|
-
return json({
|
|
95
|
+
return c.json({
|
|
99
96
|
success: false,
|
|
100
97
|
error: 'Failed to create invitation',
|
|
101
98
|
message: error instanceof Error ? error.message : 'Unknown error'
|
|
102
|
-
},
|
|
99
|
+
}, 500);
|
|
100
|
+
}
|
|
101
|
+
})
|
|
102
|
+
.delete('/invitations', zValidator('json', cancelInvitationRequest, (result, c) => {
|
|
103
|
+
if (!result.success) {
|
|
104
|
+
return c.json({
|
|
105
|
+
success: false,
|
|
106
|
+
error: 'Missing required field',
|
|
107
|
+
message: 'invitationId is required',
|
|
108
|
+
issues: result.error.issues
|
|
109
|
+
}, 400);
|
|
103
110
|
}
|
|
104
|
-
}
|
|
105
|
-
// DELETE /api/organizations/invitations - Cancel an invitation
|
|
106
|
-
export const DELETE = async ({ request, locals }) => {
|
|
111
|
+
}), async (c) => {
|
|
107
112
|
try {
|
|
108
|
-
const { databaseAdapter } =
|
|
109
|
-
const auth =
|
|
113
|
+
const { databaseAdapter } = c.var.aphexCMS;
|
|
114
|
+
const auth = c.var.auth;
|
|
110
115
|
if (!auth || auth.type !== 'session') {
|
|
111
|
-
return json({
|
|
116
|
+
return c.json({
|
|
112
117
|
success: false,
|
|
113
118
|
error: 'Unauthorized',
|
|
114
119
|
message: 'Session authentication required'
|
|
115
|
-
},
|
|
120
|
+
}, 401);
|
|
116
121
|
}
|
|
117
122
|
if (!hasCapability(auth, 'member.invite')) {
|
|
118
|
-
return json({
|
|
123
|
+
return c.json({
|
|
119
124
|
success: false,
|
|
120
125
|
error: 'Forbidden',
|
|
121
126
|
message: 'You do not have permission to cancel invitations'
|
|
122
|
-
},
|
|
127
|
+
}, 403);
|
|
123
128
|
}
|
|
124
|
-
const
|
|
125
|
-
const parsed = cancelInvitationRequest.safeParse(rawBody);
|
|
126
|
-
if (!parsed.success) {
|
|
127
|
-
return json({
|
|
128
|
-
success: false,
|
|
129
|
-
error: 'Missing required field',
|
|
130
|
-
message: 'invitationId is required',
|
|
131
|
-
issues: parsed.error.issues
|
|
132
|
-
}, { status: 400 });
|
|
133
|
-
}
|
|
134
|
-
const body = parsed.data;
|
|
135
|
-
// Delete the invitation
|
|
129
|
+
const body = c.req.valid('json');
|
|
136
130
|
const deleted = await databaseAdapter.deleteInvitation(body.invitationId);
|
|
137
131
|
if (!deleted) {
|
|
138
|
-
return json({
|
|
139
|
-
success: false,
|
|
140
|
-
error: 'Invitation not found'
|
|
141
|
-
}, { status: 404 });
|
|
132
|
+
return c.json({ success: false, error: 'Invitation not found' }, 404);
|
|
142
133
|
}
|
|
143
|
-
return json({
|
|
144
|
-
success: true,
|
|
145
|
-
message: 'Invitation canceled successfully'
|
|
146
|
-
});
|
|
134
|
+
return c.json({ success: true, message: 'Invitation canceled successfully' });
|
|
147
135
|
}
|
|
148
136
|
catch (error) {
|
|
149
137
|
cmsLogger.error('Failed to cancel invitation:', error);
|
|
150
|
-
return json({
|
|
138
|
+
return c.json({
|
|
151
139
|
success: false,
|
|
152
140
|
error: 'Failed to cancel invitation',
|
|
153
141
|
message: error instanceof Error ? error.message : 'Unknown error'
|
|
154
|
-
},
|
|
142
|
+
}, 500);
|
|
155
143
|
}
|
|
156
|
-
};
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=organizations-invitations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organizations-invitations.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-invitations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organizations-members.d.ts","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,0BAA0B,EAAE,IAAI,CAAC,QAAQ,CAgRpD,CAAC"}
|