mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-19 04:19:25 +00:00
322 lines
8.4 KiB
Python
322 lines
8.4 KiB
Python
from typing import List, Literal
|
|
from fastapi import APIRouter, Depends, Request, UploadFile
|
|
from sqlmodel import Session
|
|
from src.services.orgs.invites import (
|
|
create_invite_code,
|
|
delete_invite_code,
|
|
get_invite_code,
|
|
get_invite_codes,
|
|
)
|
|
from src.services.orgs.users import (
|
|
get_list_of_invited_users,
|
|
get_organization_users,
|
|
invite_batch_users,
|
|
remove_invited_user,
|
|
remove_user_from_org,
|
|
update_user_role,
|
|
)
|
|
from src.db.organization_config import OrganizationConfigBase
|
|
from src.db.users import PublicUser
|
|
from src.db.organizations import (
|
|
Organization,
|
|
OrganizationCreate,
|
|
OrganizationRead,
|
|
OrganizationUpdate,
|
|
OrganizationUser,
|
|
)
|
|
from src.core.events.database import get_db_session
|
|
from src.security.auth import get_current_user
|
|
from src.services.orgs.orgs import (
|
|
create_org,
|
|
create_org_with_config,
|
|
delete_org,
|
|
get_organization,
|
|
get_organization_by_slug,
|
|
get_orgs_by_user,
|
|
update_org,
|
|
update_org_logo,
|
|
update_org_signup_mechanism,
|
|
)
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("/")
|
|
async def api_create_org(
|
|
request: Request,
|
|
org_object: OrganizationCreate,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
) -> OrganizationRead:
|
|
"""
|
|
Create new organization
|
|
"""
|
|
return await create_org(request, org_object, current_user, db_session)
|
|
|
|
|
|
# Temporary pre-alpha code
|
|
@router.post("/withconfig/")
|
|
async def api_create_org_withconfig(
|
|
request: Request,
|
|
org_object: OrganizationCreate,
|
|
config_object: OrganizationConfigBase,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
) -> OrganizationRead:
|
|
"""
|
|
Create new organization
|
|
"""
|
|
return await create_org_with_config(
|
|
request, org_object, current_user, db_session, config_object
|
|
)
|
|
|
|
|
|
@router.get("/{org_id}")
|
|
async def api_get_org(
|
|
request: Request,
|
|
org_id: str,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
) -> OrganizationRead:
|
|
"""
|
|
Get single Org by ID
|
|
"""
|
|
return await get_organization(request, org_id, db_session, current_user)
|
|
|
|
|
|
@router.get("/{org_id}/users")
|
|
async def api_get_org_users(
|
|
request: Request,
|
|
org_id: str,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
) -> list[OrganizationUser]:
|
|
"""
|
|
Get single Org by ID
|
|
"""
|
|
return await get_organization_users(request, org_id, db_session, current_user)
|
|
|
|
|
|
@router.put("/{org_id}/users/{user_id}/role/{role_uuid}")
|
|
async def api_update_user_role(
|
|
request: Request,
|
|
org_id: str,
|
|
user_id: str,
|
|
role_uuid: str,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
):
|
|
"""
|
|
Update user role
|
|
"""
|
|
return await update_user_role(
|
|
request, org_id, user_id, role_uuid, db_session, current_user
|
|
)
|
|
|
|
|
|
@router.delete("/{org_id}/users/{user_id}")
|
|
async def api_remove_user_from_org(
|
|
request: Request,
|
|
org_id: int,
|
|
user_id: int,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
):
|
|
"""
|
|
Remove user from org
|
|
"""
|
|
return await remove_user_from_org(
|
|
request, org_id, user_id, db_session, current_user
|
|
)
|
|
|
|
|
|
# Config related routes
|
|
@router.put("/{org_id}/signup_mechanism")
|
|
async def api_get_org_signup_mechanism(
|
|
request: Request,
|
|
org_id: int,
|
|
signup_mechanism: Literal["open", "inviteOnly"],
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
):
|
|
"""
|
|
Get org signup mechanism
|
|
"""
|
|
return await update_org_signup_mechanism(
|
|
request, signup_mechanism, org_id, current_user, db_session
|
|
)
|
|
|
|
|
|
# Invites related routes
|
|
@router.post("/{org_id}/invites")
|
|
async def api_create_invite_code(
|
|
request: Request,
|
|
org_id: int,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
):
|
|
"""
|
|
Create invite code
|
|
"""
|
|
return await create_invite_code(request, org_id, current_user, db_session)
|
|
|
|
|
|
@router.get("/{org_id}/invites")
|
|
async def api_get_invite_codes(
|
|
request: Request,
|
|
org_id: int,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
):
|
|
"""
|
|
Get invite codes
|
|
"""
|
|
return await get_invite_codes(request, org_id, current_user, db_session)
|
|
|
|
@router.get("/{org_id}/invites/code/{invite_code}")
|
|
async def api_get_invite_code(
|
|
request: Request,
|
|
org_id: int,
|
|
invite_code: str,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
):
|
|
"""
|
|
Get invite code
|
|
"""
|
|
print(f"org_id: {org_id}, invite_code: {invite_code}")
|
|
return await get_invite_code(request, org_id,invite_code, current_user, db_session)
|
|
|
|
|
|
@router.delete("/{org_id}/invites/{org_invite_code_uuid}")
|
|
async def api_delete_invite_code(
|
|
request: Request,
|
|
org_id: int,
|
|
org_invite_code_uuid: str,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
):
|
|
"""
|
|
Delete invite code
|
|
"""
|
|
return await delete_invite_code(
|
|
request, org_id, org_invite_code_uuid, current_user, db_session
|
|
)
|
|
|
|
|
|
@router.post("/{org_id}/invites/users/batch")
|
|
async def api_invite_batch_users(
|
|
request: Request,
|
|
org_id: int,
|
|
users: str,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
):
|
|
"""
|
|
Invite batch users
|
|
"""
|
|
return await invite_batch_users(request, org_id, users, db_session, current_user)
|
|
|
|
|
|
@router.get("/{org_id}/invites/users")
|
|
async def api_get_org_users_invites(
|
|
request: Request,
|
|
org_id: int,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
):
|
|
"""
|
|
Get org users invites
|
|
"""
|
|
return await get_list_of_invited_users(request, org_id, db_session, current_user)
|
|
|
|
@router.delete("/{org_id}/invites/users/{email}")
|
|
async def api_delete_org_users_invites(
|
|
request: Request,
|
|
org_id: int,
|
|
email: str,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
):
|
|
"""
|
|
Delete org users invites
|
|
"""
|
|
return await remove_invited_user(request, org_id, email, db_session, current_user)
|
|
|
|
|
|
@router.get("/slug/{org_slug}")
|
|
async def api_get_org_by_slug(
|
|
request: Request,
|
|
org_slug: str,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
) -> OrganizationRead:
|
|
"""
|
|
Get single Org by Slug
|
|
"""
|
|
return await get_organization_by_slug(request, org_slug, db_session, current_user)
|
|
|
|
|
|
@router.put("/{org_id}/logo")
|
|
async def api_update_org_logo(
|
|
request: Request,
|
|
org_id: str,
|
|
logo_file: UploadFile,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
):
|
|
"""
|
|
Get single Org by Slug
|
|
"""
|
|
return await update_org_logo(
|
|
request=request,
|
|
logo_file=logo_file,
|
|
org_id=org_id,
|
|
current_user=current_user,
|
|
db_session=db_session,
|
|
)
|
|
|
|
|
|
@router.get("/user/page/{page}/limit/{limit}")
|
|
async def api_user_orgs(
|
|
request: Request,
|
|
page: int,
|
|
limit: int,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
) -> List[Organization]:
|
|
"""
|
|
Get orgs by page and limit by current user
|
|
"""
|
|
return await get_orgs_by_user(
|
|
request, db_session, str(current_user.id), page, limit
|
|
)
|
|
|
|
|
|
@router.put("/{org_id}")
|
|
async def api_update_org(
|
|
request: Request,
|
|
org_object: OrganizationUpdate,
|
|
org_id: int,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
) -> OrganizationRead:
|
|
"""
|
|
Update Org by ID
|
|
"""
|
|
return await update_org(request, org_object, org_id, current_user, db_session)
|
|
|
|
|
|
@router.delete("/{org_id}")
|
|
async def api_delete_org(
|
|
request: Request,
|
|
org_id: int,
|
|
current_user: PublicUser = Depends(get_current_user),
|
|
db_session: Session = Depends(get_db_session),
|
|
):
|
|
"""
|
|
Delete Org by ID
|
|
"""
|
|
|
|
return await delete_org(request, org_id, current_user, db_session)
|