diff --git a/api.saladeaula.digital/app/routes/orgs/__init__.py b/api.saladeaula.digital/app/routes/orgs/__init__.py index 395c57f..f351e67 100644 --- a/api.saladeaula.digital/app/routes/orgs/__init__.py +++ b/api.saladeaula.digital/app/routes/orgs/__init__.py @@ -45,6 +45,7 @@ def get_org(org_id: str): + SortKey('METADATA#ADDRESS', rename_key='address') + SortKey('METADATA#BILLING', rename_key='billing') + SortKey('METADATA#SUBSCRIPTION', rename_key='subscription') + + SortKey('METADATA#TEST_MODE', rename_key='test_mode') + KeyPair( pk='SUBSCRIPTION#FROZEN', sk=SortKey(f'ORG#{org_id}'), diff --git a/apps/admin.saladeaula.digital/app/components/workspace-switcher.tsx b/apps/admin.saladeaula.digital/app/components/workspace-switcher.tsx index aa80352..e13d35b 100644 --- a/apps/admin.saladeaula.digital/app/components/workspace-switcher.tsx +++ b/apps/admin.saladeaula.digital/app/components/workspace-switcher.tsx @@ -5,6 +5,7 @@ import { BadgeCheckIcon, CheckIcon, ChevronsUpDownIcon, + FlaskConicalIcon, PlusIcon } from 'lucide-react' import { createContext, use } from 'react' @@ -54,7 +55,8 @@ export function WorkspaceProvider({ export function WorkspaceSwitcher() { const location = useLocation() const { isMobile, state } = useSidebar() - const { activeWorkspace, workspaces, subscription } = useWorksapce() + const { activeWorkspace, workspaces, subscription, test_mode } = + useWorksapce() const [, fragment, _] = location.pathname.slice(1).split('/') const onSelect = (workspace: Workspace) => { @@ -74,10 +76,14 @@ export function WorkspaceSwitcher() { className="aria-expanded:border flex aspect-square size-8 items-center justify-center rounded-lg relative" aria-expanded={state === 'expanded'} > - {subscription ? ( + {subscription && !test_mode ? ( ) : null} + {test_mode ? ( + + ) : null} + {initials(activeWorkspace.name)}
diff --git a/apps/admin.saladeaula.digital/app/middleware/workspace.ts b/apps/admin.saladeaula.digital/app/middleware/workspace.ts index f45ac4d..89ffff8 100644 --- a/apps/admin.saladeaula.digital/app/middleware/workspace.ts +++ b/apps/admin.saladeaula.digital/app/middleware/workspace.ts @@ -22,6 +22,7 @@ export type WorkspaceContextProps = { workspaces: Workspace[] subscription: Subscription | null address: Address | null + test_mode: boolean } export const workspaceContext = createContext< @@ -66,6 +67,7 @@ export const workspaceMiddleware = async ( workspaces, subscription: org?.['subscription'] || null, address: org?.['address'] || null, + test_mode: 'test_mode' in org, blocked: 'subscription_frozen' in org }) diff --git a/orders-events/app/events/run_self_destruction.py b/orders-events/app/events/run_self_destruction.py new file mode 100644 index 0000000..86b1f19 --- /dev/null +++ b/orders-events/app/events/run_self_destruction.py @@ -0,0 +1,39 @@ +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.data_classes import ( + EventBridgeEvent, + event_source, +) +from aws_lambda_powertools.utilities.typing import LambdaContext +from layercake.dynamodb import ( + DynamoDBPersistenceLayer, + PartitionKey, +) + +from boto3clients import dynamodb_client +from config import ORDER_TABLE + +logger = Logger(__name__) +dyn = DynamoDBPersistenceLayer(ORDER_TABLE, dynamodb_client) + + +@event_source(data_class=EventBridgeEvent) +@logger.inject_lambda_context +def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: + keys = event.detail['keys'] + order_id = keys['id'] + + r = dyn.collection.query(PartitionKey(order_id), limit=150) + logger.info('Records found', total_items=len(r['items']), records=r['items']) + + with dyn.batch_writer() as batch: + for pair in r['items']: + batch.delete_item( + Key={ + 'id': {'S': pair['id']}, + 'sk': {'S': pair['sk']}, + } + ) + + logger.info('Deleted all records') + + return True diff --git a/orders-events/template.yaml b/orders-events/template.yaml index 3608386..f9e8318 100644 --- a/orders-events/template.yaml +++ b/orders-events/template.yaml @@ -96,6 +96,8 @@ Resources: detail: new_image: sk: ['0'] + payment_method: + - anything-but: [MANUAL] EventPaymentsChargeCreditCardFunction: Type: AWS::Serverless::Function @@ -245,6 +247,26 @@ Resources: old_image: status: [PENDING] + EventRunSelfDestructionFunction: + Type: AWS::Serverless::Function + Properties: + Handler: events.run_self_destruction.lambda_handler + LoggingConfig: + LogGroup: !Ref EventLog + Policies: + - DynamoDBCrudPolicy: + TableName: !Ref OrderTable + Events: + Event: + Type: EventBridgeRule + Properties: + Pattern: + resources: [!Ref OrderTable] + detail-type: [EXPIRE] + detail: + keys: + sk: ['SCHEDULE#SELF_DESTRUCTION'] + # DEPRECATED EventAppendOrgIdFunction: Type: AWS::Serverless::Function