diff --git a/docsfera.json b/docsfera.json index 381bdfe..0f21c43 100644 --- a/docsfera.json +++ b/docsfera.json @@ -5530,6 +5530,43 @@ "Health" ] } + }, + "/open-data/sharing-ocean-data": { + "post": { + "operationId": "OpenDataController_createUser", + "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/CreateUserOpenDataDTO" + } + } + } + }, + "responses": { + "201": { + "description": "" + } + }, + "tags": [ + "OpenData" + ] + } } }, "info": { @@ -8377,6 +8414,33 @@ "required": [ "links" ] + }, + "CreateUserOpenDataDTO": { + "type": "object", + "properties": { + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "organization": { + "type": "string" + }, + "enquiryType": { + "type": "string" + } + }, + "required": [ + "firstName", + "lastName", + "email", + "organization", + "enquiryType" + ] } } } diff --git a/package-lock.json b/package-lock.json index ff693d2..c1ea922 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@aws-sdk/client-secrets-manager": "^3.414.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", "@dadosfera/protospack": "2.5.3", - "@dadosfera/protospack-v2": "^3.36.1", + "@dadosfera/protospack-v2": "3.37.0-beta.1", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -1403,9 +1403,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.36.1", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.36.1.tgz", - "integrity": "sha512-IbkkjoTjhyhglVt4H78n1atNfC3wl5EDDfwhWA9H6VpHLyj8Fbu4XCnZH839oVC5eDtAaq4f4y8RyDueO/L8zg==", + "version": "3.37.0-beta.1", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.37.0-beta.1.tgz", + "integrity": "sha512-AcDxeg7KruBJncOXbLJFHKH/5GQ9VHR8MxU7s1o1lrZVfZY4Ht3UWmvwL1F2b+6DIhTDqzVOsKjfg7KAbuDYuw==", "license": "ISC", "dependencies": { "@grpc/grpc-js": "^1.9.3", diff --git a/package.json b/package.json index 1daeda0..8300759 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@aws-sdk/client-secrets-manager": "^3.414.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", "@dadosfera/protospack": "2.5.3", - "@dadosfera/protospack-v2": "^3.36.1", + "@dadosfera/protospack-v2": "3.37.0-beta.1", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", diff --git a/src/app.module.ts b/src/app.module.ts index fa831fd..1cf1611 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -26,9 +26,9 @@ import { PipelinesV2Module } from './modules/pipelinesV2/pipelines.module'; import { ProductboardModule } from './modules/productboard/productboard.module'; import { MixpanelModule } from './modules/mixpanel/mixpanel.module'; import { CustomersModule } from './modules/customers/customers.module'; +import { OpenDataModule } from './modules/open-data/open-data.module'; @Module({ - controllers: [], providers: [ DadosferaLogger, { @@ -60,6 +60,7 @@ import { CustomersModule } from './modules/customers/customers.module'; CustomersModule, //Always leave HealthModule last, so it is on the bottom of swagger HealthModule, + OpenDataModule, ], }) export class AppModule {} diff --git a/src/modules/open-data/dto/create-user.ts b/src/modules/open-data/dto/create-user.ts new file mode 100644 index 0000000..78a1bfc --- /dev/null +++ b/src/modules/open-data/dto/create-user.ts @@ -0,0 +1,14 @@ +import { ApiProperty } from "@nestjs/swagger"; + +export class CreateUserOpenDataDTO { + @ApiProperty() + firstName: string; + @ApiProperty() + lastName: string; + @ApiProperty() + email: string; + @ApiProperty() + organization: string; + @ApiProperty() + enquiryType: string; +} \ No newline at end of file diff --git a/src/modules/open-data/open-data.controller.spec.ts b/src/modules/open-data/open-data.controller.spec.ts new file mode 100644 index 0000000..f9f0ee5 --- /dev/null +++ b/src/modules/open-data/open-data.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { OpenDataController } from './open-data.controller'; + +describe('OpenDataController', () => { + let controller: OpenDataController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [OpenDataController], + }).compile(); + + controller = module.get(OpenDataController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/modules/open-data/open-data.controller.ts b/src/modules/open-data/open-data.controller.ts new file mode 100644 index 0000000..726b0b2 --- /dev/null +++ b/src/modules/open-data/open-data.controller.ts @@ -0,0 +1,47 @@ +import DadosferaLogger from '@dadosfera/dadosfera-logs'; +import { Body, Controller, Inject, Post, UseFilters } from '@nestjs/common'; +import { ApiCreatedResponse, ApiHeaders, ApiTags } from '@nestjs/swagger'; +import { ApiInternalOnlyController } from 'src/decorators/swagger.decorator'; +import { GrpcToHttpExceptionFilter } from 'src/error/grpc-to-http-exception.filter'; +import { LanguageEnum } from 'src/utils/languages.enum'; +import { UsersService } from '../users/users.service'; +import { Language } from 'src/decorators/language.decorator'; +import { CreateUserOpenDataDTO } from './dto/create-user'; +import { OpenDataService } from './open-data.service'; + +@Controller('open-data') +@ApiInternalOnlyController() +@ApiTags('OpenData') +@ApiHeaders([{ name: 'dadosfera-lang', enum: LanguageEnum, required: false }]) +@UseFilters(GrpcToHttpExceptionFilter) +export class OpenDataController { + logger: DadosferaLogger; + + constructor( + @Inject(DadosferaLogger) + dadosferaLogger: DadosferaLogger, + private openDataService: OpenDataService, + ) { + this.logger = dadosferaLogger.logger; + } + + @Post("/sharing-ocean-data") + @ApiCreatedResponse() + async createUser( + @Body() body: CreateUserOpenDataDTO + ) { + const OPENDATA_PUBLIC_USERS_GROUP_ID = "401573bb-334f-44b2-b30e-88d4cea31ae9"; + const OPENDATA_CUSTOMER_ID = "f239718a-a271-4ef9-ae7e-02a2f0f3aa6e"; + const roles = [OPENDATA_PUBLIC_USERS_GROUP_ID]; + + this.logger.info('createUser for open data' + JSON.stringify({ body })); + try { + await this.openDataService.createUser(OPENDATA_CUSTOMER_ID, body, roles); + return "success" + } catch (e) { + return e; + } + // return ; + } + +} diff --git a/src/modules/open-data/open-data.module.ts b/src/modules/open-data/open-data.module.ts new file mode 100644 index 0000000..f82b125 --- /dev/null +++ b/src/modules/open-data/open-data.module.ts @@ -0,0 +1,22 @@ +import { Module } from '@nestjs/common'; +import { OpenDataController } from './open-data.controller'; +import { UsersService } from '../users/users.service'; +import { ClientsModule } from '@nestjs/microservices' +import { DucClient } from '../duc/client.config'; +import DadosferaLogger from '@dadosfera/dadosfera-logs'; +import { RolesModule } from '../roles/roles.module'; +import { PermissionsModule } from '../permissions/permissions.module'; +import { OpenDataService } from './open-data.service'; + +const client = new DucClient(); + +@Module({ + controllers: [OpenDataController], + imports: [ + ClientsModule.register([client.providerOptions]), + RolesModule, + // PermissionsModule, + ], + providers: [DadosferaLogger, UsersService, OpenDataService] +}) +export class OpenDataModule {} diff --git a/src/modules/open-data/open-data.service.spec.ts b/src/modules/open-data/open-data.service.spec.ts new file mode 100644 index 0000000..17269fe --- /dev/null +++ b/src/modules/open-data/open-data.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { OpenDataService } from './open-data.service'; + +describe('OpenDataService', () => { + let service: OpenDataService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [OpenDataService], + }).compile(); + + service = module.get(OpenDataService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/modules/open-data/open-data.service.ts b/src/modules/open-data/open-data.service.ts new file mode 100644 index 0000000..239f11c --- /dev/null +++ b/src/modules/open-data/open-data.service.ts @@ -0,0 +1,50 @@ +import { Inject, Injectable, OnModuleInit } from '@nestjs/common'; +import { lastValueFrom } from 'rxjs'; +import { CreateUserOpenDataDTO } from './dto/create-user'; +import DadosferaLogger from '@dadosfera/dadosfera-logs'; +import { UsersProtoService } from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/write-service'; +import { DucClient } from '../duc/client.config'; +import { ClientGrpc } from '@nestjs/microservices'; +import { ProtoServices } from '@dadosfera/protospack-v2/dist/lib/Duc'; + +@Injectable() +export class OpenDataService implements OnModuleInit { + logger: DadosferaLogger; + + private usersClientService: UsersProtoService; + constructor( + @Inject(DadosferaLogger) + private dadosferaLogger: DadosferaLogger, + @Inject(DucClient.name) + private readonly grpcClient: ClientGrpc, + ) { + this.logger = dadosferaLogger.logger; + } + + onModuleInit() { + this.usersClientService = this.grpcClient.getService( + ProtoServices.UsersProtoService, + ); + + } + + async createUser(customerId: string, data: CreateUserOpenDataDTO, roleIds: string[]) { + const body = { + email: data.email, + name: data.firstName + " " + data.lastName, + department: data.organization, + jobTitle: data.enquiryType, + customerId: customerId, + roleIds: roleIds + } + + try { + await lastValueFrom( + this.usersClientService.SimpleUserCreate(body), + ); + return "User created"; + } catch(err) { + return err; + } + } +}