From 76477f650780e38af673adbebaaf52f4cebe7d8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Rafael=20Siqueira?= Date: Tue, 2 Sep 2025 16:04:32 -0300 Subject: [PATCH] issue certs --- enrollments-events/app/events/issue_cert.py | 32 +-- .../tests/events/test_issue_cert.py | 11 +- enrollments-events/tests/sample.html | 251 ------------------ 3 files changed, 26 insertions(+), 268 deletions(-) delete mode 100644 enrollments-events/tests/sample.html diff --git a/enrollments-events/app/events/issue_cert.py b/enrollments-events/app/events/issue_cert.py index 7310b8f..fd76d88 100644 --- a/enrollments-events/app/events/issue_cert.py +++ b/enrollments-events/app/events/issue_cert.py @@ -9,7 +9,7 @@ from aws_lambda_powertools.utilities.data_classes import ( ) from aws_lambda_powertools.utilities.typing import LambdaContext from layercake.dateutils import fromisoformat, now -from layercake.dynamodb import DynamoDBPersistenceLayer, SortKey, TransactKey +from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair, SortKey, TransactKey from boto3clients import dynamodb_client, s3_client from config import BUCKET_NAME, ENROLLMENT_TABLE, PAPERFORGE_API @@ -23,6 +23,7 @@ enrollment_layer = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client) def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: new_image = event.detail['new_image'] now_ = now() + enrollment_id = new_image['id'] course = enrollment_layer.collection.get_items( TransactKey(new_image['id']) + SortKey('METADATA#COURSE', path_spec='cert', rename_key='cert') @@ -55,10 +56,7 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: r = requests.post(PAPERFORGE_API, data=json_data) r.raise_for_status() - object_key = 'issuedcerts/{completed_at}_{id}.pdf'.format( - completed_at=completed_at.strftime('%Y-%m-%d'), - id=new_image['id'], - ) + object_key = f'issuedcerts/{enrollment_id}.pdf' s3_uri = f's3://{BUCKET_NAME}/{object_key}' try: @@ -72,18 +70,22 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: logger.exception(exc) raise - enrollment_layer.put_item( - item={ - 'id': new_image['id'], - 'sk': 'ISSUED_CERT', - 's3_uri': s3_uri, - 'created_at': now_, - } - ) - logger.info(f'PDF uploaded successfully to {s3_uri}') - return True + return enrollment_layer.update_item( + key=KeyPair( + pk=enrollment_id, + sk='0', + ), + update_expr='SET issued_cert = :issued_cert', + expr_attr_values={ + ':issued_cert': { + 's3_uri': s3_uri, + 'issued_at': now_, + }, + }, + cond_expr='attribute_exists(sk)', + ) def _cpffmt(s: str) -> str: diff --git a/enrollments-events/tests/events/test_issue_cert.py b/enrollments-events/tests/events/test_issue_cert.py index c84938a..ec7302c 100644 --- a/enrollments-events/tests/events/test_issue_cert.py +++ b/enrollments-events/tests/events/test_issue_cert.py @@ -1,5 +1,5 @@ from aws_lambda_powertools.utilities.typing import LambdaContext -from layercake.dynamodb import DynamoDBPersistenceLayer +from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair import events.issue_cert as app @@ -9,10 +9,11 @@ def test_issue_cert( dynamodb_persistence_layer: DynamoDBPersistenceLayer, lambda_context: LambdaContext, ): + enrollment_id = '1ee108ae-67d4-4545-bf6d-4e641cdaa4e0' event = { 'detail': { 'new_image': { - 'id': '1ee108ae-67d4-4545-bf6d-4e641cdaa4e0', + 'id': enrollment_id, 'user': { 'name': 'Jimi Hendrix', 'cpf': '74630003037', @@ -23,3 +24,9 @@ def test_issue_cert( } } assert app.lambda_handler(event, lambda_context) # type: ignore + + r = dynamodb_persistence_layer.get_item( + key=KeyPair('1ee108ae-67d4-4545-bf6d-4e641cdaa4e0', '0') + ) + + assert 'issued_cert' in r diff --git a/enrollments-events/tests/sample.html b/enrollments-events/tests/sample.html deleted file mode 100644 index fbb90d7..0000000 --- a/enrollments-events/tests/sample.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - NR-10 Complementar (SEP) - - - - - -
- - - - - - - - - - - - - - - - - - - - - -

Certificamos que

-

{{ name }}

-

- Portador(a) do CPF {{ cpf }} , concluiu o curso - de NR-10 Complementar (SEP) com aproveitamento - de - {{ progress }}% -

-

Realizado entre {{ started_date }} e {{ finished_date }}

-

Florianópolis, SC, {{ today }}

- -
-
-
-

Tiago Maciel do Santos

-

CEO/Diretor

-
-
- -
- -
-
- -
-
-

Conteúdo programático ministrado

-
    -
  • Organização do sistema elétrico de potência
  • -
  • Organização do trabalho
  • -
  • Aspectos comportamentais
  • -
  • Condições impeditivas para serviços
  • -
  • Riscos típicos no SEP e sua prevenção
  • -
  • Técnicas de análise de riscos no SEP
  • -
  • Procedimentos de trabalho (análise e discussão)
  • -
  • Técnicas de análise de riscos no SEP
  • -
  • Equipamentos e ferramentas de trabalho
  • -
  • Sistemas de proteção coletiva
  • -
  • Equipamentos de proteção individual
  • -
  • Posturas e vestuários de trabalhos
  • -
  • - Segurança com veículos e transporte de pessoas, - materiais e equipamentos -
  • -
  • Sinalização e isolamento de áreas de trabalho
  • -
  • - Liberação de instalação para serviço, operação e uso -
  • -
  • - Treinamento em técnicas de remoção, atendimento e - transporte de acidentados -
  • -
  • Acidentes típicos
  • -
  • Responsabilidades
  • -
-
- -
-
-

Carga horária

-

40 horas

-
- -
-

Instrutor e responsável técnico

-
-

Francis Ricardo Baretta

-

CPF 039.539.409-02

-

Eng. de Segurança no Trabalho Eng. Eletricista

-

CREA/SC 126693-0

-
-
-
-
- -