update login

This commit is contained in:
2025-11-28 16:07:59 -03:00
parent 2b0efc654a
commit c71e19eacb
14 changed files with 251 additions and 16 deletions

View File

@@ -43,6 +43,7 @@ app.include_router(enrollments.scorm, prefix='/enrollments')
app.include_router(users.router, prefix='/users')
app.include_router(users.emails, prefix='/users')
app.include_router(users.orgs, prefix='/users')
app.include_router(users.password, prefix='/users')
app.include_router(orders.router, prefix='/orders')
app.include_router(orgs.admins, prefix='/orgs')
app.include_router(orgs.custom_pricing, prefix='/orgs')

View File

@@ -9,8 +9,9 @@ from config import USER_TABLE
from .emails import router as emails
from .orgs import router as orgs
from .password import router as password
__all__ = ['emails', 'orgs']
__all__ = ['emails', 'orgs', 'password']
router = Router()
dyn = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)

View File

@@ -0,0 +1,42 @@
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 passlib.hash import pbkdf2_sha256
from api_gateway import JSONResponse
from boto3clients import dynamodb_client
from config import USER_TABLE
router = Router()
dyn = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
class UserNotFoundError(NotFoundError): ...
@router.post('/<user_id>/password')
def password(
user_id: str,
new_password: Annotated[str, Body(min_length=6, embed=True)],
):
with dyn.transact_writer() as transact:
transact.condition(
key=KeyPair(user_id, '0'),
cond_expr='attribute_exists(sk)',
exc_cls=UserNotFoundError,
)
transact.put(
item={
'id': user_id,
'sk': 'PASSWORD',
'hash': pbkdf2_sha256.hash(new_password),
'created_at': now(),
}
)
return JSONResponse(status_code=HTTPStatus.NO_CONTENT)

View File

@@ -0,0 +1,21 @@
from http import HTTPMethod, HTTPStatus
from ...conftest import HttpApiProxy, LambdaContext
def test_password(
app,
seeds,
http_api_proxy: HttpApiProxy,
lambda_context: LambdaContext,
):
r = app.lambda_handler(
http_api_proxy(
raw_path='/users/15bacf02-1535-4bee-9022-19d106fd7518/password',
method=HTTPMethod.POST,
body={'new_password': '123@56'},
),
lambda_context,
)
assert r['statusCode'] == HTTPStatus.NO_CONTENT