diff --git a/app/routers/auth.py b/app/routers/auth.py index e85d4cb..11218a4 100644 --- a/app/routers/auth.py +++ b/app/routers/auth.py @@ -7,6 +7,7 @@ from fastapi.responses import StreamingResponse from app.models import User +from app.types.frontend import LoginFormWith2FA from app.types.pydantic_models import Token, Enable2FA from app.utils import authenticate_user, generate_user_token from app.security import TwoFactorAuth @@ -46,7 +47,7 @@ async def login_without_2fa( @router.post("/2fa/is-2fa-active/") async def is_2fa_active( - form_data: Annotated[OAuth2PasswordRequestForm, Depends()], + form_data: Annotated[LoginFormWith2FA, Depends()], ) -> bool: user = await authenticate_user(form_data.username, form_data.password) if not user: @@ -61,8 +62,7 @@ async def is_2fa_active( @router.post("/2fa/login/") async def login_with_2fa( - form_data: Annotated[OAuth2PasswordRequestForm, Depends()], - totp_code: str, + form_data: Annotated[LoginFormWith2FA, Depends()], ) -> Token: user = await authenticate_user(form_data.username, form_data.password) @@ -76,7 +76,7 @@ async def login_with_2fa( secret_key = await TwoFactorAuth.get_or_create_secret_key(user.id) two_factor_auth = TwoFactorAuth(user.id, secret_key) - is_valid = two_factor_auth.verify_totp_code(totp_code) + is_valid = two_factor_auth.verify_totp_code(form_data.totp_code) if not is_valid: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, @@ -107,7 +107,7 @@ async def enable_2fa( @router.post("/2fa/generate-qrcode/") async def generate_qrcode( - form_data: Annotated[OAuth2PasswordRequestForm, Depends()], + form_data: Annotated[LoginFormWith2FA, Depends()], ) -> bytes: current_user = await authenticate_user(form_data.username, form_data.password) if not current_user: diff --git a/app/routers/frontend.py b/app/routers/frontend.py index c780cc8..562dff1 100644 --- a/app/routers/frontend.py +++ b/app/routers/frontend.py @@ -59,7 +59,7 @@ async def get_patient_header( f""" SELECT * FROM `{BIGQUERY_PROJECT}`.{BIGQUERY_PATIENT_HEADER_TABLE_ID} - WHERE cpf = '{cpf}' + WHERE cpf_particao = {cpf} """, from_file="/tmp/credentials.json", ) @@ -88,7 +88,7 @@ async def get_patient_summary( f""" SELECT * FROM `{BIGQUERY_PROJECT}`.{BIGQUERY_PATIENT_SUMMARY_TABLE_ID} - WHERE cpf = '{cpf}' + WHERE cpf_particao = {cpf} """, from_file="/tmp/credentials.json", ) @@ -123,7 +123,7 @@ async def get_patient_encounters( f""" SELECT * FROM `{BIGQUERY_PROJECT}`.{BIGQUERY_PATIENT_ENCOUNTERS_TABLE_ID} - WHERE cpf = '{cpf}' and exibicao.indicador = true + WHERE cpf_particao = {cpf} and exibicao.indicador = true """, from_file="/tmp/credentials.json", ) diff --git a/app/types/frontend.py b/app/types/frontend.py index 60743cc..044ab9a 100644 --- a/app/types/frontend.py +++ b/app/types/frontend.py @@ -2,6 +2,19 @@ from typing import Optional, List from pydantic import BaseModel +from fastapi.security import OAuth2PasswordRequestForm + + +class LoginFormWith2FA(OAuth2PasswordRequestForm): + def __init__( + self, + username: str, + password: str, + totp: str, + ): + super().__init__(username=username, password=password) + self.totp = totp + # Clinic Family model class FamilyClinic(BaseModel): @@ -16,11 +29,13 @@ class FamilyHealthTeam(BaseModel): name: Optional[str] phone: Optional[str] + # Clinical Exam Model class ClinicalExam(BaseModel): type: str description: Optional[str] + # Medical Conditions model class PatientSummary(BaseModel): allergies: List[str] @@ -29,7 +44,7 @@ class PatientSummary(BaseModel): # Responsible model class Responsible(BaseModel): - name: str + name: Optional[str] # Temporary role: str @@ -40,7 +55,7 @@ class Encounter(BaseModel): location: str type: str subtype: Optional[str] - exhibition_type: str = 'default' + exhibition_type: str = "default" active_cids: List[str] responsible: Optional[Responsible] clinical_motivation: Optional[str] @@ -56,8 +71,9 @@ class UserInfo(BaseModel): email: Optional[str] role: Optional[str] + class Professional(BaseModel): - name: str + name: Optional[str] registry: Optional[str]