import os import logging from fastapi import APIRouter, Request, HTTPException from core.sap import forward_to_sapb1, ensure_sap_session from core.session import create_employee_session, remove_employee_session_by_token from context import set_current_user from dotenv import load_dotenv # Cargar variables de entorno desde .env load_dotenv(dotenv_path=".env") SAPB1_SL_COMPANYDB = os.getenv("SAPB1_SL_COMPANYDB", "") logger = logging.getLogger(__name__) router = APIRouter( tags=["Autenticación"] ) @router.post("/api/Login") async def login(request: Request): data = await request.json() webUser = data.get("Username") password = data.get("Password") logger.info(f"Intento de login recibido para el usuario web {webUser}") webUser_escaped = (webUser or "").replace("'", "''") try: employee_response = forward_to_sapb1( method="GET", endpoint_path="EmployeesInfo", params={ "$select": "EmployeeID,FirstName,LastName,Active,U_WEB_USER,U_WEB_PASS", "$filter": f"U_WEB_USER eq '{webUser_escaped}'" } ) except HTTPException: raise HTTPException(status_code=401, detail="Usuario o contraseña incorrectos") except Exception as exc: logger.error(f"Error al consultar empleados en SAP a través de proxy: {exc}") raise HTTPException(status_code=500, detail=f"Error al consultar empleados en SAP: {exc}") employees = employee_response.json().get("value", []) employee_data = employees[0] if employees else None if employee_data is None: logger.warning(f"Login fallido: no se encontró ningún empleado con U_WEB_USER {webUser}") raise HTTPException(status_code=401, detail="Usuario no registrado") empId = employee_data.get("EmployeeID") if employee_data.get("Active") != "tYES": logger.warning(f"Login fallido: el empleado {empId} está inactivo") raise HTTPException(status_code=401, detail="Usuario inactivo") if employee_data.get("U_WEB_PASS") != password: logger.warning(f"Login fallido: la contraseña no coincide para el empleado {empId}") raise HTTPException(status_code=401, detail="Usuario o contraseña incorrectos") full_name = f"{employee_data.get('FirstName', '')} {employee_data.get('LastName', '')}".strip() set_current_user(webUser, full_name, empId) logger.info(f"Login exitoso para el usuario {webUser} (empleado SAP {empId})") token = create_employee_session( webUser=webUser, emp_id=empId, first_name=employee_data.get('FirstName', ''), last_name=employee_data.get('LastName', '') ) ensure_sap_session() return { "message": "Login exitoso", "token": token, "username": employee_data.get('FirstName'), "company": SAPB1_SL_COMPANYDB } @router.post("/api/Logout") async def logout(request: Request): token = request.headers.get("X-Session-Token") if token: remove_employee_session_by_token(token) return {"message": "Logout exitoso"}