add test mode to checkout

This commit is contained in:
2026-01-20 10:41:32 -03:00
parent fde5c31ffc
commit 49e0c3333b
13 changed files with 847 additions and 493 deletions

View File

@@ -4,7 +4,7 @@ from decimal import Decimal
from enum import Enum
from functools import reduce
from http import HTTPStatus
from typing import Any, Literal
from typing import Any, Literal, NotRequired, TypedDict, cast
from uuid import uuid4
from aws_lambda_powertools import Logger
@@ -13,7 +13,7 @@ from aws_lambda_powertools.event_handler.exceptions import (
NotFoundError,
)
from layercake.dateutils import now, ttl
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair, SortKey
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair, SortKey, TransactKey
from layercake.extra_types import CnpjStr, CpfStr, CreditCard, NameStr
from pydantic import (
UUID4,
@@ -136,8 +136,8 @@ class Checkout(BaseModel):
@router.post('/')
def checkout(payload: Checkout):
now_ = now()
settings = _get_settings(str(payload.org_id or payload.user_id))
order_id = payload.id
org_id = payload.org_id
address = payload.address
credit_card = payload.credit_card
created_by = payload.created_by
@@ -148,7 +148,7 @@ def checkout(payload: Checkout):
installments = payload.installments
subtotal = _sum_items(items)
due_date = (
_calc_due_date(now_, _get_due_days(org_id) if org_id else DUE_DAYS)
_calc_due_date(now_, settings['due_days'])
if payment_method == 'BANK_SLIP'
else now_ + timedelta(hours=1)
)
@@ -267,6 +267,16 @@ def checkout(payload: Checkout):
| enrollment.model_dump(exclude={'id'})
)
if 'iugu_api_token' in settings:
transact.put(
item={
'id': order_id,
'sk': 'METADATA#TEST_MODE',
'iugu_api_token': settings['iugu_api_token'],
'created_at': now_,
}
)
return JSONResponse(
body={'id': order_id},
status_code=HTTPStatus.CREATED,
@@ -319,18 +329,32 @@ def _calc_due_date(
return due_date
def _get_due_days(
org_id: str | UUID4,
default: int = DUE_DAYS,
) -> int:
return int(
dyn.collection.get_item(
KeyPair(
pk=str(org_id),
sk=SortKey('METADATA#BILLING', path_spec='due_days'),
table_name=USER_TABLE,
),
raise_on_error=False,
default=default,
Settings = TypedDict(
'Settings',
{
'due_days': int,
'iugu_api_token': NotRequired[str],
},
)
def _get_settings(id: str) -> Settings:
r = dyn.collection.get_items(
TransactKey(id, table_name=USER_TABLE)
+ SortKey(
sk='METADATA#BILLING',
path_spec='due_days',
rename_key='due_days',
)
+ SortKey(
'METADATA#TEST_MODE',
path_spec='iugu_api_token',
rename_key='iugu_api_token',
),
flatten_top=False,
)
if 'due_days' not in r:
r['due_days'] = DUE_DAYS
return cast(Settings, r)