"""Recent Search Item model.""" from sqlalchemy import func, UniqueConstraint, CheckConstraint from typing import List from db import db from enum import Enum class RecentSearchItemType(Enum): ARTIST = 0 PROJECT = 1 CAMPAIGN = 2 UNASSIGNED_PROJECT = 3 RECENTLY_VIEWED_PROJECT = 4 @staticmethod def all_values() -> List[int]: # noinspection PyTypeChecker return list(map(lambda c: c.value, RecentSearchItemType)) class RecentSearchItem(db.Model): """RecentSearchItem model.""" __tablename__ = "RecentSearchItem" id = db.Column(db.BigInteger, primary_key=True) type = db.Column( db.Integer, CheckConstraint( f""" (artist_id is not null AND type = {RecentSearchItemType.ARTIST.value}) OR (project_id is not null AND type = {RecentSearchItemType.PROJECT.value}) OR (campaign_id is not null AND type = {RecentSearchItemType.CAMPAIGN.value}) OR (project_id is not null AND type = {RecentSearchItemType.RECENTLY_VIEWED_PROJECT.value}) """, name="ck_RecentSearchItem_type", ), nullable=False, ) user_id = db.Column(db.Integer, db.ForeignKey("User.id", ondelete="CASCADE"), nullable=False) artist_id = db.Column(db.Integer, db.ForeignKey("Artist.id", ondelete="CASCADE"), nullable=True) project_id = db.Column(db.Integer, db.ForeignKey("Project.id", ondelete="CASCADE"), nullable=True) campaign_id = db.Column(db.Integer, db.ForeignKey("Campaign.id", ondelete="CASCADE"), nullable=True) searched_at = db.Column(db.TIMESTAMP(timezone=True), nullable=False, server_default=func.current_timestamp()) project = db.relationship("Project") artist = db.relationship("Artist") campaign = db.relationship("Campaign") user = db.relationship("User") __table_args__ = ( UniqueConstraint("artist_id", "user_id", name="uq_RecentSearchItem_artist_id_user_id"), UniqueConstraint("project_id", "user_id", "type", name="uq_RecentSearchItem_project_id_user_id_type"), UniqueConstraint("campaign_id", "user_id", name="uq_RecentSearchItem_campaign_id_user_id"), )