from enum import Enum as PyEnum from typing import Optional, List from datetime import datetime, time from sqlalchemy import Column, CheckConstraint from sqlalchemy.dialects.postgresql import JSONB from sqlmodel import SQLModel, Field, Relationship, Enum from pydantic import BaseModel, constr class ShopStatus(PyEnum): ACTIVE = "active" INACTIVE = "inactive" SUSPENDED = "suspended" class ShopLinkEntry(BaseModel): name: constr(strip_whitespace=True, min_length=1) url: constr(strip_whitespace=True, min_length=1) class ShopLinks(BaseModel): links: List[ShopLinkEntry] class ShopBusinessHourEntry(BaseModel): day: constr(strip_whitespace=True, min_length=1) open_time: time close_time: time class ShopBusinessHours(BaseModel): hours: List[ShopBusinessHourEntry] class Shop(SQLModel, table=True): __tablename__ = 'shop' id: Optional[int] = Field(default=None, primary_key=True) owner_id: int = Field(foreign_key='user.id', nullable=False) name: str = Field(max_length=100, nullable=False, unique=True) description: str = Field(max_length=500, nullable=False) created_at: datetime = Field(default_factory=datetime.utcnow, nullable=False) updated_at: datetime = Field(default_factory=datetime.utcnow, nullable=False) status: ShopStatus = Field(sa_column=Column(Enum(ShopStatus))) logo: Optional[str] = Field(max_length=100) contact_email: str = Field(max_length=128, nullable=False, unique=True) phone_number: str = Field(max_length=15, nullable=False) address: str = Field(nullable=False) currency: str = Field(max_length=3, nullable=False) business_hours: ShopBusinessHours = Field( sa_column=Column(JSONB, nullable=False, default=lambda: {}) ) links: ShopLinks = Field( sa_column=Column(JSONB, nullable=False, default=lambda: {}) ) owner: Optional["User"] = Relationship(back_populates='owned_shops') registered_users: List["User"] = Relationship(back_populates='registered_shop') __table_args__ = ( CheckConstraint("business_hours ? 'hours'", name="check_business_hours_keys"), CheckConstraint("links ? 'links'", name="check_links_keys"), ) __all__ = ["Shop", "ShopBusinessHours", "ShopLinks", "ShopStatus"]