feat(friendships): implement dependencies and router with CRUD endpoints
This commit is contained in:
@@ -1 +1,33 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Annotated
|
||||||
|
|
||||||
|
from fastapi import Depends
|
||||||
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
|
||||||
|
from core.auth.models import CurrentUser
|
||||||
|
from core.db import get_db
|
||||||
|
from v1.friendships.repository import SQLAlchemyFriendshipRepository
|
||||||
|
from v1.friendships.service import FriendshipService
|
||||||
|
from v1.users.dependencies import get_current_user
|
||||||
|
from v1.users.repository import SQLAlchemyUserRepository
|
||||||
|
|
||||||
|
|
||||||
|
async def get_friendship_repository(
|
||||||
|
session: Annotated[AsyncSession, Depends(get_db)],
|
||||||
|
) -> SQLAlchemyFriendshipRepository:
|
||||||
|
return SQLAlchemyFriendshipRepository(session)
|
||||||
|
|
||||||
|
|
||||||
|
async def get_friendship_service(
|
||||||
|
session: Annotated[AsyncSession, Depends(get_db)],
|
||||||
|
current_user: Annotated[CurrentUser, Depends(get_current_user)],
|
||||||
|
) -> FriendshipService:
|
||||||
|
friendship_repository = SQLAlchemyFriendshipRepository(session)
|
||||||
|
user_repository = SQLAlchemyUserRepository(session)
|
||||||
|
return FriendshipService(
|
||||||
|
repository=friendship_repository,
|
||||||
|
user_repository=user_repository,
|
||||||
|
session=session,
|
||||||
|
current_user=current_user,
|
||||||
|
)
|
||||||
|
|||||||
@@ -1 +1,97 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Annotated
|
||||||
|
from uuid import UUID
|
||||||
|
|
||||||
|
from fastapi import APIRouter, Depends, status
|
||||||
|
|
||||||
|
from v1.friendships.dependencies import get_friendship_service
|
||||||
|
from v1.friendships.schemas import (
|
||||||
|
FriendRequestAction,
|
||||||
|
FriendRequestCreate,
|
||||||
|
FriendRequestResponse,
|
||||||
|
FriendResponse,
|
||||||
|
)
|
||||||
|
from v1.friendships.service import FriendshipService
|
||||||
|
|
||||||
|
|
||||||
|
router = APIRouter(prefix="/friends", tags=["friends"])
|
||||||
|
|
||||||
|
|
||||||
|
@router.post(
|
||||||
|
"/requests",
|
||||||
|
response_model=FriendRequestResponse,
|
||||||
|
status_code=status.HTTP_201_CREATED,
|
||||||
|
)
|
||||||
|
async def send_friend_request(
|
||||||
|
payload: FriendRequestCreate,
|
||||||
|
service: Annotated[FriendshipService, Depends(get_friendship_service)],
|
||||||
|
) -> FriendRequestResponse:
|
||||||
|
return await service.send_request(payload)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/requests/inbox", response_model=list[FriendRequestResponse])
|
||||||
|
async def get_inbox(
|
||||||
|
service: Annotated[FriendshipService, Depends(get_friendship_service)],
|
||||||
|
) -> list[FriendRequestResponse]:
|
||||||
|
return await service.get_inbox()
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/requests/outgoing", response_model=list[FriendRequestResponse])
|
||||||
|
async def get_outgoing_requests(
|
||||||
|
service: Annotated[FriendshipService, Depends(get_friendship_service)],
|
||||||
|
) -> list[FriendRequestResponse]:
|
||||||
|
return await service.get_outgoing_requests()
|
||||||
|
|
||||||
|
|
||||||
|
@router.post(
|
||||||
|
"/requests/{friendship_id}/accept",
|
||||||
|
response_model=FriendRequestResponse,
|
||||||
|
)
|
||||||
|
async def accept_friend_request(
|
||||||
|
friendship_id: UUID,
|
||||||
|
_: FriendRequestAction,
|
||||||
|
service: Annotated[FriendshipService, Depends(get_friendship_service)],
|
||||||
|
) -> FriendRequestResponse:
|
||||||
|
return await service.accept_request(friendship_id)
|
||||||
|
|
||||||
|
|
||||||
|
@router.post(
|
||||||
|
"/requests/{friendship_id}/decline",
|
||||||
|
response_model=FriendRequestResponse,
|
||||||
|
)
|
||||||
|
async def decline_friend_request(
|
||||||
|
friendship_id: UUID,
|
||||||
|
_: FriendRequestAction,
|
||||||
|
service: Annotated[FriendshipService, Depends(get_friendship_service)],
|
||||||
|
) -> FriendRequestResponse:
|
||||||
|
return await service.decline_request(friendship_id)
|
||||||
|
|
||||||
|
|
||||||
|
@router.delete(
|
||||||
|
"/requests/{friendship_id}",
|
||||||
|
status_code=status.HTTP_204_NO_CONTENT,
|
||||||
|
)
|
||||||
|
async def cancel_friend_request(
|
||||||
|
friendship_id: UUID,
|
||||||
|
service: Annotated[FriendshipService, Depends(get_friendship_service)],
|
||||||
|
) -> None:
|
||||||
|
await service.cancel_request(friendship_id)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("", response_model=list[FriendResponse])
|
||||||
|
async def get_friends_list(
|
||||||
|
service: Annotated[FriendshipService, Depends(get_friendship_service)],
|
||||||
|
) -> list[FriendResponse]:
|
||||||
|
return await service.get_friends_list()
|
||||||
|
|
||||||
|
|
||||||
|
@router.delete(
|
||||||
|
"/{friendship_id}",
|
||||||
|
status_code=status.HTTP_204_NO_CONTENT,
|
||||||
|
)
|
||||||
|
async def remove_friend(
|
||||||
|
friendship_id: UUID,
|
||||||
|
service: Annotated[FriendshipService, Depends(get_friendship_service)],
|
||||||
|
) -> None:
|
||||||
|
await service.remove_friend(friendship_id)
|
||||||
|
|||||||
@@ -5,12 +5,14 @@ from fastapi import APIRouter
|
|||||||
from core.http.models import HealthResponse
|
from core.http.models import HealthResponse
|
||||||
from v1.agent_chat.router import router as agent_chat_router
|
from v1.agent_chat.router import router as agent_chat_router
|
||||||
from v1.auth.router import router as auth_router
|
from v1.auth.router import router as auth_router
|
||||||
|
from v1.friendships.router import router as friendships_router
|
||||||
from v1.infra.router import router as infra_router
|
from v1.infra.router import router as infra_router
|
||||||
from v1.users.router import router as users_router
|
from v1.users.router import router as users_router
|
||||||
|
|
||||||
|
|
||||||
router = APIRouter(prefix="/api/v1")
|
router = APIRouter(prefix="/api/v1")
|
||||||
router.include_router(auth_router)
|
router.include_router(auth_router)
|
||||||
|
router.include_router(friendships_router)
|
||||||
router.include_router(infra_router)
|
router.include_router(infra_router)
|
||||||
router.include_router(users_router)
|
router.include_router(users_router)
|
||||||
router.include_router(agent_chat_router)
|
router.include_router(agent_chat_router)
|
||||||
|
|||||||
Reference in New Issue
Block a user