diff --git a/backend/src/entities/visualizations/panel-position/data-structures/generate-panel-position-with-ai.ds.ts b/backend/src/entities/visualizations/panel-position/data-structures/generate-panel-position-with-ai.ds.ts index 46c5cea33..e78082696 100644 --- a/backend/src/entities/visualizations/panel-position/data-structures/generate-panel-position-with-ai.ds.ts +++ b/backend/src/entities/visualizations/panel-position/data-structures/generate-panel-position-with-ai.ds.ts @@ -1,5 +1,4 @@ export class GeneratePanelPositionWithAiDs { - dashboardId: string; connectionId: string; masterPassword: string; userId: string; diff --git a/backend/src/entities/visualizations/panel-position/dto/generated-panel-with-position.dto.ts b/backend/src/entities/visualizations/panel-position/dto/generated-panel-with-position.dto.ts index 42dd10c4e..13443aa2f 100644 --- a/backend/src/entities/visualizations/panel-position/dto/generated-panel-with-position.dto.ts +++ b/backend/src/entities/visualizations/panel-position/dto/generated-panel-with-position.dto.ts @@ -13,9 +13,6 @@ export class GeneratedPanelPositionDto { @ApiProperty({ description: 'Panel height in grid units' }) height: number; - - @ApiProperty({ description: 'Dashboard ID', nullable: true }) - dashboard_id: string | null; } export class GeneratedPanelWithPositionDto { diff --git a/backend/src/entities/visualizations/panel-position/panel-position.controller.ts b/backend/src/entities/visualizations/panel-position/panel-position.controller.ts index 0ebb72333..9ad6f4f76 100644 --- a/backend/src/entities/visualizations/panel-position/panel-position.controller.ts +++ b/backend/src/entities/visualizations/panel-position/panel-position.controller.ts @@ -164,20 +164,17 @@ export class DashboardWidgetController { type: GeneratedPanelWithPositionDto, }) @ApiBody({ type: GeneratePanelPositionWithAiDto }) - @ApiParam({ name: 'dashboardId', required: true }) @ApiParam({ name: 'connectionId', required: true }) @UseGuards(ConnectionEditGuard) @Timeout(TimeoutDefaults.AI) - @Post('/dashboard/:dashboardId/widget/generate/:connectionId') + @Post('/widget/generate/:connectionId') async generateWidgetWithAi( @SlugUuid('connectionId') connectionId: string, - @Param('dashboardId') dashboardId: string, @MasterPassword() masterPwd: string, @UserId() userId: string, @Body() generateDto: GeneratePanelPositionWithAiDto, ): Promise { const inputData: GeneratePanelPositionWithAiDs = { - dashboardId, connectionId, masterPassword: masterPwd, userId, diff --git a/backend/src/entities/visualizations/panel-position/use-cases/generate-panel-position-with-ai.use.case.ts b/backend/src/entities/visualizations/panel-position/use-cases/generate-panel-position-with-ai.use.case.ts index 1ba9e1aec..cb4c49545 100644 --- a/backend/src/entities/visualizations/panel-position/use-cases/generate-panel-position-with-ai.use.case.ts +++ b/backend/src/entities/visualizations/panel-position/use-cases/generate-panel-position-with-ai.use.case.ts @@ -78,7 +78,6 @@ export class GeneratePanelPositionWithAiUseCase public async implementation(inputData: GeneratePanelPositionWithAiDs): Promise { const { - dashboardId, connectionId, masterPassword, userId, @@ -99,15 +98,6 @@ export class GeneratePanelPositionWithAiUseCase throw new NotFoundException(Messages.CONNECTION_NOT_FOUND); } - const foundDashboard = await this._dbContext.dashboardRepository.findDashboardByIdAndConnectionId( - dashboardId, - connectionId, - ); - - if (!foundDashboard) { - throw new NotFoundException(Messages.DASHBOARD_NOT_FOUND); - } - const dao = getDataAccessObject(foundConnection); let userEmail: string; @@ -155,7 +145,6 @@ export class GeneratePanelPositionWithAiUseCase position_y: position_y ?? 0, width: width ?? 6, height: height ?? 4, - dashboard_id: dashboardId, }, }; } diff --git a/backend/src/entities/visualizations/panel-position/use-cases/generate-table-dashboard-with-ai.use.case.ts b/backend/src/entities/visualizations/panel-position/use-cases/generate-table-dashboard-with-ai.use.case.ts index 5373fd1cb..04c4f15f8 100644 --- a/backend/src/entities/visualizations/panel-position/use-cases/generate-table-dashboard-with-ai.use.case.ts +++ b/backend/src/entities/visualizations/panel-position/use-cases/generate-table-dashboard-with-ai.use.case.ts @@ -162,7 +162,6 @@ export class GenerateTableDashboardWithAiUseCase position_y: row * PANEL_HEIGHT, width: PANEL_WIDTH, height: PANEL_HEIGHT, - dashboard_id: null, }, }); } catch (error) { diff --git a/backend/test/ava-tests/saas-tests/dashboard-ai-widget-e2e.test.ts b/backend/test/ava-tests/saas-tests/dashboard-ai-widget-e2e.test.ts index 78a2bfd5c..d8d603af6 100644 --- a/backend/test/ava-tests/saas-tests/dashboard-ai-widget-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/dashboard-ai-widget-e2e.test.ts @@ -164,7 +164,7 @@ test.after(async () => { } }); -currentTest = 'POST /dashboard/:dashboardId/widget/generate/:connectionId'; +currentTest = 'POST /widget/generate/:connectionId'; test.serial(`${currentTest} should generate a widget with AI for chart type`, async (t) => { mockResponse = MOCK_AI_RESPONSE_CHART; @@ -183,19 +183,8 @@ test.serial(`${currentTest} should generate a widget with AI for chart type`, as const connectionId = JSON.parse(createConnectionResponse.text).id; t.is(createConnectionResponse.status, 201); - const createDashboard = await request(app.getHttpServer()) - .post(`/dashboards/${connectionId}`) - .send({ name: 'AI Generated Dashboard' }) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const dashboardId = JSON.parse(createDashboard.text).id; - t.is(createDashboard.status, 201); - const generateWidget = await request(app.getHttpServer()) - .post(`/dashboard/${dashboardId}/widget/generate/${connectionId}`) + .post(`/widget/generate/${connectionId}`) .send({ chart_description: 'Show total sales by category as a bar chart', }) @@ -222,7 +211,6 @@ test.serial(`${currentTest} should generate a widget with AI for chart type`, as t.is(generateWidgetRO.panel_position.position_y, 0); t.is(generateWidgetRO.panel_position.width, 6); t.is(generateWidgetRO.panel_position.height, 4); - t.is(generateWidgetRO.panel_position.dashboard_id, dashboardId); const getSavedQueries = await request(app.getHttpServer()) .get(`/connection/${connectionId}/saved-queries`) @@ -253,18 +241,8 @@ test.serial(`${currentTest} should generate a counter widget with AI`, async (t) const connectionId = JSON.parse(createConnectionResponse.text).id; t.is(createConnectionResponse.status, 201); - const createDashboard = await request(app.getHttpServer()) - .post(`/dashboards/${connectionId}`) - .send({ name: 'Counter Dashboard' }) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const dashboardId = JSON.parse(createDashboard.text).id; - const generateWidget = await request(app.getHttpServer()) - .post(`/dashboard/${dashboardId}/widget/generate/${connectionId}`) + .post(`/widget/generate/${connectionId}`) .send({ chart_description: 'Show total count of orders', }) @@ -283,7 +261,6 @@ test.serial(`${currentTest} should generate a counter widget with AI`, async (t) t.is(generateWidgetRO.connection_id, connectionId); t.truthy(generateWidgetRO.panel_position); - t.is(generateWidgetRO.panel_position.dashboard_id, dashboardId); }); test.serial(`${currentTest} should reject AI-generated unsafe query`, async (t) => { @@ -302,18 +279,8 @@ test.serial(`${currentTest} should reject AI-generated unsafe query`, async (t) .set('Accept', 'application/json'); const connectionId = JSON.parse(createConnectionResponse.text).id; - const createDashboard = await request(app.getHttpServer()) - .post(`/dashboards/${connectionId}`) - .send({ name: 'Unsafe Query Dashboard' }) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const dashboardId = JSON.parse(createDashboard.text).id; - const generateWidget = await request(app.getHttpServer()) - .post(`/dashboard/${dashboardId}/widget/generate/${connectionId}`) + .post(`/widget/generate/${connectionId}`) .send({ chart_description: 'Delete all data', }) @@ -344,19 +311,9 @@ test.serial(`${currentTest} should generate widget with custom name`, async (t) .set('Accept', 'application/json'); const connectionId = JSON.parse(createConnectionResponse.text).id; - const createDashboard = await request(app.getHttpServer()) - .post(`/dashboards/${connectionId}`) - .send({ name: 'Custom Name Dashboard' }) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const dashboardId = JSON.parse(createDashboard.text).id; - const customName = 'My Custom Widget Name'; const generateWidget = await request(app.getHttpServer()) - .post(`/dashboard/${dashboardId}/widget/generate/${connectionId}`) + .post(`/widget/generate/${connectionId}`) .send({ chart_description: 'Show sales data', name: customName, @@ -387,18 +344,8 @@ test.serial(`${currentTest} should fail without chart_description`, async (t) => .set('Accept', 'application/json'); const connectionId = JSON.parse(createConnectionResponse.text).id; - const createDashboard = await request(app.getHttpServer()) - .post(`/dashboards/${connectionId}`) - .send({ name: 'No Description Dashboard' }) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const dashboardId = JSON.parse(createDashboard.text).id; - const generateWidget = await request(app.getHttpServer()) - .post(`/dashboard/${dashboardId}/widget/generate/${connectionId}`) + .post(`/widget/generate/${connectionId}`) .send({}) .set('Cookie', token) .set('masterpwd', 'ahalaimahalai') @@ -408,33 +355,3 @@ test.serial(`${currentTest} should fail without chart_description`, async (t) => t.is(generateWidget.status, 400); }); -test.serial(`${currentTest} should fail for non-existent dashboard`, async (t) => { - mockResponse = MOCK_AI_RESPONSE_CHART; - toolCallCounter = 0; - - const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; - const { token } = await registerUserAndReturnUserInfo(app); - const { testTableName } = await createTestTable(connectionToTestDB); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const connectionId = JSON.parse(createConnectionResponse.text).id; - - const fakeDashboardId = faker.string.uuid(); - - const generateWidget = await request(app.getHttpServer()) - .post(`/dashboard/${fakeDashboardId}/widget/generate/${connectionId}`) - .send({ - chart_description: 'Show some data', - }) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(generateWidget.status, 404); -});