From 2f390ab20250154a4fea63dcfe0b9f6cffa77510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Rafael=20Siqueira?= Date: Sun, 18 Jan 2026 13:16:17 -0300 Subject: [PATCH] check if subscription if not freeze --- enrollments-events/app/enrollment.py | 33 ++++++++++++++++++++++++++-- enrollments-events/template.yaml | 2 ++ enrollments-events/tests/seeds.jsonl | 3 +++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/enrollments-events/app/enrollment.py b/enrollments-events/app/enrollment.py index afa94aa..f9703c9 100644 --- a/enrollments-events/app/enrollment.py +++ b/enrollments-events/app/enrollment.py @@ -6,7 +6,7 @@ from typing import Any, Literal, TypedDict from uuid import uuid4 from layercake.dateutils import now, ttl -from layercake.dynamodb import DynamoDBPersistenceLayer +from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair from layercake.extra_types import CpfStr, NameStr from layercake.strutils import md5_hash from pydantic import ( @@ -18,7 +18,7 @@ from pydantic import ( ) from typing_extensions import NotRequired -from config import DEDUP_WINDOW_OFFSET_DAYS +from config import DEDUP_WINDOW_OFFSET_DAYS, USER_TABLE class User(BaseModel): @@ -90,6 +90,16 @@ class DeduplicationConflictError(Exception): super().__init__('Enrollment already exists') +class SubscriptionRequiredError(Exception): + def __init__(self, msg: str | dict): + super().__init__('Subscription required') + + +class SubscriptionFrozenError(Exception): + def __init__(self, msg: str | dict): + super().__init__('Subscription is frozen') + + def enroll( enrollment: Enrollment, *, @@ -164,6 +174,7 @@ def enroll( ) if subscription: + org_id = subscription['org_id'] transact.put( item={ 'id': enrollment.id, @@ -172,6 +183,24 @@ def enroll( } | subscription, ) + transact.condition( + key=KeyPair( + pk='SUBSCRIPTION', + sk=f'ORG#{org_id}', + ), + cond_expr='attribute_exists(sk)', + exc_cls=SubscriptionRequiredError, + table_name=USER_TABLE, + ) + transact.condition( + key=KeyPair( + pk='SUBSCRIPTION#FREEZE', + sk=f'ORG#{org_id}', + ), + cond_expr='attribute_not_exists(sk)', + exc_cls=SubscriptionFrozenError, + table_name=USER_TABLE, + ) if created_by: transact.put( diff --git a/enrollments-events/template.yaml b/enrollments-events/template.yaml index ea2b54e..95b844f 100644 --- a/enrollments-events/template.yaml +++ b/enrollments-events/template.yaml @@ -194,6 +194,8 @@ Resources: Policies: - DynamoDBCrudPolicy: TableName: !Ref EnrollmentTable + - DynamoDBReadPolicy: + TableName: !Ref UserTable Events: DynamoDBEvent: Type: EventBridgeRule diff --git a/enrollments-events/tests/seeds.jsonl b/enrollments-events/tests/seeds.jsonl index ae4d7db..3420734 100644 --- a/enrollments-events/tests/seeds.jsonl +++ b/enrollments-events/tests/seeds.jsonl @@ -45,3 +45,6 @@ {"id": "1e2eaf0e-e319-49eb-ab33-1ddec156dc94", "sk": "0", "name": "pytest"} // Org admins {"id": "00237409-9384-4692-9be5-b4443a41e1c4", "sk": "admins#1234", "email": "sergio@somosbeta.com.br", "name": "Sérgio R Siqueira"} + +// file: tests/events/test_reenroll_if_failed.py::test_reenroll_custom_dedup_window +{"id": "SUBSCRIPTION", "sk": "ORG#123"} \ No newline at end of file