From 1e239026a34a7a183f8f040127ee632cbdac973a Mon Sep 17 00:00:00 2001 From: Arthur Simas Date: Thu, 19 May 2022 12:02:08 -0300 Subject: [PATCH 1/2] FEAT: MFA finished + better error handling --- src/clients/auth/client.service.ts | 139 +++++++++++----------------- src/clients/auth/interfaces.d.ts | 10 -- src/modules/auth/auth.controller.ts | 92 +++++++++++++----- src/utils/ErrorBuilder.ts | 106 +++++++++++++++++++++ src/utils/errorCodes.ts | 20 ++++ swagger.json | 2 +- 6 files changed, 251 insertions(+), 118 deletions(-) delete mode 100644 src/clients/auth/interfaces.d.ts create mode 100644 src/utils/ErrorBuilder.ts create mode 100644 src/utils/errorCodes.ts diff --git a/src/clients/auth/client.service.ts b/src/clients/auth/client.service.ts index cff1e85..d56d238 100644 --- a/src/clients/auth/client.service.ts +++ b/src/clients/auth/client.service.ts @@ -2,17 +2,18 @@ import { OnModuleInit, Inject } from '@nestjs/common'; import { ClientGrpc } from '@nestjs/microservices'; import { - AuthConfirmationRequest, - AuthDisableTotpMfaRequest, - AuthEnableTotpMfaRequest, - AuthResendConfirmationCodeRequest, - AuthServiceInterface, - AuthVerifyTotpMfaRequest, DucServicesNames, + AuthServiceInterface, + AuthSignInRequest, + AuthRefreshAccessTokenRequest, + AuthConfirmationRequest, + AuthResendConfirmationCodeRequest, + AuthEnableTotpMfaRequest, + AuthDisableTotpMfaRequest, + AuthDismissTotpMfaRequest, + AuthVerifyTotpMfaRequest, } from '@victorradael/protospack'; -import { ISignIn, IRefreshAccessToken } from './interfaces'; - export class AuthClientService implements OnModuleInit { private authService: AuthServiceInterface; constructor( @@ -25,111 +26,89 @@ export class AuthClientService implements OnModuleInit { ); } - async signIn({ username, password, totp }: ISignIn): Promise { + async signIn({ username, password, totp }: AuthSignInRequest): Promise { console.log('AuthClientService', 'SignIn'); - const tokens = await new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { this.authService.signIn({ username, password, totp }).subscribe({ - next(x) { - resolve(x); - }, - error(err) { - console.log('Observable Error'); - reject(err); + next: resolve, + //error: (err) => reject(err.details), + error: (err) => { + console.log(err); + reject(err.details); }, complete() { console.log('done'); }, }); - }) - .then((res) => res) - .catch((err) => { - throw new Error(err); - }); - return tokens; + }); } async enableTotpMFA({ - username, + accessToken, password, }: AuthEnableTotpMfaRequest): Promise { console.log('AuthClientService', 'enableTotpMFA'); - const tokens = await new Promise((resolve, reject) => { - this.authService.enableTotpMfa({ username, password }).subscribe({ - next(x) { - resolve(x); - }, - error(err) { - console.log('Observable Error'); - reject(err); - }, + return new Promise((resolve, reject) => { + this.authService.enableTotpMfa({ accessToken, password }).subscribe({ + next: resolve, + error: (err) => reject(err.details), complete() { console.log('done'); }, }); - }) - .then((res) => res) - .catch((err) => { - throw new Error(err); - }); - return tokens; + }); } async disableTotpMFA({ - username, + accessToken, password, - totp, }: AuthDisableTotpMfaRequest): Promise { console.log('AuthClientService', 'disableTotpMFA'); - const tokens = await new Promise((resolve, reject) => { - this.authService.disableTotpMfa({ username, password, totp }).subscribe({ - next(x) { - resolve(x); - }, - error(err) { - console.log('Observable Error'); - reject(err); - }, + return new Promise((resolve, reject) => { + this.authService.disableTotpMfa({ accessToken, password }).subscribe({ + next: resolve, + error: (err) => reject(err.details), complete() { console.log('done'); }, }); - }) - .then((res) => res) - .catch((err) => { - throw new Error(err); + }); + } + + async dismissTotpMFA({ + accessToken, + }: AuthDismissTotpMfaRequest): Promise { + console.log('AuthClientService', 'dismissTotpMFA'); + + return new Promise((resolve, reject) => { + this.authService.dismissTotpMfa({ accessToken }).subscribe({ + next: resolve, + error: (err) => reject(err.details), + complete() { + console.log('done'); + }, }); - return tokens; + }); } async verifyTotp({ - username, accessToken, totp, }: AuthVerifyTotpMfaRequest): Promise { console.log('AuthClientService', 'disableTotpMFA'); - const tokens = await new Promise((resolve, reject) => { - this.authService.verifyTotp({ username, accessToken, totp }).subscribe({ - next(x) { - resolve(x); - }, - error(err) { - console.log('Observable Error'); - reject(err); - }, + return new Promise((resolve, reject) => { + this.authService.verifyTotp({ accessToken, totp }).subscribe({ + next: resolve, + error: (err) => reject(err.details), complete() { console.log('done'); }, }); - }) - .then((res) => res) - .catch((err) => { - throw new Error(err); - }); - return tokens; + }); } async confirmRegister({ @@ -190,29 +169,19 @@ export class AuthClientService implements OnModuleInit { async refreshAccessToken({ username, refreshToken, - }: IRefreshAccessToken): Promise { + }: AuthRefreshAccessTokenRequest): Promise { console.log('AuthClientService', 'RefreshAccessToken'); - const tokens = await new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { this.authService .refreshAccessToken({ username, refreshToken }) .subscribe({ - next(x) { - resolve(x); - }, - error(err) { - console.log('Observable Error'); - reject(err); - }, + next: resolve, + error: (err) => reject(err.details), complete() { console.log('done'); }, }); - }) - .then((res) => res) - .catch((err) => { - throw new Error(err); - }); - return tokens; + }); } } diff --git a/src/clients/auth/interfaces.d.ts b/src/clients/auth/interfaces.d.ts deleted file mode 100644 index 4ddb2e0..0000000 --- a/src/clients/auth/interfaces.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface ISignIn { - username: string; - password: string; - totp: string; -} - -export interface IRefreshAccessToken { - username: string; - refreshToken: string; -} diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 59c5c12..b9fd145 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -3,15 +3,21 @@ import { Controller, Headers, Post, + HttpCode, + HttpStatus, UnauthorizedException, } from '@nestjs/common'; import { + AuthSignInRequest, + AuthRefreshAccessTokenRequest, AuthEnableTotpMfaRequest, + AuthDisableTotpMfaRequest, AuthVerifyTotpMfaRequest, } from '@victorradael/protospack'; import { AuthClientService } from 'src/clients/auth/client.service'; -import { ISignIn, IRefreshAccessToken } from 'src/clients/auth/interfaces'; + +import ErrorBuilder from '../../utils/ErrorBuilder'; @Controller('auth') export class AuthController { @@ -19,82 +25,124 @@ export class AuthController { // DEPRECADO! @Post() - async signIn_old(@Body() body: ISignIn) { + @HttpCode(HttpStatus.OK) + async signIn_old(@Body() body: AuthSignInRequest) { console.log(`/auth`, 'SignIn_old'); return this.signIn(body); } @Post('login') - async signIn_login(@Body() body: ISignIn) { + @HttpCode(HttpStatus.OK) + async signIn_login(@Body() body: AuthSignInRequest) { console.log(`/auth`, 'SignIn_login'); return this.signIn(body); } @Post('sign-in') - async signIn(@Body() { username, password, totp }: ISignIn) { + @HttpCode(HttpStatus.OK) + async signIn(@Body() { username, password, totp }: AuthSignInRequest) { console.log(`/auth`, 'SignIn'); const tokens = await this.authClient .signIn({ username, password, totp }) - .then((result) => result) .catch((err) => { - throw new UnauthorizedException(err.message); + throw ErrorBuilder(err); }); return tokens; } @Post('refresh-access-token') + @HttpCode(HttpStatus.OK) async refreshAccessToken( - @Body() { username, refreshToken }: IRefreshAccessToken, + @Body() { username, refreshToken }: AuthRefreshAccessTokenRequest, ) { console.log(`/auth`, 'RefreshAccessToken'); const accessToken = await this.authClient .refreshAccessToken({ username, refreshToken }) - .then((result) => result) .catch((err) => { - throw new UnauthorizedException(err.message); + throw ErrorBuilder(err); }); return accessToken; } @Post('enable-totp') + @HttpCode(HttpStatus.OK) async enableTotpMFA( - @Body() { username, password }: AuthEnableTotpMfaRequest, + @Body() body: AuthEnableTotpMfaRequest, + @Headers() headers, ) { console.log(`/auth`, 'enable-totp'); - const enableTotpResponse = await this.authClient - .enableTotpMFA({ username, password }) - .then((result) => result) + const { password } = body; + const { authorization: accessToken } = headers; + + const response = await this.authClient + .enableTotpMFA({ accessToken, password }) .catch((err) => { - throw new UnauthorizedException(err.message); + throw ErrorBuilder(err); }); - return enableTotpResponse; + return response; + } + + @Post('disable-totp') + @HttpCode(HttpStatus.OK) + async disableTotpMFA( + @Body() body: AuthDisableTotpMfaRequest, + @Headers() headers, + ) { + console.log(`/auth`, 'disable-totp'); + + const { password } = body; + const { authorization: accessToken } = headers; + + const response = await this.authClient + .disableTotpMFA({ accessToken, password }) + .catch((err) => { + throw ErrorBuilder(err); + }); + + return response; + } + + @Post('dismiss-totp') + @HttpCode(HttpStatus.OK) + async dismissTotpMFA(@Headers() headers) { + console.log(`/auth`, 'disable-totp'); + + const { authorization: accessToken } = headers; + + const response = await this.authClient + .dismissTotpMFA({ accessToken }) + .catch((err) => { + throw ErrorBuilder(err); + }); + + return response; } @Post('verify-totp') + @HttpCode(HttpStatus.OK) async verifyTotp( @Body() body: AuthVerifyTotpMfaRequest, @Headers() headers, ): Promise { console.log(`/auth`, 'enable-totp'); - const { username, totp } = body; - const { Authorization } = headers; + const { totp } = body; + const { authorization: accessToken } = headers; - const enableTotpResponse = await this.authClient - .verifyTotp({ username, totp, accessToken: Authorization }) - .then((result) => result) + const response = await this.authClient + .verifyTotp({ accessToken, totp }) .catch((err) => { - throw new UnauthorizedException(err.message); + throw ErrorBuilder(err); }); - return enableTotpResponse; + return response; } } diff --git a/src/utils/ErrorBuilder.ts b/src/utils/ErrorBuilder.ts new file mode 100644 index 0000000..e6cc5de --- /dev/null +++ b/src/utils/ErrorBuilder.ts @@ -0,0 +1,106 @@ +import { HttpStatus, HttpException } from '@nestjs/common'; + +import ErrorCodes from './errorCodes'; + +function Builder({ statusCode, message, error, code }) { + return new HttpException({ statusCode, message, error, code }, statusCode); +} + +export default function ErrorBuilder(code: string) { + console.log(code); + + switch (code) { + case ErrorCodes.AUTH.WRONG_CREDENTIALS: + return Builder({ + statusCode: HttpStatus.UNAUTHORIZED, + error: 'Não autenticado', + message: 'Usuário ou senha incorretos', + code, + }); + + case ErrorCodes.AUTH.WRONG_PASSWORD_CONFIRMATION: + return Builder({ + statusCode: HttpStatus.UNAUTHORIZED, + error: 'Senha incorreta', + message: 'Confirmação de senha incorreta', + code, + }); + + case ErrorCodes.AUTH.TOTP_NOT_ENABLED: + return Builder({ + statusCode: HttpStatus.PRECONDITION_FAILED, + error: 'Não permitido', + message: 'A autenticação multifator não está habilitada', + code, + }); + + case ErrorCodes.AUTH.TOTP_ALREADY_ENABLED: + return Builder({ + statusCode: HttpStatus.PRECONDITION_FAILED, + error: 'Não permitido', + message: 'A autenticação multifator já está habilitada', + code, + }); + + case ErrorCodes.AUTH.TOTP_ALREADY_DISABLED: + return Builder({ + statusCode: HttpStatus.PRECONDITION_FAILED, + error: 'Não permitido', + message: 'A autenticação multifator já está desabilitada', + code, + }); + + case ErrorCodes.AUTH.TOTP_REQUIRED: + return Builder({ + statusCode: HttpStatus.UNAUTHORIZED, + error: 'Não autenticado', + message: 'Informe o token de autenticação multifator', + code, + }); + + case ErrorCodes.AUTH.CODE_MISMATCH: + case ErrorCodes.AUTH.CODE_ALREADY_USED: + return Builder({ + statusCode: HttpStatus.UNAUTHORIZED, + error: 'Não autenticado', + message: 'Token de autenticação multifator inválido', + code, + }); + + case ErrorCodes.RATE_LIMIT: + return Builder({ + statusCode: HttpStatus.TOO_MANY_REQUESTS, + error: 'Limite excedido', + message: + 'Você tentou realizar essa operação muitas vezes. Tente novamente mais tarde', + code, + }); + + case ErrorCodes.AUTH.UNAUTHORIZED: + return Builder({ + statusCode: HttpStatus.UNAUTHORIZED, + error: 'Não autenticado', + message: 'É necessário estar logado para realizar essa operação', + code, + }); + + case ErrorCodes.AUTH.FORBIDDEN: + return Builder({ + statusCode: HttpStatus.FORBIDDEN, + error: 'Não autorizado', + message: + 'Você não tem permissões suficientes para realizar essa operação', + code, + }); + + case ErrorCodes.UNKNOWN: + default: + return Builder({ + statusCode: HttpStatus.INTERNAL_SERVER_ERROR, + error: 'Desconhecido', + message: + 'Erro desconhecido. Tente novamente ou entre em contato com o suporte', + code: ErrorCodes.UNKNOWN, + }); + } +} diff --git a/src/utils/errorCodes.ts b/src/utils/errorCodes.ts new file mode 100644 index 0000000..e5d28e1 --- /dev/null +++ b/src/utils/errorCodes.ts @@ -0,0 +1,20 @@ +export const Auth = { + UNAUTHORIZED: 'AUTH.UNAUTHORIZED', + FORBIDDEN: 'AUTH.FORBIDDEN', + WRONG_CREDENTIALS: 'AUTH.WRONG_CREDENTIALS', + WRONG_PASSWORD_CONFIRMATION: 'AUTH.WRONG_PASSWORD_CONFIRMATION', + TOTP_NOT_ENABLED: 'AUTH.TOTP_NOT_ENABLED', + TOTP_ALREADY_ENABLED: 'AUTH.TOTP_ALREADY_ENABLED', + TOTP_ALREADY_DISABLED: 'AUTH.TOTP_ALREADY_DISABLED', + TOTP_REQUIRED: 'AUTH.TOTP_REQUIRED', + CODE_MISMATCH: 'AUTH.CODE_MISMATCH', + CODE_ALREADY_USED: 'AUTH.CODE_ALREADY_USED', +}; + +const ErrorCodes = { + UNKNOWN: 'UNKNOWN', + RATE_LIMIT: 'RATE_LIMIT', + AUTH: Auth, +}; + +export default ErrorCodes; diff --git a/swagger.json b/swagger.json index 0893bd3..072ebd9 100644 --- a/swagger.json +++ b/swagger.json @@ -1 +1 @@ -{"openapi":"3.0.0","paths":{"/inputs/test-connection":{"post":{"operationId":"InputsController_testConnection","parameters":[],"responses":{"201":{"description":""}}}},"/inputs/test-connection/get-columns":{"post":{"operationId":"InputsController_getColumns","parameters":[],"responses":{"201":{"description":""}}}},"/inputs":{"post":{"operationId":"InputsController_create","parameters":[],"responses":{"201":{"description":""}}},"get":{"operationId":"InputsController_findAll","parameters":[],"responses":{"200":{"description":""}}}},"/inputs/{id}":{"get":{"operationId":"InputsController_findOne","parameters":[],"responses":{"200":{"description":""}}},"put":{"operationId":"InputsController_update","parameters":[],"responses":{"200":{"description":""}}},"delete":{"operationId":"InputsController_delete","parameters":[],"responses":{"200":{"description":""}}}},"/transformations":{"post":{"operationId":"TransformationsController_create","parameters":[],"responses":{"201":{"description":""}}},"get":{"operationId":"TransformationsController_findAll","parameters":[],"responses":{"200":{"description":""}}}},"/transformations/{id}":{"get":{"operationId":"TransformationsController_findOne","parameters":[],"responses":{"200":{"description":""}}},"put":{"operationId":"TransformationsController_update","parameters":[],"responses":{"200":{"description":""}}},"delete":{"operationId":"TransformationsController_delete","parameters":[],"responses":{"200":{"description":""}}}},"/outputs":{"post":{"operationId":"OutputsController_create","parameters":[],"responses":{"201":{"description":""}}},"get":{"operationId":"OutputsController_findAll","parameters":[],"responses":{"200":{"description":""}}}},"/outputs/{id}":{"get":{"operationId":"OutputsController_findOne","parameters":[],"responses":{"200":{"description":""}}},"put":{"operationId":"OutputsController_update","parameters":[],"responses":{"200":{"description":""}}},"delete":{"operationId":"OutputsController_delete","parameters":[],"responses":{"200":{"description":""}}}},"/pipelines/start/{id}":{"post":{"operationId":"PipelinesController_activate","parameters":[],"responses":{"201":{"description":""}}}},"/pipelines/{id}/status":{"get":{"operationId":"PipelinesController_getPipelineStatus","parameters":[],"responses":{"200":{"description":""}}}},"/pipelines/{id}/{details}":{"get":{"operationId":"PipelinesController_getPipelineLogs","parameters":[],"responses":{"200":{"description":""}}}},"/pipelines":{"post":{"operationId":"PipelinesController_create","parameters":[],"responses":{"201":{"description":""}}},"get":{"operationId":"PipelinesController_findAll","parameters":[],"responses":{"200":{"description":""}}}},"/pipelines/{id}":{"get":{"operationId":"PipelinesController_findOne","parameters":[],"responses":{"200":{"description":""}}},"put":{"operationId":"PipelinesController_update","parameters":[],"responses":{"200":{"description":""}}},"delete":{"operationId":"PipelinesController_delete","parameters":[],"responses":{"200":{"description":""}}}},"/auth":{"post":{"operationId":"AuthController_signIn_old","parameters":[],"responses":{"201":{"description":""}}}},"/auth/login":{"post":{"operationId":"AuthController_signIn_login","parameters":[],"responses":{"201":{"description":""}}}},"/auth/sign-in":{"post":{"operationId":"AuthController_signIn","parameters":[],"responses":{"201":{"description":""}}}},"/auth/refresh-access-token":{"post":{"operationId":"AuthController_refreshAccessToken","parameters":[],"responses":{"201":{"description":""}}}},"/auth/enable-totp":{"post":{"operationId":"AuthController_enableTotpMFA","parameters":[],"responses":{"201":{"description":""}}}},"/auth/verify-totp":{"post":{"operationId":"AuthController_verifyTotp","parameters":[],"responses":{"201":{"description":""}}}},"/health":{"get":{"operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/all":{"get":{"operationId":"CatalogController_catalogAll","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/data_apps":{"get":{"operationId":"CatalogController_dataAppsAll","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/data_apps/{id}":{"delete":{"operationId":"CatalogController_dataAppsOne","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/dashboard-metabase":{"get":{"operationId":"CatalogController_getAllDashboardMetabase","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/dashboard-metabase/{id}":{"get":{"operationId":"CatalogController_getOneDashboardMetabase","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/table-metadata":{"get":{"operationId":"CatalogController_getAllTableMetadata","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/table-metadata/{id}":{"delete":{"operationId":"CatalogController_deleteOneTableMetadata","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/column-metadata":{"get":{"operationId":"CatalogController_getOneColumnMetadata","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/column-metadata/{id}":{"delete":{"operationId":"CatalogController_deleteOneColumnMetadata","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/data-preview":{"get":{"operationId":"CatalogController_getOneDataPreview","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/data-status":{"get":{"operationId":"CatalogController_createDataStatus","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/data-description":{"get":{"operationId":"CatalogController_getDataDescription","parameters":[],"responses":{"200":{"description":""}}},"post":{"operationId":"CatalogController_createDataDescription","parameters":[],"responses":{"201":{"description":""}}}},"/catalog/data-docs":{"get":{"operationId":"CatalogController_getDataDocs","parameters":[],"responses":{"200":{"description":""}}},"post":{"operationId":"CatalogController_createDataDocs","parameters":[],"responses":{"201":{"description":""}}}},"/catalog/data-rating":{"get":{"operationId":"CatalogController_getDataRating","parameters":[],"responses":{"200":{"description":""}}},"post":{"operationId":"CatalogController_createDataRating","parameters":[],"responses":{"201":{"description":""}}}},"/catalog/summary-rating/{id}":{"get":{"operationId":"CatalogController_getSummaryRating","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/data-comment":{"get":{"operationId":"CatalogController_getDataComment","parameters":[],"responses":{"200":{"description":""}}},"post":{"operationId":"CatalogController_createDataComment","parameters":[],"responses":{"201":{"description":""}}}},"/catalog/data-review":{"get":{"operationId":"CatalogController_getDataReview","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/tags":{"post":{"operationId":"CatalogController_createTags","parameters":[],"responses":{"201":{"description":""}}},"get":{"operationId":"CatalogController_findAllTags","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/tags/{id}":{"delete":{"operationId":"CatalogController_deleteTags","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/table-tags":{"post":{"operationId":"CatalogController_createTableTags","parameters":[],"responses":{"201":{"description":""}}},"get":{"operationId":"CatalogController_getAllTableTags","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/table-tags/{id}":{"delete":{"operationId":"CatalogController_deleteTableTags","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/table-rules":{"get":{"operationId":"CatalogController_getTableRules","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/table-rules/{id}":{"delete":{"operationId":"CatalogController_deleteTableRules","parameters":[],"responses":{"200":{"description":""}}}}},"info":{"title":"Maestro Grpc Documentation","description":"Documentation for Maestro gateway","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{}}} \ No newline at end of file +{"openapi":"3.0.0","paths":{"/inputs/test-connection":{"post":{"operationId":"InputsController_testConnection","parameters":[],"responses":{"201":{"description":""}}}},"/inputs/test-connection/get-columns":{"post":{"operationId":"InputsController_getColumns","parameters":[],"responses":{"201":{"description":""}}}},"/inputs":{"post":{"operationId":"InputsController_create","parameters":[],"responses":{"201":{"description":""}}},"get":{"operationId":"InputsController_findAll","parameters":[],"responses":{"200":{"description":""}}}},"/inputs/{id}":{"get":{"operationId":"InputsController_findOne","parameters":[],"responses":{"200":{"description":""}}},"put":{"operationId":"InputsController_update","parameters":[],"responses":{"200":{"description":""}}},"delete":{"operationId":"InputsController_delete","parameters":[],"responses":{"200":{"description":""}}}},"/transformations":{"post":{"operationId":"TransformationsController_create","parameters":[],"responses":{"201":{"description":""}}},"get":{"operationId":"TransformationsController_findAll","parameters":[],"responses":{"200":{"description":""}}}},"/transformations/{id}":{"get":{"operationId":"TransformationsController_findOne","parameters":[],"responses":{"200":{"description":""}}},"put":{"operationId":"TransformationsController_update","parameters":[],"responses":{"200":{"description":""}}},"delete":{"operationId":"TransformationsController_delete","parameters":[],"responses":{"200":{"description":""}}}},"/outputs":{"post":{"operationId":"OutputsController_create","parameters":[],"responses":{"201":{"description":""}}},"get":{"operationId":"OutputsController_findAll","parameters":[],"responses":{"200":{"description":""}}}},"/outputs/{id}":{"get":{"operationId":"OutputsController_findOne","parameters":[],"responses":{"200":{"description":""}}},"put":{"operationId":"OutputsController_update","parameters":[],"responses":{"200":{"description":""}}},"delete":{"operationId":"OutputsController_delete","parameters":[],"responses":{"200":{"description":""}}}},"/pipelines/start/{id}":{"post":{"operationId":"PipelinesController_activate","parameters":[],"responses":{"201":{"description":""}}}},"/pipelines/{id}/status":{"get":{"operationId":"PipelinesController_getPipelineStatus","parameters":[],"responses":{"200":{"description":""}}}},"/pipelines/{id}/{details}":{"get":{"operationId":"PipelinesController_getPipelineLogs","parameters":[],"responses":{"200":{"description":""}}}},"/pipelines":{"post":{"operationId":"PipelinesController_create","parameters":[],"responses":{"201":{"description":""}}},"get":{"operationId":"PipelinesController_findAll","parameters":[],"responses":{"200":{"description":""}}}},"/pipelines/{id}":{"get":{"operationId":"PipelinesController_findOne","parameters":[],"responses":{"200":{"description":""}}},"put":{"operationId":"PipelinesController_update","parameters":[],"responses":{"200":{"description":""}}},"delete":{"operationId":"PipelinesController_delete","parameters":[],"responses":{"200":{"description":""}}}},"/auth":{"post":{"operationId":"AuthController_signIn_old","parameters":[],"responses":{"200":{"description":""}}}},"/auth/login":{"post":{"operationId":"AuthController_signIn_login","parameters":[],"responses":{"200":{"description":""}}}},"/auth/sign-in":{"post":{"operationId":"AuthController_signIn","parameters":[],"responses":{"200":{"description":""}}}},"/auth/refresh-access-token":{"post":{"operationId":"AuthController_refreshAccessToken","parameters":[],"responses":{"200":{"description":""}}}},"/auth/enable-totp":{"post":{"operationId":"AuthController_enableTotpMFA","parameters":[],"responses":{"200":{"description":""}}}},"/auth/disable-totp":{"post":{"operationId":"AuthController_disableTotpMFA","parameters":[],"responses":{"200":{"description":""}}}},"/auth/dismiss-totp":{"post":{"operationId":"AuthController_dismissTotpMFA","parameters":[],"responses":{"200":{"description":""}}}},"/auth/verify-totp":{"post":{"operationId":"AuthController_verifyTotp","parameters":[],"responses":{"200":{"description":""}}}},"/health":{"get":{"operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/all":{"get":{"operationId":"CatalogController_catalogAll","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/data_apps":{"get":{"operationId":"CatalogController_dataAppsAll","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/data_apps/{id}":{"delete":{"operationId":"CatalogController_dataAppsOne","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/dashboard-metabase":{"get":{"operationId":"CatalogController_getAllDashboardMetabase","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/dashboard-metabase/{id}":{"get":{"operationId":"CatalogController_getOneDashboardMetabase","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/table-metadata":{"get":{"operationId":"CatalogController_getAllTableMetadata","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/table-metadata/{id}":{"delete":{"operationId":"CatalogController_deleteOneTableMetadata","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/column-metadata":{"get":{"operationId":"CatalogController_getOneColumnMetadata","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/column-metadata/{id}":{"delete":{"operationId":"CatalogController_deleteOneColumnMetadata","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/data-preview":{"get":{"operationId":"CatalogController_getOneDataPreview","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/data-status":{"get":{"operationId":"CatalogController_createDataStatus","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/data-description":{"get":{"operationId":"CatalogController_getDataDescription","parameters":[],"responses":{"200":{"description":""}}},"post":{"operationId":"CatalogController_createDataDescription","parameters":[],"responses":{"201":{"description":""}}}},"/catalog/data-docs":{"get":{"operationId":"CatalogController_getDataDocs","parameters":[],"responses":{"200":{"description":""}}},"post":{"operationId":"CatalogController_createDataDocs","parameters":[],"responses":{"201":{"description":""}}}},"/catalog/data-rating":{"get":{"operationId":"CatalogController_getDataRating","parameters":[],"responses":{"200":{"description":""}}},"post":{"operationId":"CatalogController_createDataRating","parameters":[],"responses":{"201":{"description":""}}}},"/catalog/summary-rating/{id}":{"get":{"operationId":"CatalogController_getSummaryRating","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/data-comment":{"get":{"operationId":"CatalogController_getDataComment","parameters":[],"responses":{"200":{"description":""}}},"post":{"operationId":"CatalogController_createDataComment","parameters":[],"responses":{"201":{"description":""}}}},"/catalog/data-review":{"get":{"operationId":"CatalogController_getDataReview","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/tags":{"post":{"operationId":"CatalogController_createTags","parameters":[],"responses":{"201":{"description":""}}},"get":{"operationId":"CatalogController_findAllTags","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/tags/{id}":{"delete":{"operationId":"CatalogController_deleteTags","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/table-tags":{"post":{"operationId":"CatalogController_createTableTags","parameters":[],"responses":{"201":{"description":""}}},"get":{"operationId":"CatalogController_getAllTableTags","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/table-tags/{id}":{"delete":{"operationId":"CatalogController_deleteTableTags","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/table-rules":{"get":{"operationId":"CatalogController_getTableRules","parameters":[],"responses":{"200":{"description":""}}}},"/catalog/table-rules/{id}":{"delete":{"operationId":"CatalogController_deleteTableRules","parameters":[],"responses":{"200":{"description":""}}}}},"info":{"title":"Maestro Grpc Documentation","description":"Documentation for Maestro gateway","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{}}} \ No newline at end of file From b2e7870cc50ae56ea9295095ac373d53d00979e2 Mon Sep 17 00:00:00 2001 From: Arthur Simas Date: Thu, 19 May 2022 12:56:32 -0300 Subject: [PATCH 2/2] CHORE: protospack version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8672c4d..b5dd08c 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@nestjs/platform-express": "^8.4.3", "@nestjs/schedule": "^1.1.0", "@nestjs/swagger": "^5.2.1", - "@victorradael/protospack": "^1.8.0", + "@victorradael/protospack": "2.2.0", "axios": "^0.25.0", "dotenv": "^14.2.0", "helmet": "^5.0.2",