login.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. # FastApi imports
  2. # Pydantic imports
  3. from typing import List
  4. from fastapi import APIRouter, Depends, HTTPException
  5. from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
  6. # passlib imports
  7. from passlib.hash import sha256_crypt
  8. # Sqlalchemy imports
  9. from sqlalchemy.orm import Session
  10. from starlette.responses import Response
  11. from client.loginClient import get_auth_token
  12. from commands.fincas import update_fincas
  13. from cruds.companies import create_company, get_company_by_id
  14. from cruds.users import (
  15. create_user,
  16. get_user_by_token,
  17. get_user_by_username,
  18. get_users,
  19. update_password,
  20. )
  21. from database.sqlalchemy import get_db
  22. from schemas.company import Company as CompanySchema
  23. from schemas.users import User as UserSchema
  24. from schemas.users import UserBase as UserBaseSchema
  25. router = APIRouter()
  26. oauth2_scheme = OAuth2PasswordBearer(tokenUrl="login")
  27. async def get_current_user(
  28. token: str = Depends(oauth2_scheme),
  29. db: Session = Depends(get_db),
  30. ) -> UserSchema:
  31. user = get_user_by_token(db, token)
  32. if not user:
  33. raise HTTPException(
  34. status_code=401,
  35. detail="No puede iniciar sesión con el token proporcionado.",
  36. headers={"WWW-Authenticate": "Bearer"},
  37. )
  38. return user
  39. @router.get("/users", response_model=List[UserBaseSchema])
  40. async def get_all_users(
  41. db: Session = Depends(get_db),
  42. current_user: UserSchema = Depends(get_current_user),
  43. ) -> Response:
  44. users = get_users(db)
  45. return users
  46. @router.post("/login")
  47. async def login(
  48. form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)
  49. ) -> Response:
  50. # Me logeo en clima
  51. response = get_auth_token(form_data.username, form_data.password)
  52. if response:
  53. if response.status_code == 200:
  54. # Login correcto, tengo el usuario cacheado?
  55. user_sqlite = get_user_by_username(db, username=form_data.username)
  56. if user_sqlite:
  57. # Si si, entonces verifico que las contraseñas sean identicas
  58. # De lo contrario, actualizo la cacheada
  59. if not sha256_crypt.verify(form_data.password, user_sqlite.password):
  60. update_password(db, user_sqlite, form_data.password)
  61. else:
  62. # Verifico si la organizacion a la que pertenece el usuario existe, sino la creo
  63. company = get_company_by_id(db, response.json()["company_id"])
  64. if not company:
  65. company = CompanySchema(
  66. id=response.json()["company_id"],
  67. title=response.json()["company_name"],
  68. )
  69. create_company(db, company)
  70. # Cacheo el usuario
  71. new_user = UserSchema(
  72. username=form_data.username,
  73. password=form_data.password,
  74. token=response.json()["token"],
  75. company_id=response.json()["company_id"],
  76. )
  77. user_sqlite = create_user(db=db, user=new_user)
  78. # Agrego las de la nueva finca estaciones
  79. update_fincas(company.id)
  80. return {"access_token": user_sqlite.token, "token_type": "bearer"}
  81. elif response.status_code == 400:
  82. # Credenciales incorrectas para clima, devuelvo el error
  83. raise HTTPException(
  84. status_code=401, detail=response.json()["non_field_errors"][0]
  85. )
  86. elif response.status_code == 401:
  87. # Credenciales Correctas pero no tiene acceso al sistema
  88. raise HTTPException(status_code=401, detail=response.json()["detail"])
  89. else:
  90. # Ante cualquier otro error en clima,
  91. # directamente me logeo con las credenciales cacheadas
  92. user_sqlite = get_user_by_username(db, username=form_data.username)
  93. if user_sqlite:
  94. if not sha256_crypt.verify(form_data.password, user_sqlite.password):
  95. raise HTTPException(
  96. status_code=401,
  97. detail="No puede iniciar sesión con las credenciales proporcionadas.",
  98. )
  99. else:
  100. return {"access_token": user_sqlite.token, "token_type": "bearer"}
  101. else:
  102. raise HTTPException(
  103. status_code=401,
  104. detail="No puede iniciar sesión con las credenciales proporcionadas.",
  105. )
  106. # Por si hay que crear un usuario en el sqlite
  107. # El nuevo usuario no se sincronizaria en clima
  108. """
  109. @router.post("/users/", response_model=UserSchema)
  110. def post_user(user: UserSchema, db: Session = Depends(get_db)):
  111. db_user = get_user_by_username(db, username=user.username)
  112. print(db_user)
  113. if db_user:
  114. raise HTTPException(status_code=400, detail="Username already registered")
  115. return create_user(db=db, user=user)
  116. """