diff --git a/docsfera.json b/docsfera.json index 73ff0ac..2adba1e 100644 --- a/docsfera.json +++ b/docsfera.json @@ -2698,6 +2698,28 @@ "tags": [ "Catalog" ] + }, + "post": { + "operationId": "CatalogController_createDataAsset", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ICreateDataAsset" + } + } + } + }, + "responses": { + "201": { + "description": "" + } + }, + "tags": [ + "Catalog" + ] } }, "/catalog/tags": { @@ -3255,9 +3277,9 @@ } }, "info": { - "title": "Maestro", + "title": "Maestro - feat/rest-api", "description": "Documentation for Maestro gateway", - "version": "feat/rest-api", + "version": "9.11.2022 - 15:2", "contact": {} }, "tags": [], @@ -5869,6 +5891,33 @@ "data_asset" ] }, + "ICreateDataAsset": { + "type": "object", + "properties": { + "display_name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "data_asset_type": { + "type": "string" + }, + "external_url": { + "type": "string" + }, + "location": { + "type": "string" + } + }, + "required": [ + "display_name", + "description", + "data_asset_type", + "external_url", + "location" + ] + }, "IMakeAComment": { "type": "object", "properties": { diff --git a/package-lock.json b/package-lock.json index be4ad72..964b3fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dependencies": { "@aws-sdk/client-secrets-manager": "^3.112.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", - "@dadosfera/protospack-v2": "3.19.0", + "@dadosfera/protospack-v2": "3.19.2", "@grpc/grpc-js": "^1.6.7", "@grpc/proto-loader": "^0.6.13", "@nestjs/common": "^8.4.7", @@ -1726,9 +1726,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.19.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.19.0.tgz", - "integrity": "sha512-TTBo0W+7pczlJyIu6BTbc0/XbrP9uQV5O8EeHdWpv/9yksc1lxLExPrB6LSozdg4etrJUYjNROH/voZEXs82Eg==", + "version": "3.19.2", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.19.2.tgz", + "integrity": "sha512-0+5V4zo7x36Y9xojYnktTllm41uhAttEFTT13i2sBXn4Cb6xSCX5rOyMHwRHb4TOHTpWvaO58lGjP/i0x+lpEg==", "dependencies": { "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", @@ -8229,8 +8229,9 @@ } }, "node_modules/moment-timezone": { - "version": "0.5.34", - "license": "MIT", + "version": "0.5.38", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.38.tgz", + "integrity": "sha512-nMIrzGah4+oYZPflDvLZUgoVUO4fvAqHstvG3xAUnMolWncuAiLDWNnJZj6EwJGMGfb1ZcuTFE6GI3hNOVWI/Q==", "dependencies": { "moment": ">= 2.9.0" }, @@ -12306,9 +12307,9 @@ } }, "@dadosfera/protospack-v2": { - "version": "3.19.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.19.0.tgz", - "integrity": "sha512-TTBo0W+7pczlJyIu6BTbc0/XbrP9uQV5O8EeHdWpv/9yksc1lxLExPrB6LSozdg4etrJUYjNROH/voZEXs82Eg==", + "version": "3.19.2", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.19.2.tgz", + "integrity": "sha512-0+5V4zo7x36Y9xojYnktTllm41uhAttEFTT13i2sBXn4Cb6xSCX5rOyMHwRHb4TOHTpWvaO58lGjP/i0x+lpEg==", "requires": { "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", @@ -16736,7 +16737,9 @@ "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "moment-timezone": { - "version": "0.5.34", + "version": "0.5.38", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.38.tgz", + "integrity": "sha512-nMIrzGah4+oYZPflDvLZUgoVUO4fvAqHstvG3xAUnMolWncuAiLDWNnJZj6EwJGMGfb1ZcuTFE6GI3hNOVWI/Q==", "requires": { "moment": ">= 2.9.0" } diff --git a/package.json b/package.json index 1449d06..357f9ed 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "dependencies": { "@aws-sdk/client-secrets-manager": "^3.112.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", - "@dadosfera/protospack-v2": "3.19.0", + "@dadosfera/protospack-v2": "3.19.2", "@grpc/grpc-js": "^1.6.7", "@grpc/proto-loader": "^0.6.13", "@nestjs/common": "^8.4.7", diff --git a/src/main.ts b/src/main.ts index c3d7a11..cb3cf4a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -7,6 +7,7 @@ import { DadosferaLogger } from '@dadosfera/dadosfera-logs'; import { AppModule } from './app.module'; import { writeFileSync } from 'fs'; import { execSync } from 'child_process'; +import { INestApplication } from '@nestjs/common'; async function bootstrap() { DadosferaLogger.setupLogger({ serviceName: 'maestro', @@ -25,23 +26,29 @@ async function bootstrap() { }); app.use(helmet()); + configureSwagger(app); + await app.listen(3333); +} +function configureSwagger(app: INestApplication) { const date = new Date(); - let swaggerVersion = `${date.getDate()}.${ + const swaggerVersion = `${date.getDate()}.${ date.getMonth() + 1 }.${date.getFullYear()} - ${date.getHours()}:${date.getMinutes()}`; + let branchName = ''; try { - const branchName = execSync('git rev-parse --abbrev-ref HEAD') + branchName = execSync('git rev-parse --abbrev-ref HEAD') .toString() - .replace('\n', ''); - swaggerVersion = branchName; + .replace('\n', '') + .trim(); } catch (error) { console.log("Can't get branch name", error); } + const swaggerTitle = branchName ? `Maestro - ${branchName}` : 'Maestro'; const config = new DocumentBuilder() - .setTitle('Maestro') + .setTitle(swaggerTitle) .setDescription('Documentation for Maestro gateway') .setVersion(swaggerVersion) .addBearerAuth( @@ -66,7 +73,5 @@ async function bootstrap() { 2, ), ); - - await app.listen(3333); } bootstrap(); diff --git a/src/modules/catalog/catalog.controller.ts b/src/modules/catalog/catalog.controller.ts index b648e48..e580993 100644 --- a/src/modules/catalog/catalog.controller.ts +++ b/src/modules/catalog/catalog.controller.ts @@ -25,6 +25,7 @@ import { RequestUser, User } from 'src/authentication/user.decorator'; import { ICatalogAllResponse, IColumnsMetadataResponse, + ICreateDataAsset, IDeleteComment, IDocsResponse, IMakeAComment, @@ -438,6 +439,26 @@ export class CatalogController { return { message: response.message }; } + @Post() + async createDataAsset( + @User() user: RequestUser, + @Body() body: ICreateDataAsset, + ) { + const { customer_id, customer_name, user_id, username } = user; + const metadata = PackTheMetadata({ + customer_id, + customer_name, + user_id, + username, + }); + const { data_asset } = await this.catalogService.createDataAsset( + body, + metadata, + ); + + return { data_asset: JSON.parse(data_asset) }; + } + @Post('data-asset/:id/comment') async commentOnDataAsset( @Param('id') id: string, diff --git a/src/modules/catalog/catalog.service.ts b/src/modules/catalog/catalog.service.ts index f2d2426..87c395f 100644 --- a/src/modules/catalog/catalog.service.ts +++ b/src/modules/catalog/catalog.service.ts @@ -58,6 +58,19 @@ class CatalogService implements OnModuleInit { )}.dadosfera.ai`; } + async createDataAsset(data: Messages.CreateDataAssetRequest, metadata) { + this.logger.info('CatalogService - Manage Data assets permissions'); + + return lastValueFrom( + this.catalogWriteService.CreateDataAsset(data, metadata), + ).catch((err) => { + throw new HttpException( + err.details, + err.code === 6 ? HttpStatus.CONFLICT : 404, + ); + }); + } + async managePermissions(data: Messages.ManagePermissionRequest, metadata) { this.logger.info('CatalogService - Manage Data assets permissions'); @@ -275,7 +288,7 @@ class CatalogService implements OnModuleInit { async updateOneDataAsset({ data_asset_id, customer_id, body, metadata }) { const { data_asset } = await lastValueFrom( this.catalogWriteService.UpdateDataAsset( - { id: data_asset_id, ...body }, + { id: data_asset_id, changes: JSON.stringify(body) }, metadata, ), ); diff --git a/src/modules/catalog/dtos/index.ts b/src/modules/catalog/dtos/index.ts index 4d2f921..533a559 100644 --- a/src/modules/catalog/dtos/index.ts +++ b/src/modules/catalog/dtos/index.ts @@ -1,4 +1,5 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { CreateDataAssetRequest } from '@dadosfera/protospack-v2/dist/lib/Catalog/interfaces/messages'; export class IRole { @ApiProperty() @@ -128,6 +129,19 @@ export class IUpdateDataRequest { tags: string[]; } +export class ICreateDataAsset implements CreateDataAssetRequest { + @ApiProperty() + display_name: string; + @ApiProperty() + description: string; + @ApiProperty() + data_asset_type: string; + @ApiProperty() + external_url: string; + @ApiProperty() + location: string; +} + export class IPreview { @ApiProperty() id: string;