corvix.db

SQLAlchemy ORM models and engine helpers for PostgreSQL persistence.

Classes

Base

Shared declarative base for all ORM models.

User

Registered user with an encrypted GitHub token.

NotificationRecordRow

Persisted notification record scoped to a user.

UserPreferences

Per-user preferences (theme, browser notifications).

PushSubscription

Browser push subscription for a user.

Functions

get_database_url(→ str | None)

Return DB URL from env, supporting ${URL_ENV}_FILE Docker secret files.

Module Contents

class corvix.db.Base[source][source]

Bases: sqlalchemy.orm.DeclarativeBase

Shared declarative base for all ORM models.

class corvix.db.User[source][source]

Bases: Base

Registered user with an encrypted GitHub token.

__tablename__ = 'users'[source][source]
id: sqlalchemy.orm.Mapped[uuid.UUID][source][source]
github_login: sqlalchemy.orm.Mapped[str][source][source]
github_token: sqlalchemy.orm.Mapped[str][source][source]
created_at: sqlalchemy.orm.Mapped[datetime.datetime][source][source]
updated_at: sqlalchemy.orm.Mapped[datetime.datetime][source][source]
preferences: sqlalchemy.orm.Mapped[UserPreferences | None][source][source]
push_subscriptions: sqlalchemy.orm.Mapped[list[PushSubscription]][source][source]
notification_records: sqlalchemy.orm.Mapped[list[NotificationRecordRow]][source][source]
class corvix.db.NotificationRecordRow[source][source]

Bases: Base

Persisted notification record scoped to a user.

__tablename__ = 'notification_records'[source][source]
__table_args__[source][source]
id: sqlalchemy.orm.Mapped[int][source][source]
user_id: sqlalchemy.orm.Mapped[uuid.UUID][source][source]
account_id: sqlalchemy.orm.Mapped[str][source][source]
account_label: sqlalchemy.orm.Mapped[str][source][source]
thread_id: sqlalchemy.orm.Mapped[str][source][source]
repository: sqlalchemy.orm.Mapped[str][source][source]
reason: sqlalchemy.orm.Mapped[str][source][source]
subject_title: sqlalchemy.orm.Mapped[str][source][source]
subject_type: sqlalchemy.orm.Mapped[str][source][source]
unread: sqlalchemy.orm.Mapped[bool][source][source]
updated_at: sqlalchemy.orm.Mapped[datetime.datetime][source][source]
thread_url: sqlalchemy.orm.Mapped[str | None][source][source]
web_url: sqlalchemy.orm.Mapped[str | None][source][source]
score: sqlalchemy.orm.Mapped[float][source][source]
excluded: sqlalchemy.orm.Mapped[bool][source][source]
matched_rules: sqlalchemy.orm.Mapped[list[str]][source][source]
actions_taken: sqlalchemy.orm.Mapped[list[str]][source][source]
context: sqlalchemy.orm.Mapped[dict[str, object]][source][source]
dismissed: sqlalchemy.orm.Mapped[bool][source][source]
snapshot_at: sqlalchemy.orm.Mapped[datetime.datetime][source][source]
user: sqlalchemy.orm.Mapped[User][source][source]
class corvix.db.UserPreferences[source][source]

Bases: Base

Per-user preferences (theme, browser notifications).

__tablename__ = 'user_preferences'[source][source]
user_id: sqlalchemy.orm.Mapped[uuid.UUID][source][source]
theme: sqlalchemy.orm.Mapped[str][source][source]
browser_notify: sqlalchemy.orm.Mapped[bool][source][source]
user: sqlalchemy.orm.Mapped[User][source][source]
class corvix.db.PushSubscription[source][source]

Bases: Base

Browser push subscription for a user.

__tablename__ = 'push_subscriptions'[source][source]
__table_args__[source][source]
id: sqlalchemy.orm.Mapped[int][source][source]
user_id: sqlalchemy.orm.Mapped[uuid.UUID][source][source]
endpoint: sqlalchemy.orm.Mapped[str][source][source]
p256dh_key: sqlalchemy.orm.Mapped[str][source][source]
auth_key: sqlalchemy.orm.Mapped[str][source][source]
created_at: sqlalchemy.orm.Mapped[datetime.datetime][source][source]
user: sqlalchemy.orm.Mapped[User][source][source]
corvix.db.get_database_url(url_env: str = 'DATABASE_URL') str | None[source][source]

Return DB URL from env, supporting ${URL_ENV}_FILE Docker secret files.