|
@@ -21,6 +21,7 @@ from services.data_service import BlacklistDataService, UserDataService
|
|
|
from services.email_service import get_email_sender
|
|
from services.email_service import get_email_sender
|
|
|
from services.print_service import print_ticket
|
|
from services.print_service import print_ticket
|
|
|
import services.recovery_service as recovery_service
|
|
import services.recovery_service as recovery_service
|
|
|
|
|
+from utils.responses import error_response, success_response
|
|
|
from utils.rut import validate_rut
|
|
from utils.rut import validate_rut
|
|
|
|
|
|
|
|
fernet = Fernet(PIN_KEY.encode())
|
|
fernet = Fernet(PIN_KEY.encode())
|
|
@@ -31,20 +32,14 @@ user_router = APIRouter()
|
|
|
|
|
|
|
|
redis_client = redis.Redis(host='localhost', port=6379, db=1 if DEVELOPMENT else 0, decode_responses=True)
|
|
redis_client = redis.Redis(host='localhost', port=6379, db=1 if DEVELOPMENT else 0, decode_responses=True)
|
|
|
|
|
|
|
|
-def unique_pin_generate():
|
|
|
|
|
- """Generate a unique 4-digit PIN"""
|
|
|
|
|
- import random
|
|
|
|
|
- pin = str(random.randint(1000, 9999))
|
|
|
|
|
- return pin
|
|
|
|
|
-
|
|
|
|
|
@user_router.post("/exists")
|
|
@user_router.post("/exists")
|
|
|
async def exists_user(request: UserIDRequest):
|
|
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 JSONResponse(status_code=200, content={"exists": True, "message": UserResponse.USER_EXISTS})
|
|
|
|
|
|
|
+ return success_response({"exists": True, "message": UserResponse.USER_EXISTS})
|
|
|
else:
|
|
else:
|
|
|
- return JSONResponse(status_code=404, content={"exists": False, "message": UserResponse.USER_DOES_NOT_EXIST})
|
|
|
|
|
|
|
+ return error_response({"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):
|
|
@@ -57,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}")
|
|
|
|
|
|
|
|
- raise HTTPException(status_code=400, detail=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:
|
|
@@ -65,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 HTTPException(status_code=400, detail=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 HTTPException(status_code=400, detail=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}"
|
|
@@ -106,20 +101,20 @@ async def register_user(request: RegisterUserRequest):
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
- return JSONResponse(status_code=201, content={"message": SuccessResponse.USER_CREATED_SUCCESS})
|
|
|
|
|
|
|
+ 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 JSONResponse(status_code=500, content={"message": "Error interno del servidor"})
|
|
|
|
|
|
|
+ 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 JSONResponse(status_code=400, content={"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")
|
|
@@ -127,17 +122,17 @@ 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 JSONResponse(status_code=400, content={"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 JSONResponse(status_code=400, content={"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 JSONResponse(status_code=500, content={"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 JSONResponse(status_code=201, content={"message": SuccessResponse.USER_CREATED_SUCCESS, "data": {
|
|
|
|
|
|
|
+ return success_response({"message": SuccessResponse.USER_CREATED_SUCCESS, "data": {
|
|
|
**user.model_dump(exclude={"pin_hash"}),
|
|
**user.model_dump(exclude={"pin_hash"}),
|
|
|
"token": generate_token(user.email)
|
|
"token": generate_token(user.email)
|
|
|
}})
|
|
}})
|
|
@@ -148,21 +143,21 @@ 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 JSONResponse(status_code=403, content={"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 JSONResponse(status_code=400, content={"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 JSONResponse(status_code=400, content={"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 JSONResponse(status_code=500, content={"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 JSONResponse(status_code=201, content={"message": SuccessResponse.USER_CREATED_SUCCESS, "data": {
|
|
|
|
|
|
|
+ return success_response({"message": SuccessResponse.USER_CREATED_SUCCESS, "data": {
|
|
|
**user.model_dump(exclude={"pin_hash"}),
|
|
**user.model_dump(exclude={"pin_hash"}),
|
|
|
"token": generate_token(user.email)
|
|
"token": generate_token(user.email)
|
|
|
}})
|
|
}})
|
|
@@ -186,9 +181,9 @@ 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 JSONResponse(
|
|
|
|
|
- status_code=403,
|
|
|
|
|
- content={"message": UserResponse.USER_FORMAT_BLOCKED.format(time=f"{blocked_minutes} minutos")}
|
|
|
|
|
|
|
+ return error_response(
|
|
|
|
|
+ {"message": UserResponse.USER_FORMAT_BLOCKED.format(time=f"{blocked_minutes} minutos")},
|
|
|
|
|
+ status_code=403
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
# Attempt login
|
|
# Attempt login
|
|
@@ -198,9 +193,9 @@ async def login_user(request: LoginRequest, http_request: Request):
|
|
|
if blacklist_data_service.is_user_blacklisted(user.id):
|
|
if blacklist_data_service.is_user_blacklisted(user.id):
|
|
|
logger.warning(f"Login attempt for blacklisted user: {request.email}")
|
|
logger.warning(f"Login attempt for blacklisted user: {request.email}")
|
|
|
|
|
|
|
|
- return JSONResponse(
|
|
|
|
|
- status_code=403,
|
|
|
|
|
- content={"message": UserResponse.USER_BLACKLISTED}
|
|
|
|
|
|
|
+ return error_response(
|
|
|
|
|
+ {"message": UserResponse.USER_BLACKLISTED},
|
|
|
|
|
+ status_code=403
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
# Successful login
|
|
# Successful login
|
|
@@ -214,14 +209,14 @@ 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 JSONResponse(status_code=403, content={"message": UserResponse.NOT_PERMITTED})
|
|
|
|
|
|
|
+ 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}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- return JSONResponse(status_code=200, content={
|
|
|
|
|
|
|
+ return success_response({
|
|
|
"message": SuccessResponse.LOGIN_SUCCESS,
|
|
"message": SuccessResponse.LOGIN_SUCCESS,
|
|
|
"data": {
|
|
"data": {
|
|
|
"id": user.id,
|
|
"id": user.id,
|
|
@@ -248,50 +243,50 @@ 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 JSONResponse(status_code=429, content={"message": ErrorResponse.TOO_MANY_ATTEMPTS})
|
|
|
|
|
|
|
+ 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 JSONResponse(status_code=401, content={
|
|
|
|
|
|
|
+ return error_response({
|
|
|
"message": ErrorResponse.INVALID_CREDENTIALS,
|
|
"message": ErrorResponse.INVALID_CREDENTIALS,
|
|
|
"attempts_remaining": 5 - attempts if attempts else 5
|
|
"attempts_remaining": 5 - attempts if attempts else 5
|
|
|
- })
|
|
|
|
|
|
|
+ }, 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 JSONResponse(status_code=500, content={"message": "Error interno del servidor"})
|
|
|
|
|
|
|
+ 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 JSONResponse(status_code=500, content={"message": "Error interno del servidor"})
|
|
|
|
|
|
|
+ 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 JSONResponse(status_code=403, content={"message": UserResponse.NOT_PERMITTED})
|
|
|
|
|
|
|
+ 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 JSONResponse(status_code=200, content={"message": SuccessResponse.USER_DELETED_SUCCESS, "data": user})
|
|
|
|
|
|
|
+ return success_response({"message": SuccessResponse.USER_DELETED_SUCCESS, "data": user})
|
|
|
else:
|
|
else:
|
|
|
- return JSONResponse(status_code=404, content={"message": UserResponse.USER_NOT_FOUND})
|
|
|
|
|
|
|
+ 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 JSONResponse(status_code=404, content={"message": UserResponse.USER_NOT_FOUND.format(user_id=request.email)})
|
|
|
|
|
|
|
+ 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 JSONResponse(status_code=400, content={"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()
|
|
@@ -301,19 +296,19 @@ 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 JSONResponse(status_code=200, content={"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 JSONResponse(status_code=400, content={"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 JSONResponse(status_code=404, content={"message": UserResponse.USER_NOT_FOUND.format(user_id=request.id)})
|
|
|
|
|
|
|
+ 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 JSONResponse(status_code=200, content={"message": SuccessResponse.REWARD_SUCCESS, "data": {
|
|
|
|
|
|
|
+ return success_response({"message": SuccessResponse.REWARD_SUCCESS, "data": {
|
|
|
"id": user.id,
|
|
"id": user.id,
|
|
|
"name": user.name,
|
|
"name": user.name,
|
|
|
"email": user.email,
|
|
"email": user.email,
|
|
@@ -323,19 +318,19 @@ async def reward_user(request: UserRewardRequest, user: User = Depends(get_curre
|
|
|
@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 JSONResponse(status_code=200, content={"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 JSONResponse(status_code=200, content={"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 JSONResponse(status_code=200, content={"next_id": next_id})
|
|
|
|
|
|
|
+ return success_response({"next_id": next_id})
|
|
|
from fastapi import Query
|
|
from fastapi import Query
|
|
|
|
|
|
|
|
verify_router = APIRouter()
|
|
verify_router = APIRouter()
|
|
@@ -370,7 +365,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 JSONResponse(status_code=404, content={"message": UserResponse.USER_NOT_FOUND.format(user_id=request.email)})
|
|
|
|
|
|
|
+ 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()
|
|
@@ -380,20 +375,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 JSONResponse(status_code=200, content={"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 JSONResponse(status_code=404, content={"message": UserResponse.USER_NOT_FOUND.format(user_id=request.email)})
|
|
|
|
|
|
|
+ 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 JSONResponse(status_code=404, content={"message": UserResponse.USER_NOT_FOUND.format(user_id=request.email)})
|
|
|
|
|
|
|
+ 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 JSONResponse(status_code=400, content={"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 JSONResponse(status_code=200, content={"message": "Recovery code validated successfully", "token": token})
|
|
|
|
|
|
|
+ return success_response({"message": "Recovery code validated successfully", "token": token})
|