from fastapi import APIRouter, Body, Form from fastapi.encoders import jsonable_encoder from typing_extensions import Annotated from server.services import login_user, get_project_user from server.database import ( add_user, delete_user, retrieve_user, retrieve_users, update_user, ) from server.models.user import ( ErrorResponseModel, ResponseModel, UserSchema, UpdateUserModel, ) router = APIRouter() # CREATE @router.post("/", response_description="User data added into the database") async def add_user_data(user: UserSchema = Body(...)): user = jsonable_encoder(user) new_user = await add_user(user) return ResponseModel(new_user, "User added successfully.") # READ @router.get("/", response_description="Users retrieved") async def get_users(): users = await retrieve_users() if users: return ResponseModel(users, "Users data retrieved successfully") return ResponseModel(users, "Empty list returned") @router.get("/{username}", response_description="User data retrieved") async def get_user_data(username): user = await retrieve_user(username) if user: return ResponseModel(user, "User data retrieved successfully") return ErrorResponseModel("An error occurred.", 404, "User doesn't exist.") # UPDATE @router.put("/{username}") async def update_user_data(username: str, req: UpdateUserModel = Body(...)): req = {k: v for k, v in req.dict().items() if v is not None} updated_user = await update_user(username, req) if updated_user: return ResponseModel( "User with ID: {} name update is successful".format(id), "User name updated successfully", ) return ErrorResponseModel( "An error occurred", 404, "There was an error updating the user data.", ) # DELETE @router.delete("/{username}", response_description="User data deleted from the database") async def delete_user_data(username: str): deleted_user = await delete_user(username) if deleted_user: return ResponseModel( "User with ID: {} removed".format(username), "User deleted successfully" ) return ErrorResponseModel( "An error occurred", 404, "User with username {0} doesn't exist".format(username) ) @router.post("/login", response_description="User login") async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]): return login_user(username, password) # return {"username": username} @router.post("/get_project", response_description="User login") async def get_project(username: Annotated[str, Form()]): return get_project_user(username)