@objectstack/plugin-hono-server 0.8.1 → 0.8.2
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 +9 -0
- package/dist/hono-plugin.js +8 -95
- package/package.json +4 -4
- package/src/hono-plugin.ts +8 -83
package/CHANGELOG.md
CHANGED
package/dist/hono-plugin.js
CHANGED
|
@@ -256,104 +256,17 @@ class HonoServerPlugin {
|
|
|
256
256
|
res.status(404).json({ error: e.message });
|
|
257
257
|
}
|
|
258
258
|
});
|
|
259
|
-
//
|
|
260
|
-
this.server.
|
|
261
|
-
ctx.logger.debug('
|
|
262
|
-
try {
|
|
263
|
-
const result = await p.createView(req.body);
|
|
264
|
-
if (result.success) {
|
|
265
|
-
ctx.logger.info('View created', { id: result.data?.id, name: result.data?.name });
|
|
266
|
-
res.status(201).json(result);
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
ctx.logger.warn('View creation failed', { error: result.error });
|
|
270
|
-
res.status(400).json(result);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
catch (e) {
|
|
274
|
-
ctx.logger.error('View creation error', e);
|
|
275
|
-
res.status(500).json({ success: false, error: { code: 'internal_error', message: e.message } });
|
|
276
|
-
}
|
|
277
|
-
});
|
|
278
|
-
this.server.get('/api/v1/ui/views/:id', async (req, res) => {
|
|
279
|
-
ctx.logger.debug('Get view request', { id: req.params.id });
|
|
280
|
-
try {
|
|
281
|
-
const result = await p.getView({ id: req.params.id });
|
|
282
|
-
if (result.success) {
|
|
283
|
-
ctx.logger.debug('View retrieved', { id: req.params.id });
|
|
284
|
-
res.json(result);
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
ctx.logger.warn('View not found', { id: req.params.id });
|
|
288
|
-
res.status(404).json(result);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
catch (e) {
|
|
292
|
-
ctx.logger.error('Get view error', e, { id: req.params.id });
|
|
293
|
-
res.status(500).json({ success: false, error: { code: 'internal_error', message: e.message } });
|
|
294
|
-
}
|
|
295
|
-
});
|
|
296
|
-
this.server.get('/api/v1/ui/views', async (req, res) => {
|
|
297
|
-
ctx.logger.debug('List views request', { query: req.query });
|
|
298
|
-
try {
|
|
299
|
-
const request = {};
|
|
300
|
-
if (req.query.object)
|
|
301
|
-
request.object = req.query.object;
|
|
302
|
-
if (req.query.type)
|
|
303
|
-
request.type = req.query.type;
|
|
304
|
-
if (req.query.visibility)
|
|
305
|
-
request.visibility = req.query.visibility;
|
|
306
|
-
if (req.query.createdBy)
|
|
307
|
-
request.createdBy = req.query.createdBy;
|
|
308
|
-
if (req.query.isDefault !== undefined)
|
|
309
|
-
request.isDefault = req.query.isDefault === 'true';
|
|
310
|
-
if (req.query.limit)
|
|
311
|
-
request.limit = parseInt(req.query.limit);
|
|
312
|
-
if (req.query.offset)
|
|
313
|
-
request.offset = parseInt(req.query.offset);
|
|
314
|
-
const result = await p.listViews(request);
|
|
315
|
-
ctx.logger.debug('Views listed', { count: result.data?.length, total: result.pagination?.total });
|
|
316
|
-
res.json(result);
|
|
317
|
-
}
|
|
318
|
-
catch (e) {
|
|
319
|
-
ctx.logger.error('List views error', e);
|
|
320
|
-
res.status(500).json({ success: false, error: { code: 'internal_error', message: e.message } });
|
|
321
|
-
}
|
|
322
|
-
});
|
|
323
|
-
this.server.patch('/api/v1/ui/views/:id', async (req, res) => {
|
|
324
|
-
ctx.logger.debug('Update view request', { id: req.params.id });
|
|
325
|
-
try {
|
|
326
|
-
const result = await p.updateView({ ...req.body, id: req.params.id });
|
|
327
|
-
if (result.success) {
|
|
328
|
-
ctx.logger.info('View updated', { id: req.params.id });
|
|
329
|
-
res.json(result);
|
|
330
|
-
}
|
|
331
|
-
else {
|
|
332
|
-
ctx.logger.warn('View update failed', { id: req.params.id, error: result.error });
|
|
333
|
-
res.status(result.error?.code === 'resource_not_found' ? 404 : 400).json(result);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
catch (e) {
|
|
337
|
-
ctx.logger.error('Update view error', e, { id: req.params.id });
|
|
338
|
-
res.status(500).json({ success: false, error: { code: 'internal_error', message: e.message } });
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
this.server.delete('/api/v1/ui/views/:id', async (req, res) => {
|
|
342
|
-
ctx.logger.debug('Delete view request', { id: req.params.id });
|
|
259
|
+
// UI Protocol endpoint
|
|
260
|
+
this.server.get('/api/v1/ui/view/:object', async (req, res) => {
|
|
261
|
+
ctx.logger.debug('Get UI view request', { object: req.params.object, type: req.query.type });
|
|
343
262
|
try {
|
|
344
|
-
const
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
res.json(result);
|
|
348
|
-
}
|
|
349
|
-
else {
|
|
350
|
-
ctx.logger.warn('View deletion failed', { id: req.params.id });
|
|
351
|
-
res.status(404).json(result);
|
|
352
|
-
}
|
|
263
|
+
const viewType = req.query.type || 'list';
|
|
264
|
+
const view = await p.getUiView({ object: req.params.object, type: viewType });
|
|
265
|
+
res.json(view);
|
|
353
266
|
}
|
|
354
267
|
catch (e) {
|
|
355
|
-
ctx.logger.
|
|
356
|
-
res.status(
|
|
268
|
+
ctx.logger.warn('UI view not found', { object: req.params.object, error: e.message });
|
|
269
|
+
res.status(404).json({ error: e.message });
|
|
357
270
|
}
|
|
358
271
|
});
|
|
359
272
|
ctx.logger.info('All API routes registered');
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@objectstack/plugin-hono-server",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.2",
|
|
4
4
|
"description": "Standard Hono Server Adapter for ObjectStack Runtime",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"@hono/node-server": "^1.2.0",
|
|
9
9
|
"hono": "^4.0.0",
|
|
10
|
-
"@objectstack/core": "0.8.
|
|
11
|
-
"@objectstack/spec": "0.8.
|
|
12
|
-
"@objectstack/types": "0.8.
|
|
10
|
+
"@objectstack/core": "0.8.2",
|
|
11
|
+
"@objectstack/spec": "0.8.2",
|
|
12
|
+
"@objectstack/types": "0.8.2"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
15
|
"@types/node": "^25.1.0",
|
package/src/hono-plugin.ts
CHANGED
|
@@ -276,95 +276,20 @@ export class HonoServerPlugin implements Plugin {
|
|
|
276
276
|
}
|
|
277
277
|
});
|
|
278
278
|
|
|
279
|
-
//
|
|
280
|
-
this.server.
|
|
281
|
-
ctx.logger.debug('
|
|
282
|
-
try {
|
|
283
|
-
const result = await p.createView(req.body);
|
|
284
|
-
if (result.success) {
|
|
285
|
-
ctx.logger.info('View created', { id: result.data?.id, name: result.data?.name });
|
|
286
|
-
res.status(201).json(result);
|
|
287
|
-
} else {
|
|
288
|
-
ctx.logger.warn('View creation failed', { error: result.error });
|
|
289
|
-
res.status(400).json(result);
|
|
290
|
-
}
|
|
291
|
-
} catch (e: any) {
|
|
292
|
-
ctx.logger.error('View creation error', e);
|
|
293
|
-
res.status(500).json({ success: false, error: { code: 'internal_error', message: e.message } });
|
|
294
|
-
}
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
this.server.get('/api/v1/ui/views/:id', async (req, res) => {
|
|
298
|
-
ctx.logger.debug('Get view request', { id: req.params.id });
|
|
299
|
-
try {
|
|
300
|
-
const result = await p.getView({ id: req.params.id });
|
|
301
|
-
if (result.success) {
|
|
302
|
-
ctx.logger.debug('View retrieved', { id: req.params.id });
|
|
303
|
-
res.json(result);
|
|
304
|
-
} else {
|
|
305
|
-
ctx.logger.warn('View not found', { id: req.params.id });
|
|
306
|
-
res.status(404).json(result);
|
|
307
|
-
}
|
|
308
|
-
} catch (e: any) {
|
|
309
|
-
ctx.logger.error('Get view error', e, { id: req.params.id });
|
|
310
|
-
res.status(500).json({ success: false, error: { code: 'internal_error', message: e.message } });
|
|
311
|
-
}
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
this.server.get('/api/v1/ui/views', async (req, res) => {
|
|
315
|
-
ctx.logger.debug('List views request', { query: req.query });
|
|
279
|
+
// UI Protocol endpoint
|
|
280
|
+
this.server.get('/api/v1/ui/view/:object', async (req, res) => {
|
|
281
|
+
ctx.logger.debug('Get UI view request', { object: req.params.object, type: req.query.type });
|
|
316
282
|
try {
|
|
317
|
-
const
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
if (req.query.visibility) request.visibility = req.query.visibility;
|
|
321
|
-
if (req.query.createdBy) request.createdBy = req.query.createdBy as string;
|
|
322
|
-
if (req.query.isDefault !== undefined) request.isDefault = req.query.isDefault === 'true';
|
|
323
|
-
if (req.query.limit) request.limit = parseInt(req.query.limit as string);
|
|
324
|
-
if (req.query.offset) request.offset = parseInt(req.query.offset as string);
|
|
325
|
-
|
|
326
|
-
const result = await p.listViews(request);
|
|
327
|
-
ctx.logger.debug('Views listed', { count: result.data?.length, total: result.pagination?.total });
|
|
328
|
-
res.json(result);
|
|
283
|
+
const viewType = (req.query.type as 'list' | 'form') || 'list';
|
|
284
|
+
const view = await p.getUiView({ object: req.params.object, type: viewType });
|
|
285
|
+
res.json(view);
|
|
329
286
|
} catch (e: any) {
|
|
330
|
-
ctx.logger.
|
|
331
|
-
res.status(
|
|
287
|
+
ctx.logger.warn('UI view not found', { object: req.params.object, error: e.message });
|
|
288
|
+
res.status(404).json({ error: e.message });
|
|
332
289
|
}
|
|
333
290
|
});
|
|
334
291
|
|
|
335
|
-
this.server.patch('/api/v1/ui/views/:id', async (req, res) => {
|
|
336
|
-
ctx.logger.debug('Update view request', { id: req.params.id });
|
|
337
|
-
try {
|
|
338
|
-
const result = await p.updateView({ ...req.body, id: req.params.id });
|
|
339
|
-
if (result.success) {
|
|
340
|
-
ctx.logger.info('View updated', { id: req.params.id });
|
|
341
|
-
res.json(result);
|
|
342
|
-
} else {
|
|
343
|
-
ctx.logger.warn('View update failed', { id: req.params.id, error: result.error });
|
|
344
|
-
res.status(result.error?.code === 'resource_not_found' ? 404 : 400).json(result);
|
|
345
|
-
}
|
|
346
|
-
} catch (e: any) {
|
|
347
|
-
ctx.logger.error('Update view error', e, { id: req.params.id });
|
|
348
|
-
res.status(500).json({ success: false, error: { code: 'internal_error', message: e.message } });
|
|
349
|
-
}
|
|
350
|
-
});
|
|
351
292
|
|
|
352
|
-
this.server.delete('/api/v1/ui/views/:id', async (req, res) => {
|
|
353
|
-
ctx.logger.debug('Delete view request', { id: req.params.id });
|
|
354
|
-
try {
|
|
355
|
-
const result = await p.deleteView({ id: req.params.id });
|
|
356
|
-
if (result.success) {
|
|
357
|
-
ctx.logger.info('View deleted', { id: req.params.id });
|
|
358
|
-
res.json(result);
|
|
359
|
-
} else {
|
|
360
|
-
ctx.logger.warn('View deletion failed', { id: req.params.id });
|
|
361
|
-
res.status(404).json(result);
|
|
362
|
-
}
|
|
363
|
-
} catch (e: any) {
|
|
364
|
-
ctx.logger.error('Delete view error', e, { id: req.params.id });
|
|
365
|
-
res.status(500).json({ success: false, error: { code: 'internal_error', message: e.message } });
|
|
366
|
-
}
|
|
367
|
-
});
|
|
368
293
|
|
|
369
294
|
ctx.logger.info('All API routes registered');
|
|
370
295
|
}
|