import { Body, Controller, Delete, Get, Param, Patch, Post, Query, UseFilters, UseGuards, } from '@nestjs/common'; import { isDefined } from 'class-validator'; import { PermissionFlagType } from 'twenty-shared/constants'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator'; import { NoPermissionGuard } from 'src/engine/guards/no-permission.guard'; import { SettingsPermissionGuard } from 'src/engine/guards/settings-permission.guard'; import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard'; import { FlatEntityMapsRestApiExceptionFilter } from 'src/engine/metadata-modules/flat-entity/filters/flat-entity-maps-rest-api-exception.filter'; import { CreatePageLayoutWidgetInput } from 'src/engine/metadata-modules/page-layout-widget/dtos/inputs/create-page-layout-widget.input'; import { UpdatePageLayoutWidgetInput } from 'src/engine/metadata-modules/page-layout-widget/dtos/inputs/update-page-layout-widget.input'; import { type PageLayoutWidgetDTO } from 'src/engine/metadata-modules/page-layout-widget/dtos/page-layout-widget.dto'; import { generatePageLayoutWidgetExceptionMessage, PageLayoutWidgetException, PageLayoutWidgetExceptionCode, PageLayoutWidgetExceptionMessageKey, } from 'src/engine/metadata-modules/page-layout-widget/exceptions/page-layout-widget.exception'; import { PageLayoutWidgetRestApiExceptionFilter } from 'src/engine/metadata-modules/page-layout-widget/filters/page-layout-widget-rest-api-exception.filter'; import { PageLayoutWidgetService } from 'src/engine/metadata-modules/page-layout-widget/services/page-layout-widget.service'; import { PermissionsRestApiExceptionFilter } from 'src/engine/metadata-modules/permissions/utils/permissions-rest-api-exception.filter'; import { WorkspaceMigrationRunnerRestApiExceptionFilter } from 'src/engine/workspace-manager/workspace-migration/filters/workspace-migration-runner-rest-api-exception.filter'; @Controller('rest/metadata/pageLayoutWidgets') @UseGuards(WorkspaceAuthGuard) @UseFilters( PermissionsRestApiExceptionFilter, PageLayoutWidgetRestApiExceptionFilter, FlatEntityMapsRestApiExceptionFilter, WorkspaceMigrationRunnerRestApiExceptionFilter, ) export class PageLayoutWidgetController { constructor( private readonly pageLayoutWidgetService: PageLayoutWidgetService, ) {} @Get() @UseGuards(NoPermissionGuard) async findMany( @AuthWorkspace() workspace: WorkspaceEntity, @Query('pageLayoutTabId') pageLayoutTabId: string, ): Promise { if (!isDefined(pageLayoutTabId)) { throw new PageLayoutWidgetException( generatePageLayoutWidgetExceptionMessage( PageLayoutWidgetExceptionMessageKey.PAGE_LAYOUT_TAB_ID_REQUIRED, ), PageLayoutWidgetExceptionCode.INVALID_PAGE_LAYOUT_WIDGET_DATA, ); } return this.pageLayoutWidgetService.findByPageLayoutTabId({ workspaceId: workspace.id, pageLayoutTabId, }); } @Get(':id') @UseGuards(NoPermissionGuard) async findOne( @Param('id') id: string, @AuthWorkspace() workspace: WorkspaceEntity, ): Promise { return this.pageLayoutWidgetService.findByIdOrThrow({ id, workspaceId: workspace.id, }); } @Post() @UseGuards(SettingsPermissionGuard(PermissionFlagType.LAYOUTS)) async create( @Body() input: CreatePageLayoutWidgetInput, @AuthWorkspace() workspace: WorkspaceEntity, ): Promise { return this.pageLayoutWidgetService.create({ input, workspaceId: workspace.id, }); } @Patch(':id') @UseGuards(SettingsPermissionGuard(PermissionFlagType.LAYOUTS)) async update( @Param('id') id: string, @Body() input: UpdatePageLayoutWidgetInput, @AuthWorkspace() workspace: WorkspaceEntity, ): Promise { return this.pageLayoutWidgetService.update({ id, workspaceId: workspace.id, updateData: input, }); } @Delete(':id') @UseGuards(SettingsPermissionGuard(PermissionFlagType.LAYOUTS)) async destroy( @Param('id') id: string, @AuthWorkspace() workspace: WorkspaceEntity, ): Promise { return this.pageLayoutWidgetService.destroy({ id, workspaceId: workspace.id, }); } }