61 lines
1.5 KiB
Python
61 lines
1.5 KiB
Python
import uuid
|
|
from datetime import date, datetime
|
|
|
|
from pydantic import BaseModel, field_validator
|
|
|
|
from app.models.transaction import TransactionType
|
|
from app.schemas.common import PaginatedResponse
|
|
|
|
|
|
class CategoryBrief(BaseModel):
|
|
id: uuid.UUID
|
|
name: str
|
|
color: str | None
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class TransactionCreate(BaseModel):
|
|
amount_cents: int
|
|
type: TransactionType
|
|
category_id: uuid.UUID
|
|
description: str | None = None
|
|
transaction_date: date
|
|
|
|
@field_validator("amount_cents")
|
|
@classmethod
|
|
def amount_must_be_positive(cls, v: int) -> int:
|
|
if v <= 0:
|
|
raise ValueError("amount_cents must be greater than 0")
|
|
return v
|
|
|
|
|
|
class TransactionUpdate(BaseModel):
|
|
amount_cents: int | None = None
|
|
type: TransactionType | None = None
|
|
category_id: uuid.UUID | None = None
|
|
description: str | None = None
|
|
transaction_date: date | None = None
|
|
|
|
@field_validator("amount_cents")
|
|
@classmethod
|
|
def amount_must_be_positive(cls, v: int | None) -> int | None:
|
|
if v is not None and v <= 0:
|
|
raise ValueError("amount_cents must be greater than 0")
|
|
return v
|
|
|
|
|
|
class TransactionResponse(BaseModel):
|
|
id: uuid.UUID
|
|
amount_cents: int
|
|
type: TransactionType
|
|
description: str | None
|
|
category: CategoryBrief
|
|
transaction_date: date
|
|
created_at: datetime
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
PaginatedTransactions = PaginatedResponse[TransactionResponse]
|