feat: widgets and ai chat
This commit is contained in:
@@ -4,3 +4,4 @@ export * from './tags';
|
||||
export * from './token-auth';
|
||||
export * from './course-import';
|
||||
export * from './automation';
|
||||
export * from './widgets';
|
||||
|
||||
@@ -61,7 +61,9 @@ import { orgMemberMiddleware } from '@api/middlewares/org-member';
|
||||
import { orgMemberOrAutomationKeyMiddleware } from '@api/middlewares/org-member-or-automation-key';
|
||||
import { orgTeamMemberMiddleware } from '@api/middlewares/org-team-member';
|
||||
import { quizRouter } from '@api/routes/organization/quiz';
|
||||
import { searchRouter } from '@api/routes/organization/search';
|
||||
import { tagsRouter } from '@api/routes/organization/tags';
|
||||
import { widgetsRouter } from '@api/routes/organization/widgets';
|
||||
import { zValidator } from '@hono/zod-validator';
|
||||
|
||||
export const organizationRouter = new Hono()
|
||||
@@ -664,6 +666,8 @@ export const organizationRouter = new Hono()
|
||||
)
|
||||
.route('/automation', automationRouter)
|
||||
.route('/course-import', courseImportRouter)
|
||||
.route('/search', searchRouter)
|
||||
.route('/tags', tagsRouter)
|
||||
.route('/widgets', widgetsRouter)
|
||||
.route('/assets', assetsRouter)
|
||||
.route('/:orgId/quiz', quizRouter);
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
import { ZSearchOrganization } from '@cio/utils/validation/organization';
|
||||
|
||||
import { Hono } from '@api/utils/hono';
|
||||
import { authMiddleware } from '@api/middlewares/auth';
|
||||
import { handleError } from '@api/utils/errors';
|
||||
import { orgMemberMiddleware } from '@api/middlewares/org-member';
|
||||
import { orgTeamMemberMiddleware } from '@api/middlewares/org-team-member';
|
||||
import { searchLmsOrganization, searchOrganization } from '@api/services/organization/search';
|
||||
import { zValidator } from '@hono/zod-validator';
|
||||
|
||||
export const searchRouter = new Hono()
|
||||
.get('/', authMiddleware, orgTeamMemberMiddleware, zValidator('query', ZSearchOrganization), async (c) => {
|
||||
try {
|
||||
const orgId = c.req.header('cio-org-id')!;
|
||||
const { q, limit } = c.req.valid('query');
|
||||
const results = await searchOrganization(orgId, q, limit);
|
||||
|
||||
return c.json({ success: true, data: results });
|
||||
} catch (error) {
|
||||
return handleError(c, error, 'Failed to search organization');
|
||||
}
|
||||
})
|
||||
.get('/lms', authMiddleware, orgMemberMiddleware, zValidator('query', ZSearchOrganization), async (c) => {
|
||||
try {
|
||||
const orgId = c.req.header('cio-org-id')!;
|
||||
const user = c.get('user')!;
|
||||
const { q, limit } = c.req.valid('query');
|
||||
const results = await searchLmsOrganization(orgId, user.id, q, limit);
|
||||
|
||||
return c.json({ success: true, data: results });
|
||||
} catch (error) {
|
||||
return handleError(c, error, 'Failed to search LMS');
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,140 @@
|
||||
import { Hono } from '@api/utils/hono';
|
||||
import { authMiddleware } from '@api/middlewares/auth';
|
||||
import { handleError } from '@api/utils/errors';
|
||||
import { orgAdminMiddleware } from '@api/middlewares/org-admin';
|
||||
import { orgTeamMemberMiddleware } from '@api/middlewares/org-team-member';
|
||||
import {
|
||||
ZCreateWidget,
|
||||
ZPreviewWidget,
|
||||
ZRollbackWidget,
|
||||
ZUpdateWidget,
|
||||
ZWidgetIdParams
|
||||
} from '@cio/utils/validation/widget';
|
||||
import {
|
||||
createOrganizationWidget,
|
||||
deleteOrganizationWidget,
|
||||
getOrganizationWidgetDetail,
|
||||
listOrganizationWidgets,
|
||||
previewOrganizationWidget,
|
||||
publishOrganizationWidget,
|
||||
rollbackOrganizationWidget,
|
||||
updateOrganizationWidget
|
||||
} from '@api/services/widget';
|
||||
import { zValidator } from '@hono/zod-validator';
|
||||
|
||||
export const widgetsRouter = new Hono()
|
||||
.get('/', authMiddleware, orgTeamMemberMiddleware, async (c) => {
|
||||
try {
|
||||
const orgId = c.req.header('cio-org-id')!;
|
||||
const widgets = await listOrganizationWidgets(orgId);
|
||||
return c.json({ success: true, data: widgets });
|
||||
} catch (error) {
|
||||
return handleError(c, error, 'Failed to fetch widgets');
|
||||
}
|
||||
})
|
||||
.post('/', authMiddleware, orgTeamMemberMiddleware, zValidator('json', ZCreateWidget), async (c) => {
|
||||
try {
|
||||
const orgId = c.req.header('cio-org-id')!;
|
||||
const user = c.get('user')!;
|
||||
const data = c.req.valid('json');
|
||||
const widget = await createOrganizationWidget(orgId, user.id, data);
|
||||
|
||||
return c.json({ success: true, data: widget }, 201);
|
||||
} catch (error) {
|
||||
return handleError(c, error, 'Failed to create widget');
|
||||
}
|
||||
})
|
||||
.get('/:widgetId', authMiddleware, orgTeamMemberMiddleware, zValidator('param', ZWidgetIdParams), async (c) => {
|
||||
try {
|
||||
const orgId = c.req.header('cio-org-id')!;
|
||||
const { widgetId } = c.req.valid('param');
|
||||
const widgetDetail = await getOrganizationWidgetDetail(orgId, widgetId);
|
||||
|
||||
return c.json({ success: true, data: widgetDetail });
|
||||
} catch (error) {
|
||||
return handleError(c, error, 'Failed to fetch widget');
|
||||
}
|
||||
})
|
||||
.put(
|
||||
'/:widgetId',
|
||||
authMiddleware,
|
||||
orgTeamMemberMiddleware,
|
||||
zValidator('param', ZWidgetIdParams),
|
||||
zValidator('json', ZUpdateWidget),
|
||||
async (c) => {
|
||||
try {
|
||||
const orgId = c.req.header('cio-org-id')!;
|
||||
const user = c.get('user')!;
|
||||
const { widgetId } = c.req.valid('param');
|
||||
const data = c.req.valid('json');
|
||||
const widget = await updateOrganizationWidget(orgId, widgetId, user.id, data);
|
||||
|
||||
return c.json({ success: true, data: widget });
|
||||
} catch (error) {
|
||||
return handleError(c, error, 'Failed to update widget');
|
||||
}
|
||||
}
|
||||
)
|
||||
.delete('/:widgetId', authMiddleware, orgAdminMiddleware, zValidator('param', ZWidgetIdParams), async (c) => {
|
||||
try {
|
||||
const orgId = c.req.header('cio-org-id')!;
|
||||
const user = c.get('user')!;
|
||||
const { widgetId } = c.req.valid('param');
|
||||
const widget = await deleteOrganizationWidget(orgId, widgetId, user.id);
|
||||
|
||||
return c.json({ success: true, data: widget });
|
||||
} catch (error) {
|
||||
return handleError(c, error, 'Failed to delete widget');
|
||||
}
|
||||
})
|
||||
.post(
|
||||
'/:widgetId/preview',
|
||||
authMiddleware,
|
||||
orgTeamMemberMiddleware,
|
||||
zValidator('param', ZWidgetIdParams),
|
||||
zValidator('json', ZPreviewWidget),
|
||||
async (c) => {
|
||||
try {
|
||||
const orgId = c.req.header('cio-org-id')!;
|
||||
const { widgetId } = c.req.valid('param');
|
||||
const data = c.req.valid('json');
|
||||
const payload = await previewOrganizationWidget(orgId, widgetId, data);
|
||||
|
||||
return c.json({ success: true, data: payload });
|
||||
} catch (error) {
|
||||
return handleError(c, error, 'Failed to build widget preview');
|
||||
}
|
||||
}
|
||||
)
|
||||
.post('/:widgetId/publish', authMiddleware, orgAdminMiddleware, zValidator('param', ZWidgetIdParams), async (c) => {
|
||||
try {
|
||||
const orgId = c.req.header('cio-org-id')!;
|
||||
const user = c.get('user')!;
|
||||
const { widgetId } = c.req.valid('param');
|
||||
const result = await publishOrganizationWidget(orgId, widgetId, user.id);
|
||||
|
||||
return c.json({ success: true, data: result });
|
||||
} catch (error) {
|
||||
return handleError(c, error, 'Failed to publish widget');
|
||||
}
|
||||
})
|
||||
.post(
|
||||
'/:widgetId/rollback',
|
||||
authMiddleware,
|
||||
orgAdminMiddleware,
|
||||
zValidator('param', ZWidgetIdParams),
|
||||
zValidator('json', ZRollbackWidget),
|
||||
async (c) => {
|
||||
try {
|
||||
const orgId = c.req.header('cio-org-id')!;
|
||||
const user = c.get('user')!;
|
||||
const { widgetId } = c.req.valid('param');
|
||||
const data = c.req.valid('json');
|
||||
const result = await rollbackOrganizationWidget(orgId, widgetId, user.id, data);
|
||||
|
||||
return c.json({ success: true, data: result });
|
||||
} catch (error) {
|
||||
return handleError(c, error, 'Failed to rollback widget');
|
||||
}
|
||||
}
|
||||
);
|
||||
Reference in New Issue
Block a user