diff --git a/app/db/crud.py b/app/db/crud.py index 79f71cd..94b21cf 100644 --- a/app/db/crud.py +++ b/app/db/crud.py @@ -20,7 +20,6 @@ from app.db.models import ( Inbound, System, User, - UserUsageResetLogs, ) from app.models.admin import AdminCreate, AdminModify, AdminPartialModify from app.models.node import NodeCreate, NodeModify, NodeStatus, NodeUsageResponse @@ -396,14 +395,11 @@ def update_user(db: Session, dbuser: User, modify: UserModify): def reset_user_data_usage(db: Session, dbuser: User): - usage_log = UserUsageResetLogs( - user=dbuser, - used_traffic_at_reset=dbuser.used_traffic, - ) - db.add(usage_log) + dbuser.lifetime_used_traffic += dbuser.used_traffic + dbuser.traffic_reset_at = datetime.utcnow() dbuser.used_traffic = 0 - dbuser.node_usages.clear() + if dbuser.status == UserStatus.limited: dbuser.status = UserStatus.active.value db.add(dbuser) diff --git a/app/db/migrations/versions/058eb11c5b17_user_reset_in_table.py b/app/db/migrations/versions/058eb11c5b17_user_reset_in_table.py new file mode 100644 index 0000000..b0bbe1d --- /dev/null +++ b/app/db/migrations/versions/058eb11c5b17_user_reset_in_table.py @@ -0,0 +1,45 @@ +"""empty message + +Revision ID: 058eb11c5b17 +Revises: 74e234a3bd4b +Create Date: 2024-05-26 21:16:06.762089 + +""" + +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = "058eb11c5b17" +down_revision = "74e234a3bd4b" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table("user_usage_logs") + op.add_column( + "users", sa.Column("lifetime_used_traffic", sa.BigInteger(), nullable=True) + ) + op.add_column("users", sa.Column("traffic_reset_at", sa.DateTime(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column("users", "traffic_reset_at") + op.drop_column("users", "lifetime_used_traffic") + op.create_table( + "user_usage_logs", + sa.Column("id", sa.INTEGER(), nullable=False), + sa.Column("user_id", sa.INTEGER(), nullable=True), + sa.Column("used_traffic_at_reset", sa.BIGINT(), nullable=False), + sa.Column("reset_at", sa.DATETIME(), nullable=True), + sa.ForeignKeyConstraint( + ["user_id"], + ["users.id"], + ), + sa.PrimaryKeyConstraint("id"), + ) + # ### end Alembic commands ### diff --git a/app/db/models.py b/app/db/models.py index 1e6a143..497d2f6 100644 --- a/app/db/models.py +++ b/app/db/models.py @@ -91,6 +91,8 @@ class User(Base): # proxies = relationship("Proxy", back_populates="user", cascade="all, delete-orphan") status = Column(Enum(UserStatus), nullable=False, default=UserStatus.active) used_traffic = Column(BigInteger, default=0) + lifetime_used_traffic = Column(BigInteger, default=0) + traffic_reset_at = Column(DateTime) node_usages = relationship( "NodeUserUsage", back_populates="user", @@ -110,9 +112,6 @@ class User(Base): ) ip_limit = Column(Integer, nullable=False, default=-1) settings = Column(String(1024)) - usage_logs = relationship( - "UserUsageResetLogs", back_populates="user", lazy="joined" - ) expire = Column(DateTime) admin_id = Column(Integer, ForeignKey("admins.id")) admin = relationship("Admin", back_populates="users") @@ -125,27 +124,6 @@ class User(Base): on_hold_timeout = Column(DateTime) edit_at = Column(DateTime) - @property - def lifetime_used_traffic(self): - return ( - sum([log.used_traffic_at_reset for log in self.usage_logs]) - + self.used_traffic - ) - - @property - def last_traffic_reset_time(self): - return self.usage_logs[-1].reset_at if self.usage_logs else self.created_at - - -class UserUsageResetLogs(Base): - __tablename__ = "user_usage_logs" - - id = Column(Integer, primary_key=True) - user_id = Column(Integer, ForeignKey("users.id")) - user = relationship("User", back_populates="usage_logs") - used_traffic_at_reset = Column(BigInteger, nullable=False) - reset_at = Column(DateTime, default=datetime.utcnow) - class Inbound(Base): __tablename__ = "inbounds"