SurfSense/surfsense_backend/app/schemas/search_source_connector.py

68 lines
2.3 KiB
Python
Raw Normal View History

2025-03-14 18:53:14 -07:00
import uuid
from datetime import datetime
from typing import Any
from pydantic import BaseModel, ConfigDict, field_validator, model_validator
2025-03-14 18:53:14 -07:00
from app.db import SearchSourceConnectorType
2025-10-08 00:29:09 +05:30
from app.utils.validators import validate_connector_config
2025-03-14 18:53:14 -07:00
from .base import IDModel, TimestampModel
2025-03-14 18:53:14 -07:00
class SearchSourceConnectorBase(BaseModel):
name: str
connector_type: SearchSourceConnectorType
is_indexable: bool
last_indexed_at: datetime | None = None
config: dict[str, Any]
periodic_indexing_enabled: bool = False
indexing_frequency_minutes: int | None = None
next_scheduled_at: datetime | None = None
@field_validator("config")
2025-03-14 18:53:14 -07:00
@classmethod
def validate_config_for_connector_type(
cls, config: dict[str, Any], values: dict[str, Any]
) -> dict[str, Any]:
connector_type = values.data.get("connector_type")
2025-10-08 00:29:09 +05:30
return validate_connector_config(connector_type, config)
2025-03-14 18:53:14 -07:00
@model_validator(mode="after")
def validate_periodic_indexing(self):
"""Validate that periodic indexing configuration is consistent."""
if self.periodic_indexing_enabled:
if not self.is_indexable:
raise ValueError(
"periodic_indexing_enabled can only be True for indexable connectors"
)
if self.indexing_frequency_minutes is None:
raise ValueError(
"indexing_frequency_minutes is required when periodic_indexing_enabled is True"
)
if self.indexing_frequency_minutes <= 0:
raise ValueError("indexing_frequency_minutes must be greater than 0")
return self
2025-03-14 18:53:14 -07:00
class SearchSourceConnectorCreate(SearchSourceConnectorBase):
pass
2025-04-16 20:29:50 -07:00
class SearchSourceConnectorUpdate(BaseModel):
name: str | None = None
connector_type: SearchSourceConnectorType | None = None
is_indexable: bool | None = None
last_indexed_at: datetime | None = None
config: dict[str, Any] | None = None
periodic_indexing_enabled: bool | None = None
indexing_frequency_minutes: int | None = None
next_scheduled_at: datetime | None = None
2025-03-14 18:53:14 -07:00
class SearchSourceConnectorRead(SearchSourceConnectorBase, IDModel, TimestampModel):
search_space_id: int
2025-03-14 18:53:14 -07:00
user_id: uuid.UUID
model_config = ConfigDict(from_attributes=True)