mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-19 04:19:25 +00:00
feat: init ug database models + svcs
This commit is contained in:
parent
e763f0933e
commit
e1b3b62e40
5 changed files with 233 additions and 0 deletions
16
apps/api/src/db/usergroup_ressources.py
Normal file
16
apps/api/src/db/usergroup_ressources.py
Normal file
|
|
@ -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 = ""
|
||||||
33
apps/api/src/db/usergroups.py
Normal file
33
apps/api/src/db/usergroups.py
Normal file
|
|
@ -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
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
from fastapi import APIRouter, Depends
|
from fastapi import APIRouter, Depends
|
||||||
|
from src.routers import usergroups
|
||||||
from src.routers import blocks, dev, trail, users, auth, orgs, roles
|
from src.routers import blocks, dev, trail, users, auth, orgs, roles
|
||||||
from src.routers.ai import ai
|
from src.routers.ai import ai
|
||||||
from src.routers.courses import chapters, collections, courses, activities
|
from src.routers.courses import chapters, collections, courses, activities
|
||||||
|
|
@ -12,6 +13,7 @@ v1_router = APIRouter(prefix="/api/v1")
|
||||||
|
|
||||||
# API Routes
|
# API Routes
|
||||||
v1_router.include_router(users.router, prefix="/users", tags=["users"])
|
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(auth.router, prefix="/auth", tags=["auth"])
|
||||||
v1_router.include_router(orgs.router, prefix="/orgs", tags=["orgs"])
|
v1_router.include_router(orgs.router, prefix="/orgs", tags=["orgs"])
|
||||||
v1_router.include_router(roles.router, prefix="/roles", tags=["roles"])
|
v1_router.include_router(roles.router, prefix="/roles", tags=["roles"])
|
||||||
|
|
|
||||||
68
apps/api/src/routers/usergroups.py
Normal file
68
apps/api/src/routers/usergroups.py
Normal file
|
|
@ -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)
|
||||||
114
apps/api/src/services/users/usergroups.py
Normal file
114
apps/api/src/services/users/usergroups.py
Normal file
|
|
@ -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"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue