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