# schemas.py from pydantic import BaseModel, EmailStr , UUID4 , Field from typing import Optional , Any from uuid import UUID from datetime import datetime import os import sys from pathlib import Path # ensure project root (agent/) is on sys.path so sibling packages like "s3" can be imported project_root = Path(__file__).resolve().parents[2] # -> ...\openai_agents\agent if str(project_root) not in sys.path: sys.path.insert(0, str(project_root)) from .models import UserRole,DatasetStatus # ----------------------------- # USER SCHEMAS # ----------------------------- class UserBase(BaseModel): fullname: str username: str email: EmailStr class UserCreate(UserBase): password: str role: Optional[UserRole] = UserRole.employee is_active: Optional[bool] = True organization_id: Optional[UUID] = None provider_id: Optional[UUID] = None class UserResponse(BaseModel): id: UUID fullname: str username: str email: EmailStr role: UserRole is_active: bool last_login: Optional[datetime] organization_id: Optional[UUID] provider_id: Optional[UUID] created_at: datetime updated_at: datetime class Config: from_attributes = True class LoginRequest(BaseModel): email: EmailStr password: str # ----------------------------- # CONVERSATION SCHEMAS # ----------------------------- class ConversationCreate(BaseModel): convo_id: str user_query: dict response: dict file_metadata: Optional[dict] = None is_saved: Optional[bool] = False class ConversationResponse(BaseModel): id: UUID convo_id: str user_query: dict response: dict file_metadata: Optional[dict] = None is_saved: bool user_id: UUID created_at: datetime updated_at: datetime class Config: from_attributes = True # ----------------------------- # ORGANIZATION SCHEMAS # ----------------------------- class OrganizationCreate(BaseModel): name: str plan_id: UUID domain: Optional[str] = None location: Optional[str] = None city: Optional[str] = None state: Optional[str] = None country: Optional[str] = None is_active: Optional[bool] = True class OrganizationResponse(BaseModel): id: UUID name: str domain: Optional[str] = None plan_id: UUID location: Optional[str] = None city: Optional[str] = None state: Optional[str] = None country: Optional[str] = None is_active: bool class Config: from_attributes = True # ----------------------------- # PLAN SCHEMAS # ----------------------------- class PlanCreate(BaseModel): plan_type: str price: float features: Optional[str] = None class PlanResponse(BaseModel): id: UUID plan_type: str price: float features: Optional[str] = None class Config: from_attributes = True # ----------------------------- # DATASET SCHEMAS # -------------------------------- class DatasetBase(BaseModel): name: str description: Optional[str] = None category: Optional[str] = None tags: Optional[list[str]] = None metadata: Optional[dict] = None class DatasetCreate(DatasetBase): organization_id: UUID # status defaults to "pending" in database file_key: Optional[str] = None # S3 file reference file_size: Optional[int] = None file_type: Optional[str] = None class DatasetUpdate(BaseModel): name: Optional[str] = None description: Optional[str] = None category: Optional[str] = None tags: Optional[list[str]] = None metadata: Optional[dict] = None status: Optional[DatasetStatus] = None rejection_reason: Optional[str] = None class DatasetResponse(DatasetBase): id: UUID organization_id: UUID status: DatasetStatus file_key: Optional[str] = None file_size: Optional[int] = None file_type: Optional[str] = None rejection_reason: Optional[str] = None created_at: datetime updated_at: datetime submitted_by: Optional[UUID] = None # User ID who submitted class Config: from_attributes = True # ----------------------------- # USERMETADATA SCHEMAS # -------------------------------- class UserDatasetsMetadataBase(BaseModel): user_id: UUID user_metadata: Any # will store full JSON response class UserDatasetsMetadataCreate(UserDatasetsMetadataBase): pass class UserDatasetsMetadataResponse(UserDatasetsMetadataBase): id: UUID created_at: datetime updated_at: datetime class Config: orm_mode = True # ----------------------------- # ORGANIZATIONS SCHEMAS # -------------------------------- class OrganizationBase(BaseModel): name: str domain: Optional[str] = None plan_id: UUID location: Optional[str] = None city: Optional[str] = None state: Optional[str] = None country: Optional[str] = None is_active: Optional[bool] = True class OrganizationCreate(OrganizationBase): pass class OrganizationUpdate(BaseModel): name: Optional[str] = None domain: Optional[str] = None location: Optional[str] = None city: Optional[str] = None state: Optional[str] = None country: Optional[str] = None is_active: Optional[bool] = None class OrganizationResponse(OrganizationBase): id: UUID created_by: Optional[UUID] = None created_at: datetime updated_at: datetime deleted_at: Optional[datetime] = None class Config: orm_mode = True