45 lines
1.8 KiB
Python
45 lines
1.8 KiB
Python
# app/api/v1/endpoints/expenses.py
|
|
import logging
|
|
from typing import List as PyList
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.database import get_db
|
|
from app.api.dependencies import get_current_user
|
|
from app.models import User as UserModel, SettlementActivityTypeEnum
|
|
from app.schemas.expense import (
|
|
ExpenseRecordPublic,
|
|
ExpenseSharePublic,
|
|
SettleShareRequest
|
|
)
|
|
from app.schemas.message import Message
|
|
from app.crud import expense as crud_expense
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
|
|
@router.get("/lists/{list_id}/expenses", response_model=PyList[ExpenseRecordPublic], tags=["Expenses"])
|
|
async def read_list_expense_records(
|
|
list_id: int,
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: UserModel = Depends(get_current_user),
|
|
):
|
|
"""Retrieves all historical expense calculation records for a specific list."""
|
|
records = await crud_expense.get_expense_records_for_list(db, list_id=list_id)
|
|
return records
|
|
|
|
@router.post("/expenses/{expense_record_id}/settle", response_model=Message, tags=["Expenses"])
|
|
async def settle_expense_share(
|
|
expense_record_id: int,
|
|
settle_request: SettleShareRequest,
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: UserModel = Depends(get_current_user),
|
|
):
|
|
"""Marks a specific user's share within an expense record as paid."""
|
|
affected_user_id = settle_request.affected_user_id
|
|
share_to_update = await crud_expense.get_expense_share(db, record_id=expense_record_id, user_id=affected_user_id)
|
|
if not share_to_update:
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Expense share not found")
|
|
await crud_expense.mark_share_as_paid(db, share_id=share_to_update.id, is_paid_status=True)
|
|
return Message(detail="Share successfully marked as paid") |