Spaces:
Sleeping
Sleeping
File size: 2,632 Bytes
c71e312 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
# Commands y modelos
from src.expon.iam.domain.model.commands.sign_up_command import SignUpCommand
from src.expon.iam.domain.model.aggregates.user import User
# Servicios de dominio
from src.expon.iam.application.internal.commandservices.user_command_service import UserCommandService
# Infraestructura: hashing y token
from src.expon.iam.infrastructure.hashing.bcrypt.services.hashing_service import HashingService
from src.expon.iam.infrastructure.tokens.jwt.services.token_service_impl import TokenService
# Infraestructura: repositorio e inyección de dependencias
from src.expon.iam.infrastructure.persistence.jpa.repositories.user_repository import UserRepository
from src.expon.shared.infrastructure.dependencies import get_db
# Middleware JWT
from src.expon.iam.infrastructure.authorization.sfs.auth_bearer import get_current_user
# Esquemas (DTOs REST)
from src.expon.iam.interfaces.rest.schemas.login_request import LoginRequest
from src.expon.iam.interfaces.rest.schemas.auth_response import AuthResponse
router = APIRouter()
@router.post("/signup")
def signup(command: SignUpCommand, db: Session = Depends(get_db)):
user_repository = UserRepository(db)
hashing_service = HashingService()
user_command_service = UserCommandService(user_repository, hashing_service)
existing_user = user_repository.find_by_email(command.email)
if existing_user:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Email already registered"
)
user = user_command_service.handle_sign_up(command)
return {
"id": str(user.id),
"username": user.username,
"email": user.email,
"created_at": user.created_at.isoformat()
}
@router.post("/login", response_model=AuthResponse)
def login(request: LoginRequest, db: Session = Depends(get_db)):
user_repository = UserRepository(db)
hashing_service = HashingService()
user = user_repository.find_by_email(request.email)
if not user or not hashing_service.verify(request.password, user.password):
raise HTTPException(status_code=401, detail="Credenciales inválidas")
token = TokenService.generate_token(user)
return AuthResponse(
access_token=token,
token_type="bearer",
user_id=str(user.id)
)
@router.get("/me")
def get_me(current_user: User = Depends(get_current_user)):
return {
"id": str(current_user.id),
"username": current_user.username,
"email": current_user.email
}
|