From 7e09e49ed81c1724319f8b869ecf838d5cae9227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Rafael=20Siqueira?= Date: Tue, 13 Jan 2026 04:03:09 -0300 Subject: [PATCH] add route to payment's details --- api.saladeaula.digital/app/exceptions.py | 3 + .../app/routes/orders/__init__.py | 27 +++++++-- .../_.$orgid.payments.$id._index/route.tsx | 56 +++++++++++++++++++ .../app/routes/_.$orgid.users.$id/route.tsx | 7 +-- .../app/events/payments/charge_credit_card.py | 4 +- 5 files changed, 84 insertions(+), 13 deletions(-) create mode 100644 apps/admin.saladeaula.digital/app/routes/_.$orgid.payments.$id._index/route.tsx diff --git a/api.saladeaula.digital/app/exceptions.py b/api.saladeaula.digital/app/exceptions.py index 26b5463..f139555 100644 --- a/api.saladeaula.digital/app/exceptions.py +++ b/api.saladeaula.digital/app/exceptions.py @@ -11,6 +11,9 @@ class ConflictError(ServiceError): super().__init__(HTTPStatus.CONFLICT, msg) +class OrderNotFoundError(NotFoundError): ... + + class UserNotFoundError(NotFoundError): ... diff --git a/api.saladeaula.digital/app/routes/orders/__init__.py b/api.saladeaula.digital/app/routes/orders/__init__.py index 77434d5..c4d1ed8 100644 --- a/api.saladeaula.digital/app/routes/orders/__init__.py +++ b/api.saladeaula.digital/app/routes/orders/__init__.py @@ -1,12 +1,14 @@ from aws_lambda_powertools.event_handler.api_gateway import Router from layercake.dynamodb import ( DynamoDBPersistenceLayer, + KeyPair, SortKey, TransactKey, ) from boto3clients import dynamodb_client from config import ORDER_TABLE +from exceptions import OrderNotFoundError from .checkout import router as checkout @@ -18,12 +20,25 @@ dyn = DynamoDBPersistenceLayer(ORDER_TABLE, dynamodb_client) @router.get('/') def get_order(order_id: str): - return dyn.collection.get_items( + order = dyn.collection.get_items( TransactKey(order_id) + SortKey('0') - + SortKey('ITEMS') - + SortKey('ADDRESS') - + SortKey('PIX') - + SortKey('NFSE') - + SortKey('FEE'), + + SortKey('ITEMS', rename_key='items') + + SortKey('ADDRESS', rename_key='address') + + SortKey('CREDIT_CARD', rename_key='credit_card') + + SortKey('INVOICE', rename_key='invoice') + + SortKey('NFSE', rename_key='nfse') + + SortKey('FEE', rename_key='fee') + + SortKey('TRANSACTION#STATS', rename_key='stats'), ) + + if not order: + raise OrderNotFoundError('Order not found') + + attempts = dyn.collection.query(KeyPair(order_id, 'TRANSACTION#ATTEMPT#')) + enrollments = dyn.collection.query(KeyPair(order_id, 'ENROLLMENT#')) + + return order | { + 'attempts': attempts['items'], + 'enrollments': enrollments['items'], + } diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.payments.$id._index/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.payments.$id._index/route.tsx new file mode 100644 index 0000000..1e500a0 --- /dev/null +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.payments.$id._index/route.tsx @@ -0,0 +1,56 @@ +import type { Route } from './+types/route' + +import { Link } from 'react-router' + +import { request as req } from '@repo/util/request' +import { + Breadcrumb, + BreadcrumbItem, + BreadcrumbLink, + BreadcrumbList, + BreadcrumbPage, + BreadcrumbSeparator +} from '@repo/ui/components/ui/breadcrumb' + +export function meta() { + return [ + { + title: 'Pagamento' + } + ] +} + +export async function loader({ params, request, context }: Route.LoaderArgs) { + const r = await req({ + url: `/orders/${params.id}`, + request, + context + }) + + if (!r.ok) { + throw new Response(null, { status: r.status }) + } + + return { order: await r.json() } +} + +export default function Route({ loaderData: { order } }: Route.ComponentProps) { + return ( +
+ + + + + Histórico de pagamentos + + + + + Pagamento + + + +
{JSON.stringify(order, null, 2)}
+
+ ) +} diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id/route.tsx index 55265f0..03afd4d 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users.$id/route.tsx @@ -44,8 +44,7 @@ export async function loader({ params, request, context }: Route.LoaderArgs) { throw new Response(null, { status: r.status }) } - const data = await r.json() - return { data } as { data: any } + return { user: await r.json() } as { user: any } } export function shouldRevalidate({ @@ -55,9 +54,7 @@ export function shouldRevalidate({ return currentParams.id !== nextParams.id } -export default function Route({ - loaderData: { data: user } -}: Route.ComponentProps) { +export default function Route({ loaderData: { user } }: Route.ComponentProps) { return (
diff --git a/orders-events/app/events/payments/charge_credit_card.py b/orders-events/app/events/payments/charge_credit_card.py index 73c8ee3..2ed5111 100644 --- a/orders-events/app/events/payments/charge_credit_card.py +++ b/orders-events/app/events/payments/charge_credit_card.py @@ -77,7 +77,7 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: transact.put( item={ 'id': order_id, - 'sk': f'TRANSACTION#ATTEMPTS#{now_.isoformat()}', + 'sk': f'TRANSACTION#ATTEMPT#{now_.isoformat()}', 'brand': credit_card.brand, 'last4': credit_card.last4, 'status': 'SUCCEEDED', @@ -88,7 +88,7 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: transact.put( item={ 'id': order_id, - 'sk': f'TRANSACTION#ATTEMPTS#{now_.isoformat()}', + 'sk': f'TRANSACTION#ATTEMPT#{now_.isoformat()}', 'brand': credit_card.brand, 'last4': credit_card.last4, 'status': 'FAILED',