[DASHBOARDS] Dashboard duplication (#16291)

## Description

- Created a Dashboard duplication action
- Created a new duplication custom resolver
- Created the service using the v2 of the API
- Created the integration tests following the v2 methodology

## Video QA


https://github.com/user-attachments/assets/e409951a-5946-4da0-91a0-1f7d2ecadb08
This commit is contained in:
Raphaël Bosi
2025-12-11 12:15:15 +01:00
committed by GitHub
parent 6c728fff78
commit 5af2d37253
39 changed files with 1542 additions and 79 deletions
@@ -56,12 +56,13 @@ import { WorkspaceModule } from 'src/engine/core-modules/workspace/workspace.mod
import { AiBillingModule } from 'src/engine/metadata-modules/ai/ai-billing/ai-billing.module';
import { AiModelsModule } from 'src/engine/metadata-modules/ai/ai-models/ai-models.module';
import { FlatPageLayoutTabModule } from 'src/engine/metadata-modules/flat-page-layout-tab/flat-page-layout-tab.module';
import { PageLayoutModule } from 'src/engine/metadata-modules/page-layout/page-layout.module';
import { RoleModule } from 'src/engine/metadata-modules/role/role.module';
import { SubscriptionsModule } from 'src/engine/subscriptions/subscriptions.module';
import { TrashCleanupModule } from 'src/engine/trash-cleanup/trash-cleanup.module';
import { WorkspaceEventEmitterModule } from 'src/engine/workspace-event-emitter/workspace-event-emitter.module';
import { ChannelSyncModule } from 'src/modules/connected-account/channel-sync/channel-sync.module';
import { PageLayoutModule } from 'src/engine/metadata-modules/page-layout/page-layout.module';
import { DashboardModule } from 'src/modules/dashboard/dashboard.module';
import { AuditModule } from './audit/audit.module';
import { ClientConfigModule } from './client-config/client-config.module';
@@ -142,6 +143,7 @@ import { FileModule } from './file/file.module';
FlatPageLayoutTabModule,
ImpersonationModule,
TrashCleanupModule,
DashboardModule,
],
exports: [
AuditModule,
@@ -180,6 +180,30 @@ export class OpenApiService {
return paths;
}, schema.paths as OpenAPIV3_1.PathsObject);
schema.paths['/dashboards/{id}/duplicate'] = {
post: {
tags: ['dashboards'],
summary: 'Duplicate a dashboard',
description: 'Creates a duplicate of an existing dashboard',
operationId: 'duplicateDashboard',
parameters: [{ $ref: '#/components/parameters/idPath' }],
responses: {
'201': {
description: 'Dashboard duplicated successfully',
content: {
'application/json': {
schema: {
$ref: '#/components/schemas/DashboardForResponse',
},
},
},
},
'400': { $ref: '#/components/responses/400' },
'401': { $ref: '#/components/responses/401' },
},
},
} as OpenAPIV3_1.PathItemObject;
schema.webhooks = filteredObjectMetadataItems.reduce(
(paths, item) => {
paths[