FEAT: add custom properties endpoints and DTOs for catalog management

This commit is contained in:
viniciusgadea
2026-07-21 11:21:22 -03:00
parent 1e63df6536
commit e1cfc6e1a8
6 changed files with 282 additions and 8 deletions
+62 -1
View File
@@ -37,6 +37,7 @@ import { PackTheMetadata } from 'src/utils/PackTheMetadata';
import { RequestUser, User } from 'src/decorators/user.decorator';
import {
BatchRemoveRlsRulesRequest,
CustomPropertyDefinitionDto,
GetDatasetCatalogTaskRes,
ICatalogAllRequest,
ICatalogAllResponse,
@@ -271,6 +272,66 @@ export class CatalogController {
}
@Get('custom-properties')
@RequireSomePermission(
PERMISSIONS_GROUPS.CATALOG.permissions.GET,
PERMISSIONS_GROUPS.CATALOG.permissions.DATA_MANAGER,
)
async getCustomPropertyDefinitions(@User() user: RequestUser) {
const { customer_id, customer_name, user_id, username } = user;
const metadata = PackTheMetadata({
customer_id,
customer_name,
user_id,
username,
});
return this.catalogService.getCustomPropertyDefinitions(metadata);
}
@Post('custom-properties')
@RequireAllPermissions(PERMISSIONS_GROUPS.CATALOG.permissions.DATA_MANAGER)
async upsertCustomPropertyDefinition(
@User() user: RequestUser,
@Body() definition: CustomPropertyDefinitionDto,
) {
const { customer_id, customer_name, user_id, username } = user;
const metadata = PackTheMetadata({
customer_id,
customer_name,
user_id,
username,
});
return this.catalogService.upsertCustomPropertyDefinition(
{
definition: {
key: definition.key || '',
name: definition.name,
type: definition.type,
},
},
metadata,
);
}
@Delete('custom-properties/:key')
@RequireAllPermissions(PERMISSIONS_GROUPS.CATALOG.permissions.DATA_MANAGER)
async deleteCustomPropertyDefinition(
@User() user: RequestUser,
@Param('key') key: string,
) {
const { customer_id, customer_name, user_id, username } = user;
const metadata = PackTheMetadata({
customer_id,
customer_name,
user_id,
username,
});
return this.catalogService.deleteCustomPropertyDefinition({ key }, metadata);
}
@Get('data-asset/:id')
@RequireSomePermission(
PERMISSIONS_GROUPS.CATALOG.permissions.GET,
@@ -1002,4 +1063,4 @@ export class CatalogController {
this.logger.error(error.message);
}
}
}
}
+20
View File
@@ -35,9 +35,11 @@ import {
} from './dtos';
import {
AddRlsRuleRequest,
DeleteCustomPropertyDefinitionRequest,
GetNimbusDashboardsRequest,
GetRlsRulesRequest,
PiiMetadata,
UpsertCustomPropertyDefinitionRequest,
} from '@dadosfera/protospack-v2/dist/lib/Catalog/interfaces/messages';
import { TypeParser } from 'src/utils/FileParser/parser-types';
import { ParserBuilder } from 'src/utils/FileParser/parser.builder';
@@ -120,6 +122,24 @@ class CatalogService implements OnModuleInit {
}
}
async getCustomPropertyDefinitions(metadata: Metadata) {
return lastValueFrom(this.catalogReadService.GetCustomPropertyDefinitions({}, metadata));
}
async upsertCustomPropertyDefinition(
data: UpsertCustomPropertyDefinitionRequest,
metadata: Metadata,
) {
return lastValueFrom(this.catalogWriteService.UpsertCustomPropertyDefinition(data, metadata));
}
async deleteCustomPropertyDefinition(
data: DeleteCustomPropertyDefinitionRequest,
metadata: Metadata,
) {
return lastValueFrom(this.catalogWriteService.DeleteCustomPropertyDefinition(data, metadata));
}
async createDataAsset(data: Messages.CreateDataAssetRequest, metadata) {
this.logger.info('CatalogService - Manage Data assets permissions');
if (!data.embed) data.embed = undefined;
+25 -2
View File
@@ -1,5 +1,10 @@
import { ApiProperty, ApiPropertyOptional, PickType } from '@nestjs/swagger';
import { IsEnum } from 'class-validator';
import {
IsEnum,
IsNotEmpty,
IsOptional,
IsString,
} from 'class-validator';
import { CreateDataAssetRequest } from '@dadosfera/protospack-v2/dist/lib/Catalog/interfaces/messages';
export enum DataAssetShareType {
@@ -198,6 +203,22 @@ export class IData {
day_opening: number;
}
export type CustomPropertyType = 'text' | 'number' | 'boolean' | 'date';
export class CustomPropertyDefinitionDto {
@ApiPropertyOptional()
@IsOptional()
@IsString()
key?: string;
@ApiProperty()
@IsString()
@IsNotEmpty()
name: string;
@ApiProperty({ enum: ['text', 'number', 'boolean', 'date'] })
@IsEnum(['text', 'number', 'boolean', 'date'])
type: CustomPropertyType;
}
export class IUpdateDataRequest {
@ApiProperty()
name: string;
@@ -211,6 +232,8 @@ export class IUpdateDataRequest {
share_type?: DataAssetShareType;
@ApiPropertyOptional()
docs?: string;
@ApiPropertyOptional()
custom_properties?: Record<string, string | number | boolean | null>;
}
export class IUpdateCertificationStatusRequest {
@@ -372,4 +395,4 @@ export type CreateDataDocsDTO = {
docs: string;
asset_type: string;
}
}