@objectql/server 1.7.2 → 1.8.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 +21 -0
- package/LICENSE +1 -1
- package/README.md +93 -0
- package/dist/adapters/graphql.d.ts +17 -0
- package/dist/adapters/graphql.js +460 -0
- package/dist/adapters/graphql.js.map +1 -0
- package/dist/adapters/rest.d.ts +7 -5
- package/dist/adapters/rest.js +52 -15
- package/dist/adapters/rest.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/metadata.js +7 -7
- package/dist/metadata.js.map +1 -1
- package/dist/server.d.ts +4 -0
- package/dist/server.js +85 -10
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +15 -8
- package/package.json +6 -3
- package/src/adapters/graphql.ts +523 -0
- package/src/adapters/rest.ts +49 -15
- package/src/index.ts +2 -0
- package/src/metadata.ts +7 -7
- package/src/server.ts +100 -11
- package/src/types.ts +24 -8
- package/test/graphql.test.ts +439 -0
- package/test/integration-example.ts +247 -0
- package/test/node.test.ts +4 -2
- package/test/rest-advanced.test.ts +455 -0
- package/test/rest.test.ts +283 -7
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# @objectql/server
|
|
2
2
|
|
|
3
|
+
## 1.8.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Release minor version 1.8.0
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies
|
|
12
|
+
- @objectql/core@1.8.0
|
|
13
|
+
- @objectql/types@1.8.0
|
|
14
|
+
|
|
15
|
+
## 1.7.3
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- Release patch version 1.7.3 with latest improvements and bug fixes
|
|
20
|
+
- Updated dependencies
|
|
21
|
+
- @objectql/core@1.7.3
|
|
22
|
+
- @objectql/types@1.7.3
|
|
23
|
+
|
|
3
24
|
## 1.7.2
|
|
4
25
|
|
|
5
26
|
### Patch Changes
|
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2026 ObjectQL Contributors
|
|
3
|
+
Copyright (c) 2026 ObjectQL Contributors (https://github.com/objectql)
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -56,3 +56,96 @@ export const config = {
|
|
|
56
56
|
|
|
57
57
|
export default createNodeHandler(app);
|
|
58
58
|
```
|
|
59
|
+
|
|
60
|
+
## API Response Format
|
|
61
|
+
|
|
62
|
+
ObjectQL uses a standardized response format for all operations:
|
|
63
|
+
|
|
64
|
+
### List Operations (find)
|
|
65
|
+
|
|
66
|
+
List operations return data in an `items` array with optional pagination metadata:
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"items": [
|
|
71
|
+
{
|
|
72
|
+
"id": "1001",
|
|
73
|
+
"name": "Contract A",
|
|
74
|
+
"amount": 5000
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "1002",
|
|
78
|
+
"name": "Contract B",
|
|
79
|
+
"amount": 3000
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"meta": {
|
|
83
|
+
"total": 105, // Total number of records
|
|
84
|
+
"page": 1, // Current page number (1-indexed)
|
|
85
|
+
"size": 20, // Number of items per page
|
|
86
|
+
"pages": 6, // Total number of pages
|
|
87
|
+
"has_next": true // Whether there is a next page
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Note:** The `meta` object is only included when pagination parameters (`limit` and/or `skip`) are used.
|
|
93
|
+
|
|
94
|
+
### Single Item Operations (findOne, create, update, delete)
|
|
95
|
+
|
|
96
|
+
Single item operations return data in a `data` field:
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"data": {
|
|
101
|
+
"id": "1001",
|
|
102
|
+
"name": "Contract A",
|
|
103
|
+
"amount": 5000
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Error Responses
|
|
109
|
+
|
|
110
|
+
All errors follow a consistent format:
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"error": {
|
|
115
|
+
"code": "NOT_FOUND",
|
|
116
|
+
"message": "Record not found",
|
|
117
|
+
"details": {
|
|
118
|
+
"field": "id",
|
|
119
|
+
"reason": "No record found with the given ID"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## REST API Endpoints
|
|
126
|
+
|
|
127
|
+
The server exposes the following REST endpoints:
|
|
128
|
+
|
|
129
|
+
- `GET /api/data/:object` - List records (supports `?limit=10&skip=0` for pagination)
|
|
130
|
+
- `GET /api/data/:object/:id` - Get single record
|
|
131
|
+
- `POST /api/data/:object` - Create record
|
|
132
|
+
- `PUT /api/data/:object/:id` - Update record
|
|
133
|
+
- `DELETE /api/data/:object/:id` - Delete record
|
|
134
|
+
|
|
135
|
+
### Pagination Example
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# Get first page (10 items)
|
|
139
|
+
GET /api/data/contracts?limit=10&skip=0
|
|
140
|
+
|
|
141
|
+
# Get second page (10 items)
|
|
142
|
+
GET /api/data/contracts?limit=10&skip=10
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Metadata API Endpoints
|
|
146
|
+
|
|
147
|
+
- `GET /api/metadata/object` - List all objects
|
|
148
|
+
- `GET /api/metadata/object/:name` - Get object definition
|
|
149
|
+
- `GET /api/metadata/object/:name/actions` - List object actions
|
|
150
|
+
|
|
151
|
+
All metadata list endpoints return data in the standardized `items` format.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { IObjectQL } from '@objectql/types';
|
|
2
|
+
import { IncomingMessage, ServerResponse } from 'http';
|
|
3
|
+
import { GraphQLSchema } from 'graphql';
|
|
4
|
+
/**
|
|
5
|
+
* Generate GraphQL schema from ObjectQL metadata
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateGraphQLSchema(app: IObjectQL): GraphQLSchema;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a GraphQL HTTP request handler for ObjectQL
|
|
10
|
+
*
|
|
11
|
+
* Endpoints:
|
|
12
|
+
* - POST /api/graphql - GraphQL queries and mutations
|
|
13
|
+
* - GET /api/graphql - GraphQL queries via URL parameters
|
|
14
|
+
*/
|
|
15
|
+
export declare function createGraphQLHandler(app: IObjectQL): (req: IncomingMessage & {
|
|
16
|
+
body?: any;
|
|
17
|
+
}, res: ServerResponse) => Promise<void>;
|
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateGraphQLSchema = generateGraphQLSchema;
|
|
4
|
+
exports.createGraphQLHandler = createGraphQLHandler;
|
|
5
|
+
const server_1 = require("../server");
|
|
6
|
+
const types_1 = require("../types");
|
|
7
|
+
const graphql_1 = require("graphql");
|
|
8
|
+
/**
|
|
9
|
+
* Normalize ObjectQL response to use 'id' instead of '_id'
|
|
10
|
+
*/
|
|
11
|
+
function normalizeId(data) {
|
|
12
|
+
if (!data)
|
|
13
|
+
return data;
|
|
14
|
+
if (Array.isArray(data)) {
|
|
15
|
+
return data.map(item => normalizeId(item));
|
|
16
|
+
}
|
|
17
|
+
if (typeof data === 'object') {
|
|
18
|
+
const normalized = { ...data };
|
|
19
|
+
// Map _id to id if present
|
|
20
|
+
if ('_id' in normalized) {
|
|
21
|
+
normalized.id = normalized._id;
|
|
22
|
+
delete normalized._id;
|
|
23
|
+
}
|
|
24
|
+
// Remove '@type' field as it's not needed in GraphQL
|
|
25
|
+
delete normalized['@type'];
|
|
26
|
+
return normalized;
|
|
27
|
+
}
|
|
28
|
+
return data;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Map ObjectQL field types to GraphQL types
|
|
32
|
+
*/
|
|
33
|
+
function mapFieldTypeToGraphQL(field, isInput = false) {
|
|
34
|
+
const type = field.type;
|
|
35
|
+
switch (type) {
|
|
36
|
+
case 'text':
|
|
37
|
+
case 'textarea':
|
|
38
|
+
case 'markdown':
|
|
39
|
+
case 'html':
|
|
40
|
+
case 'email':
|
|
41
|
+
case 'url':
|
|
42
|
+
case 'phone':
|
|
43
|
+
case 'password':
|
|
44
|
+
return graphql_1.GraphQLString;
|
|
45
|
+
case 'number':
|
|
46
|
+
case 'currency':
|
|
47
|
+
case 'percent':
|
|
48
|
+
return graphql_1.GraphQLFloat;
|
|
49
|
+
case 'auto_number':
|
|
50
|
+
return graphql_1.GraphQLInt;
|
|
51
|
+
case 'boolean':
|
|
52
|
+
return graphql_1.GraphQLBoolean;
|
|
53
|
+
case 'date':
|
|
54
|
+
case 'datetime':
|
|
55
|
+
case 'time':
|
|
56
|
+
return graphql_1.GraphQLString; // ISO 8601 string format
|
|
57
|
+
case 'select':
|
|
58
|
+
// For select fields, we could create an enum type, but for simplicity use String
|
|
59
|
+
return graphql_1.GraphQLString;
|
|
60
|
+
case 'lookup':
|
|
61
|
+
case 'master_detail':
|
|
62
|
+
// For relationships, return ID reference
|
|
63
|
+
return graphql_1.GraphQLString;
|
|
64
|
+
case 'file':
|
|
65
|
+
case 'image':
|
|
66
|
+
// File fields return metadata object (simplified as String for now)
|
|
67
|
+
return graphql_1.GraphQLString;
|
|
68
|
+
case 'object':
|
|
69
|
+
case 'formula':
|
|
70
|
+
case 'summary':
|
|
71
|
+
case 'location':
|
|
72
|
+
case 'vector':
|
|
73
|
+
case 'grid':
|
|
74
|
+
// Return as JSON string
|
|
75
|
+
return graphql_1.GraphQLString;
|
|
76
|
+
default:
|
|
77
|
+
return graphql_1.GraphQLString;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Sanitize field/object names to be valid GraphQL identifiers
|
|
82
|
+
* GraphQL names must match /^[_a-zA-Z][_a-zA-Z0-9]*$/
|
|
83
|
+
*/
|
|
84
|
+
function sanitizeGraphQLName(name) {
|
|
85
|
+
// Replace invalid characters with underscores
|
|
86
|
+
let sanitized = name.replace(/[^_a-zA-Z0-9]/g, '_');
|
|
87
|
+
// Ensure it starts with a letter or underscore
|
|
88
|
+
if (!/^[_a-zA-Z]/.test(sanitized)) {
|
|
89
|
+
sanitized = '_' + sanitized;
|
|
90
|
+
}
|
|
91
|
+
return sanitized;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Generate GraphQL schema from ObjectQL metadata
|
|
95
|
+
*/
|
|
96
|
+
function generateGraphQLSchema(app) {
|
|
97
|
+
const objects = app.metadata.list('object');
|
|
98
|
+
// Validate that there are objects to generate schema from
|
|
99
|
+
if (!objects || objects.length === 0) {
|
|
100
|
+
// Create a minimal schema with a dummy query to avoid GraphQL error
|
|
101
|
+
return new graphql_1.GraphQLSchema({
|
|
102
|
+
query: new graphql_1.GraphQLObjectType({
|
|
103
|
+
name: 'Query',
|
|
104
|
+
fields: {
|
|
105
|
+
_schema: {
|
|
106
|
+
type: graphql_1.GraphQLString,
|
|
107
|
+
description: 'Schema introspection placeholder',
|
|
108
|
+
resolve: () => 'No objects registered in ObjectQL metadata'
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
})
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
const typeMap = {};
|
|
115
|
+
const inputTypeMap = {};
|
|
116
|
+
const deleteResultTypeMap = {};
|
|
117
|
+
// Create a shared ObjectQL server instance to reuse across resolvers
|
|
118
|
+
// This is safe because ObjectQLServer is stateless - it only holds a reference to the app
|
|
119
|
+
// and creates fresh contexts for each request via handle()
|
|
120
|
+
const server = new server_1.ObjectQLServer(app);
|
|
121
|
+
// First pass: Create all object types
|
|
122
|
+
for (const config of objects) {
|
|
123
|
+
const objectName = config.name;
|
|
124
|
+
// Skip if no name or fields defined
|
|
125
|
+
if (!objectName || !config.fields || Object.keys(config.fields).length === 0) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const sanitizedTypeName = sanitizeGraphQLName(objectName.charAt(0).toUpperCase() + objectName.slice(1));
|
|
129
|
+
// Create output type
|
|
130
|
+
const fields = {
|
|
131
|
+
id: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) }
|
|
132
|
+
};
|
|
133
|
+
for (const [fieldName, fieldConfig] of Object.entries(config.fields)) {
|
|
134
|
+
const sanitizedFieldName = sanitizeGraphQLName(fieldName);
|
|
135
|
+
const gqlType = mapFieldTypeToGraphQL(fieldConfig, false);
|
|
136
|
+
fields[sanitizedFieldName] = {
|
|
137
|
+
type: fieldConfig.required ? new graphql_1.GraphQLNonNull(gqlType) : gqlType,
|
|
138
|
+
description: fieldConfig.label || fieldName
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
typeMap[objectName] = new graphql_1.GraphQLObjectType({
|
|
142
|
+
name: sanitizedTypeName,
|
|
143
|
+
description: config.label || objectName,
|
|
144
|
+
fields
|
|
145
|
+
});
|
|
146
|
+
// Create input type for mutations
|
|
147
|
+
const inputFields = {};
|
|
148
|
+
for (const [fieldName, fieldConfig] of Object.entries(config.fields)) {
|
|
149
|
+
const sanitizedFieldName = sanitizeGraphQLName(fieldName);
|
|
150
|
+
const gqlType = mapFieldTypeToGraphQL(fieldConfig, true);
|
|
151
|
+
inputFields[sanitizedFieldName] = {
|
|
152
|
+
type: gqlType,
|
|
153
|
+
description: fieldConfig.label || fieldName
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
inputTypeMap[objectName] = new graphql_1.GraphQLInputObjectType({
|
|
157
|
+
name: sanitizedTypeName + 'Input',
|
|
158
|
+
description: `Input type for ${config.label || objectName}`,
|
|
159
|
+
fields: inputFields
|
|
160
|
+
});
|
|
161
|
+
// Create delete result type (shared across all delete mutations for this object)
|
|
162
|
+
deleteResultTypeMap[objectName] = new graphql_1.GraphQLObjectType({
|
|
163
|
+
name: 'Delete' + sanitizedTypeName + 'Result',
|
|
164
|
+
fields: {
|
|
165
|
+
id: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
166
|
+
deleted: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLBoolean) }
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// Build query root
|
|
171
|
+
const queryFields = {};
|
|
172
|
+
for (const config of objects) {
|
|
173
|
+
const objectName = config.name;
|
|
174
|
+
if (!objectName || !typeMap[objectName])
|
|
175
|
+
continue;
|
|
176
|
+
// Query single record by ID
|
|
177
|
+
queryFields[objectName] = {
|
|
178
|
+
type: typeMap[objectName],
|
|
179
|
+
args: {
|
|
180
|
+
id: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) }
|
|
181
|
+
},
|
|
182
|
+
resolve: async (_, args) => {
|
|
183
|
+
const result = await server.handle({
|
|
184
|
+
op: 'findOne',
|
|
185
|
+
object: objectName,
|
|
186
|
+
args: args.id
|
|
187
|
+
});
|
|
188
|
+
if (result.error) {
|
|
189
|
+
throw new Error(result.error.message);
|
|
190
|
+
}
|
|
191
|
+
return normalizeId(result);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
// Query list of records
|
|
195
|
+
// Using 'List' suffix to avoid naming conflicts and handle irregular plurals
|
|
196
|
+
queryFields[objectName + 'List'] = {
|
|
197
|
+
type: new graphql_1.GraphQLList(typeMap[objectName]),
|
|
198
|
+
args: {
|
|
199
|
+
limit: { type: graphql_1.GraphQLInt },
|
|
200
|
+
skip: { type: graphql_1.GraphQLInt },
|
|
201
|
+
filters: { type: graphql_1.GraphQLString }, // JSON string
|
|
202
|
+
fields: { type: new graphql_1.GraphQLList(graphql_1.GraphQLString) },
|
|
203
|
+
sort: { type: graphql_1.GraphQLString } // JSON string
|
|
204
|
+
},
|
|
205
|
+
resolve: async (_, args) => {
|
|
206
|
+
const queryArgs = {};
|
|
207
|
+
if (args.limit)
|
|
208
|
+
queryArgs.limit = args.limit;
|
|
209
|
+
if (args.skip)
|
|
210
|
+
queryArgs.skip = args.skip;
|
|
211
|
+
if (args.fields)
|
|
212
|
+
queryArgs.fields = args.fields;
|
|
213
|
+
if (args.filters) {
|
|
214
|
+
try {
|
|
215
|
+
queryArgs.filters = JSON.parse(args.filters);
|
|
216
|
+
}
|
|
217
|
+
catch (e) {
|
|
218
|
+
throw new Error('Invalid filters JSON');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (args.sort) {
|
|
222
|
+
try {
|
|
223
|
+
queryArgs.sort = JSON.parse(args.sort);
|
|
224
|
+
}
|
|
225
|
+
catch (e) {
|
|
226
|
+
throw new Error('Invalid sort JSON');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const result = await server.handle({
|
|
230
|
+
op: 'find',
|
|
231
|
+
object: objectName,
|
|
232
|
+
args: queryArgs
|
|
233
|
+
});
|
|
234
|
+
if (result.error) {
|
|
235
|
+
throw new Error(result.error.message);
|
|
236
|
+
}
|
|
237
|
+
return normalizeId(result.items || []);
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
const queryType = new graphql_1.GraphQLObjectType({
|
|
242
|
+
name: 'Query',
|
|
243
|
+
fields: queryFields
|
|
244
|
+
});
|
|
245
|
+
// Build mutation root
|
|
246
|
+
const mutationFields = {};
|
|
247
|
+
for (const config of objects) {
|
|
248
|
+
const objectName = config.name;
|
|
249
|
+
if (!objectName || !typeMap[objectName] || !inputTypeMap[objectName])
|
|
250
|
+
continue;
|
|
251
|
+
const capitalizedName = sanitizeGraphQLName(objectName.charAt(0).toUpperCase() + objectName.slice(1));
|
|
252
|
+
// Create mutation
|
|
253
|
+
mutationFields['create' + capitalizedName] = {
|
|
254
|
+
type: typeMap[objectName],
|
|
255
|
+
args: {
|
|
256
|
+
input: { type: new graphql_1.GraphQLNonNull(inputTypeMap[objectName]) }
|
|
257
|
+
},
|
|
258
|
+
resolve: async (_, args) => {
|
|
259
|
+
const result = await server.handle({
|
|
260
|
+
op: 'create',
|
|
261
|
+
object: objectName,
|
|
262
|
+
args: args.input
|
|
263
|
+
});
|
|
264
|
+
if (result.error) {
|
|
265
|
+
throw new Error(result.error.message);
|
|
266
|
+
}
|
|
267
|
+
return normalizeId(result);
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
// Update mutation
|
|
271
|
+
mutationFields['update' + capitalizedName] = {
|
|
272
|
+
type: typeMap[objectName],
|
|
273
|
+
args: {
|
|
274
|
+
id: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
275
|
+
input: { type: new graphql_1.GraphQLNonNull(inputTypeMap[objectName]) }
|
|
276
|
+
},
|
|
277
|
+
resolve: async (_, args) => {
|
|
278
|
+
const result = await server.handle({
|
|
279
|
+
op: 'update',
|
|
280
|
+
object: objectName,
|
|
281
|
+
args: {
|
|
282
|
+
id: args.id,
|
|
283
|
+
data: args.input
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
if (result.error) {
|
|
287
|
+
throw new Error(result.error.message);
|
|
288
|
+
}
|
|
289
|
+
return normalizeId(result);
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
// Delete mutation - use shared delete result type
|
|
293
|
+
mutationFields['delete' + capitalizedName] = {
|
|
294
|
+
type: deleteResultTypeMap[objectName],
|
|
295
|
+
args: {
|
|
296
|
+
id: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) }
|
|
297
|
+
},
|
|
298
|
+
resolve: async (_, args) => {
|
|
299
|
+
const result = await server.handle({
|
|
300
|
+
op: 'delete',
|
|
301
|
+
object: objectName,
|
|
302
|
+
args: { id: args.id }
|
|
303
|
+
});
|
|
304
|
+
if (result.error) {
|
|
305
|
+
throw new Error(result.error.message);
|
|
306
|
+
}
|
|
307
|
+
return result;
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
const mutationType = new graphql_1.GraphQLObjectType({
|
|
312
|
+
name: 'Mutation',
|
|
313
|
+
fields: mutationFields
|
|
314
|
+
});
|
|
315
|
+
return new graphql_1.GraphQLSchema({
|
|
316
|
+
query: queryType,
|
|
317
|
+
mutation: mutationType
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Parse GraphQL request body
|
|
322
|
+
*/
|
|
323
|
+
function readBody(req) {
|
|
324
|
+
return new Promise((resolve, reject) => {
|
|
325
|
+
let body = '';
|
|
326
|
+
req.on('data', chunk => body += chunk.toString());
|
|
327
|
+
req.on('end', () => {
|
|
328
|
+
if (!body)
|
|
329
|
+
return resolve({});
|
|
330
|
+
try {
|
|
331
|
+
resolve(JSON.parse(body));
|
|
332
|
+
}
|
|
333
|
+
catch (e) {
|
|
334
|
+
reject(new Error('Invalid JSON'));
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
req.on('error', reject);
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Send JSON response
|
|
342
|
+
*/
|
|
343
|
+
function sendJSON(res, statusCode, data) {
|
|
344
|
+
res.setHeader('Content-Type', 'application/json');
|
|
345
|
+
res.statusCode = statusCode;
|
|
346
|
+
res.end(JSON.stringify(data));
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Creates a GraphQL HTTP request handler for ObjectQL
|
|
350
|
+
*
|
|
351
|
+
* Endpoints:
|
|
352
|
+
* - POST /api/graphql - GraphQL queries and mutations
|
|
353
|
+
* - GET /api/graphql - GraphQL queries via URL parameters
|
|
354
|
+
*/
|
|
355
|
+
function createGraphQLHandler(app) {
|
|
356
|
+
// Generate schema once - Note: Schema is static after handler creation.
|
|
357
|
+
// If metadata changes at runtime, create a new handler or regenerate the schema.
|
|
358
|
+
const schema = generateGraphQLSchema(app);
|
|
359
|
+
return async (req, res) => {
|
|
360
|
+
try {
|
|
361
|
+
// CORS headers
|
|
362
|
+
const requestOrigin = req.headers.origin;
|
|
363
|
+
const configuredOrigin = process.env.OBJECTQL_CORS_ORIGIN;
|
|
364
|
+
const isProduction = process.env.NODE_ENV === 'production';
|
|
365
|
+
if (!isProduction) {
|
|
366
|
+
res.setHeader('Access-Control-Allow-Origin', configuredOrigin || '*');
|
|
367
|
+
}
|
|
368
|
+
else if (configuredOrigin && (!requestOrigin || requestOrigin === configuredOrigin)) {
|
|
369
|
+
res.setHeader('Access-Control-Allow-Origin', configuredOrigin);
|
|
370
|
+
}
|
|
371
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
372
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
373
|
+
if (req.method === 'OPTIONS') {
|
|
374
|
+
res.statusCode = 200;
|
|
375
|
+
res.end();
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
const url = req.url || '';
|
|
379
|
+
const method = req.method || 'POST';
|
|
380
|
+
if (method !== 'GET' && method !== 'POST') {
|
|
381
|
+
sendJSON(res, 405, {
|
|
382
|
+
errors: [{
|
|
383
|
+
message: 'Method not allowed. Use GET or POST.'
|
|
384
|
+
}]
|
|
385
|
+
});
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
let query = '';
|
|
389
|
+
let variables = null;
|
|
390
|
+
let operationName = null;
|
|
391
|
+
if (method === 'GET') {
|
|
392
|
+
// Parse query string for GET requests
|
|
393
|
+
const urlObj = new URL(url, `http://${req.headers.host || 'localhost'}`);
|
|
394
|
+
query = urlObj.searchParams.get('query') || '';
|
|
395
|
+
const varsParam = urlObj.searchParams.get('variables');
|
|
396
|
+
if (varsParam) {
|
|
397
|
+
try {
|
|
398
|
+
variables = JSON.parse(varsParam);
|
|
399
|
+
}
|
|
400
|
+
catch (e) {
|
|
401
|
+
sendJSON(res, 400, {
|
|
402
|
+
errors: [{
|
|
403
|
+
message: 'Invalid variables JSON'
|
|
404
|
+
}]
|
|
405
|
+
});
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
operationName = urlObj.searchParams.get('operationName');
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
// Parse body for POST requests
|
|
413
|
+
const body = req.body || await readBody(req);
|
|
414
|
+
query = body.query || '';
|
|
415
|
+
variables = body.variables || null;
|
|
416
|
+
operationName = body.operationName || null;
|
|
417
|
+
}
|
|
418
|
+
if (!query) {
|
|
419
|
+
sendJSON(res, 400, {
|
|
420
|
+
errors: [{
|
|
421
|
+
message: 'Must provide query string'
|
|
422
|
+
}]
|
|
423
|
+
});
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
// Execute GraphQL query
|
|
427
|
+
const result = await (0, graphql_1.graphql)({
|
|
428
|
+
schema,
|
|
429
|
+
source: query,
|
|
430
|
+
variableValues: variables,
|
|
431
|
+
operationName,
|
|
432
|
+
contextValue: { app }
|
|
433
|
+
});
|
|
434
|
+
sendJSON(res, 200, result);
|
|
435
|
+
}
|
|
436
|
+
catch (e) {
|
|
437
|
+
console.error('[GraphQL Handler] Error:', e);
|
|
438
|
+
const errorResponse = {
|
|
439
|
+
errors: [{
|
|
440
|
+
message: 'Internal server error',
|
|
441
|
+
extensions: {
|
|
442
|
+
code: types_1.ErrorCode.INTERNAL_ERROR
|
|
443
|
+
}
|
|
444
|
+
}]
|
|
445
|
+
};
|
|
446
|
+
// In non-production environments, include additional error details to aid debugging
|
|
447
|
+
if (typeof process !== 'undefined' &&
|
|
448
|
+
process.env &&
|
|
449
|
+
process.env.NODE_ENV !== 'production') {
|
|
450
|
+
const firstError = errorResponse.errors[0];
|
|
451
|
+
firstError.extensions.debug = {
|
|
452
|
+
message: e && typeof e.message === 'string' ? e.message : undefined,
|
|
453
|
+
stack: e && typeof e.stack === 'string' ? e.stack : undefined
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
sendJSON(res, 500, errorResponse);
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
//# sourceMappingURL=graphql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/adapters/graphql.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/rest.d.ts
CHANGED
|
@@ -4,11 +4,13 @@ import { IncomingMessage, ServerResponse } from 'http';
|
|
|
4
4
|
* Creates a REST-style HTTP request handler for ObjectQL
|
|
5
5
|
*
|
|
6
6
|
* Endpoints:
|
|
7
|
-
* - GET /api/data/:object
|
|
8
|
-
* - GET /api/data/:object/:id
|
|
9
|
-
* - POST /api/data/:object
|
|
10
|
-
* -
|
|
11
|
-
* -
|
|
7
|
+
* - GET /api/data/:object - List records
|
|
8
|
+
* - GET /api/data/:object/:id - Get single record
|
|
9
|
+
* - POST /api/data/:object - Create record (or create many if array)
|
|
10
|
+
* - POST /api/data/:object/bulk-update - Update many records
|
|
11
|
+
* - POST /api/data/:object/bulk-delete - Delete many records
|
|
12
|
+
* - PUT /api/data/:object/:id - Update record
|
|
13
|
+
* - DELETE /api/data/:object/:id - Delete record
|
|
12
14
|
*/
|
|
13
15
|
export declare function createRESTHandler(app: IObjectQL): (req: IncomingMessage & {
|
|
14
16
|
body?: any;
|