update version

This commit is contained in:
2025-12-06 14:55:57 -03:00
parent f3cd5663bd
commit a56e051a18
23 changed files with 8766 additions and 1942 deletions

View File

@@ -25,5 +25,7 @@ def get_enrollment(enrollment_id: str):
+ SortKey('0')
+ SortKey('ORG', rename_key='org')
+ SortKey('CANCEL_POLICY', rename_key='cancel_policy')
+ SortKey('CREATED_BY', rename_key='created_by')
+ SortKey('CANCELED_BY', rename_key='canceled_by')
+ SortKey('LOCK', rename_key='lock')
)

View File

@@ -37,7 +37,7 @@ def cancel(
with dyn.transact_writer() as transact:
transact.update(
key=KeyPair(enrollment_id, '0'),
cond_expr='#status = pending',
cond_expr='#status = :pending',
update_expr='SET #status = :canceled, \
canceled_at = :now, \
updated_at = :now',

View File

@@ -119,6 +119,14 @@ def add_org(
'created_at': now_,
}
)
transact.put(
item={
'id': user.id,
'sk': f'SCOPE#{org_id}',
'scope': {'apps:admin'},
'created_at': now_,
}
)
transact.put(
item={
# Post-migration (users): rename `orgmembers#` to `MEMBER#ORG#`

View File

@@ -1,7 +1,13 @@
from http import HTTPStatus
from typing import Annotated
from aws_lambda_powertools.event_handler.api_gateway import Router
from aws_lambda_powertools.event_handler.exceptions import NotFoundError
from aws_lambda_powertools.event_handler.openapi.params import Body
from layercake.dateutils import now
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair
from layercake.extra_types import NameStr
from pydantic import UUID4, BaseModel, EmailStr
from api_gateway import JSONResponse
from boto3clients import dynamodb_client
@@ -11,6 +17,12 @@ router = Router()
dyn = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
class OrgNotFoundError(NotFoundError): ...
class MemberNotFoundError(NotFoundError): ...
@router.get('/<org_id>/admins')
def get_admins(org_id: str):
return dyn.collection.query(
@@ -20,9 +32,60 @@ def get_admins(org_id: str):
)
class User(BaseModel):
id: str | UUID4
name: NameStr
email: EmailStr
@router.post('/<org_id>/admins')
def add(org_id: str):
return JSONResponse(HTTPStatus.CREATED)
def add(org_id: str, user: Annotated[User, Body(embed=True)]):
now_ = now()
org = dyn.collection.get_item(
KeyPair(pk=org_id, sk='0'),
exc_cls=OrgNotFoundError,
)
with dyn.transact_writer() as transact:
transact.condition(
key=KeyPair(
# Post-migration (users): rename `orgmemebers#` to `MEMBER#ORG#`
pk=f'orgmembers#{org_id}',
sk=str(user.id),
),
cond_expr='attribute_exists(sk)',
exc_cls=MemberNotFoundError,
)
transact.put(
item={
'id': user.id,
# Post-migration (users): rename `orgs#` to `ORG#`
'sk': f'orgs#{org_id}',
'name': org['name'],
'cnpj': org['cnpj'],
'created_at': now_,
}
)
transact.put(
item={
'id': user.id,
'sk': f'SCOPE#{org_id}',
'scope': {'apps:admin'},
'created_at': now_,
}
)
transact.put(
item={
'id': org_id,
# Post-migrations (users): rename `admins#` to `ADMIN#`
'sk': f'admins#{user.id}',
'name': user.name,
'email': user.email,
'created_at': now_,
},
)
return JSONResponse(HTTPStatus.NO_CONTENT)
@router.delete('/<org_id>/admins/<user_id>')
@@ -32,5 +95,8 @@ def revoke(org_id: str, user_id: str):
# Post-migration: rename `admins` to `ADMIN`
key=KeyPair(org_id, f'admins#{user_id}'),
)
transact.delete(
key=KeyPair(user_id, f'SCOPE#{org_id}'),
)
return JSONResponse(HTTPStatus.NO_CONTENT)

View File

@@ -79,6 +79,9 @@ def unlink(org_id: str, user_id: str):
# Post-migration: uncomment the following line
# key=KeyPair(org_id, f'ADMIN#{user_id}'),
)
transact.delete(
key=KeyPair(user_id, f'SCOPE#{org_id}'),
)
transact.delete(
key=KeyPair(
pk=user_id,
@@ -90,6 +93,8 @@ def unlink(org_id: str, user_id: str):
transact.update(
key=KeyPair(user_id, '0'),
update_expr='DELETE tenant_id :org_id',
# Post-migration: uncomment the following line
# update_expr='DELETE org_id :org_id',
expr_attr_values={':org_id': {org_id}},
)

View File

@@ -10,5 +10,5 @@ router = Router()
dyn = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
@router.post('/<org_id>/users/batch-jobs')
@router.post('/<org_id>/users/batch')
def batch_jobs(org_id: str): ...

View File

@@ -195,7 +195,7 @@ def primary(
with dyn.transact_writer() as transact:
# Set the old email as non-primary
transact.update(
# Post-migration (users): rename `emails` to `EMAIL`
# Post-migration (users): rename `emails#` to `EMAIL#`
key=KeyPair(user_id, f'emails#{old_email}'),
update_expr=expr,
expr_attr_values={
@@ -206,7 +206,7 @@ def primary(
)
# Set the new email as primary
transact.update(
# Post-migration (users): rename `emails` to `EMAIL`
# Post-migration (users): rename `emails#` to `EMAIL#`
key=KeyPair(user_id, f'emails#{new_email}'),
update_expr=expr,
expr_attr_values={
@@ -243,7 +243,7 @@ def remove(
key=KeyPair('email', email),
)
transact.delete(
# Post-migration (users): rename `emails` to `EMAIL`
# Post-migration (users): rename `emails#` to `EMAIL#`
key=KeyPair(user_id, f'emails#{email}'),
# Delete any email except the primary email
cond_expr='email_primary <> :email_primary',

View File

@@ -18,7 +18,7 @@ def get_orgs(
limit: Annotated[int, Query(ge=25)] = 25,
):
return dyn.collection.query(
# Post-migration (users): rename `orgs` to `ORG`
# Post-migration (users): rename `orgs#` to `ORG#`
key=KeyPair(user_id, 'orgs#'),
start_key=start_key,
limit=limit,

View File

@@ -12,40 +12,40 @@
"typecheck": "npm run cf-typegen && react-router typegen && tsc -b"
},
"dependencies": {
"@react-router/fs-routes": "^7.9.5",
"@react-router/fs-routes": "^7.10.1",
"@repo/auth": "*",
"@repo/ui": "*",
"@repo/util": "^0.0.0",
"@tanstack/react-table": "^8.21.3",
"cookie": "^1.0.2",
"cookie": "^1.1.1",
"date-fns": "^4.1.0",
"flat": "^6.0.1",
"fuse.js": "^7.1.0",
"isbot": "^5.1.31",
"isbot": "^5.1.32",
"luxon": "^3.7.2",
"meilisearch": "^0.54.0",
"meilisearch-helper": "github:sergiors/meilisearch-helper",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react-router": "^7.9.5",
"react": "^19.2.1",
"react-dom": "^19.2.1",
"react-router": "^7.10.1",
"unique-names-generator": "^4.7.1",
"zod": "^4.1.12"
"zod": "^4.1.13"
},
"devDependencies": {
"@cloudflare/vite-plugin": "^1.13.18",
"@tailwindcss/vite": "^4.1.16",
"@cloudflare/vite-plugin": "^1.17.0",
"@tailwindcss/vite": "^4.1.17",
"@types/file-saver": "^2.0.7",
"@types/luxon": "^3.7.1",
"@types/node": "^24.9.2",
"@types/react": "^19.2.2",
"@types/react-dom": "^19.2.2",
"prettier": "^3.6.2",
"@types/node": "^24.10.1",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"prettier": "^3.7.4",
"remix-flat-routes": "^0.8.5",
"tailwindcss": "^4.1.16",
"tailwindcss": "^4.1.17",
"tw-animate-css": "^1.4.0",
"typescript": "^5.9.3",
"vite": "^7.1.12",
"vite": "^7.2.6",
"vite-tsconfig-paths": "^5.1.4",
"wrangler": "^4.45.3"
"wrangler": "^4.53.0"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -14,25 +14,25 @@
"dependencies": {
"@repo/ui": "*",
"@repo/util": "*",
"cookie": "^1.0.2",
"isbot": "^5.1.31",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react-router": "^7.9.5"
"cookie": "^1.1.1",
"isbot": "^5.1.32",
"react": "^19.2.1",
"react-dom": "^19.2.1",
"react-router": "^7.10.1"
},
"devDependencies": {
"@react-router/dev": "^7.9.5",
"@cloudflare/vite-plugin": "^1.13.17",
"@tailwindcss/vite": "^4.1.16",
"@react-router/dev": "^7.10.1",
"@cloudflare/vite-plugin": "^1.17.0",
"@tailwindcss/vite": "^4.1.17",
"@types/node": "^24",
"@types/react": "^19.2.2",
"@types/react-dom": "^19.2.2",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@types/statuses": "^2.0.6",
"tailwindcss": "^4.1.16",
"tailwindcss": "^4.1.17",
"tw-animate-css": "^1.4.0",
"typescript": "^5.9.3",
"vite": "^7.1.12",
"vite": "^7.2.6",
"vite-tsconfig-paths": "^5.1.4",
"wrangler": "^4.45.2"
"wrangler": "^4.53.0"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -12,33 +12,33 @@
"typecheck": "npm run cf-typegen && react-router typegen && tsc --noEmit"
},
"dependencies": {
"@react-router/fs-routes": "^7.9.6",
"@react-router/fs-routes": "^7.10.1",
"@repo/auth": "*",
"@repo/ui": "*",
"@repo/util": "*",
"@tanstack/react-table": "^8.21.3",
"cookie": "^1.0.2",
"cookie": "^1.1.1",
"flat": "^6.0.1",
"isbot": "^5.1.31",
"lucide-react": "^0.548.0",
"react": "^19.1.1",
"react-dom": "^19.1.1",
"react-router": "^7.9.2",
"isbot": "^5.1.32",
"lucide-react": "^0.556.0",
"react": "^19.2.1",
"react-dom": "^19.2.1",
"react-router": "^7.10.1",
"meilisearch": "^0.54.0",
"meilisearch-helper": "github:sergiors/meilisearch-helper",
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz"
},
"devDependencies": {
"@cloudflare/vite-plugin": "^1.13.5",
"@react-router/dev": "^7.9.2",
"@tailwindcss/vite": "^4.1.13",
"@types/node": "^22",
"@types/react": "^19.1.13",
"@types/react-dom": "^19.1.9",
"tailwindcss": "^4.1.13",
"typescript": "^5.9.2",
"vite": "^7.1.7",
"@cloudflare/vite-plugin": "^1.17.0",
"@react-router/dev": "^7.10.1",
"@tailwindcss/vite": "^4.1.17",
"@types/node": "^24",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"tailwindcss": "^4.1.17",
"typescript": "^5.9.3",
"vite": "^7.2.6",
"vite-tsconfig-paths": "^5.1.4",
"wrangler": "^4.40.0"
"wrangler": "^4.53.0"
}
}

View File

@@ -18,33 +18,33 @@
"@tanstack/react-table": "^8.21.3",
"crypto-js": "^4.2.0",
"fuse.js": "^7.1.0",
"isbot": "^5.1.31",
"isbot": "^5.1.32",
"lzwcompress": "^1.1.0",
"meilisearch": "^0.54.0",
"meilisearch-helper": "github:sergiors/meilisearch-helper",
"ramda": "^0.32.0",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react-router": "^7.9.5",
"react": "^19.2.1",
"react-dom": "^19.2.1",
"react-router": "^7.10.1",
"rrweb": "^2.0.0-alpha.4",
"scorm-again": "^2.6.7",
"zod": "^4.1.12"
"zod": "^4.1.13"
},
"devDependencies": {
"@cloudflare/vite-plugin": "^1.13.17",
"@react-router/dev": "^7.9.5",
"@tailwindcss/vite": "^4.1.16",
"@cloudflare/vite-plugin": "^1.17.0",
"@react-router/dev": "^7.10.1",
"@tailwindcss/vite": "^4.1.17",
"@types/crypto-js": "^4.2.2",
"@types/node": "^24",
"@types/ramda": "^0.31.1",
"@types/react": "^19.2.2",
"@types/react-dom": "^19.2.2",
"prettier": "^3.6.2",
"tailwindcss": "^4.1.16",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"prettier": "^3.7.4",
"tailwindcss": "^4.1.17",
"tw-animate-css": "^1.4.0",
"typescript": "^5.9.3",
"vite": "^7.1.12",
"vite": "^7.2.6",
"vite-tsconfig-paths": "^5.1.4",
"wrangler": "^4.45.2"
"wrangler": "^4.53.0"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -16,26 +16,26 @@
"@repo/auth": "*",
"@repo/ui": "*",
"fuse.js": "^7.1.0",
"isbot": "^5.1.31",
"jose": "^6.1.0",
"isbot": "^5.1.32",
"jose": "^6.1.3",
"lodash": "^4.17.21",
"lucide-react": "^0.548.0",
"lucide-react": "^0.556.0",
"meilisearch": "^0.54.0",
"react": "^19.2.0",
"react-dom": "^19.2.0"
"react": "^19.2.1",
"react-dom": "^19.2.1"
},
"devDependencies": {
"@cloudflare/vite-plugin": "^1.13.17",
"@react-router/dev": "^7.9.5",
"@tailwindcss/vite": "^4.1.16",
"@cloudflare/vite-plugin": "^1.17.0",
"@react-router/dev": "^7.10.1",
"@tailwindcss/vite": "^4.1.17",
"@types/node": "^24",
"@types/react": "^19.2.2",
"@types/react-dom": "^19.2.2",
"tailwindcss": "^4.1.16",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"tailwindcss": "^4.1.17",
"tw-animate-css": "^1.4.0",
"typescript": "^5.9.3",
"vite": "^7.1.12",
"vite": "^7.2.6",
"vite-tsconfig-paths": "^5.1.4",
"wrangler": "^4.45.2"
"wrangler": "^4.53.0"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -16,14 +16,14 @@
// Post-migrations (users): rename `emails#` to `EMAIL#`
{"id": "357db1c5-7442-4075-98a3-fbe5c938a419", "sk": "emails#sergio@somosbeta.com.br", "email_verified": true}
{"id": "357db1c5-7442-4075-98a3-fbe5c938a419", "sk": "PASSWORD", "hash": "$pbkdf2-sha256$29000$IuTcm7M2BiAEgPB.b.3dGw$d8xVCbx8zxg7MeQBrOvCOgniiilsIHEMHzoH/OXftLQ"}
{"id": "357db1c5-7442-4075-98a3-fbe5c938a419", "sk": "SCOPE", "scope": ["openid", "profile", "email", "offline_access", "apps:admin"]}
{"id": "357db1c5-7442-4075-98a3-fbe5c938a419", "sk": "SCOPE#*", "scope": ["openid", "profile", "email", "offline_access", "apps:admin"]}
{"id": "357db1c5-7442-4075-98a3-fbe5c938a419", "sk": "SESSION#36af142e-9f6d-49d3-bfe9-6a6bd6ab2712", "created_at": "2025-09-17T13:44:34.544491-03:00", "ttl": 1760719474}
{"id": "357db1c5-7442-4075-98a3-fbe5c938a419", "sk": "NEVER_LOGGED"}
{"id": "fd5914ec-fd37-458b-b6b9-8aeab38b666b", "sk": "0", "name": "Johnny Cash", "email": "johnny@johnnycash.com"}
{"id": "fd5914ec-fd37-458b-b6b9-8aeab38b666b", "sk": "PASSWORD", "hash": "$pbkdf2-sha256$29000$IuTcm7M2BiAEgPB.b.3dGw$d8xVCbx8zxg7MeQBrOvCOgniiilsIHEMHzoH/OXftLQ"}
{"id": "fd5914ec-fd37-458b-b6b9-8aeab38b666b", "sk": "SCOPE", "scope": ["openid"]}
{"id": "fd5914ec-fd37-458b-b6b9-8aeab38b666b", "sk": "SCOPE#*", "scope": ["openid"]}
{"id": "email", "sk": "sergio@somosbeta.com.br", "user_id": "357db1c5-7442-4075-98a3-fbe5c938a419"}
{"id": "email", "sk": "osergiosiqueira@gmail.com", "user_id": "357db1c5-7442-4075-98a3-fbe5c938a419"}

2225
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -8,19 +8,19 @@
"check-types": "turbo run check-types"
},
"devDependencies": {
"prettier": "^3.6.2",
"turbo": "^2.6.2",
"typescript": "5.9.2"
"prettier": "^3.7.4",
"turbo": "^2.6.3",
"typescript": "5.9.3"
},
"optionalDependencies": {
"@rollup/rollup-linux-x64-gnu": "^4.52.5",
"@tailwindcss/oxide-linux-x64-gnu": "^4.1.16",
"@rollup/rollup-linux-x64-gnu": "^4.53.3",
"@tailwindcss/oxide-linux-x64-gnu": "^4.1.17",
"lightningcss-linux-x64-gnu": "^1.30.2"
},
"engines": {
"node": ">=18"
},
"packageManager": "npm@11.5.2",
"packageManager": "npm@11.6.4",
"workspaces": [
"apps/*",
"packages/*"

View File

@@ -9,14 +9,14 @@
"./middleware/*": "./src/middleware/*.ts"
},
"dependencies": {
"jose": "^6.1.0",
"jose": "^6.1.3",
"remix-auth-oauth2": "^3.4.1"
},
"devDependencies": {
"react-router": "^7.9.5",
"@types/node": "^24.9.2",
"@types/react": "^19.2.2",
"@types/react-dom": "^19.2.2",
"react-router": "^7.10.1",
"@types/node": "^24.10.1",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"typescript": "^5.9.3"
}
}

View File

@@ -15,14 +15,14 @@
"./components/data-table": "./src/components/data-table/index.ts"
},
"dependencies": {
"@brazilian-utils/brazilian-utils": "^1.0.0-rc.12",
"@brazilian-utils/brazilian-utils": "^1.1.0",
"@hookform/resolvers": "^5.2.2",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-avatar": "^1.1.10",
"@radix-ui/react-avatar": "^1.1.11",
"@radix-ui/react-checkbox": "^1.3.3",
"@radix-ui/react-dialog": "^1.1.15",
"@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-label": "^2.1.7",
"@radix-ui/react-label": "^2.1.8",
"@radix-ui/react-navigation-menu": "^1.2.14",
"@radix-ui/react-popover": "^1.1.15",
"@radix-ui/react-progress": "^1.1.8",
@@ -32,31 +32,31 @@
"@radix-ui/react-switch": "^1.2.6",
"@radix-ui/react-tabs": "^1.1.13",
"@radix-ui/react-tooltip": "^1.2.8",
"@tailwindcss/postcss": "^4.1.16",
"@tailwindcss/vite": "^4.1.16",
"@tailwindcss/postcss": "^4.1.17",
"@tailwindcss/vite": "^4.1.17",
"ahooks": "^3.9.6",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"date-fns": "^4.1.0",
"lodash": "^4.17.21",
"lucide-react": "^0.548.0",
"lucide-react": "^0.556.0",
"next-themes": "^0.4.6",
"postcss": "^8.5.6",
"react-day-picker": "^9.11.1",
"react-hook-form": "^7.66.0",
"react-day-picker": "^9.11.3",
"react-hook-form": "^7.68.0",
"react-number-format": "^5.4.4",
"sonner": "^2.0.7",
"tailwind-merge": "^3.3.1",
"tailwindcss": "^4.1.16",
"tailwind-merge": "^3.4.0",
"tailwindcss": "^4.1.17",
"tw-animate-css": "^1.4.0",
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
"zod": "^4.1.12"
"zod": "^4.1.13"
},
"devDependencies": {
"@types/lodash": "^4.17.20",
"typescript": "^5.9.2",
"vite": "^7.2.0",
"@types/lodash": "^4.17.21",
"typescript": "^5.9.3",
"vite": "^7.2.6",
"vite-tsconfig-paths": "^5.1.4"
}
}

View File

@@ -7,9 +7,9 @@
},
"devDependencies": {
"@repo/auth": "*",
"@types/node": "^24.9.2",
"@types/react": "^19.2.2",
"@types/react-dom": "^19.2.2",
"@types/node": "^24.10.1",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"typescript": "^5.9.3"
}
}