|
@@ -37,9 +37,9 @@ async def exists_user(request: UserIDRequest):
|
|
|
"""Check if user exists"""
|
|
"""Check if user exists"""
|
|
|
user = user_data_service.get_by_id(request.id)
|
|
user = user_data_service.get_by_id(request.id)
|
|
|
if user:
|
|
if user:
|
|
|
- return success_response({"exists": True, "message": UserResponse.USER_EXISTS})
|
|
|
|
|
|
|
+ return success_response(data={"exists": True}, message=UserResponse.USER_EXISTS)
|
|
|
else:
|
|
else:
|
|
|
- return error_response({"exists": False, "message": UserResponse.USER_DOES_NOT_EXIST})
|
|
|
|
|
|
|
+ return error_response(error={"exists": False}, message=UserResponse.USER_DOES_NOT_EXIST)
|
|
|
|
|
|
|
|
@user_router.post("/register")
|
|
@user_router.post("/register")
|
|
|
async def register_user(request: RegisterUserRequest):
|
|
async def register_user(request: RegisterUserRequest):
|
|
@@ -52,7 +52,7 @@ async def register_user(request: RegisterUserRequest):
|
|
|
if not validate_rut(request.rut):
|
|
if not validate_rut(request.rut):
|
|
|
logger.warning(f"Registration failed for {request.email}: invalid RUT {request.rut}")
|
|
logger.warning(f"Registration failed for {request.email}: invalid RUT {request.rut}")
|
|
|
|
|
|
|
|
- return error_response({"message": ErrorResponse.INVALID_RUT})
|
|
|
|
|
|
|
+ return error_response(message=ErrorResponse.INVALID_RUT)
|
|
|
|
|
|
|
|
# Check if user already exists by email
|
|
# Check if user already exists by email
|
|
|
try:
|
|
try:
|
|
@@ -60,14 +60,14 @@ async def register_user(request: RegisterUserRequest):
|
|
|
if user:
|
|
if user:
|
|
|
logger.warning(f"Registration failed for {request.email}: user already exists")
|
|
logger.warning(f"Registration failed for {request.email}: user already exists")
|
|
|
|
|
|
|
|
- return error_response({"message": UserResponse.USER_ALREADY_EXISTS})
|
|
|
|
|
|
|
+ return error_response(message=UserResponse.USER_ALREADY_EXISTS)
|
|
|
|
|
|
|
|
# Check if RUT already exists
|
|
# Check if RUT already exists
|
|
|
user = user_data_service.get_by_rut(request.rut)
|
|
user = user_data_service.get_by_rut(request.rut)
|
|
|
if user:
|
|
if user:
|
|
|
logger.warning(f"Registration failed for {request.email}: RUT already exists")
|
|
logger.warning(f"Registration failed for {request.email}: RUT already exists")
|
|
|
|
|
|
|
|
- return error_response({"message": UserResponse.USER_ALREADY_EXISTS})
|
|
|
|
|
|
|
+ return error_response(message=UserResponse.USER_ALREADY_EXISTS)
|
|
|
|
|
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
error_msg = f"Database error during user validation: {e}"
|
|
error_msg = f"Database error during user validation: {e}"
|
|
@@ -101,20 +101,20 @@ async def register_user(request: RegisterUserRequest):
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
- return success_response({"message": SuccessResponse.USER_CREATED_SUCCESS}, status_code=201)
|
|
|
|
|
|
|
+ return success_response(message=SuccessResponse.USER_CREATED_SUCCESS, status_code=201)
|
|
|
|
|
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
error_msg = f"Error during registration process for {request.email}: {e}"
|
|
error_msg = f"Error during registration process for {request.email}: {e}"
|
|
|
logger.error(error_msg)
|
|
logger.error(error_msg)
|
|
|
|
|
|
|
|
- return error_response({"message": f"Error interno del servidor: {e}"}, status_code=500)
|
|
|
|
|
|
|
+ return error_response(message=f"Error interno del servidor: {e}", status_code=500)
|
|
|
|
|
|
|
|
@user_router.post("/create-user")
|
|
@user_router.post("/create-user")
|
|
|
async def create_user(request: PinUserRequest, q: str):
|
|
async def create_user(request: PinUserRequest, q: str):
|
|
|
"""Create a new user with PIN"""
|
|
"""Create a new user with PIN"""
|
|
|
data = redis_client.get(f"verify:{q}")
|
|
data = redis_client.get(f"verify:{q}")
|
|
|
if not redis_client.get(f"verify:{q}"):
|
|
if not redis_client.get(f"verify:{q}"):
|
|
|
- return error_response({"message": ErrorResponse.INVALID_VERIFICATION_CODE})
|
|
|
|
|
|
|
+ return error_response(message=ErrorResponse.INVALID_VERIFICATION_CODE)
|
|
|
else:
|
|
else:
|
|
|
data = json.loads(str(data))
|
|
data = json.loads(str(data))
|
|
|
name = data.get("name")
|
|
name = data.get("name")
|
|
@@ -122,20 +122,20 @@ async def create_user(request: PinUserRequest, q: str):
|
|
|
rut = data.get("rut")
|
|
rut = data.get("rut")
|
|
|
pin = request.pin
|
|
pin = request.pin
|
|
|
if not request.pin or len(request.pin) != 4:
|
|
if not request.pin or len(request.pin) != 4:
|
|
|
- return error_response({"message": ErrorResponse.INVALID_PIN})
|
|
|
|
|
|
|
+ return error_response(message=ErrorResponse.INVALID_PIN)
|
|
|
userID = user_data_service.create(name, email, rut, pin)
|
|
userID = user_data_service.create(name, email, rut, pin)
|
|
|
if userID == -1:
|
|
if userID == -1:
|
|
|
- return error_response({"message": UserResponse.USER_ALREADY_EXISTS})
|
|
|
|
|
|
|
+ return error_response(message=UserResponse.USER_ALREADY_EXISTS)
|
|
|
user = user_data_service.get_by_id(userID)
|
|
user = user_data_service.get_by_id(userID)
|
|
|
if not user:
|
|
if not user:
|
|
|
logger.error(f"User creation failed for {email}: user not found after creation")
|
|
logger.error(f"User creation failed for {email}: user not found after creation")
|
|
|
- return error_response({"message": ErrorResponse.USER_CREATION_ERROR})
|
|
|
|
|
|
|
+ return error_response(message=ErrorResponse.USER_CREATION_ERROR)
|
|
|
|
|
|
|
|
logger.info(f"User created successfully: {email}")
|
|
logger.info(f"User created successfully: {email}")
|
|
|
- return success_response({"message": SuccessResponse.USER_CREATED_SUCCESS, "data": {
|
|
|
|
|
|
|
+ return success_response(data={
|
|
|
**user.model_dump(exclude={"pin_hash"}),
|
|
**user.model_dump(exclude={"pin_hash"}),
|
|
|
"token": generate_token(user.email)
|
|
"token": generate_token(user.email)
|
|
|
- }})
|
|
|
|
|
|
|
+ }, message=SuccessResponse.USER_CREATED_SUCCESS)
|
|
|
|
|
|
|
|
|
|
|
|
|
@user_router.post("/force-register")
|
|
@user_router.post("/force-register")
|
|
@@ -143,24 +143,24 @@ async def force_register_user(request: ForceRegisterUserRequest, current_user: U
|
|
|
"""Force register a new user"""
|
|
"""Force register a new user"""
|
|
|
logger.info(f"Force register attempt for email: {request.email}")
|
|
logger.info(f"Force register attempt for email: {request.email}")
|
|
|
if (current_user.permissions or -1) >= 1:
|
|
if (current_user.permissions or -1) >= 1:
|
|
|
- return error_response({"message": UserResponse.NOT_PERMITTED})
|
|
|
|
|
|
|
+ return error_response(message=UserResponse.NOT_PERMITTED)
|
|
|
|
|
|
|
|
|
|
|
|
|
if not request.pin or len(request.pin) != 4:
|
|
if not request.pin or len(request.pin) != 4:
|
|
|
- return error_response({"message": ErrorResponse.INVALID_PIN})
|
|
|
|
|
|
|
+ return error_response(message=ErrorResponse.INVALID_PIN)
|
|
|
userID = user_data_service.create(request.name, request.email, request.rut, request.pin)
|
|
userID = user_data_service.create(request.name, request.email, request.rut, request.pin)
|
|
|
if userID == -1:
|
|
if userID == -1:
|
|
|
- return error_response({"message": UserResponse.USER_ALREADY_EXISTS})
|
|
|
|
|
|
|
+ return error_response(message=UserResponse.USER_ALREADY_EXISTS)
|
|
|
user = user_data_service.get_by_id(userID)
|
|
user = user_data_service.get_by_id(userID)
|
|
|
if not user:
|
|
if not user:
|
|
|
logger.error(f"User creation failed for {request.email}: user not found after creation")
|
|
logger.error(f"User creation failed for {request.email}: user not found after creation")
|
|
|
- return error_response({"message": ErrorResponse.USER_CREATION_ERROR})
|
|
|
|
|
|
|
+ return error_response(message=ErrorResponse.USER_CREATION_ERROR)
|
|
|
|
|
|
|
|
logger.info(f"User created successfully: {request.email}")
|
|
logger.info(f"User created successfully: {request.email}")
|
|
|
- return success_response({"message": SuccessResponse.USER_CREATED_SUCCESS, "data": {
|
|
|
|
|
|
|
+ return success_response(data={
|
|
|
**user.model_dump(exclude={"pin_hash"}),
|
|
**user.model_dump(exclude={"pin_hash"}),
|
|
|
"token": generate_token(user.email)
|
|
"token": generate_token(user.email)
|
|
|
- }})
|
|
|
|
|
|
|
+ }, message=SuccessResponse.USER_CREATED_SUCCESS)
|
|
|
|
|
|
|
|
|
|
|
|
|
@user_router.post("/login")
|
|
@user_router.post("/login")
|
|
@@ -182,7 +182,7 @@ async def login_user(request: LoginRequest, http_request: Request):
|
|
|
logger.warning(f"Login attempt for blocked user: {request.email}, blocked for {blocked_minutes} minutes")
|
|
logger.warning(f"Login attempt for blocked user: {request.email}, blocked for {blocked_minutes} minutes")
|
|
|
|
|
|
|
|
return error_response(
|
|
return error_response(
|
|
|
- {"message": UserResponse.USER_FORMAT_BLOCKED.format(time=f"{blocked_minutes} minutos")},
|
|
|
|
|
|
|
+ message=UserResponse.USER_FORMAT_BLOCKED.format(time=f"{blocked_minutes} minutos"),
|
|
|
status_code=403
|
|
status_code=403
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -194,7 +194,7 @@ async def login_user(request: LoginRequest, http_request: Request):
|
|
|
logger.warning(f"Login attempt for blacklisted user: {request.email}")
|
|
logger.warning(f"Login attempt for blacklisted user: {request.email}")
|
|
|
|
|
|
|
|
return error_response(
|
|
return error_response(
|
|
|
- {"message": UserResponse.USER_BLACKLISTED},
|
|
|
|
|
|
|
+ message=UserResponse.USER_BLACKLISTED,
|
|
|
status_code=403
|
|
status_code=403
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -209,7 +209,7 @@ async def login_user(request: LoginRequest, http_request: Request):
|
|
|
if user_permissions == 0:
|
|
if user_permissions == 0:
|
|
|
logger.warning(f"Unauthorized admin access attempt by {request.email}")
|
|
logger.warning(f"Unauthorized admin access attempt by {request.email}")
|
|
|
|
|
|
|
|
- return error_response({"message": UserResponse.NOT_PERMITTED}, status_code=403)
|
|
|
|
|
|
|
+ return error_response(message=UserResponse.NOT_PERMITTED, status_code=403)
|
|
|
|
|
|
|
|
# Clear login attempts and log successful login
|
|
# Clear login attempts and log successful login
|
|
|
redis_client.delete(f"login_attempts:{request.email}")
|
|
redis_client.delete(f"login_attempts:{request.email}")
|
|
@@ -217,18 +217,15 @@ async def login_user(request: LoginRequest, http_request: Request):
|
|
|
|
|
|
|
|
|
|
|
|
|
return success_response({
|
|
return success_response({
|
|
|
- "message": SuccessResponse.LOGIN_SUCCESS,
|
|
|
|
|
- "data": {
|
|
|
|
|
- "id": user.id,
|
|
|
|
|
- "name": user.name,
|
|
|
|
|
- "email": user.email,
|
|
|
|
|
- "kleincoins": user.kleincoins,
|
|
|
|
|
- "created_at": user.created_at,
|
|
|
|
|
- "token": generate_token(user.email),
|
|
|
|
|
- "reward_progress": user.reward_progress,
|
|
|
|
|
- "permissions": user.permissions
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ "id": user.id,
|
|
|
|
|
+ "name": user.name,
|
|
|
|
|
+ "email": user.email,
|
|
|
|
|
+ "kleincoins": user.kleincoins,
|
|
|
|
|
+ "created_at": user.created_at,
|
|
|
|
|
+ "token": generate_token(user.email),
|
|
|
|
|
+ "reward_progress": user.reward_progress,
|
|
|
|
|
+ "permissions": user.permissions
|
|
|
|
|
+ }, message=SuccessResponse.LOGIN_SUCCESS)
|
|
|
else:
|
|
else:
|
|
|
# Failed login: increment attempts in Redis
|
|
# Failed login: increment attempts in Redis
|
|
|
redis_client.incr(f"login_attempts:{request.email}")
|
|
redis_client.incr(f"login_attempts:{request.email}")
|
|
@@ -243,50 +240,51 @@ async def login_user(request: LoginRequest, http_request: Request):
|
|
|
|
|
|
|
|
logger.warning(f"Too many login attempts for {request.email}. User blocked.")
|
|
logger.warning(f"Too many login attempts for {request.email}. User blocked.")
|
|
|
|
|
|
|
|
- return error_response({"message": ErrorResponse.TOO_MANY_ATTEMPTS}, status_code=429)
|
|
|
|
|
|
|
+ return error_response(message=ErrorResponse.TOO_MANY_ATTEMPTS, status_code=429)
|
|
|
else:
|
|
else:
|
|
|
logger.warning(f"Failed login attempt for {request.email}. Attempts: {attempts}")
|
|
logger.warning(f"Failed login attempt for {request.email}. Attempts: {attempts}")
|
|
|
|
|
|
|
|
|
|
|
|
|
# Return unauthorized with attempts remaining
|
|
# Return unauthorized with attempts remaining
|
|
|
- return error_response({
|
|
|
|
|
- "message": ErrorResponse.INVALID_CREDENTIALS,
|
|
|
|
|
- "attempts_remaining": 5 - attempts if attempts else 5
|
|
|
|
|
- }, status_code=401)
|
|
|
|
|
|
|
+ return error_response(
|
|
|
|
|
+ error={"attempts_remaining": 5 - attempts if attempts else 5},
|
|
|
|
|
+ message=ErrorResponse.INVALID_CREDENTIALS,
|
|
|
|
|
+ status_code=401
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
except redis.RedisError as e:
|
|
except redis.RedisError as e:
|
|
|
error_msg = f"Redis error during login for {request.email}: {e}"
|
|
error_msg = f"Redis error during login for {request.email}: {e}"
|
|
|
logger.error(error_msg)
|
|
logger.error(error_msg)
|
|
|
|
|
|
|
|
- return error_response({"message": "Error interno del servidor"}, status_code=500)
|
|
|
|
|
|
|
+ return error_response(message="Error interno del servidor", status_code=500)
|
|
|
|
|
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
error_msg = f"Unexpected error during login for {request.email}: {e}"
|
|
error_msg = f"Unexpected error during login for {request.email}: {e}"
|
|
|
logger.error(error_msg)
|
|
logger.error(error_msg)
|
|
|
|
|
|
|
|
- return error_response({"message": "Error interno del servidor"}, status_code=500)
|
|
|
|
|
|
|
+ return error_response(message="Error interno del servidor", status_code=500)
|
|
|
|
|
|
|
|
@user_router.delete("/delete")
|
|
@user_router.delete("/delete")
|
|
|
async def delete_user(request: UserIDRequest, current_user: User = Depends(get_current_user)):
|
|
async def delete_user(request: UserIDRequest, current_user: User = Depends(get_current_user)):
|
|
|
if current_user.permissions != 2:
|
|
if current_user.permissions != 2:
|
|
|
- return error_response({"message": UserResponse.NOT_PERMITTED}, status_code=403)
|
|
|
|
|
|
|
+ return error_response(message=UserResponse.NOT_PERMITTED, status_code=403)
|
|
|
"""Delete a user by ID"""
|
|
"""Delete a user by ID"""
|
|
|
user = user_data_service.delete(request.id)
|
|
user = user_data_service.delete(request.id)
|
|
|
if user:
|
|
if user:
|
|
|
- return success_response({"message": SuccessResponse.USER_DELETED_SUCCESS, "data": user})
|
|
|
|
|
|
|
+ return success_response(message=SuccessResponse.USER_DELETED_SUCCESS)
|
|
|
else:
|
|
else:
|
|
|
- return error_response({"message": UserResponse.USER_NOT_FOUND}, status_code=404)
|
|
|
|
|
|
|
+ return error_response(message=UserResponse.USER_NOT_FOUND, status_code=404)
|
|
|
|
|
|
|
|
@user_router.post("/pin-recovery")
|
|
@user_router.post("/pin-recovery")
|
|
|
async def change_pin(request: PinRecoveryRequest):
|
|
async def change_pin(request: PinRecoveryRequest):
|
|
|
"""Change a user's PIN"""
|
|
"""Change a user's PIN"""
|
|
|
user = user_data_service.get_by_email(request.email)
|
|
user = user_data_service.get_by_email(request.email)
|
|
|
if not user:
|
|
if not user:
|
|
|
- return error_response({"message": UserResponse.USER_NOT_FOUND.format(user_id=request.email)}, status_code=404)
|
|
|
|
|
|
|
+ return error_response(message= UserResponse.USER_NOT_FOUND.format(user_id=request.email), status_code=404)
|
|
|
|
|
|
|
|
real_token = recovery_service.get_token(user.id)
|
|
real_token = recovery_service.get_token(user.id)
|
|
|
if real_token and real_token != request.token:
|
|
if real_token and real_token != request.token:
|
|
|
- return error_response({"message": "Invalid token"})
|
|
|
|
|
|
|
+ return error_response(message= "Invalid token")
|
|
|
logger.info(f"Pin change, to {request.new_pin} for user {user.email}")
|
|
logger.info(f"Pin change, to {request.new_pin} for user {user.email}")
|
|
|
user_data_service.update(user_id=user.id, pin_hash=request.new_pin)
|
|
user_data_service.update(user_id=user.id, pin_hash=request.new_pin)
|
|
|
sender = get_email_sender()
|
|
sender = get_email_sender()
|
|
@@ -296,41 +294,41 @@ async def change_pin(request: PinRecoveryRequest):
|
|
|
body=PIN_SUCCESSFULLY["body"].format(app_name=APPNAME, date=datetime.now().strftime("%Y-%m-%d"), time=datetime.now().strftime("%H:%M:%S"), name=user.name)
|
|
body=PIN_SUCCESSFULLY["body"].format(app_name=APPNAME, date=datetime.now().strftime("%Y-%m-%d"), time=datetime.now().strftime("%H:%M:%S"), name=user.name)
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
- return success_response({"message": "Recovery email sent"})
|
|
|
|
|
|
|
+ return success_response(message= "Recovery email sent")
|
|
|
|
|
|
|
|
@user_router.post("/reward")
|
|
@user_router.post("/reward")
|
|
|
async def reward_user(request: UserRewardRequest, user: User = Depends(get_current_user)):
|
|
async def reward_user(request: UserRewardRequest, user: User = Depends(get_current_user)):
|
|
|
"""Reward a user with 1 free beer"""
|
|
"""Reward a user with 1 free beer"""
|
|
|
if user.reward_progress < 100:
|
|
if user.reward_progress < 100:
|
|
|
- return error_response({"message": UserResponse.REWARD_INSUFFICIENT_PROGRESS.format(progress=user.reward_progress)})
|
|
|
|
|
|
|
+ return error_response(message=UserResponse.REWARD_INSUFFICIENT_PROGRESS.format(progress=user.reward_progress))
|
|
|
if not user:
|
|
if not user:
|
|
|
- return error_response({"message": UserResponse.USER_NOT_FOUND.format(user_id=request.id)}, status_code=404)
|
|
|
|
|
|
|
+ return error_response(message=UserResponse.USER_NOT_FOUND.format(user_id=request.id), status_code=404)
|
|
|
|
|
|
|
|
user_data_service.set_reward_progress(user.id, 0)
|
|
user_data_service.set_reward_progress(user.id, 0)
|
|
|
print_ticket(request.tableNumber)
|
|
print_ticket(request.tableNumber)
|
|
|
- return success_response({"message": SuccessResponse.REWARD_SUCCESS, "data": {
|
|
|
|
|
|
|
+ return success_response(data={
|
|
|
"id": user.id,
|
|
"id": user.id,
|
|
|
"name": user.name,
|
|
"name": user.name,
|
|
|
"email": user.email,
|
|
"email": user.email,
|
|
|
"reward_progress": 0
|
|
"reward_progress": 0
|
|
|
- }})
|
|
|
|
|
|
|
+ }, message=SuccessResponse.REWARD_SUCCESS)
|
|
|
|
|
|
|
|
@user_router.get("/user")
|
|
@user_router.get("/user")
|
|
|
async def get_cur_user(current_user:User = Depends(get_current_user)):
|
|
async def get_cur_user(current_user:User = Depends(get_current_user)):
|
|
|
"""Get current user information"""
|
|
"""Get current user information"""
|
|
|
- return success_response({"data": current_user.model_dump(exclude={"pin_hash", "kleincoins", "rut"})})
|
|
|
|
|
|
|
+ return success_response(data=current_user.model_dump(exclude={"pin_hash", "kleincoins", "rut"}))
|
|
|
|
|
|
|
|
@user_router.get("/all")
|
|
@user_router.get("/all")
|
|
|
async def get_all_users():
|
|
async def get_all_users():
|
|
|
"""Get all users"""
|
|
"""Get all users"""
|
|
|
users = list(map(lambda u: u.model_dump(), user_data_service.get_all()))
|
|
users = list(map(lambda u: u.model_dump(), user_data_service.get_all()))
|
|
|
- return success_response({"data": users})
|
|
|
|
|
|
|
+ return success_response(data=users)
|
|
|
|
|
|
|
|
@user_router.get("/next")
|
|
@user_router.get("/next")
|
|
|
async def get_next_user_id():
|
|
async def get_next_user_id():
|
|
|
"""Get the next user ID"""
|
|
"""Get the next user ID"""
|
|
|
next_id = user_data_service.get_next_id()
|
|
next_id = user_data_service.get_next_id()
|
|
|
- return success_response({"next_id": next_id})
|
|
|
|
|
|
|
+ return success_response(data={"next_id": next_id})
|
|
|
from fastapi import Query
|
|
from fastapi import Query
|
|
|
|
|
|
|
|
verify_router = APIRouter()
|
|
verify_router = APIRouter()
|
|
@@ -365,7 +363,7 @@ async def pin_forgot_post(request: UserMail):
|
|
|
|
|
|
|
|
user = user_data_service.get_by_email(request.email)
|
|
user = user_data_service.get_by_email(request.email)
|
|
|
if not user:
|
|
if not user:
|
|
|
- return error_response({"message": UserResponse.USER_NOT_FOUND.format(user_id=request.email)}, status_code=404)
|
|
|
|
|
|
|
+ return error_response(message=UserResponse.USER_NOT_FOUND.format(user_id=request.email), status_code=404)
|
|
|
|
|
|
|
|
recovery_key = recovery_service.generate_recovery_key(user.id)
|
|
recovery_key = recovery_service.generate_recovery_key(user.id)
|
|
|
sender = get_email_sender()
|
|
sender = get_email_sender()
|
|
@@ -375,20 +373,20 @@ async def pin_forgot_post(request: UserMail):
|
|
|
body=PIN_RECOVERY_MAIL["body"].format(app_name=APPNAME, verification_code=recovery_key,name=user.name)
|
|
body=PIN_RECOVERY_MAIL["body"].format(app_name=APPNAME, verification_code=recovery_key,name=user.name)
|
|
|
)
|
|
)
|
|
|
# Send recovery_key to user's email
|
|
# Send recovery_key to user's email
|
|
|
- return success_response({"message": SuccessResponse.RECOVERY_EMAIL_SENT})
|
|
|
|
|
|
|
+ return success_response(message=SuccessResponse.RECOVERY_EMAIL_SENT)
|
|
|
|
|
|
|
|
@recovery_pin_router.post("/validate")
|
|
@recovery_pin_router.post("/validate")
|
|
|
async def pin_forgot_validate(request: PinRecoveryValidateRequest):
|
|
async def pin_forgot_validate(request: PinRecoveryValidateRequest):
|
|
|
"""Validate the PIN recovery code"""
|
|
"""Validate the PIN recovery code"""
|
|
|
user = user_data_service.get_by_email(request.email)
|
|
user = user_data_service.get_by_email(request.email)
|
|
|
if not user:
|
|
if not user:
|
|
|
- return error_response({"message": UserResponse.USER_NOT_FOUND.format(user_id=request.email)}, status_code=404)
|
|
|
|
|
|
|
+ return error_response(message=UserResponse.USER_NOT_FOUND.format(user_id=request.email), status_code=404)
|
|
|
recovery_data = recovery_service.get_recovery_data(user.id)
|
|
recovery_data = recovery_service.get_recovery_data(user.id)
|
|
|
logger.info(f"Recovery data for {request.email}: {recovery_data}|{request.code}")
|
|
logger.info(f"Recovery data for {request.email}: {recovery_data}|{request.code}")
|
|
|
if recovery_data.code == -1:
|
|
if recovery_data.code == -1:
|
|
|
- return error_response({"message": UserResponse.USER_NOT_FOUND.format(user_id=request.email)}, status_code=404)
|
|
|
|
|
|
|
+ return error_response(message=UserResponse.USER_NOT_FOUND.format(user_id=request.email), status_code=404)
|
|
|
if recovery_data.code != request.code:
|
|
if recovery_data.code != request.code:
|
|
|
- return error_response({"message": "Invalid recovery code"})
|
|
|
|
|
|
|
+ return error_response(message="Invalid recovery code")
|
|
|
token = uuid4().hex
|
|
token = uuid4().hex
|
|
|
recovery_service.add_token(user.id, token)
|
|
recovery_service.add_token(user.id, token)
|
|
|
- return success_response({"message": "Recovery code validated successfully", "token": token})
|
|
|
|
|
|
|
+ return success_response(data={"token": token}, message="Recovery code validated successfully")
|