|
|
from __future__ import annotations |
|
|
|
|
|
from typing import Optional |
|
|
|
|
|
from bson import ObjectId |
|
|
from pydantic import BaseModel, Field, field_validator |
|
|
|
|
|
|
|
|
class CategorizeRequest(BaseModel): |
|
|
notes: str = Field(..., min_length=1, description="Full transaction note.") |
|
|
user_id: str = Field(..., description="User identifier associated with the request.") |
|
|
|
|
|
|
|
|
class CategoryPrediction(BaseModel): |
|
|
headcategory_id: str = Field(..., description="High-level category ObjectId.") |
|
|
headcategory_title: str = Field(..., description="High-level category title.") |
|
|
category_id: str = Field(..., description="Specific subcategory ObjectId chosen by the model.") |
|
|
category_title: str = Field(..., description="Specific subcategory title chosen by the model.") |
|
|
|
|
|
@field_validator('headcategory_id', 'category_id') |
|
|
@classmethod |
|
|
def validate_object_id(cls, v: str) -> str: |
|
|
"""Validate that the string is a valid ObjectId.""" |
|
|
if not ObjectId.is_valid(v): |
|
|
raise ValueError(f"Invalid ObjectId: {v}") |
|
|
return v |
|
|
|
|
|
|
|
|
class CategorizeResponse(BaseModel): |
|
|
status: str = Field(..., description="Outcome of the request (success/fail).") |
|
|
data: Optional[CategoryPrediction] = Field( |
|
|
None, description="Predicted category payload when successful." |
|
|
) |
|
|
message: Optional[str] = Field(None, description="Error message when failed.") |
|
|
|