db/add some models
This commit is contained in:
parent
8b30b66799
commit
b7ecc4728b
3 changed files with 285 additions and 1 deletions
134
alembic/versions/2023_03_19_1509-caf39c6e55fc_in_out_models.py
Normal file
134
alembic/versions/2023_03_19_1509-caf39c6e55fc_in_out_models.py
Normal file
|
@ -0,0 +1,134 @@
|
|||
"""in/out models
|
||||
|
||||
Revision ID: caf39c6e55fc
|
||||
Revises: f68634d9bba2
|
||||
Create Date: 2023-03-19 15:09:30.921382+00:00
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = 'caf39c6e55fc'
|
||||
down_revision = 'f68634d9bba2'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.create_table('inbox',
|
||||
sa.Column('id', sa.Integer(), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('actor_id', sa.Integer(), nullable=False),
|
||||
sa.Column('server', sa.String(), nullable=False),
|
||||
sa.Column('is_hidden_from_stream', sa.Boolean(), nullable=False),
|
||||
sa.Column('ap_actor_id', sa.String(), nullable=False),
|
||||
sa.Column('ap_type', sa.String(), nullable=False),
|
||||
sa.Column('ap_id', sa.String(), nullable=False),
|
||||
sa.Column('ap_context', sa.String(), nullable=True),
|
||||
sa.Column('ap_published_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('ap_object', sa.JSON(), nullable=False),
|
||||
sa.Column('visibility', sa.Enum('PUBLIC', 'UNLISTED', 'FOLLOWERS_ONLY', 'DIRECT', name='visibilityenum'), nullable=False),
|
||||
sa.Column('relates_to_inbox_object_id', sa.Integer(), nullable=True),
|
||||
sa.Column('relates_to_outbox_object_id', sa.Integer(), nullable=True),
|
||||
sa.ForeignKeyConstraint(['actor_id'], ['actor.id'], ),
|
||||
sa.ForeignKeyConstraint(['relates_to_inbox_object_id'], ['inbox.id'], ),
|
||||
sa.ForeignKeyConstraint(['relates_to_outbox_object_id'], ['outbox.id'], ),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index(op.f('ix_inbox_ap_id'), 'inbox', ['ap_id'], unique=True)
|
||||
op.create_index(op.f('ix_inbox_ap_type'), 'inbox', ['ap_type'], unique=False)
|
||||
op.create_index(op.f('ix_inbox_id'), 'inbox', ['id'], unique=False)
|
||||
op.create_table('outbox',
|
||||
sa.Column('id', sa.Integer(), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('public_id', sa.String(), nullable=False),
|
||||
sa.Column('slug', sa.String(), nullable=True),
|
||||
sa.Column('ap_type', sa.String(), nullable=False),
|
||||
sa.Column('ap_id', sa.String(), nullable=False),
|
||||
sa.Column('ap_context', sa.String(), nullable=True),
|
||||
sa.Column('ap_object', sa.JSON(), nullable=False),
|
||||
sa.Column('activity_object_ap_id', sa.String(), nullable=True),
|
||||
sa.Column('visibility', sa.Enum('PUBLIC', 'UNLISTED', 'FOLLOWERS_ONLY', 'DIRECT', name='visibilityenum'), nullable=False),
|
||||
sa.Column('likes_count', sa.Integer(), nullable=False),
|
||||
sa.Column('announces_count', sa.Integer(), nullable=False),
|
||||
sa.Column('replies_count', sa.Integer(), nullable=False),
|
||||
sa.Column('relates_to_inbox_object_id', sa.Integer(), nullable=True),
|
||||
sa.Column('relates_to_outbox_object_id', sa.Integer(), nullable=True),
|
||||
sa.Column('relates_to_actor_id', sa.Integer(), nullable=True),
|
||||
sa.ForeignKeyConstraint(['relates_to_actor_id'], ['actor.id'], ),
|
||||
sa.ForeignKeyConstraint(['relates_to_inbox_object_id'], ['inbox.id'], ),
|
||||
sa.ForeignKeyConstraint(['relates_to_outbox_object_id'], ['outbox.id'], ),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index(op.f('ix_outbox_activity_object_ap_id'), 'outbox', ['activity_object_ap_id'], unique=False)
|
||||
op.create_index(op.f('ix_outbox_ap_id'), 'outbox', ['ap_id'], unique=True)
|
||||
op.create_index(op.f('ix_outbox_ap_type'), 'outbox', ['ap_type'], unique=False)
|
||||
op.create_index(op.f('ix_outbox_id'), 'outbox', ['id'], unique=False)
|
||||
op.create_index(op.f('ix_outbox_public_id'), 'outbox', ['public_id'], unique=False)
|
||||
op.create_index(op.f('ix_outbox_slug'), 'outbox', ['slug'], unique=False)
|
||||
op.create_table('push',
|
||||
sa.Column('id', sa.Integer(), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('ap_id', sa.String(), nullable=True),
|
||||
sa.Column('ap_object', sa.JSON(), nullable=True),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index(op.f('ix_push_ap_id'), 'push', ['ap_id'], unique=False)
|
||||
op.create_index(op.f('ix_push_id'), 'push', ['id'], unique=False)
|
||||
op.create_table('follower',
|
||||
sa.Column('id', sa.Integer(), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('actor_id', sa.Integer(), nullable=False),
|
||||
sa.Column('inbox_object_id', sa.Integer(), nullable=False),
|
||||
sa.Column('ap_actor_id', sa.String(), nullable=False),
|
||||
sa.ForeignKeyConstraint(['actor_id'], ['actor.id'], ),
|
||||
sa.ForeignKeyConstraint(['inbox_object_id'], ['inbox.id'], ),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
sa.UniqueConstraint('actor_id'),
|
||||
sa.UniqueConstraint('ap_actor_id')
|
||||
)
|
||||
op.create_index(op.f('ix_follower_id'), 'follower', ['id'], unique=False)
|
||||
op.create_table('following',
|
||||
sa.Column('id', sa.Integer(), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('actor_id', sa.Integer(), nullable=False),
|
||||
sa.Column('out_object_id', sa.Integer(), nullable=False),
|
||||
sa.Column('ap_actor_id', sa.String(), nullable=False),
|
||||
sa.ForeignKeyConstraint(['actor_id'], ['actor.id'], ),
|
||||
sa.ForeignKeyConstraint(['out_object_id'], ['outbox.id'], ),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
sa.UniqueConstraint('actor_id'),
|
||||
sa.UniqueConstraint('ap_actor_id')
|
||||
)
|
||||
op.create_index(op.f('ix_following_id'), 'following', ['id'], unique=False)
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_index(op.f('ix_following_id'), table_name='following')
|
||||
op.drop_table('following')
|
||||
op.drop_index(op.f('ix_follower_id'), table_name='follower')
|
||||
op.drop_table('follower')
|
||||
op.drop_index(op.f('ix_push_id'), table_name='push')
|
||||
op.drop_index(op.f('ix_push_ap_id'), table_name='push')
|
||||
op.drop_table('push')
|
||||
op.drop_index(op.f('ix_outbox_slug'), table_name='outbox')
|
||||
op.drop_index(op.f('ix_outbox_public_id'), table_name='outbox')
|
||||
op.drop_index(op.f('ix_outbox_id'), table_name='outbox')
|
||||
op.drop_index(op.f('ix_outbox_ap_type'), table_name='outbox')
|
||||
op.drop_index(op.f('ix_outbox_ap_id'), table_name='outbox')
|
||||
op.drop_index(op.f('ix_outbox_activity_object_ap_id'), table_name='outbox')
|
||||
op.drop_table('outbox')
|
||||
op.drop_index(op.f('ix_inbox_id'), table_name='inbox')
|
||||
op.drop_index(op.f('ix_inbox_ap_type'), table_name='inbox')
|
||||
op.drop_index(op.f('ix_inbox_ap_id'), table_name='inbox')
|
||||
op.drop_table('inbox')
|
||||
# ### end Alembic commands ###
|
|
@ -1,5 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
import httpx
|
||||
import enum
|
||||
|
||||
from app import config
|
||||
from app.key import get_pubkey_as_pem
|
||||
|
@ -74,6 +75,12 @@ ME = {
|
|||
"tag": [] # TODO
|
||||
}
|
||||
|
||||
class VisibilityEnum(str, enum.Enum):
|
||||
PUBLIC = "public"
|
||||
UNLISTED = "unlisted"
|
||||
FOLLOWERS_ONLY = "followers-only"
|
||||
DIRECT = "direct"
|
||||
|
||||
async def post(
|
||||
url: str,
|
||||
payload : dict,
|
||||
|
|
145
app/models.py
145
app/models.py
|
@ -4,16 +4,18 @@ from typing import Any
|
|||
from typing import Optional
|
||||
from typing import Union
|
||||
|
||||
|
||||
from app import activitypub as ap
|
||||
from app.database import Base
|
||||
from app.database import metadata_obj
|
||||
|
||||
from sqlalchemy import Column
|
||||
from sqlalchemy import Boolean
|
||||
from sqlalchemy import DateTime
|
||||
from sqlalchemy import Enum
|
||||
from sqlalchemy import Integer
|
||||
from sqlalchemy import String
|
||||
from sqlalchemy import JSON
|
||||
from sqlalchemy import ForeignKey
|
||||
from sqlalchemy.orm import Mapped
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
|
@ -39,6 +41,108 @@ class Actor(Base):
|
|||
is_blocked = Column(Boolean, nullable=False, default=False, server_default="0")
|
||||
is_deleted = Column(Boolean, nullable=False, default=False, server_default="0")
|
||||
|
||||
class InboxObject(Base):
|
||||
__tablename__ = "inbox"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
created_at = Column(DateTime(timezone=True), nullable=False, default=now)
|
||||
updated_at = Column(DateTime(timezone=True), nullable=False, default=now)
|
||||
|
||||
actor_id = Column(Integer, ForeignKey("actor.id"), nullable=False)
|
||||
actor: Mapped[Actor] = relationship(Actor, uselist=False)
|
||||
|
||||
server = Column(String, nullable=False)
|
||||
|
||||
is_hidden_from_stream = Column(Boolean, nullable=False, default=False)
|
||||
|
||||
ap_actor_id = Column(String, nullable=False)
|
||||
ap_type = Column(String, nullable=False, index=True)
|
||||
ap_id: Mapped[str] = Column(String, nullable=False, unique=True, index=True) # type: ignore
|
||||
ap_context = Column(String, nullable=True)
|
||||
ap_published_at = Column(DateTime(timezone=True), nullable=False)
|
||||
ap_object: Mapped[dict[str, Any]] = Column(JSON, nullable=False) # type: ignore
|
||||
|
||||
visibility = Column(Enum(ap.VisibilityEnum), nullable=False)
|
||||
|
||||
relates_to_inbox_object_id = Column(
|
||||
Integer,
|
||||
ForeignKey("inbox.id"),
|
||||
nullable=True,
|
||||
)
|
||||
relates_to_inbox_object: Mapped[Optional["InboxObject"]] = relationship(
|
||||
"InboxObject",
|
||||
foreign_keys=relates_to_inbox_object_id,
|
||||
remote_side=id,
|
||||
uselist=False,
|
||||
)
|
||||
relates_to_outbox_object_id = Column(
|
||||
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,
|
||||
)
|
||||
|
||||
class OutboxObject(Base):
|
||||
__tablename__ = "outbox"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
created_at = Column(DateTime(timezone=True), nullable=False, default=now)
|
||||
updated_at = Column(DateTime(timezone=True), nullable=False, default=now)
|
||||
|
||||
public_id = Column(String, nullable=False, index=True)
|
||||
slug = Column(String, nullable=True, index=True)
|
||||
|
||||
ap_type = Column(String, nullable=False, index=True)
|
||||
ap_id: Mapped[str] = Column(String, nullable=False, unique=True, index=True) # type: ignore
|
||||
ap_context = Column(String, nullable=True)
|
||||
ap_object: Mapped[ap.RawObject] = Column(JSON, nullable=False) #type: ignore
|
||||
|
||||
activity_object_ap_id = Column(String, nullable=True, index=True)
|
||||
|
||||
visibility = Column(Enum(ap.VisibilityEnum), nullable=False)
|
||||
|
||||
likes_count = Column(Integer, nullable=False, default=0)
|
||||
announces_count = Column(Integer, nullable=False, default=0)
|
||||
replies_count: Mapped[int] = Column(Integer, nullable=False, default=0) #type: ignore
|
||||
|
||||
relates_to_inbox_object_id = Column(
|
||||
Integer,
|
||||
ForeignKey("inbox.id"),
|
||||
nullable=True,
|
||||
)
|
||||
relates_to_inbox_object: Mapped[Optional["InboxObject"]] = relationship(
|
||||
"InboxObject",
|
||||
foreign_keys=[relates_to_inbox_object_id],
|
||||
uselist=False,
|
||||
)
|
||||
relates_to_outbox_object_id = Column(
|
||||
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 = Column(
|
||||
Integer,
|
||||
ForeignKey("actor.id"),
|
||||
nullable=True,
|
||||
)
|
||||
relates_to_actor: Mapped[Optional["Actor"]] = relationship(
|
||||
"Actor",
|
||||
foreign_keys=[relates_to_actor_id],
|
||||
uselist=False,
|
||||
)
|
||||
|
||||
class IncomingActivity(Base):
|
||||
__tablename__ = "ingress"
|
||||
|
||||
|
@ -47,3 +151,42 @@ class IncomingActivity(Base):
|
|||
|
||||
ap_id = Column(String, nullable=True, index=True)
|
||||
ap_object = Column(JSON, nullable=True)
|
||||
|
||||
class OutcomingActivity(Base):
|
||||
__tablename__ = "push"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
created_at = Column(DateTime(timezone=True), nullable=False, default=now)
|
||||
|
||||
ap_id = Column(String, nullable=True, index=True)
|
||||
ap_object = Column(JSON, nullable=True)
|
||||
|
||||
class Follower(Base):
|
||||
__tablename__ = "follower"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
created_at = Column(DateTime(timezone=True), nullable=False, default=now)
|
||||
updated_at = Column(DateTime(timezone=True), nullable=False, default=now)
|
||||
|
||||
actor_id = Column(Integer, ForeignKey("actor.id"), nullable=False, unique=True)
|
||||
actor: Mapped[Actor] = relationship(Actor, uselist=False)
|
||||
|
||||
inbox_object_id = Column(Integer, ForeignKey("inbox.id"), nullable=False)
|
||||
inbox_object = relationship(InboxObject, uselist=False)
|
||||
|
||||
ap_actor_id = Column(String, nullable=False, unique=True)
|
||||
|
||||
class Following(Base):
|
||||
__tablename__ = "following"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
created_at = Column(DateTime(timezone=True), nullable=False, default=now)
|
||||
updated_at = Column(DateTime(timezone=True), nullable=False, default=now)
|
||||
|
||||
actor_id = Column(Integer, ForeignKey("actor.id"), nullable=False, unique=True)
|
||||
actor: Mapped[Actor] = relationship(Actor, uselist=False)
|
||||
|
||||
out_object_id = Column(Integer, ForeignKey("outbox.id"), nullable=False)
|
||||
out_object = relationship(OutboxObject, uselist=False)
|
||||
|
||||
ap_actor_id = Column(String, nullable=False, unique=True)
|
||||
|
|
Loading…
Reference in a new issue