91 lines
2.4 KiB
Python
91 lines
2.4 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
import uuid
|
|
|
|
from db.session import get_db
|
|
from core.deps import get_current_user
|
|
from domains.groups.schemas import (
|
|
GroupCreate,
|
|
GroupResponse,
|
|
AddMemberRequest,
|
|
GroupMemberResponse
|
|
)
|
|
from domains.groups.service import (
|
|
create_user_group,
|
|
list_user_groups,
|
|
list_group_members_api,
|
|
invite_member_to_group,
|
|
delete_group_service
|
|
)
|
|
|
|
router = APIRouter(
|
|
prefix="/groups",
|
|
tags=["groups"]
|
|
)
|
|
|
|
@router.post("/", response_model=GroupResponse)
|
|
async def user_create_group(
|
|
payload: GroupCreate,
|
|
db: AsyncSession = Depends(get_db),
|
|
user=Depends(get_current_user)
|
|
):
|
|
"""
|
|
Regular users always create private groups and become the first manager.
|
|
"""
|
|
return await create_user_group(
|
|
db,
|
|
name=payload.name,
|
|
owner_id=user.id
|
|
)
|
|
|
|
@router.get("/my", response_model=list[GroupResponse])
|
|
async def my_groups(
|
|
db: AsyncSession = Depends(get_db),
|
|
user=Depends(get_current_user)
|
|
):
|
|
"""
|
|
List groups the current user is a member of.
|
|
"""
|
|
return await list_user_groups(db, user.id)
|
|
|
|
@router.get("/{group_id}/members", response_model=list[GroupMemberResponse])
|
|
async def list_members(
|
|
group_id: uuid.UUID,
|
|
db: AsyncSession = Depends(get_db),
|
|
user=Depends(get_current_user)
|
|
):
|
|
return await list_group_members_api(db, str(group_id))
|
|
|
|
@router.post("/{group_id}/invite")
|
|
async def invite_member(
|
|
group_id: uuid.UUID,
|
|
payload: AddMemberRequest,
|
|
db: AsyncSession = Depends(get_db),
|
|
user=Depends(get_current_user)
|
|
):
|
|
try:
|
|
notification = await invite_member_to_group(
|
|
db,
|
|
group_id,
|
|
user.id,
|
|
payload.username
|
|
)
|
|
return {"message": "Invitation sent", "notification_id": str(notification.id)}
|
|
except ValueError as e:
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
|
|
@router.delete("/{group_id}")
|
|
async def delete_my_group(
|
|
group_id: uuid.UUID,
|
|
db: AsyncSession = Depends(get_db),
|
|
user=Depends(get_current_user)
|
|
):
|
|
"""
|
|
Only the Group Owner (creator) can delete the group.
|
|
"""
|
|
try:
|
|
await delete_group_service(db, group_id, user)
|
|
return {"message": "Group deleted successfully"}
|
|
except ValueError as e:
|
|
raise HTTPException(status_code=403, detail=str(e))
|