"""Модели пользователей.""" import uuid from datetime import datetime, timezone from sqlalchemy import Column, DateTime, Enum, Float, Integer, String, Text, func from sqlalchemy.dialects.postgresql import UUID as PG_UUID from sqlalchemy.orm import Mapped, mapped_column, relationship from app.core.database import Base class User(Base): __tablename__ = "users" id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) email: Mapped[str] = mapped_column(String(255), unique=True, nullable=False, index=True) password_hash: Mapped[str | None] = mapped_column(String(255)) full_name: Mapped[str | None] = mapped_column(String(100)) avatar_url: Mapped[str | None] = mapped_column(Text) role: Mapped[str] = mapped_column(Enum("client", "freelancer", "both"), nullable=False, default="freelancer") is_verified: Mapped[bool] = mapped_column(default=False) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), onupdate=func.now()) # Relationships freelancer_profile: Mapped["FreelancerProfile | None"] = relationship(back_populates="user", uselist=False) client_profile: Mapped["ClientProfile | None"] = relationship(back_populates="user", uselist=False) class FreelancerProfile(Base): __tablename__ = "freelancer_profiles" user_id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, nullable=False) bio: Mapped[str | None] = mapped_column(Text) skills: Mapped[list] = mapped_column("skills", postgresql.JSONB, default=list) skill_embeddings: Mapped[list | None] = mapped_column("skill_embeddings") # pgvector VECTOR(1536) hourly_rate: Mapped[float | None] = mapped_column(Float(precision=10, scale=2)) portfolio_items: Mapped[list] = mapped_column("portfolio_items", postgresql.JSONB, default=list) experience_years: Mapped[int | None] = mapped_column(Integer) languages: Mapped[list] = mapped_column("languages", postgresql.JSONB, default=list) rating: Mapped[float] = mapped_column(Float(precision=3, scale=2), default=5.0) total_jobs_completed: Mapped[int] = mapped_column(Integer, default=0) response_time_hours: Mapped[int | None] = mapped_column(Integer) is_online: Mapped[bool] = mapped_column(default=False) last_seen: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) user: Mapped["User"] = relationship(back_populates="freelancer_profile") class ClientProfile(Base): __tablename__ = "client_profiles" user_id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, nullable=False) company_name: Mapped[str | None] = mapped_column(String(255)) industry: Mapped[str | None] = mapped_column(String(100)) budget_range: Mapped[dict | None] = mapped_column("budget_range", postgresql.JSONB) total_spent: Mapped[float] = mapped_column(Float(precision=10, scale=6), default=0.0) rating: Mapped[float] = mapped_column(Float(precision=3, scale=2), default=5.0) user: Mapped["User"] = relationship(back_populates="client_profile")