diff --git a/app/db/crud.py b/app/db/crud.py
@@ -470,6 +470,7 @@ def reset_user_data_usage(db: Session, dbuser: User):
def revoke_user_sub(db: Session, dbuser: User):
dbuser.key = secrets.token_hex(16)
+ dbuser.sub_revoked_at = datetime.utcnow()
db.commit()
db.refresh(dbuser)
return dbuser
diff --git a/app/db/migrations/versions/1992c49c5990_add_sub_revoked_at.py b/app/db/migrations/versions/1992c49c5990_add_sub_revoked_at.py
@@ -0,0 +1,32 @@
+"""add sub_revoked_at to users table
+
+Revision ID: 1992c49c5990
+Revises: fd423c19f682
+Create Date: 2024-10-09 05:24:52.450988
+
+"""
+
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = "1992c49c5990"
+down_revision = "fd423c19f682"
+branch_labels = None
+depends_on = None
+
+
+def upgrade() -> None:
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.add_column(
+ "users",
+ sa.Column("sub_revoked_at", sa.DateTime()),
+ )
+ # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.drop_column("users", "sub_revoked_at")
+ # ### end Alembic commands ###
diff --git a/app/db/models.py b/app/db/models.py
@@ -206,6 +206,7 @@ class User(Base):
admin = relationship("Admin", back_populates="users")
sub_updated_at = Column(DateTime)
sub_last_user_agent = Column(String(512))
+ sub_revoked_at = Column(DateTime)
created_at = Column(DateTime, default=datetime.utcnow)
note = Column(String(500))
online_at = Column(DateTime)
diff --git a/app/models/user.py b/app/models/user.py
@@ -123,6 +123,7 @@ class UserResponse(User):
enabled: bool
used_traffic: int
lifetime_used_traffic: int
+ sub_revoked_at: datetime | None
created_at: datetime
service_ids: list[int]
subscription_url: str