@objectql/server 1.4.0 → 1.6.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/CHANGELOG.md +24 -0
- package/dist/adapters/node.js +118 -43
- package/dist/adapters/node.js.map +1 -1
- package/dist/metadata.d.ts +1 -1
- package/dist/metadata.js +104 -116
- package/dist/metadata.js.map +1 -1
- package/dist/openapi.js +73 -24
- package/dist/openapi.js.map +1 -1
- package/dist/server.js +5 -3
- package/dist/server.js.map +1 -1
- package/jest.config.js +4 -1
- package/package.json +3 -3
- package/src/adapters/node.ts +124 -45
- package/src/metadata.ts +113 -125
- package/src/openapi.ts +80 -32
- package/tsconfig.json +6 -2
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# @objectql/server
|
|
2
2
|
|
|
3
|
+
## 1.6.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Minor version release - 1.6.0
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies
|
|
12
|
+
- @objectql/core@1.6.0
|
|
13
|
+
- @objectql/types@1.6.0
|
|
14
|
+
|
|
15
|
+
## 1.5.0
|
|
16
|
+
|
|
17
|
+
### Minor Changes
|
|
18
|
+
|
|
19
|
+
- Minor version release - 1.5.0
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- Updated dependencies
|
|
24
|
+
- @objectql/core@1.5.0
|
|
25
|
+
- @objectql/types@1.5.0
|
|
26
|
+
|
|
3
27
|
## 1.4.0
|
|
4
28
|
|
|
5
29
|
### Minor Changes
|
package/dist/adapters/node.js
CHANGED
|
@@ -10,8 +10,9 @@ const openapi_1 = require("../openapi");
|
|
|
10
10
|
function createNodeHandler(app) {
|
|
11
11
|
const server = new server_1.ObjectQLServer(app);
|
|
12
12
|
return async (req, res) => {
|
|
13
|
+
var _a;
|
|
13
14
|
// Handle OpenAPI spec request
|
|
14
|
-
if (req.method === 'GET' && req.url
|
|
15
|
+
if (req.method === 'GET' && ((_a = req.url) === null || _a === void 0 ? void 0 : _a.endsWith('/openapi.json'))) {
|
|
15
16
|
const spec = (0, openapi_1.generateOpenAPI)(app);
|
|
16
17
|
res.setHeader('Content-Type', 'application/json');
|
|
17
18
|
res.statusCode = 200;
|
|
@@ -20,13 +21,13 @@ function createNodeHandler(app) {
|
|
|
20
21
|
}
|
|
21
22
|
const handleRequest = async (json) => {
|
|
22
23
|
try {
|
|
23
|
-
//
|
|
24
|
+
// Determine Operation based on JSON or previously derived info
|
|
24
25
|
const qlReq = {
|
|
25
26
|
op: json.op,
|
|
26
27
|
object: json.object,
|
|
27
28
|
args: json.args,
|
|
28
|
-
user: json.user,
|
|
29
|
-
ai_context: json.ai_context
|
|
29
|
+
user: json.user,
|
|
30
|
+
ai_context: json.ai_context
|
|
30
31
|
};
|
|
31
32
|
const result = await server.handle(qlReq);
|
|
32
33
|
// Determine HTTP status code based on error
|
|
@@ -61,6 +62,7 @@ function createNodeHandler(app) {
|
|
|
61
62
|
res.end(JSON.stringify(result));
|
|
62
63
|
}
|
|
63
64
|
catch (e) {
|
|
65
|
+
console.error(e);
|
|
64
66
|
res.statusCode = 500;
|
|
65
67
|
res.end(JSON.stringify({
|
|
66
68
|
error: {
|
|
@@ -70,55 +72,128 @@ function createNodeHandler(app) {
|
|
|
70
72
|
}));
|
|
71
73
|
}
|
|
72
74
|
};
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
75
|
+
// Parse URL
|
|
76
|
+
const urlObj = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
|
|
77
|
+
const pathName = urlObj.pathname;
|
|
78
|
+
const method = req.method;
|
|
79
|
+
// 1. JSON-RPC: POST /api/objectql
|
|
80
|
+
if (pathName === '/api/objectql' && method === 'POST') {
|
|
81
|
+
await processBody(req, async (json) => {
|
|
82
|
+
await handleRequest(json);
|
|
83
|
+
}, res);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// 2. REST API: /api/data/:object and /api/data/:object/:id
|
|
87
|
+
// Regex to match /api/data/objectName(/id)?
|
|
88
|
+
const restMatch = pathName.match(/^\/api\/data\/([^/]+)(?:\/(.+))?$/);
|
|
89
|
+
if (restMatch) {
|
|
90
|
+
const objectName = restMatch[1];
|
|
91
|
+
const id = restMatch[2];
|
|
92
|
+
const query = Object.fromEntries(urlObj.searchParams.entries());
|
|
93
|
+
if (method === 'GET') {
|
|
94
|
+
// GET /api/data/:object/:id -> findOne
|
|
95
|
+
if (id) {
|
|
82
96
|
await handleRequest({
|
|
83
|
-
op: '
|
|
97
|
+
op: 'findOne',
|
|
84
98
|
object: objectName,
|
|
85
|
-
args: {} //
|
|
99
|
+
args: { filters: [['_id', '=', id]] } // Assuming _id or id mapping
|
|
86
100
|
});
|
|
87
|
-
return;
|
|
88
101
|
}
|
|
102
|
+
// GET /api/data/:object -> find (List)
|
|
103
|
+
else {
|
|
104
|
+
// Parse standard params
|
|
105
|
+
const args = {};
|
|
106
|
+
if (query.fields)
|
|
107
|
+
args.fields = query.fields.split(',');
|
|
108
|
+
if (query.top)
|
|
109
|
+
args.limit = parseInt(query.top);
|
|
110
|
+
if (query.skip)
|
|
111
|
+
args.skip = parseInt(query.skip);
|
|
112
|
+
if (query.filter) {
|
|
113
|
+
try {
|
|
114
|
+
args.filters = JSON.parse(query.filter);
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
// ignore invalid filter json
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
await handleRequest({ op: 'find', object: objectName, args });
|
|
121
|
+
}
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (method === 'POST' && !id) {
|
|
125
|
+
// POST /api/data/:object -> create
|
|
126
|
+
await processBody(req, async (body) => {
|
|
127
|
+
await handleRequest({
|
|
128
|
+
op: 'create',
|
|
129
|
+
object: objectName,
|
|
130
|
+
args: body.data || body // Support enclosed in data or flat
|
|
131
|
+
});
|
|
132
|
+
}, res);
|
|
133
|
+
return;
|
|
89
134
|
}
|
|
135
|
+
if (method === 'PATCH' && id) {
|
|
136
|
+
// PATCH /api/data/:object/:id -> update
|
|
137
|
+
await processBody(req, async (body) => {
|
|
138
|
+
await handleRequest({
|
|
139
|
+
op: 'update',
|
|
140
|
+
object: objectName,
|
|
141
|
+
args: {
|
|
142
|
+
id: id,
|
|
143
|
+
data: body.data || body
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}, res);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (method === 'DELETE' && id) {
|
|
150
|
+
// DELETE /api/data/:object/:id -> delete
|
|
151
|
+
await handleRequest({
|
|
152
|
+
op: 'delete',
|
|
153
|
+
object: objectName,
|
|
154
|
+
args: { id: id }
|
|
155
|
+
});
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Fallback or 404
|
|
160
|
+
if (req.method === 'POST') {
|
|
161
|
+
// Fallback for root POSTs if people forget /api/objectql but send to /api something
|
|
162
|
+
await processBody(req, handleRequest, res);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
// Special case for root: since we accept POST / (RPC), correct response for GET / is 405
|
|
166
|
+
if (pathName === '/') {
|
|
167
|
+
res.setHeader('Allow', 'POST');
|
|
90
168
|
res.statusCode = 405;
|
|
169
|
+
res.end(JSON.stringify({ error: { code: types_1.ErrorCode.INVALID_REQUEST, message: 'Method Not Allowed. Use POST for JSON-RPC.' } }));
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
res.statusCode = 404;
|
|
173
|
+
res.end(JSON.stringify({ error: { code: types_1.ErrorCode.NOT_FOUND, message: 'Not Found' } }));
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// Helper to process body
|
|
177
|
+
async function processBody(req, callback, res) {
|
|
178
|
+
if (req.body && typeof req.body === 'object') {
|
|
179
|
+
return callback(req.body);
|
|
180
|
+
}
|
|
181
|
+
let body = '';
|
|
182
|
+
req.on('data', chunk => body += chunk);
|
|
183
|
+
req.on('end', async () => {
|
|
184
|
+
try {
|
|
185
|
+
const json = body ? JSON.parse(body) : {};
|
|
186
|
+
await callback(json);
|
|
187
|
+
}
|
|
188
|
+
catch (e) {
|
|
189
|
+
res.statusCode = 400;
|
|
91
190
|
res.end(JSON.stringify({
|
|
92
191
|
error: {
|
|
93
|
-
code:
|
|
94
|
-
message: '
|
|
192
|
+
code: 'INVALID_JSON',
|
|
193
|
+
message: 'Invalid JSON body'
|
|
95
194
|
}
|
|
96
195
|
}));
|
|
97
|
-
return;
|
|
98
196
|
}
|
|
99
|
-
|
|
100
|
-
if (req.body && typeof req.body === 'object') {
|
|
101
|
-
await handleRequest(req.body);
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
// 2. Parse Body from stream
|
|
105
|
-
let body = '';
|
|
106
|
-
req.on('data', chunk => body += chunk);
|
|
107
|
-
req.on('end', async () => {
|
|
108
|
-
try {
|
|
109
|
-
const json = JSON.parse(body);
|
|
110
|
-
await handleRequest(json);
|
|
111
|
-
}
|
|
112
|
-
catch (e) {
|
|
113
|
-
res.statusCode = 400;
|
|
114
|
-
res.end(JSON.stringify({
|
|
115
|
-
error: {
|
|
116
|
-
code: types_1.ErrorCode.INVALID_REQUEST,
|
|
117
|
-
message: 'Invalid JSON'
|
|
118
|
-
}
|
|
119
|
-
}));
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
};
|
|
197
|
+
});
|
|
123
198
|
}
|
|
124
199
|
//# sourceMappingURL=node.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/adapters/node.ts"],"names":[],"mappings":";;AASA,
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/adapters/node.ts"],"names":[],"mappings":"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"}
|
package/dist/metadata.d.ts
CHANGED
|
@@ -2,6 +2,6 @@ import { IObjectQL } from '@objectql/types';
|
|
|
2
2
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
3
3
|
/**
|
|
4
4
|
* Creates a handler for metadata endpoints.
|
|
5
|
-
* These endpoints expose information about registered objects.
|
|
5
|
+
* These endpoints expose information about registered objects and other metadata.
|
|
6
6
|
*/
|
|
7
7
|
export declare function createMetadataHandler(app: IObjectQL): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
|
package/dist/metadata.js
CHANGED
|
@@ -21,10 +21,11 @@ function readBody(req) {
|
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* Creates a handler for metadata endpoints.
|
|
24
|
-
* These endpoints expose information about registered objects.
|
|
24
|
+
* These endpoints expose information about registered objects and other metadata.
|
|
25
25
|
*/
|
|
26
26
|
function createMetadataHandler(app) {
|
|
27
27
|
return async (req, res) => {
|
|
28
|
+
var _a;
|
|
28
29
|
// Parse the URL
|
|
29
30
|
const url = req.url || '';
|
|
30
31
|
const method = req.method;
|
|
@@ -38,7 +39,19 @@ function createMetadataHandler(app) {
|
|
|
38
39
|
return;
|
|
39
40
|
}
|
|
40
41
|
try {
|
|
41
|
-
//
|
|
42
|
+
// Helper to send JSON
|
|
43
|
+
const sendJson = (data, status = 200) => {
|
|
44
|
+
res.setHeader('Content-Type', 'application/json');
|
|
45
|
+
res.statusCode = status;
|
|
46
|
+
res.end(JSON.stringify(data));
|
|
47
|
+
};
|
|
48
|
+
const sendError = (code, message, status = 400) => {
|
|
49
|
+
sendJson({ error: { code, message } }, status);
|
|
50
|
+
};
|
|
51
|
+
// ---------------------------------------------------------
|
|
52
|
+
// 1. List Entries (GET /api/metadata/:type)
|
|
53
|
+
// ---------------------------------------------------------
|
|
54
|
+
// Legacy/Alias: /api/metadata or /api/metadata/objects -> list objects
|
|
42
55
|
if (method === 'GET' && (url === '/api/metadata' || url === '/api/metadata/objects')) {
|
|
43
56
|
const configs = app.getConfigs();
|
|
44
57
|
const objects = Object.values(configs).map(obj => ({
|
|
@@ -48,80 +61,96 @@ function createMetadataHandler(app) {
|
|
|
48
61
|
description: obj.description,
|
|
49
62
|
fields: obj.fields || {}
|
|
50
63
|
}));
|
|
51
|
-
|
|
52
|
-
res.statusCode = 200;
|
|
53
|
-
res.end(JSON.stringify({ objects }));
|
|
54
|
-
return;
|
|
64
|
+
return sendJson({ objects });
|
|
55
65
|
}
|
|
56
|
-
//
|
|
57
|
-
const
|
|
58
|
-
if (method === 'GET' &&
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
// Generic List: /api/metadata/:type
|
|
67
|
+
const listMatch = url.match(/^\/api\/metadata\/([^\/]+)$/);
|
|
68
|
+
if (method === 'GET' && listMatch) {
|
|
69
|
+
let [, type] = listMatch;
|
|
70
|
+
if (type === 'objects')
|
|
71
|
+
type = 'object'; // Should not hit due to order, but safe to keep.
|
|
72
|
+
const entries = app.metadata.list(type);
|
|
73
|
+
// Return simple list
|
|
74
|
+
return sendJson({
|
|
75
|
+
[type]: entries
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// ---------------------------------------------------------
|
|
79
|
+
// 2. Get Single Entry (GET /api/metadata/:type/:id)
|
|
80
|
+
// ---------------------------------------------------------
|
|
81
|
+
const detailMatch = url.match(/^\/api\/metadata\/([^\/]+)\/([^\/\?]+)$/);
|
|
82
|
+
if (method === 'GET' && detailMatch) {
|
|
83
|
+
let [, type, id] = detailMatch;
|
|
84
|
+
// Handle Object Special Logic (Field Formatting)
|
|
85
|
+
if (type === 'objects' || type === 'object') {
|
|
86
|
+
const metadata = app.getObject(id);
|
|
87
|
+
if (!metadata) {
|
|
88
|
+
return sendError(types_1.ErrorCode.NOT_FOUND, `Object '${id}' not found`, 404);
|
|
89
|
+
}
|
|
90
|
+
// Convert fields object to array (Standard Object Response)
|
|
91
|
+
const fields = metadata.fields
|
|
92
|
+
? Object.entries(metadata.fields).map(([key, field]) => ({
|
|
93
|
+
name: field.name || key,
|
|
94
|
+
type: field.type,
|
|
95
|
+
label: field.label,
|
|
96
|
+
required: field.required,
|
|
97
|
+
defaultValue: field.defaultValue,
|
|
98
|
+
unique: field.unique,
|
|
99
|
+
options: field.options,
|
|
100
|
+
min: field.min,
|
|
101
|
+
max: field.max,
|
|
102
|
+
min_length: field.min_length,
|
|
103
|
+
max_length: field.max_length,
|
|
104
|
+
regex: field.regex
|
|
105
|
+
}))
|
|
106
|
+
: [];
|
|
107
|
+
return sendJson({
|
|
108
|
+
...metadata,
|
|
109
|
+
fields
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// Generic Metadata (View, Form, etc.)
|
|
114
|
+
const content = app.metadata.get(type, id);
|
|
115
|
+
if (!content) {
|
|
116
|
+
return sendError(types_1.ErrorCode.NOT_FOUND, `${type} '${id}' not found`, 404);
|
|
117
|
+
}
|
|
118
|
+
return sendJson(content);
|
|
70
119
|
}
|
|
71
|
-
// Convert fields object to array
|
|
72
|
-
const fields = metadata.fields
|
|
73
|
-
? Object.entries(metadata.fields).map(([key, field]) => ({
|
|
74
|
-
name: field.name || key,
|
|
75
|
-
type: field.type,
|
|
76
|
-
label: field.label,
|
|
77
|
-
required: field.required,
|
|
78
|
-
defaultValue: field.defaultValue,
|
|
79
|
-
unique: field.unique,
|
|
80
|
-
options: field.options,
|
|
81
|
-
min: field.min,
|
|
82
|
-
max: field.max,
|
|
83
|
-
min_length: field.min_length,
|
|
84
|
-
max_length: field.max_length,
|
|
85
|
-
regex: field.regex
|
|
86
|
-
}))
|
|
87
|
-
: [];
|
|
88
|
-
res.setHeader('Content-Type', 'application/json');
|
|
89
|
-
res.statusCode = 200;
|
|
90
|
-
res.end(JSON.stringify({
|
|
91
|
-
...metadata,
|
|
92
|
-
fields
|
|
93
|
-
}));
|
|
94
|
-
return;
|
|
95
120
|
}
|
|
96
|
-
//
|
|
121
|
+
// ---------------------------------------------------------
|
|
122
|
+
// 3. Update Entry (POST/PUT /api/metadata/:type/:id)
|
|
123
|
+
// ---------------------------------------------------------
|
|
124
|
+
if ((method === 'POST' || method === 'PUT') && detailMatch) {
|
|
125
|
+
let [, type, id] = detailMatch;
|
|
126
|
+
if (type === 'objects')
|
|
127
|
+
type = 'object';
|
|
128
|
+
const body = await readBody(req);
|
|
129
|
+
try {
|
|
130
|
+
// await app.updateMetadata(type, id, body);
|
|
131
|
+
// return sendJson({ success: true });
|
|
132
|
+
return sendError(types_1.ErrorCode.INTERNAL_ERROR, 'Metadata updates via API are temporarily disabled in this architectural version.', 501);
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
const isUserError = e.message.startsWith('Cannot update') || e.message.includes('not found');
|
|
136
|
+
return sendError(isUserError ? types_1.ErrorCode.INVALID_REQUEST : types_1.ErrorCode.INTERNAL_ERROR, e.message, isUserError ? 400 : 500);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// ---------------------------------------------------------
|
|
140
|
+
// 4. Object Sub-resources (Fields, Actions)
|
|
141
|
+
// ---------------------------------------------------------
|
|
142
|
+
// GET /api/metadata/objects/:name/fields/:field
|
|
143
|
+
// Legacy path support.
|
|
97
144
|
const fieldMatch = url.match(/^\/api\/metadata\/objects\/([^\/]+)\/fields\/([^\/\?]+)$/);
|
|
98
145
|
if (method === 'GET' && fieldMatch) {
|
|
99
146
|
const [, objectName, fieldName] = fieldMatch;
|
|
100
147
|
const metadata = app.getObject(objectName);
|
|
101
|
-
if (!metadata)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
}));
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
const field = metadata.fields?.[fieldName];
|
|
112
|
-
if (!field) {
|
|
113
|
-
res.statusCode = 404;
|
|
114
|
-
res.end(JSON.stringify({
|
|
115
|
-
error: {
|
|
116
|
-
code: types_1.ErrorCode.NOT_FOUND,
|
|
117
|
-
message: `Field '${fieldName}' not found in object '${objectName}'`
|
|
118
|
-
}
|
|
119
|
-
}));
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
res.setHeader('Content-Type', 'application/json');
|
|
123
|
-
res.statusCode = 200;
|
|
124
|
-
res.end(JSON.stringify({
|
|
148
|
+
if (!metadata)
|
|
149
|
+
return sendError(types_1.ErrorCode.NOT_FOUND, `Object '${objectName}' not found`, 404);
|
|
150
|
+
const field = (_a = metadata.fields) === null || _a === void 0 ? void 0 : _a[fieldName];
|
|
151
|
+
if (!field)
|
|
152
|
+
return sendError(types_1.ErrorCode.NOT_FOUND, `Field '${fieldName}' not found`, 404);
|
|
153
|
+
return sendJson({
|
|
125
154
|
name: field.name || fieldName,
|
|
126
155
|
type: field.type,
|
|
127
156
|
label: field.label,
|
|
@@ -134,24 +163,15 @@ function createMetadataHandler(app) {
|
|
|
134
163
|
min_length: field.min_length,
|
|
135
164
|
max_length: field.max_length,
|
|
136
165
|
regex: field.regex
|
|
137
|
-
})
|
|
138
|
-
return;
|
|
166
|
+
});
|
|
139
167
|
}
|
|
140
|
-
// GET /api/metadata/objects/:name/actions
|
|
168
|
+
// GET /api/metadata/objects/:name/actions
|
|
141
169
|
const actionsMatch = url.match(/^\/api\/metadata\/objects\/([^\/]+)\/actions$/);
|
|
142
170
|
if (method === 'GET' && actionsMatch) {
|
|
143
171
|
const [, objectName] = actionsMatch;
|
|
144
172
|
const metadata = app.getObject(objectName);
|
|
145
|
-
if (!metadata)
|
|
146
|
-
|
|
147
|
-
res.end(JSON.stringify({
|
|
148
|
-
error: {
|
|
149
|
-
code: types_1.ErrorCode.NOT_FOUND,
|
|
150
|
-
message: `Object '${objectName}' not found`
|
|
151
|
-
}
|
|
152
|
-
}));
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
173
|
+
if (!metadata)
|
|
174
|
+
return sendError(types_1.ErrorCode.NOT_FOUND, `Object '${objectName}' not found`, 404);
|
|
155
175
|
const actions = metadata.actions || {};
|
|
156
176
|
const formattedActions = Object.entries(actions).map(([key, action]) => {
|
|
157
177
|
const actionConfig = action;
|
|
@@ -164,42 +184,10 @@ function createMetadataHandler(app) {
|
|
|
164
184
|
description: actionConfig.description
|
|
165
185
|
};
|
|
166
186
|
});
|
|
167
|
-
|
|
168
|
-
res.statusCode = 200;
|
|
169
|
-
res.end(JSON.stringify({ actions: formattedActions }));
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
// POST/PUT /api/metadata/:type/:id - Update metadata
|
|
173
|
-
const updateMatch = url.match(/^\/api\/metadata\/([^\/]+)\/([^\/]+)$/);
|
|
174
|
-
if ((method === 'POST' || method === 'PUT') && updateMatch) {
|
|
175
|
-
const [, type, id] = updateMatch;
|
|
176
|
-
const body = await readBody(req);
|
|
177
|
-
try {
|
|
178
|
-
await app.updateMetadata(type, id, body);
|
|
179
|
-
res.setHeader('Content-Type', 'application/json');
|
|
180
|
-
res.statusCode = 200;
|
|
181
|
-
res.end(JSON.stringify({ success: true }));
|
|
182
|
-
}
|
|
183
|
-
catch (e) {
|
|
184
|
-
const isUserError = e.message.startsWith('Cannot update') || e.message.includes('not found');
|
|
185
|
-
res.statusCode = isUserError ? 400 : 500;
|
|
186
|
-
res.end(JSON.stringify({
|
|
187
|
-
error: {
|
|
188
|
-
code: isUserError ? types_1.ErrorCode.INVALID_REQUEST : types_1.ErrorCode.INTERNAL_ERROR,
|
|
189
|
-
message: e.message
|
|
190
|
-
}
|
|
191
|
-
}));
|
|
192
|
-
}
|
|
193
|
-
return;
|
|
187
|
+
return sendJson({ actions: formattedActions });
|
|
194
188
|
}
|
|
195
189
|
// Not found
|
|
196
|
-
|
|
197
|
-
res.end(JSON.stringify({
|
|
198
|
-
error: {
|
|
199
|
-
code: types_1.ErrorCode.NOT_FOUND,
|
|
200
|
-
message: 'Not Found'
|
|
201
|
-
}
|
|
202
|
-
}));
|
|
190
|
+
sendError(types_1.ErrorCode.NOT_FOUND, 'Not Found', 404);
|
|
203
191
|
}
|
|
204
192
|
catch (e) {
|
|
205
193
|
console.error('[Metadata Handler] Error:', e);
|
package/dist/metadata.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":";;AAwBA,
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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"}
|