diff --git a/api/app/ledger/__init__.py b/api/app/ledger/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/app/ledger/resource.py b/api/app/ledger/resource.py new file mode 100644 index 0000000..bf3a1d5 --- /dev/null +++ b/api/app/ledger/resource.py @@ -0,0 +1,18 @@ +from datetime import date + +from sqlalchemy import and_, select +from sqlalchemy.orm import aliased + +from transaction.models import Split, Transaction + + +class LedgerResource: + @classmethod + def get_ledger(cls, session, account_id): + split_account = aliased(Split) + + return session.exec( + select(Transaction, split_account).join(split_account, and_( + split_account.account_id == account_id, + Transaction.id == split_account.transaction_id + ))).all() diff --git a/api/app/ledger/routes.py b/api/app/ledger/routes.py new file mode 100644 index 0000000..0135b2c --- /dev/null +++ b/api/app/ledger/routes.py @@ -0,0 +1,17 @@ +from uuid import UUID + +from fastapi import APIRouter, Depends + +from db import SessionDep +from ledger.schema import TransactionLedgerRead +from transaction.resource import TransactionResource +from user.manager import get_current_user + +router = APIRouter() + +@router.get("/{account_id}") +def read_ledger(account_id: UUID, session: SessionDep, current_user=Depends(get_current_user)) -> list[TransactionLedgerRead]: + response = [] + for transaction, split in TransactionResource.get_ledger(session, account_id): + response.append(TransactionLedgerRead(transaction=transaction, account_split=split)) + return response diff --git a/api/app/ledger/schema.py b/api/app/ledger/schema.py new file mode 100644 index 0000000..2c09712 --- /dev/null +++ b/api/app/ledger/schema.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel, Field + +from transaction.models import TransactionRead, SplitRead + +class TransactionLedgerRead(BaseModel): + transaction: TransactionRead = Field() + account_split: SplitRead = Field() \ No newline at end of file diff --git a/api/app/main.py b/api/app/main.py index 6acf18a..7579830 100644 --- a/api/app/main.py +++ b/api/app/main.py @@ -5,15 +5,14 @@ from fastapi.security import OAuth2PasswordBearer from fastapi.middleware.cors import CORSMiddleware from fastapi_pagination import add_pagination - from db import create_db_and_tables from user import user_router, auth_router, create_admin_user from account.account_routes import router as account_router from account.category_routes import router as category_router +from ledger.routes import router as ledger_router from payee.routes import router as payee_router from transaction.routes import router as transaction_router - @asynccontextmanager async def lifespan(app: FastAPI): create_db_and_tables() @@ -41,6 +40,7 @@ app.include_router(auth_router, prefix="/auth", tags=["auth"], ) app.include_router(user_router, prefix="/users", tags=["users"]) app.include_router(account_router, prefix="/accounts", tags=["accounts"]) app.include_router(category_router, prefix="/categories", tags=["categories"]) +app.include_router(ledger_router, prefix="/ledgers", tags=["ledgers"]) app.include_router(payee_router, prefix="/payees", tags=["payees"]) app.include_router(transaction_router, prefix="/transactions", tags=["transactions"])