From db78ee3d8b84a92378cea4ee8d47f0ee3d3d1c2a Mon Sep 17 00:00:00 2001 From: Arthur Simas Date: Thu, 7 Jul 2022 17:27:12 -0300 Subject: [PATCH 1/2] FEAT: terms of use --- package-lock.json | 14 +++--- package.json | 2 +- src/app.module.ts | 2 + .../termsOfUse/termsOfUse.controller.ts | 47 +++++++++++++++++++ src/modules/termsOfUse/termsOfUse.module.ts | 24 ++++++++++ src/modules/termsOfUse/termsOfUse.service.ts | 33 +++++++++++++ src/utils/ErrorBuilder.ts | 8 ++++ src/utils/errorCodes.ts | 5 ++ 8 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 src/modules/termsOfUse/termsOfUse.controller.ts create mode 100644 src/modules/termsOfUse/termsOfUse.module.ts create mode 100644 src/modules/termsOfUse/termsOfUse.service.ts diff --git a/package-lock.json b/package-lock.json index 6126ab4..5a1985d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "passport-hubspot-oauth2": "^1.0.3", "passport-mailchimp": "^1.1.0", "protospack": "2.5.1", - "protospack-v2": "3.0.0", + "protospack-v2": "3.1.0", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.5.5", @@ -8997,9 +8997,9 @@ } }, "node_modules/protospack-v2": { - "version": "3.0.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.0.0.tgz", - "integrity": "sha512-GEFbf8+vVaq/lA28K4nFf7bOSlghQJn/aeVnrYzh4YJUaa1+ccNz3uQs9p5OGbfjt2u/fFE5rHGEBUtueAA8KA==", + "version": "3.1.0", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.1.0.tgz", + "integrity": "sha512-Y4WL0PqU2L2mU6SIGMTMEKP0gj4cT2No3AYFEWMiiTfaR7u3WHQAZxk6alIkOexotaQT9YiLKBXghMwDmlh40g==", "dependencies": { "rxjs": "^7.5.5", "ts-proto": "^1.112.2" @@ -17198,9 +17198,9 @@ } }, "protospack-v2": { - "version": "3.0.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.0.0.tgz", - "integrity": "sha512-GEFbf8+vVaq/lA28K4nFf7bOSlghQJn/aeVnrYzh4YJUaa1+ccNz3uQs9p5OGbfjt2u/fFE5rHGEBUtueAA8KA==", + "version": "3.1.0", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.1.0.tgz", + "integrity": "sha512-Y4WL0PqU2L2mU6SIGMTMEKP0gj4cT2No3AYFEWMiiTfaR7u3WHQAZxk6alIkOexotaQT9YiLKBXghMwDmlh40g==", "requires": { "rxjs": "^7.5.5", "ts-proto": "^1.112.2" diff --git a/package.json b/package.json index c3e5c80..3ee03fb 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "passport-hubspot-oauth2": "^1.0.3", "passport-mailchimp": "^1.1.0", "protospack": "2.5.1", - "protospack-v2": "3.0.0", + "protospack-v2": "3.1.0", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.5.5", diff --git a/src/app.module.ts b/src/app.module.ts index 5653cf5..1861e22 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -40,6 +40,7 @@ import { SalesforceStrategy } from './modules/oauth/passport-strategies/salesfor import { ConnectorClientConfiguration } from './clients/connector/client.config'; import { ConnectorController } from './modules/connector/connector.controller'; import { ConnectorClientService } from './clients/connector/client.service'; +import { TermsOfUseModule } from './modules/termsOfUse/termsOfUse.module'; const inputClient = new InputsClientConfiguration(); const outputClient = new OutputsClientConfiguration(); @@ -88,6 +89,7 @@ const connectorClient = new ConnectorClientConfiguration(); }), AuthModule, PermissionsModule, + TermsOfUseModule, ClientsModule.register([ { diff --git a/src/modules/termsOfUse/termsOfUse.controller.ts b/src/modules/termsOfUse/termsOfUse.controller.ts new file mode 100644 index 0000000..c2ac3c3 --- /dev/null +++ b/src/modules/termsOfUse/termsOfUse.controller.ts @@ -0,0 +1,47 @@ +import { + Body, + Controller, + Post, + HttpCode, + HttpStatus, + Inject, + Headers, + UseFilters, +} from '@nestjs/common'; +import { ApiTags } from '@nestjs/swagger'; +import { TermsOfUseAcceptRequest } from 'protospack-v2/dist/lib/Duc/interfaces/messages'; + +import { TermsOfUseClientService } from './termsOfUse.service'; +import { DadosferaLogger } from 'dadosfera-logs'; + +import { GrpcToHttpExceptionFilter } from '../../error/grpc-to-http-exception.filter'; + +@ApiTags('TermsOfUse') +@UseFilters(new GrpcToHttpExceptionFilter()) +@Controller('terms-of-use') +export class TermsOfUseController { + logger: any; + + constructor( + @Inject(DadosferaLogger) + dadosferaLogger: DadosferaLogger, + private termsOfUseClient: TermsOfUseClientService, + ) { + this.logger = dadosferaLogger.logger; + } + + @Post('accept') + @HttpCode(HttpStatus.OK) + async accept(@Body() body: TermsOfUseAcceptRequest, @Headers() headers) { + this.logger.info('/terms-of-use - accept'); + + const { token } = body; + const fingerprint = { + ip: process.env.ENV === 'local' ? headers['x-forwarded-for'] : '0.0.0.0', + port: process.env.ENV === 'local' ? headers['x-forwarded-port'] : '00000', + userAgent: headers['user-agent'], + }; + + return this.termsOfUseClient.accept({ token, fingerprint }); + } +} diff --git a/src/modules/termsOfUse/termsOfUse.module.ts b/src/modules/termsOfUse/termsOfUse.module.ts new file mode 100644 index 0000000..e1b3eab --- /dev/null +++ b/src/modules/termsOfUse/termsOfUse.module.ts @@ -0,0 +1,24 @@ +import { Module } from '@nestjs/common'; +import { ClientsModule } from '@nestjs/microservices'; +import { DadosferaLogger } from 'dadosfera-logs'; + +import { TermsOfUseController } from './termsOfUse.controller'; +import { TermsOfUseClientService } from './termsOfUse.service'; + +import { DucClient } from '../../clients/duc/client.config'; +const ducClient = new DucClient(); + +@Module({ + imports: [ + ClientsModule.register([ + { + name: 'DUC_PACKAGE', + ...ducClient.config(), + }, + ]), + ], + controllers: [TermsOfUseController], + providers: [TermsOfUseClientService, DadosferaLogger], + exports: [TermsOfUseClientService], +}) +export class TermsOfUseModule {} diff --git a/src/modules/termsOfUse/termsOfUse.service.ts b/src/modules/termsOfUse/termsOfUse.service.ts new file mode 100644 index 0000000..e2b74b8 --- /dev/null +++ b/src/modules/termsOfUse/termsOfUse.service.ts @@ -0,0 +1,33 @@ +import { OnModuleInit, Inject, Injectable } from '@nestjs/common'; +import { ClientGrpc } from '@nestjs/microservices'; +import { DadosferaLogger } from 'dadosfera-logs'; +import { lastValueFrom } from 'rxjs'; + +import { ProtoServices } from 'protospack-v2/dist/lib/Duc'; +import { TermsOfUseProtoService as TermsOfUseServiceInterface } from 'protospack-v2/dist/lib/Duc/interfaces/write-service'; +import { TermsOfUseAcceptRequest } from 'protospack-v2/dist/lib/Duc/interfaces/messages'; + +@Injectable() +export class TermsOfUseClientService implements OnModuleInit { + logger: any; + + private termsOfUseService: TermsOfUseServiceInterface; + constructor( + @Inject(DadosferaLogger) + dadosferaLogger: DadosferaLogger, + @Inject('DUC_PACKAGE') private readonly grpcClient: ClientGrpc, + ) { + this.logger = dadosferaLogger.logger; + } + + onModuleInit() { + this.termsOfUseService = + this.grpcClient.getService( + ProtoServices.TermsOfUseProtoService, + ); + } + + async accept(data: TermsOfUseAcceptRequest) { + return lastValueFrom(this.termsOfUseService.TermsOfUseAccept(data)); + } +} diff --git a/src/utils/ErrorBuilder.ts b/src/utils/ErrorBuilder.ts index 2f2cfd9..ec0cb41 100644 --- a/src/utils/ErrorBuilder.ts +++ b/src/utils/ErrorBuilder.ts @@ -86,6 +86,14 @@ export function EnrichErrorCode(code: string) { code, }; + case ErrorCodes.TERMS_OF_USE.REQUIRED: + return { + statusCode: HttpStatus.FORBIDDEN, + error: 'Não autorizado', + message: 'É necessário aceitar os termos de uso para prosseguir', + code, + }; + case ErrorCodes.RATE_LIMIT: return { statusCode: HttpStatus.TOO_MANY_REQUESTS, diff --git a/src/utils/errorCodes.ts b/src/utils/errorCodes.ts index 5d345df..189584a 100644 --- a/src/utils/errorCodes.ts +++ b/src/utils/errorCodes.ts @@ -14,11 +14,16 @@ export const AUTH = { WEAK_NEW_PASSWORD: 'AUTH.WEAK_NEW_PASSWORD', }; +const TERMS_OF_USE = { + REQUIRED: 'TERMS_OF_USE.REQUIRED', +}; + const ErrorCodes = { UNKNOWN: 'UNKNOWN', RATE_LIMIT: 'RATE_LIMIT', INTERNAL: 'INTERNAL', AUTH, + TERMS_OF_USE, }; export default ErrorCodes; From f383cf49d5e5df11244551cb2e6c53f48dd160f6 Mon Sep 17 00:00:00 2001 From: Arthur Simas Date: Mon, 11 Jul 2022 02:13:53 -0300 Subject: [PATCH 2/2] FIX: added get token method --- package-lock.json | 14 +++++++------- package.json | 2 +- src/modules/termsOfUse/termsOfUse.controller.ts | 9 +++++++++ src/modules/termsOfUse/termsOfUse.service.ts | 9 ++++++++- src/utils/ErrorBuilder.ts | 8 ++++++++ src/utils/errorCodes.ts | 1 + 6 files changed, 34 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5a1985d..3df21a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "passport-hubspot-oauth2": "^1.0.3", "passport-mailchimp": "^1.1.0", "protospack": "2.5.1", - "protospack-v2": "3.1.0", + "protospack-v2": "3.1.1", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.5.5", @@ -8997,9 +8997,9 @@ } }, "node_modules/protospack-v2": { - "version": "3.1.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.1.0.tgz", - "integrity": "sha512-Y4WL0PqU2L2mU6SIGMTMEKP0gj4cT2No3AYFEWMiiTfaR7u3WHQAZxk6alIkOexotaQT9YiLKBXghMwDmlh40g==", + "version": "3.1.1", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.1.1.tgz", + "integrity": "sha512-uY9hsP2oO7kar1EUUjUhVLI8VQ3seWO2+WVS0XS9vjWZPUI82k7KqB70uYB+5ws2dMSowomPjiqpQ13VNjk6ZQ==", "dependencies": { "rxjs": "^7.5.5", "ts-proto": "^1.112.2" @@ -17198,9 +17198,9 @@ } }, "protospack-v2": { - "version": "3.1.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.1.0.tgz", - "integrity": "sha512-Y4WL0PqU2L2mU6SIGMTMEKP0gj4cT2No3AYFEWMiiTfaR7u3WHQAZxk6alIkOexotaQT9YiLKBXghMwDmlh40g==", + "version": "3.1.1", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.1.1.tgz", + "integrity": "sha512-uY9hsP2oO7kar1EUUjUhVLI8VQ3seWO2+WVS0XS9vjWZPUI82k7KqB70uYB+5ws2dMSowomPjiqpQ13VNjk6ZQ==", "requires": { "rxjs": "^7.5.5", "ts-proto": "^1.112.2" diff --git a/package.json b/package.json index 3ee03fb..a8b632b 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "passport-hubspot-oauth2": "^1.0.3", "passport-mailchimp": "^1.1.0", "protospack": "2.5.1", - "protospack-v2": "3.1.0", + "protospack-v2": "3.1.1", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.5.5", diff --git a/src/modules/termsOfUse/termsOfUse.controller.ts b/src/modules/termsOfUse/termsOfUse.controller.ts index c2ac3c3..4872e9a 100644 --- a/src/modules/termsOfUse/termsOfUse.controller.ts +++ b/src/modules/termsOfUse/termsOfUse.controller.ts @@ -2,6 +2,7 @@ import { Body, Controller, Post, + Get, HttpCode, HttpStatus, Inject, @@ -15,6 +16,7 @@ import { TermsOfUseClientService } from './termsOfUse.service'; import { DadosferaLogger } from 'dadosfera-logs'; import { GrpcToHttpExceptionFilter } from '../../error/grpc-to-http-exception.filter'; +import { RequestUser, User } from '../../authentication/user.decorator'; @ApiTags('TermsOfUse') @UseFilters(new GrpcToHttpExceptionFilter()) @@ -30,6 +32,13 @@ export class TermsOfUseController { this.logger = dadosferaLogger.logger; } + @Get('token') + async getToken(@User({ required: true }) user: RequestUser) { + this.logger.info('/terms-of-use - get token'); + + return this.termsOfUseClient.getToken({ userId: user.user_id }); + } + @Post('accept') @HttpCode(HttpStatus.OK) async accept(@Body() body: TermsOfUseAcceptRequest, @Headers() headers) { diff --git a/src/modules/termsOfUse/termsOfUse.service.ts b/src/modules/termsOfUse/termsOfUse.service.ts index e2b74b8..b839795 100644 --- a/src/modules/termsOfUse/termsOfUse.service.ts +++ b/src/modules/termsOfUse/termsOfUse.service.ts @@ -5,7 +5,10 @@ import { lastValueFrom } from 'rxjs'; import { ProtoServices } from 'protospack-v2/dist/lib/Duc'; import { TermsOfUseProtoService as TermsOfUseServiceInterface } from 'protospack-v2/dist/lib/Duc/interfaces/write-service'; -import { TermsOfUseAcceptRequest } from 'protospack-v2/dist/lib/Duc/interfaces/messages'; +import { + TermsOfUseGetTokenRequest, + TermsOfUseAcceptRequest, +} from 'protospack-v2/dist/lib/Duc/interfaces/messages'; @Injectable() export class TermsOfUseClientService implements OnModuleInit { @@ -27,6 +30,10 @@ export class TermsOfUseClientService implements OnModuleInit { ); } + async getToken(data: TermsOfUseGetTokenRequest) { + return lastValueFrom(this.termsOfUseService.TermsOfUseGetToken(data)); + } + async accept(data: TermsOfUseAcceptRequest) { return lastValueFrom(this.termsOfUseService.TermsOfUseAccept(data)); } diff --git a/src/utils/ErrorBuilder.ts b/src/utils/ErrorBuilder.ts index ec0cb41..50d8640 100644 --- a/src/utils/ErrorBuilder.ts +++ b/src/utils/ErrorBuilder.ts @@ -86,6 +86,14 @@ export function EnrichErrorCode(code: string) { code, }; + case ErrorCodes.TERMS_OF_USE.UP_TO_DATE: + return { + statusCode: HttpStatus.FORBIDDEN, + error: 'Não autorizado', + message: 'Você já assinou os termos de uso', + code, + }; + case ErrorCodes.TERMS_OF_USE.REQUIRED: return { statusCode: HttpStatus.FORBIDDEN, diff --git a/src/utils/errorCodes.ts b/src/utils/errorCodes.ts index 189584a..0293678 100644 --- a/src/utils/errorCodes.ts +++ b/src/utils/errorCodes.ts @@ -15,6 +15,7 @@ export const AUTH = { }; const TERMS_OF_USE = { + UP_TO_DATE: 'TERMS_OF_USE.UP_TO_DATE', REQUIRED: 'TERMS_OF_USE.REQUIRED', };