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
+169
View File
@@ -5538,6 +5538,148 @@
]
}
},
"/catalog/custom-properties": {
"get": {
"operationId": "CatalogController_getCustomPropertyDefinitions",
"parameters": [
{
"name": "dadosfera-lang",
"in": "header",
"required": false,
"schema": {
"enum": [
"pt-br",
"en-us"
],
"type": "string"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
}
},
"tags": [
"Catalog"
],
"security": [
{
"access-token": []
},
{
"access-token": []
}
]
},
"post": {
"operationId": "CatalogController_upsertCustomPropertyDefinition",
"parameters": [
{
"name": "dadosfera-lang",
"in": "header",
"required": false,
"schema": {
"enum": [
"pt-br",
"en-us"
],
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CustomPropertyDefinitionDto"
}
}
}
},
"responses": {
"201": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
}
},
"tags": [
"Catalog"
],
"security": [
{
"access-token": []
},
{
"access-token": []
}
]
}
},
"/catalog/custom-properties/{key}": {
"delete": {
"operationId": "CatalogController_deleteCustomPropertyDefinition",
"parameters": [
{
"name": "dadosfera-lang",
"in": "header",
"required": false,
"schema": {
"enum": [
"pt-br",
"en-us"
],
"type": "string"
}
},
{
"name": "key",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
}
},
"tags": [
"Catalog"
],
"security": [
{
"access-token": []
},
{
"access-token": []
}
]
}
},
"/catalog/data-asset/{id}": {
"get": {
"operationId": "CatalogController_getDataAsset",
@@ -10851,6 +10993,30 @@
"total"
]
},
"CustomPropertyDefinitionDto": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"text",
"number",
"boolean",
"date"
]
}
},
"required": [
"name",
"type"
]
},
"IColumnMetadata": {
"type": "object",
"properties": {
@@ -11073,6 +11239,9 @@
},
"docs": {
"type": "string"
},
"custom_properties": {
"type": "object"
}
},
"required": [
+5 -4
View File
@@ -16,7 +16,7 @@
"@aws-sdk/lib-dynamodb": "^3.414.0",
"@aws-sdk/signature-v4": "^3.370.0",
"@dadosfera/dadosfera-logs": "^1.0.0-beta.4",
"@dadosfera/protospack-v2": "^3.40.0-beta.10",
"@dadosfera/protospack-v2": "^3.40.0-beta.12",
"@grpc/grpc-js": "^1.9.3",
"@grpc/proto-loader": "^0.7.9",
"@nestjs/cli": "^9.5.0",
@@ -1735,9 +1735,10 @@
}
},
"node_modules/@dadosfera/protospack-v2": {
"version": "3.40.0-beta.10",
"resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.40.0-beta.10.tgz",
"integrity": "sha512-F45dSEIKG+gwwDMYHayA242bFwhFTJbZm26KesQbGhf4I45ur6hYZD8dK0voNuVQInLMQhtm6+7th6/jJ8xpTQ==",
"version": "3.40.0-beta.12",
"resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.40.0-beta.12.tgz",
"integrity": "sha512-nmam/ZJK5ecZlrh/yrMw+C0cHy3bH4NXthKt5csePX9Y/Sgri7tPwPScz9QHQh2Ux2eLflhIcFI6lW2jvOrGNQ==",
"license": "ISC",
"dependencies": {
"@grpc/grpc-js": "^1.9.3",
"rxjs": "^7.5.5"
+1 -1
View File
@@ -34,7 +34,7 @@
"@aws-sdk/lib-dynamodb": "^3.414.0",
"@aws-sdk/signature-v4": "^3.370.0",
"@dadosfera/dadosfera-logs": "^1.0.0-beta.4",
"@dadosfera/protospack-v2": "^3.40.0-beta.10",
"@dadosfera/protospack-v2": "^3.40.0-beta.12",
"@grpc/grpc-js": "^1.9.3",
"@grpc/proto-loader": "^0.7.9",
"@nestjs/cli": "^9.5.0",
+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;
}
}