swag-shop/backend/app/api/routes/user_routes.py

59 lines
1.8 KiB
Python

import logging
import re
from fastapi import APIRouter, Body, HTTPException, status
from sqlalchemy.exc import IntegrityError
from app.api.dependencies import SessionDep
from app.crud import user_crud
from app.database.models.user_model import UserRole
from app.schemas.user_schemas import UserRegister
logger = logging.getLogger(__name__)
router = APIRouter(
prefix="/user",
tags=["User"]
)
@router.delete("/delete", summary="Delete user")
async def delete_user():
raise NotImplementedError("delete_user() needs to be implemented.")
@router.delete("/logout", summary="User logout")
async def logout():
raise NotImplementedError("logout() needs to be implemented.")
@router.post("/register", summary="Register new user")
async def register(session: SessionDep, user_data: UserRegister):
try:
user_crud.create_user(session, user_data, None, UserRole.OWNER)
return {"detail": "Registered succeesfully"}
except IntegrityError as e:
field_mapping = {"uuid": "email"} # If a UUID is duplicate, it means email is in use
constraint = e.orig.diag.constraint_name
column_name = re.sub(r"^user_(\w+)_key$", r"\1", constraint) if constraint else None
if column_name == "uuid":
column_name = "email"
detail = f"{field_mapping.get(column_name, column_name or 'Entry').capitalize()} already in use"
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail=detail
)
except Exception as e:
logger.error(e)
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Failed to register")
@router.put("/update", summary="Update user details")
async def update_user(data: dict = Body(...)):
raise NotImplementedError("update_user() needs to be implemented.")