# 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")