127 lines
2.9 KiB
Python
127 lines
2.9 KiB
Python
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
from app.models import (
|
|
NotificationStatus,
|
|
NotificationType,
|
|
ProviderStatusType,
|
|
RegionScope,
|
|
SourceStatusType,
|
|
WatchType,
|
|
)
|
|
|
|
|
|
class WatchItemCreate(BaseModel):
|
|
name: str = Field(min_length=2, max_length=255)
|
|
watch_type: WatchType
|
|
region_scope: RegionScope
|
|
notes: str | None = None
|
|
|
|
|
|
class WatchItemUpdate(BaseModel):
|
|
name: str | None = Field(default=None, min_length=2, max_length=255)
|
|
watch_type: WatchType | None = None
|
|
region_scope: RegionScope | None = None
|
|
notes: str | None = None
|
|
is_active: bool | None = None
|
|
|
|
|
|
class WatchItemRead(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int
|
|
name: str
|
|
watch_type: WatchType
|
|
region_scope: RegionScope
|
|
notes: str | None
|
|
is_active: bool
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class WatchSourceCreate(BaseModel):
|
|
label: str | None = Field(default=None, max_length=255)
|
|
url: str = Field(min_length=8, max_length=1024)
|
|
parser_type: str = "auto"
|
|
|
|
|
|
class WatchSourceUpdate(BaseModel):
|
|
label: str | None = Field(default=None, max_length=255)
|
|
url: str | None = Field(default=None, min_length=8, max_length=1024)
|
|
parser_type: str | None = None
|
|
is_active: bool | None = None
|
|
|
|
|
|
class WatchSourceRead(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int
|
|
watch_item_id: int
|
|
label: str | None
|
|
url: str
|
|
parser_type: str
|
|
is_active: bool
|
|
last_status: SourceStatusType
|
|
last_message: str | None
|
|
last_checked_at: datetime | None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class PurchaseUpdate(BaseModel):
|
|
is_ticket_purchased: bool
|
|
|
|
|
|
class TrackedEventRead(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int
|
|
watch_item_id: int
|
|
source: str
|
|
external_id: str
|
|
title: str
|
|
matched_term: str
|
|
venue_name: str | None
|
|
city: str | None
|
|
country_code: str | None
|
|
event_date: datetime | None
|
|
ticket_url: str | None
|
|
image_url: str | None
|
|
is_ticket_purchased: bool
|
|
purchased_at: datetime | None
|
|
discovery_notified_at: datetime | None
|
|
reminder_notified_at: datetime | None
|
|
first_seen_at: datetime
|
|
last_seen_at: datetime
|
|
|
|
|
|
class NotificationLogRead(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int
|
|
tracked_event_id: int
|
|
notification_type: NotificationType
|
|
status: NotificationStatus
|
|
message: str
|
|
created_at: datetime
|
|
|
|
|
|
class SyncResult(BaseModel):
|
|
scanned_watch_items: int
|
|
new_events: int
|
|
updated_events: int
|
|
notifications_sent: int
|
|
notifications_skipped: int
|
|
|
|
|
|
class ProviderStatusRead(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int
|
|
provider_name: str
|
|
status: ProviderStatusType
|
|
message: str
|
|
last_checked_at: datetime
|
|
last_success_at: datetime | None
|