foxhole/app/models.py

205 lines
7.1 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
import enum
from typing import Any
from typing import Optional
from typing import Union
2023-03-19 16:13:42 +01:00
from app import activitypub as ap
from app.database import Base
from app.database import metadata_obj
2023-04-01 18:13:16 +02:00
from app.activitypub import BaseActor
2023-07-30 14:48:50 +02:00
from app.ap_object import BaseObject
from sqlalchemy.orm import mapped_column
from sqlalchemy import Boolean
from sqlalchemy import DateTime
2023-03-19 16:13:42 +01:00
from sqlalchemy import Enum
from sqlalchemy import Integer
from sqlalchemy import String
from sqlalchemy import JSON
2023-03-19 16:13:42 +01:00
from sqlalchemy import ForeignKey
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import relationship
from datetime import datetime as dtime
from datetime import timezone
2023-08-02 14:53:09 +02:00
def now() -> dtime:
return dtime.now(timezone.utc)
2023-08-02 14:53:09 +02:00
2023-03-21 07:24:57 +01:00
class Actor(Base, BaseActor):
__tablename__ = "actor"
id = mapped_column(Integer, primary_key=True, index=True)
created_at = mapped_column(DateTime(timezone=True), nullable=False, default=now)
updated_at = mapped_column(DateTime(timezone=True), nullable=False, default=now)
ap_id = mapped_column(String, unique=True, nullable=False, index=True)
ap_actor = mapped_column(JSON, nullable=False)
ap_type = mapped_column(String, nullable=False)
2023-03-16 10:41:07 +01:00
handle = mapped_column(String, nullable=True, index=True)
is_blocked = mapped_column(Boolean, nullable=False, default=False, server_default="0")
is_deleted = mapped_column(Boolean, nullable=False, default=False, server_default="0")
2023-08-02 14:53:09 +02:00
2023-07-30 14:48:50 +02:00
class InboxObject(Base, BaseObject):
2023-03-19 16:13:42 +01:00
__tablename__ = "inbox"
id = mapped_column(Integer, primary_key=True, index=True)
created_at = mapped_column(DateTime(timezone=True), nullable=False, default=now)
updated_at = mapped_column(DateTime(timezone=True), nullable=False, default=now)
2023-03-19 16:13:42 +01:00
actor_id = mapped_column(Integer, ForeignKey("actor.id"), nullable=False)
2023-03-19 16:13:42 +01:00
actor: Mapped[Actor] = relationship(Actor, uselist=False)
server = mapped_column(String, nullable=False)
2023-03-19 16:13:42 +01:00
is_hidden_from_stream = mapped_column(Boolean, nullable=False, default=False)
2023-03-19 16:13:42 +01:00
ap_actor_id = mapped_column(String, nullable=False)
ap_type = mapped_column(String, nullable=False, index=True)
ap_id = mapped_column(String, nullable=False, unique=True, index=True)
ap_context = mapped_column(String, nullable=True)
ap_published_at = mapped_column(DateTime(timezone=True), nullable=False)
ap_object = mapped_column(JSON, nullable=False)
activity_object_ap_id = mapped_column(String, nullable=True, index=True)
2023-03-19 16:13:42 +01:00
visibility = mapped_column(Enum(ap.VisibilityEnum), nullable=False)
2023-03-19 16:13:42 +01:00
is_deleted = mapped_column(Boolean, nullable=False, default=False)
relates_to_inbox_object_id = mapped_column(
2023-03-19 16:13:42 +01:00
Integer,
ForeignKey("inbox.id"),
nullable=True,
)
relates_to_inbox_object: Mapped[Optional["InboxObject"]] = relationship(
"InboxObject",
2023-03-20 08:50:41 +01:00
foreign_keys=[relates_to_inbox_object_id],
2023-03-19 16:13:42 +01:00
remote_side=id,
uselist=False,
)
relates_to_outbox_object_id = mapped_column(
2023-03-19 16:13:42 +01:00
Integer,
ForeignKey("outbox.id", use_alter=True),
2023-03-19 16:13:42 +01:00
nullable=True,
)
relates_to_outbox_object: Mapped[Optional["OutboxObject"]] = relationship(
"OutboxObject",
2023-03-20 08:50:41 +01:00
foreign_keys=relates_to_outbox_object_id,
2023-03-19 16:13:42 +01:00
uselist=False,
)
2023-08-02 14:53:09 +02:00
2023-07-30 14:48:50 +02:00
class OutboxObject(Base, BaseObject):
2023-03-19 16:13:42 +01:00
__tablename__ = "outbox"
id = mapped_column(Integer, primary_key=True, index=True)
created_at = mapped_column(DateTime(timezone=True), nullable=False, default=now)
updated_at = mapped_column(DateTime(timezone=True), nullable=False, default=now)
2023-03-19 16:13:42 +01:00
public_id = mapped_column(String, nullable=False, index=True)
slug = mapped_column(String, nullable=True, index=True)
2023-03-19 16:13:42 +01:00
ap_type = mapped_column(String, nullable=False, index=True)
ap_id = mapped_column(String, nullable=False, unique=True, index=True)
ap_context = mapped_column(String, nullable=True)
ap_object = mapped_column(JSON, nullable=False)
2023-03-19 16:13:42 +01:00
activity_object_ap_id = mapped_column(String, nullable=True, index=True)
2023-03-19 16:13:42 +01:00
visibility = mapped_column(Enum(ap.VisibilityEnum), nullable=False)
2023-03-19 16:13:42 +01:00
is_deleted = mapped_column(Boolean, nullable=False, default=False)
likes_count = mapped_column(Integer, nullable=False, default=0)
announces_count = mapped_column(Integer, nullable=False, default=0)
replies_count = mapped_column(Integer, nullable=False, default=0)
2023-03-19 16:13:42 +01:00
relates_to_inbox_object_id = mapped_column(
2023-03-19 16:13:42 +01:00
Integer,
ForeignKey("inbox.id", use_alter=True),
2023-03-19 16:13:42 +01:00
nullable=True,
)
relates_to_inbox_object: Mapped[Optional["InboxObject"]] = relationship(
"InboxObject",
2023-03-20 08:50:41 +01:00
foreign_keys=relates_to_inbox_object_id,
2023-03-19 16:13:42 +01:00
uselist=False,
)
relates_to_outbox_object_id = mapped_column(
2023-03-19 16:13:42 +01:00
Integer,
ForeignKey("outbox.id"),
nullable=True,
)
relates_to_outbox_object: Mapped[Optional["OutboxObject"]] = relationship(
"OutboxObject",
foreign_keys=[relates_to_outbox_object_id],
remote_side=id,
uselist=False,
)
relates_to_actor_id = mapped_column(
2023-03-19 16:13:42 +01:00
Integer,
ForeignKey("actor.id"),
nullable=True,
)
relates_to_actor: Mapped[Optional["Actor"]] = relationship(
"Actor",
foreign_keys=[relates_to_actor_id],
uselist=False,
)
2023-08-02 14:53:09 +02:00
class IncomingActivity(Base):
__tablename__ = "ingress"
id = mapped_column(Integer, primary_key=True, index=True)
created_at = mapped_column(DateTime(timezone=True), nullable=False, default=now)
ap_id = mapped_column(String, nullable=True, index=True)
ap_object = mapped_column(JSON, nullable=True)
2023-03-19 16:13:42 +01:00
2023-08-02 14:53:09 +02:00
2023-03-19 16:13:42 +01:00
class OutcomingActivity(Base):
__tablename__ = "push"
id = mapped_column(Integer, primary_key=True, index=True)
created_at = mapped_column(DateTime(timezone=True), nullable=False, default=now)
2023-03-19 16:13:42 +01:00
ap_id = mapped_column(String, nullable=True, index=True)
ap_object = mapped_column(JSON, nullable=True)
2023-03-19 16:13:42 +01:00
2023-08-02 14:53:09 +02:00
2023-03-19 16:13:42 +01:00
class Follower(Base):
__tablename__ = "follower"
id = mapped_column(Integer, primary_key=True, index=True)
created_at = mapped_column(DateTime(timezone=True), nullable=False, default=now)
updated_at = mapped_column(DateTime(timezone=True), nullable=False, default=now)
2023-03-19 16:13:42 +01:00
actor_id = mapped_column(Integer, ForeignKey("actor.id"), nullable=False, unique=True)
2023-03-19 16:13:42 +01:00
actor: Mapped[Actor] = relationship(Actor, uselist=False)
inbox_object_id = mapped_column(Integer, ForeignKey("inbox.id"), nullable=False)
2023-03-19 16:13:42 +01:00
inbox_object = relationship(InboxObject, uselist=False)
ap_actor_id = mapped_column(String, nullable=False, unique=True)
2023-03-19 16:13:42 +01:00
2023-08-02 14:53:09 +02:00
2023-03-19 16:13:42 +01:00
class Following(Base):
__tablename__ = "following"
id = mapped_column(Integer, primary_key=True, index=True)
created_at = mapped_column(DateTime(timezone=True), nullable=False, default=now)
updated_at = mapped_column(DateTime(timezone=True), nullable=False, default=now)
2023-03-19 16:13:42 +01:00
actor_id = mapped_column(Integer, ForeignKey("actor.id"), nullable=False, unique=True)
2023-03-19 16:13:42 +01:00
actor: Mapped[Actor] = relationship(Actor, uselist=False)
outbox_object_id = mapped_column(Integer, ForeignKey("outbox.id"), nullable=False)
2023-03-27 12:14:05 +02:00
outbox_object = relationship(OutboxObject, uselist=False)
2023-03-19 16:13:42 +01:00
ap_actor_id = mapped_column(String, nullable=False, unique=True)