from fastapi import APIRouter, Depends, HTTPException from typing import Sequence from models.users import User from schemas.users import UserOut, UserIn from sqlalchemy.ext.asyncio import AsyncSession from db.session import get_db import services.users as user_service from sqlalchemy.exc import IntegrityError from core.security import hash_password, get_current_user router = APIRouter(prefix="/users", tags=["users"]) @router.get("/me", response_model=UserOut) async def get_self(user: User = Depends(get_current_user)): return user @router.get("/", response_model=list[UserOut]) async def get_users(db: AsyncSession = Depends(get_db)) -> Sequence[User]: users = await user_service.get_users(db) return users @router.get("/{id}", response_model=UserOut) async def get_user_by_id(id: int, db: AsyncSession = Depends(get_db)) -> User: user = await user_service.get_user_by_id(id, db) if user: return user else: raise HTTPException(404, "User not found") @router.post("/register", response_model=UserOut) async def register(user: UserIn, db: AsyncSession = Depends(get_db)) -> User: hashed = hash_password(user.password) try: new_user = await user_service.create_user(User(email=user.email, password = hashed), db) return new_user except IntegrityError: await db.rollback() raise HTTPException(400, f"User with email {user.email} is already exist...")