summaryrefslogtreecommitdiff
path: root/src/srht_contrib/models.py
blob: 401e945376715455f624c9e50e66eaee49f4a64c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
from __future__ import annotations

from datetime import datetime

from sqlalchemy import JSON, Boolean, DateTime, Float, Index, Integer, String, Text, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column

from srht_contrib.db import Base


class ContributionEvent(Base):
    __tablename__ = "contribution_events"
    __table_args__ = (
        UniqueConstraint("service", "external_uid", name="uq_contribution_event_service_uid"),
        Index("ix_contribution_events_actor_occurred_at", "actor", "occurred_at"),
        Index("ix_contribution_events_service_occurred_at", "service", "occurred_at"),
    )

    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    service: Mapped[str] = mapped_column(String(32), nullable=False)
    event_type: Mapped[str] = mapped_column(String(64), nullable=False)
    actor: Mapped[str] = mapped_column(String(255), nullable=False)
    repo_name: Mapped[str | None] = mapped_column(String(255), nullable=True)
    resource_id: Mapped[str] = mapped_column(String(255), nullable=False)
    external_uid: Mapped[str] = mapped_column(String(255), nullable=False)
    occurred_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False)
    weight: Mapped[float] = mapped_column(Float, nullable=False)
    raw_payload_json: Mapped[dict | None] = mapped_column(JSON, nullable=True)


class SyncState(Base):
    __tablename__ = "sync_states"
    __table_args__ = (UniqueConstraint("service", "actor", name="uq_sync_state_service_actor"),)

    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    service: Mapped[str] = mapped_column(String(32), nullable=False)
    actor: Mapped[str] = mapped_column(String(255), nullable=False)
    cursor_value: Mapped[str | None] = mapped_column(Text, nullable=True)
    updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False)


class TrackedRepository(Base):
    __tablename__ = "tracked_repositories"
    __table_args__ = (
        UniqueConstraint("service", "actor", "repo_name", name="uq_tracked_repository_service_actor_name"),
    )

    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    service: Mapped[str] = mapped_column(String(32), nullable=False)
    repo_name: Mapped[str] = mapped_column(String(255), nullable=False)
    actor: Mapped[str] = mapped_column(String(255), nullable=False)


class ActorAlias(Base):
    __tablename__ = "actor_aliases"
    __table_args__ = (UniqueConstraint("alias", name="uq_actor_alias_alias"),)

    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    canonical_actor: Mapped[str] = mapped_column(String(255), nullable=False)
    alias: Mapped[str] = mapped_column(String(255), nullable=False)


class TrackedActor(Base):
    __tablename__ = "tracked_actors"
    __table_args__ = (UniqueConstraint("actor", name="uq_tracked_actor_actor"),)

    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    actor: Mapped[str] = mapped_column(String(255), nullable=False)
    is_active: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
    discovery_state: Mapped[str] = mapped_column(String(32), nullable=False, default="queued")
    queued_for_discovery_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
    priority_boosted_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
    next_poll_after: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
    last_claimed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
    poll_attempts: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
    last_requested_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
    last_polled_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
    last_poll_status: Mapped[str | None] = mapped_column(String(32), nullable=True)
    last_poll_error: Mapped[str | None] = mapped_column(Text, nullable=True)
    recent_backfill_status: Mapped[str] = mapped_column(String(32), nullable=False, default="pending")
    recent_backfill_started_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
    recent_backfill_completed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
    last_recent_backfill_error: Mapped[str | None] = mapped_column(Text, nullable=True)
    backfill_status: Mapped[str] = mapped_column(String(32), nullable=False, default="pending")
    backfill_started_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
    backfill_completed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
    last_backfill_error: Mapped[str | None] = mapped_column(Text, nullable=True)


class DiscoveredRepository(Base):
    __tablename__ = "discovered_repositories"
    __table_args__ = (UniqueConstraint("actor", "name", name="uq_discovered_repository_actor_name"),)

    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    actor: Mapped[str] = mapped_column(String(255), nullable=False)
    name: Mapped[str] = mapped_column(String(255), nullable=False)
    discovered_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False)


class ServiceBackfillState(Base):
    __tablename__ = "service_backfill_states"
    __table_args__ = (UniqueConstraint("actor", "service", "scope", name="uq_service_backfill_state_actor_service_scope"),)

    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    actor: Mapped[str] = mapped_column(String(255), nullable=False)
    service: Mapped[str] = mapped_column(String(32), nullable=False)
    scope: Mapped[str] = mapped_column(String(16), nullable=False, default="full")
    cursor_json: Mapped[dict | None] = mapped_column(JSON, nullable=True)
    status: Mapped[str] = mapped_column(String(32), nullable=False, default="pending")
    started_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
    completed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
    last_error: Mapped[str | None] = mapped_column(Text, nullable=True)
    updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False)