From e1b3b62e4084b654180d6e071537a4e23dda72ff Mon Sep 17 00:00:00 2001 From: swve Date: Sat, 23 Mar 2024 09:08:56 +0000 Subject: [PATCH] feat: init ug database models + svcs --- apps/api/src/db/usergroup_ressources.py | 16 +++ apps/api/src/db/usergroups.py | 33 +++++++ apps/api/src/router.py | 2 + apps/api/src/routers/usergroups.py | 68 +++++++++++++ apps/api/src/services/users/usergroups.py | 114 ++++++++++++++++++++++ 5 files changed, 233 insertions(+) create mode 100644 apps/api/src/db/usergroup_ressources.py create mode 100644 apps/api/src/db/usergroups.py create mode 100644 apps/api/src/routers/usergroups.py create mode 100644 apps/api/src/services/users/usergroups.py diff --git a/apps/api/src/db/usergroup_ressources.py b/apps/api/src/db/usergroup_ressources.py new file mode 100644 index 00000000..f8796ca5 --- /dev/null +++ b/apps/api/src/db/usergroup_ressources.py @@ -0,0 +1,16 @@ +from typing import Optional +from sqlalchemy import Column, ForeignKey, Integer +from sqlmodel import Field, SQLModel + + +class UserGroupRessource(SQLModel, table=True): + id: Optional[int] = Field(default=None, primary_key=True) + usergroup_id: int = Field( + sa_column=Column(Integer, ForeignKey("usergroup.id", ondelete="CASCADE")) + ) + ressource_uuid: str = "" + org_id: int = Field( + sa_column=Column(Integer, ForeignKey("organization.id", ondelete="CASCADE")) + ) + creation_date: str = "" + update_date: str = "" diff --git a/apps/api/src/db/usergroups.py b/apps/api/src/db/usergroups.py new file mode 100644 index 00000000..dc71ea73 --- /dev/null +++ b/apps/api/src/db/usergroups.py @@ -0,0 +1,33 @@ +from typing import Optional +from sqlalchemy import Column, ForeignKey, Integer +from sqlmodel import Field, SQLModel + + +class UserGroupBase(SQLModel): + name: str + description: str + +class UserGroup(UserGroupBase, table=True): + id: Optional[int] = Field(default=None, primary_key=True) + org_id: int = Field( + sa_column=Column(Integer, ForeignKey("organization.id", ondelete="CASCADE")) + ) + usergroup_uuid: str = "" + creation_date: str = "" + update_date: str = "" + +class UserGroupCreate(UserGroupBase): + org_id: int = Field(default=None, foreign_key="organization.id") + pass + +class UserGroupUpdate(UserGroupBase): + name: str + description: str + +class UserGroupRead(UserGroupBase): + id: int + org_id: int = Field(default=None, foreign_key="organization.id") + usergroup_uuid: str + creation_date: str + update_date: str + pass diff --git a/apps/api/src/router.py b/apps/api/src/router.py index 2908d7ae..fd171096 100644 --- a/apps/api/src/router.py +++ b/apps/api/src/router.py @@ -1,4 +1,5 @@ from fastapi import APIRouter, Depends +from src.routers import usergroups from src.routers import blocks, dev, trail, users, auth, orgs, roles from src.routers.ai import ai from src.routers.courses import chapters, collections, courses, activities @@ -12,6 +13,7 @@ v1_router = APIRouter(prefix="/api/v1") # API Routes v1_router.include_router(users.router, prefix="/users", tags=["users"]) +v1_router.include_router(usergroups.router, prefix="/usergroups", tags=["usergroups"]) v1_router.include_router(auth.router, prefix="/auth", tags=["auth"]) v1_router.include_router(orgs.router, prefix="/orgs", tags=["orgs"]) v1_router.include_router(roles.router, prefix="/roles", tags=["roles"]) diff --git a/apps/api/src/routers/usergroups.py b/apps/api/src/routers/usergroups.py new file mode 100644 index 00000000..83b69b4b --- /dev/null +++ b/apps/api/src/routers/usergroups.py @@ -0,0 +1,68 @@ +from typing import Literal +from fastapi import APIRouter, Depends, HTTPException, Request, UploadFile +from sqlmodel import Session +from src.services.users.users import delete_user_by_id +from src.db.usergroups import UserGroupCreate, UserGroupRead, UserGroupUpdate +from src.db.users import PublicUser +from src.services.users.usergroups import create_usergroup, delete_usergroup_by_id, read_usergroup_by_id, update_usergroup_by_id +from src.services.orgs.orgs import get_org_join_mechanism +from src.security.auth import get_current_user +from src.core.events.database import get_db_session + + +router = APIRouter() + + +@router.post("/", response_model=UserGroupCreate, tags=["usergroups"]) +async def api_create_user_without_org( + *, + request: Request, + db_session: Session = Depends(get_db_session), + current_user: PublicUser = Depends(get_current_user), + usergroup_object: UserGroupCreate, +) -> UserGroupRead: + """ + Create User + """ + return await create_usergroup(request, db_session, current_user, usergroup_object) + + +@router.get("/{usergroup_id}", response_model=UserGroupRead, tags=["usergroups"]) +async def api_get_usergroup( + *, + request: Request, + db_session: Session = Depends(get_db_session), + current_user: PublicUser = Depends(get_current_user), + usergroup_id: int, +) -> UserGroupRead: + """ + Get UserGroup + """ + return await read_usergroup_by_id(request, db_session, current_user, usergroup_id) + +@router.put("/{usergroup_id}", response_model=UserGroupRead, tags=["usergroups"]) +async def api_update_usergroup( + *, + request: Request, + db_session: Session = Depends(get_db_session), + current_user: PublicUser = Depends(get_current_user), + usergroup_id: int, + usergroup_object: UserGroupUpdate, +) -> UserGroupRead: + """ + Update UserGroup + """ + return await update_usergroup_by_id(request, db_session, current_user, usergroup_id, usergroup_object) + +@router.delete("/{usergroup_id}", tags=["usergroups"]) +async def api_delete_usergroup( + *, + request: Request, + db_session: Session = Depends(get_db_session), + current_user: PublicUser = Depends(get_current_user), + usergroup_id: int, +) -> str: + """ + Delete UserGroup + """ + return await delete_usergroup_by_id(request, db_session, current_user, usergroup_id) diff --git a/apps/api/src/services/users/usergroups.py b/apps/api/src/services/users/usergroups.py new file mode 100644 index 00000000..f7942166 --- /dev/null +++ b/apps/api/src/services/users/usergroups.py @@ -0,0 +1,114 @@ +from datetime import datetime +from uuid import uuid4 +from fastapi import HTTPException, Request +from sqlmodel import Session, select +from src.db.organizations import Organization +from src.db.usergroups import UserGroup, UserGroupCreate, UserGroupRead, UserGroupUpdate +from src.db.users import AnonymousUser, PublicUser + + +async def create_usergroup( + request: Request, + db_session: Session, + current_user: PublicUser | AnonymousUser, + usergroup_create: UserGroupCreate, +) -> UserGroupRead: + + usergroup = UserGroup.from_orm(usergroup_create) + + # Check if Organization exists + statement = select(Organization).where(Organization.id == usergroup_create.org_id) + result = db_session.exec(statement) + + if not result.first(): + raise HTTPException( + status_code=400, + detail="Organization does not exist", + ) + + # Complete the object + usergroup.usergroup_uuid = f"usergroup_{uuid4()}" + usergroup.creation_date = str(datetime.now()) + usergroup.update_date = str(datetime.now()) + + # Save the object + db_session.add(usergroup) + db_session.commit() + db_session.refresh(usergroup) + + usergroup = UserGroupRead.from_orm(usergroup) + + return usergroup + + +async def read_usergroup_by_id( + request: Request, + db_session: Session, + current_user: PublicUser | AnonymousUser, + usergroup_id: int, +) -> UserGroupRead: + + statement = select(UserGroup).where(UserGroup.id == usergroup_id) + usergroup = db_session.exec(statement).first() + + if not usergroup: + raise HTTPException( + status_code=404, + detail="UserGroup not found", + ) + + usergroup = UserGroupRead.from_orm(usergroup) + + return usergroup + + +async def update_usergroup_by_id( + request: Request, + db_session: Session, + current_user: PublicUser | AnonymousUser, + usergroup_id: int, + usergroup_update: UserGroupUpdate, +) -> UserGroupRead: + + statement = select(UserGroup).where(UserGroup.id == usergroup_id) + usergroup = db_session.exec(statement).first() + + if not usergroup: + raise HTTPException( + status_code=404, + detail="UserGroup not found", + ) + + usergroup.name = usergroup_update.name + usergroup.description = usergroup_update.description + usergroup.update_date = str(datetime.now()) + + db_session.add(usergroup) + db_session.commit() + db_session.refresh(usergroup) + + usergroup = UserGroupRead.from_orm(usergroup) + + return usergroup + + +async def delete_usergroup_by_id( + request: Request, + db_session: Session, + current_user: PublicUser | AnonymousUser, + usergroup_id: int, +) -> str: + + statement = select(UserGroup).where(UserGroup.id == usergroup_id) + usergroup = db_session.exec(statement).first() + + if not usergroup: + raise HTTPException( + status_code=404, + detail="UserGroup not found", + ) + + db_session.delete(usergroup) + db_session.commit() + + return "UserGroup deleted successfully"