@objectql/server 0.2.1 → 1.4.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 +27 -0
- package/LICENSE +21 -0
- package/dist/adapters/node.js +69 -9
- package/dist/adapters/node.js.map +1 -1
- package/dist/adapters/rest.d.ts +15 -0
- package/dist/adapters/rest.js +252 -0
- package/dist/adapters/rest.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata.js +152 -11
- package/dist/metadata.js.map +1 -1
- package/dist/server.d.ts +8 -0
- package/dist/server.js +75 -15
- package/dist/server.js.map +1 -1
- package/dist/studio.d.ts +5 -0
- package/dist/{console.js → studio.js} +35 -23
- package/dist/studio.js.map +1 -0
- package/dist/types.d.ts +49 -1
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -1
- package/package.json +7 -5
- package/src/adapters/node.ts +72 -11
- package/src/adapters/rest.ts +271 -0
- package/src/index.ts +3 -1
- package/src/metadata.ts +166 -11
- package/src/server.ts +119 -16
- package/src/{console.ts → studio.ts} +35 -22
- package/src/types.ts +56 -2
- package/test/rest.test.ts +164 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/console.d.ts +0 -5
- package/dist/console.js.map +0 -1
package/dist/metadata.js
CHANGED
|
@@ -1,6 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createMetadataHandler = createMetadataHandler;
|
|
4
|
+
const types_1 = require("./types");
|
|
5
|
+
function readBody(req) {
|
|
6
|
+
return new Promise((resolve, reject) => {
|
|
7
|
+
let body = '';
|
|
8
|
+
req.on('data', chunk => body += chunk.toString());
|
|
9
|
+
req.on('end', () => {
|
|
10
|
+
if (!body)
|
|
11
|
+
return resolve({});
|
|
12
|
+
try {
|
|
13
|
+
resolve(JSON.parse(body));
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
reject(e);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
req.on('error', reject);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
4
22
|
/**
|
|
5
23
|
* Creates a handler for metadata endpoints.
|
|
6
24
|
* These endpoints expose information about registered objects.
|
|
@@ -9,9 +27,10 @@ function createMetadataHandler(app) {
|
|
|
9
27
|
return async (req, res) => {
|
|
10
28
|
// Parse the URL
|
|
11
29
|
const url = req.url || '';
|
|
30
|
+
const method = req.method;
|
|
12
31
|
// CORS headers for development
|
|
13
32
|
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
14
|
-
res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS');
|
|
33
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, OPTIONS');
|
|
15
34
|
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
|
|
16
35
|
if (req.method === 'OPTIONS') {
|
|
17
36
|
res.statusCode = 200;
|
|
@@ -19,14 +38,15 @@ function createMetadataHandler(app) {
|
|
|
19
38
|
return;
|
|
20
39
|
}
|
|
21
40
|
try {
|
|
22
|
-
// GET /api/metadata/objects - List all objects
|
|
23
|
-
if (url === '/api/metadata/objects') {
|
|
41
|
+
// GET /api/metadata or /api/metadata/objects - List all objects
|
|
42
|
+
if (method === 'GET' && (url === '/api/metadata' || url === '/api/metadata/objects')) {
|
|
24
43
|
const configs = app.getConfigs();
|
|
25
44
|
const objects = Object.values(configs).map(obj => ({
|
|
26
45
|
name: obj.name,
|
|
27
46
|
label: obj.label || obj.name,
|
|
28
47
|
icon: obj.icon,
|
|
29
|
-
|
|
48
|
+
description: obj.description,
|
|
49
|
+
fields: obj.fields || {}
|
|
30
50
|
}));
|
|
31
51
|
res.setHeader('Content-Type', 'application/json');
|
|
32
52
|
res.statusCode = 200;
|
|
@@ -34,13 +54,18 @@ function createMetadataHandler(app) {
|
|
|
34
54
|
return;
|
|
35
55
|
}
|
|
36
56
|
// GET /api/metadata/objects/:name - Get object details
|
|
37
|
-
const
|
|
38
|
-
if (
|
|
39
|
-
const objectName =
|
|
57
|
+
const objectMatch = url.match(/^\/api\/metadata\/objects\/([^\/\?]+)$/);
|
|
58
|
+
if (method === 'GET' && objectMatch) {
|
|
59
|
+
const objectName = objectMatch[1];
|
|
40
60
|
const metadata = app.getObject(objectName);
|
|
41
61
|
if (!metadata) {
|
|
42
62
|
res.statusCode = 404;
|
|
43
|
-
res.end(JSON.stringify({
|
|
63
|
+
res.end(JSON.stringify({
|
|
64
|
+
error: {
|
|
65
|
+
code: types_1.ErrorCode.NOT_FOUND,
|
|
66
|
+
message: `Object '${objectName}' not found`
|
|
67
|
+
}
|
|
68
|
+
}));
|
|
44
69
|
return;
|
|
45
70
|
}
|
|
46
71
|
// Convert fields object to array
|
|
@@ -50,7 +75,14 @@ function createMetadataHandler(app) {
|
|
|
50
75
|
type: field.type,
|
|
51
76
|
label: field.label,
|
|
52
77
|
required: field.required,
|
|
53
|
-
defaultValue: field.defaultValue
|
|
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
|
|
54
86
|
}))
|
|
55
87
|
: [];
|
|
56
88
|
res.setHeader('Content-Type', 'application/json');
|
|
@@ -61,14 +93,123 @@ function createMetadataHandler(app) {
|
|
|
61
93
|
}));
|
|
62
94
|
return;
|
|
63
95
|
}
|
|
96
|
+
// GET /api/metadata/objects/:name/fields/:field - Get field metadata
|
|
97
|
+
const fieldMatch = url.match(/^\/api\/metadata\/objects\/([^\/]+)\/fields\/([^\/\?]+)$/);
|
|
98
|
+
if (method === 'GET' && fieldMatch) {
|
|
99
|
+
const [, objectName, fieldName] = fieldMatch;
|
|
100
|
+
const metadata = app.getObject(objectName);
|
|
101
|
+
if (!metadata) {
|
|
102
|
+
res.statusCode = 404;
|
|
103
|
+
res.end(JSON.stringify({
|
|
104
|
+
error: {
|
|
105
|
+
code: types_1.ErrorCode.NOT_FOUND,
|
|
106
|
+
message: `Object '${objectName}' not found`
|
|
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({
|
|
125
|
+
name: field.name || fieldName,
|
|
126
|
+
type: field.type,
|
|
127
|
+
label: field.label,
|
|
128
|
+
required: field.required,
|
|
129
|
+
unique: field.unique,
|
|
130
|
+
defaultValue: field.defaultValue,
|
|
131
|
+
options: field.options,
|
|
132
|
+
min: field.min,
|
|
133
|
+
max: field.max,
|
|
134
|
+
min_length: field.min_length,
|
|
135
|
+
max_length: field.max_length,
|
|
136
|
+
regex: field.regex
|
|
137
|
+
}));
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// GET /api/metadata/objects/:name/actions - List actions
|
|
141
|
+
const actionsMatch = url.match(/^\/api\/metadata\/objects\/([^\/]+)\/actions$/);
|
|
142
|
+
if (method === 'GET' && actionsMatch) {
|
|
143
|
+
const [, objectName] = actionsMatch;
|
|
144
|
+
const metadata = app.getObject(objectName);
|
|
145
|
+
if (!metadata) {
|
|
146
|
+
res.statusCode = 404;
|
|
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
|
+
}
|
|
155
|
+
const actions = metadata.actions || {};
|
|
156
|
+
const formattedActions = Object.entries(actions).map(([key, action]) => {
|
|
157
|
+
const actionConfig = action;
|
|
158
|
+
const hasFields = !!actionConfig.fields && Object.keys(actionConfig.fields).length > 0;
|
|
159
|
+
return {
|
|
160
|
+
name: key,
|
|
161
|
+
type: actionConfig.type || (hasFields ? 'record' : 'global'),
|
|
162
|
+
label: actionConfig.label || key,
|
|
163
|
+
params: actionConfig.params || {},
|
|
164
|
+
description: actionConfig.description
|
|
165
|
+
};
|
|
166
|
+
});
|
|
167
|
+
res.setHeader('Content-Type', 'application/json');
|
|
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;
|
|
194
|
+
}
|
|
64
195
|
// Not found
|
|
65
196
|
res.statusCode = 404;
|
|
66
|
-
res.end(
|
|
197
|
+
res.end(JSON.stringify({
|
|
198
|
+
error: {
|
|
199
|
+
code: types_1.ErrorCode.NOT_FOUND,
|
|
200
|
+
message: 'Not Found'
|
|
201
|
+
}
|
|
202
|
+
}));
|
|
67
203
|
}
|
|
68
204
|
catch (e) {
|
|
69
205
|
console.error('[Metadata Handler] Error:', e);
|
|
70
206
|
res.statusCode = 500;
|
|
71
|
-
res.end(JSON.stringify({
|
|
207
|
+
res.end(JSON.stringify({
|
|
208
|
+
error: {
|
|
209
|
+
code: types_1.ErrorCode.INTERNAL_ERROR,
|
|
210
|
+
message: 'Internal Server Error'
|
|
211
|
+
}
|
|
212
|
+
}));
|
|
72
213
|
}
|
|
73
214
|
};
|
|
74
215
|
}
|
package/dist/metadata.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -8,4 +8,12 @@ export declare class ObjectQLServer {
|
|
|
8
8
|
* This is framework-agnostic.
|
|
9
9
|
*/
|
|
10
10
|
handle(req: ObjectQLRequest): Promise<ObjectQLResponse>;
|
|
11
|
+
/**
|
|
12
|
+
* Handle errors and convert them to appropriate error responses
|
|
13
|
+
*/
|
|
14
|
+
private handleError;
|
|
15
|
+
/**
|
|
16
|
+
* Create a standardized error response
|
|
17
|
+
*/
|
|
18
|
+
private errorResponse;
|
|
11
19
|
}
|
package/dist/server.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ObjectQLServer = void 0;
|
|
4
|
+
const types_1 = require("./types");
|
|
4
5
|
class ObjectQLServer {
|
|
5
6
|
constructor(app) {
|
|
6
7
|
this.app = app;
|
|
@@ -11,6 +12,16 @@ class ObjectQLServer {
|
|
|
11
12
|
*/
|
|
12
13
|
async handle(req) {
|
|
13
14
|
try {
|
|
15
|
+
// Log AI context if provided
|
|
16
|
+
if (req.ai_context) {
|
|
17
|
+
console.log('[ObjectQL AI Context]', {
|
|
18
|
+
object: req.object,
|
|
19
|
+
op: req.op,
|
|
20
|
+
intent: req.ai_context.intent,
|
|
21
|
+
natural_language: req.ai_context.natural_language,
|
|
22
|
+
use_case: req.ai_context.use_case
|
|
23
|
+
});
|
|
24
|
+
}
|
|
14
25
|
// 1. Build Context
|
|
15
26
|
// TODO: integrate with real session/auth
|
|
16
27
|
const contextOptions = {
|
|
@@ -23,9 +34,14 @@ class ObjectQLServer {
|
|
|
23
34
|
// We need to cast or fix the interface. Assuming 'app' behaves like ObjectQL class.
|
|
24
35
|
const app = this.app;
|
|
25
36
|
if (typeof app.createContext !== 'function') {
|
|
26
|
-
|
|
37
|
+
return this.errorResponse(types_1.ErrorCode.INTERNAL_ERROR, "The provided ObjectQL instance does not support createContext.");
|
|
27
38
|
}
|
|
28
39
|
const ctx = app.createContext(contextOptions);
|
|
40
|
+
// Validate object exists
|
|
41
|
+
const objectConfig = app.getObject(req.object);
|
|
42
|
+
if (!objectConfig) {
|
|
43
|
+
return this.errorResponse(types_1.ErrorCode.NOT_FOUND, `Object '${req.object}' not found`);
|
|
44
|
+
}
|
|
29
45
|
const repo = ctx.object(req.object);
|
|
30
46
|
let result;
|
|
31
47
|
switch (req.op) {
|
|
@@ -33,7 +49,13 @@ class ObjectQLServer {
|
|
|
33
49
|
result = await repo.find(req.args);
|
|
34
50
|
break;
|
|
35
51
|
case 'findOne':
|
|
36
|
-
|
|
52
|
+
// Support both string ID and query object
|
|
53
|
+
if (typeof req.args === 'string') {
|
|
54
|
+
result = await repo.findOne({ filters: [['_id', '=', req.args]] });
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
result = await repo.findOne(req.args);
|
|
58
|
+
}
|
|
37
59
|
break;
|
|
38
60
|
case 'create':
|
|
39
61
|
result = await repo.create(req.args);
|
|
@@ -43,33 +65,71 @@ class ObjectQLServer {
|
|
|
43
65
|
break;
|
|
44
66
|
case 'delete':
|
|
45
67
|
result = await repo.delete(req.args.id);
|
|
68
|
+
if (!result) {
|
|
69
|
+
return this.errorResponse(types_1.ErrorCode.NOT_FOUND, `Record with id '${req.args.id}' not found for delete`);
|
|
70
|
+
}
|
|
71
|
+
// Return standardized delete response on success
|
|
72
|
+
result = { id: req.args.id, deleted: true };
|
|
46
73
|
break;
|
|
47
74
|
case 'count':
|
|
48
75
|
result = await repo.count(req.args);
|
|
49
76
|
break;
|
|
50
77
|
case 'action':
|
|
51
|
-
//
|
|
52
|
-
// usually it's on the app level or via special method.
|
|
53
|
-
// For now, let's assume app.executeAction
|
|
78
|
+
// Map generic args to ActionContext
|
|
54
79
|
result = await app.executeAction(req.object, req.args.action, {
|
|
55
|
-
...ctx, // Pass context
|
|
56
|
-
|
|
80
|
+
...ctx, // Pass context (user, etc.)
|
|
81
|
+
id: req.args.id,
|
|
82
|
+
input: req.args.input || req.args.params // Support both for convenience
|
|
57
83
|
});
|
|
58
84
|
break;
|
|
59
85
|
default:
|
|
60
|
-
|
|
86
|
+
return this.errorResponse(types_1.ErrorCode.INVALID_REQUEST, `Unknown operation: ${req.op}`);
|
|
61
87
|
}
|
|
62
88
|
return { data: result };
|
|
63
89
|
}
|
|
64
90
|
catch (e) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
91
|
+
return this.handleError(e);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Handle errors and convert them to appropriate error responses
|
|
96
|
+
*/
|
|
97
|
+
handleError(error) {
|
|
98
|
+
console.error('[ObjectQL Server] Error:', error);
|
|
99
|
+
// Handle validation errors
|
|
100
|
+
if (error.name === 'ValidationError' || error.code === 'VALIDATION_ERROR') {
|
|
101
|
+
return this.errorResponse(types_1.ErrorCode.VALIDATION_ERROR, 'Validation failed', { fields: error.fields || error.details });
|
|
102
|
+
}
|
|
103
|
+
// Handle permission errors
|
|
104
|
+
if (error.name === 'PermissionError' || error.code === 'FORBIDDEN') {
|
|
105
|
+
return this.errorResponse(types_1.ErrorCode.FORBIDDEN, error.message || 'You do not have permission to access this resource', error.details);
|
|
72
106
|
}
|
|
107
|
+
// Handle not found errors
|
|
108
|
+
if (error.name === 'NotFoundError' || error.code === 'NOT_FOUND') {
|
|
109
|
+
return this.errorResponse(types_1.ErrorCode.NOT_FOUND, error.message || 'Resource not found');
|
|
110
|
+
}
|
|
111
|
+
// Handle conflict errors (e.g., unique constraint violations)
|
|
112
|
+
if (error.name === 'ConflictError' || error.code === 'CONFLICT') {
|
|
113
|
+
return this.errorResponse(types_1.ErrorCode.CONFLICT, error.message || 'Resource conflict', error.details);
|
|
114
|
+
}
|
|
115
|
+
// Handle database errors
|
|
116
|
+
if (error.name === 'DatabaseError' || error.code?.startsWith('DB_')) {
|
|
117
|
+
return this.errorResponse(types_1.ErrorCode.DATABASE_ERROR, 'Database operation failed', { originalError: error.message });
|
|
118
|
+
}
|
|
119
|
+
// Default to internal error
|
|
120
|
+
return this.errorResponse(types_1.ErrorCode.INTERNAL_ERROR, error.message || 'An error occurred');
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Create a standardized error response
|
|
124
|
+
*/
|
|
125
|
+
errorResponse(code, message, details) {
|
|
126
|
+
return {
|
|
127
|
+
error: {
|
|
128
|
+
code,
|
|
129
|
+
message,
|
|
130
|
+
details
|
|
131
|
+
}
|
|
132
|
+
};
|
|
73
133
|
}
|
|
74
134
|
}
|
|
75
135
|
exports.ObjectQLServer = ObjectQLServer;
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/studio.d.ts
ADDED
|
@@ -33,37 +33,49 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.
|
|
36
|
+
exports.createStudioHandler = createStudioHandler;
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
/**
|
|
40
|
-
* Creates a handler to serve the
|
|
40
|
+
* Creates a handler to serve the Studio UI static files.
|
|
41
41
|
*/
|
|
42
|
-
function
|
|
43
|
-
// Try to find the built console files
|
|
44
|
-
const possiblePaths = [
|
|
45
|
-
path.join(__dirname, '../../console/dist'),
|
|
46
|
-
path.join(process.cwd(), 'node_modules/@objectql/console/dist'),
|
|
47
|
-
path.join(process.cwd(), 'packages/console/dist'),
|
|
48
|
-
];
|
|
42
|
+
function createStudioHandler() {
|
|
49
43
|
let distPath = null;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
44
|
+
// 1. Try to resolve from installed package (Standard way)
|
|
45
|
+
try {
|
|
46
|
+
const studioPkg = require.resolve('@objectql/studio/package.json');
|
|
47
|
+
const candidate = path.join(path.dirname(studioPkg), 'dist');
|
|
48
|
+
if (fs.existsSync(candidate)) {
|
|
49
|
+
distPath = candidate;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
// @objectql/studio might not be installed
|
|
54
|
+
}
|
|
55
|
+
// 2. Fallback for local development (Monorepo)
|
|
56
|
+
if (!distPath) {
|
|
57
|
+
const possiblePaths = [
|
|
58
|
+
path.join(__dirname, '../../studio/dist'),
|
|
59
|
+
path.join(process.cwd(), 'packages/studio/dist'),
|
|
60
|
+
];
|
|
61
|
+
for (const p of possiblePaths) {
|
|
62
|
+
if (fs.existsSync(p)) {
|
|
63
|
+
distPath = p;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
54
66
|
}
|
|
55
67
|
}
|
|
56
68
|
return async (req, res) => {
|
|
57
69
|
if (!distPath) {
|
|
58
|
-
// Return placeholder page if
|
|
70
|
+
// Return placeholder page if studio is not built
|
|
59
71
|
const html = getPlaceholderPage();
|
|
60
72
|
res.setHeader('Content-Type', 'text/html');
|
|
61
73
|
res.statusCode = 200;
|
|
62
74
|
res.end(html);
|
|
63
75
|
return;
|
|
64
76
|
}
|
|
65
|
-
// Parse the URL and remove /
|
|
66
|
-
let urlPath = (req.url || '').replace(/^\/
|
|
77
|
+
// Parse the URL and remove /studio prefix
|
|
78
|
+
let urlPath = (req.url || '').replace(/^\/studio/, '') || '/';
|
|
67
79
|
// Default to index.html for SPA routing
|
|
68
80
|
if (urlPath === '/' || !urlPath.includes('.')) {
|
|
69
81
|
urlPath = '/index.html';
|
|
@@ -119,7 +131,7 @@ function getPlaceholderPage() {
|
|
|
119
131
|
<head>
|
|
120
132
|
<meta charset="UTF-8">
|
|
121
133
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
122
|
-
<title>ObjectQL
|
|
134
|
+
<title>ObjectQL Studio</title>
|
|
123
135
|
<style>
|
|
124
136
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
125
137
|
body {
|
|
@@ -155,19 +167,19 @@ function getPlaceholderPage() {
|
|
|
155
167
|
</head>
|
|
156
168
|
<body>
|
|
157
169
|
<div class="container">
|
|
158
|
-
<h1>ObjectQL
|
|
159
|
-
<p>Web-based admin
|
|
170
|
+
<h1>ObjectQL Studio</h1>
|
|
171
|
+
<p>Web-based admin studio for database management</p>
|
|
160
172
|
<div class="info">
|
|
161
173
|
<p style="margin-bottom: 1rem;">
|
|
162
|
-
The
|
|
174
|
+
The studio is available but needs to be built separately.
|
|
163
175
|
</p>
|
|
164
176
|
<p style="font-size: 1rem;">
|
|
165
|
-
To use the full
|
|
166
|
-
<code>cd packages/
|
|
177
|
+
To use the full studio UI, run:<br>
|
|
178
|
+
<code>cd packages/studio && pnpm run build</code>
|
|
167
179
|
</p>
|
|
168
180
|
</div>
|
|
169
181
|
</div>
|
|
170
182
|
</body>
|
|
171
183
|
</html>`;
|
|
172
184
|
}
|
|
173
|
-
//# sourceMappingURL=
|
|
185
|
+
//# sourceMappingURL=studio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio.js","sourceRoot":"","sources":["../src/studio.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standardized error codes for ObjectQL API
|
|
3
|
+
*/
|
|
4
|
+
export declare enum ErrorCode {
|
|
5
|
+
INVALID_REQUEST = "INVALID_REQUEST",
|
|
6
|
+
VALIDATION_ERROR = "VALIDATION_ERROR",
|
|
7
|
+
UNAUTHORIZED = "UNAUTHORIZED",
|
|
8
|
+
FORBIDDEN = "FORBIDDEN",
|
|
9
|
+
NOT_FOUND = "NOT_FOUND",
|
|
10
|
+
CONFLICT = "CONFLICT",
|
|
11
|
+
INTERNAL_ERROR = "INTERNAL_ERROR",
|
|
12
|
+
DATABASE_ERROR = "DATABASE_ERROR",
|
|
13
|
+
RATE_LIMIT_EXCEEDED = "RATE_LIMIT_EXCEEDED"
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* AI context for better logging, debugging, and AI processing
|
|
17
|
+
*/
|
|
18
|
+
export interface AIContext {
|
|
19
|
+
intent?: string;
|
|
20
|
+
natural_language?: string;
|
|
21
|
+
use_case?: string;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* ObjectQL JSON-RPC style request
|
|
26
|
+
*/
|
|
1
27
|
export interface ObjectQLRequest {
|
|
2
28
|
user?: {
|
|
3
29
|
id: string;
|
|
@@ -7,11 +33,33 @@ export interface ObjectQLRequest {
|
|
|
7
33
|
op: 'find' | 'findOne' | 'create' | 'update' | 'delete' | 'count' | 'action';
|
|
8
34
|
object: string;
|
|
9
35
|
args: any;
|
|
36
|
+
ai_context?: AIContext;
|
|
10
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Error details structure
|
|
40
|
+
*/
|
|
41
|
+
export interface ErrorDetails {
|
|
42
|
+
field?: string;
|
|
43
|
+
reason?: string;
|
|
44
|
+
fields?: Record<string, string>;
|
|
45
|
+
required_permission?: string;
|
|
46
|
+
user_roles?: string[];
|
|
47
|
+
retry_after?: number;
|
|
48
|
+
[key: string]: unknown;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* ObjectQL API response
|
|
52
|
+
*/
|
|
11
53
|
export interface ObjectQLResponse {
|
|
12
54
|
data?: any;
|
|
13
55
|
error?: {
|
|
14
|
-
code: string;
|
|
56
|
+
code: ErrorCode | string;
|
|
15
57
|
message: string;
|
|
58
|
+
details?: ErrorDetails;
|
|
59
|
+
};
|
|
60
|
+
meta?: {
|
|
61
|
+
total?: number;
|
|
62
|
+
page?: number;
|
|
63
|
+
per_page?: number;
|
|
16
64
|
};
|
|
17
65
|
}
|
package/dist/types.js
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
// src/types.ts
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ErrorCode = void 0;
|
|
5
|
+
/**
|
|
6
|
+
* Standardized error codes for ObjectQL API
|
|
7
|
+
*/
|
|
8
|
+
var ErrorCode;
|
|
9
|
+
(function (ErrorCode) {
|
|
10
|
+
ErrorCode["INVALID_REQUEST"] = "INVALID_REQUEST";
|
|
11
|
+
ErrorCode["VALIDATION_ERROR"] = "VALIDATION_ERROR";
|
|
12
|
+
ErrorCode["UNAUTHORIZED"] = "UNAUTHORIZED";
|
|
13
|
+
ErrorCode["FORBIDDEN"] = "FORBIDDEN";
|
|
14
|
+
ErrorCode["NOT_FOUND"] = "NOT_FOUND";
|
|
15
|
+
ErrorCode["CONFLICT"] = "CONFLICT";
|
|
16
|
+
ErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
|
|
17
|
+
ErrorCode["DATABASE_ERROR"] = "DATABASE_ERROR";
|
|
18
|
+
ErrorCode["RATE_LIMIT_EXCEEDED"] = "RATE_LIMIT_EXCEEDED";
|
|
19
|
+
})(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
|
|
3
20
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,eAAe;;;AAEf;;GAEG;AACH,IAAY,SAUX;AAVD,WAAY,SAAS;IACjB,gDAAmC,CAAA;IACnC,kDAAqC,CAAA;IACrC,0CAA6B,CAAA;IAC7B,oCAAuB,CAAA;IACvB,oCAAuB,CAAA;IACvB,kCAAqB,CAAA;IACrB,8CAAiC,CAAA;IACjC,8CAAiC,CAAA;IACjC,wDAA2C,CAAA;AAC/C,CAAC,EAVW,SAAS,yBAAT,SAAS,QAUpB"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@objectql/server",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "HTTP Server Adapter for ObjectQL",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"
|
|
9
|
-
"@objectql/types": "1.
|
|
8
|
+
"js-yaml": "^4.1.1",
|
|
9
|
+
"@objectql/types": "1.4.0",
|
|
10
|
+
"@objectql/core": "1.4.0"
|
|
10
11
|
},
|
|
11
12
|
"devDependencies": {
|
|
12
|
-
"
|
|
13
|
-
"@types/node": "^20.10.0"
|
|
13
|
+
"@types/js-yaml": "^4.0.9",
|
|
14
|
+
"@types/node": "^20.10.0",
|
|
15
|
+
"typescript": "^5.3.0"
|
|
14
16
|
},
|
|
15
17
|
"scripts": {
|
|
16
18
|
"build": "tsc",
|