From 565508689f10f3ffe41b51a00d2da5b783dadff8 Mon Sep 17 00:00:00 2001 From: Son NK Date: Thu, 28 Nov 2019 22:00:19 +0000 Subject: [PATCH] create AliasUsedOn and ApiKey model --- app/models.py | 40 +++++++++++++++++++++ migrations/versions/e505cb517589_.py | 52 ++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 migrations/versions/e505cb517589_.py diff --git a/app/models.py b/app/models.py index da9de86d..ea77fcf3 100644 --- a/app/models.py +++ b/app/models.py @@ -576,3 +576,43 @@ class EmailChange(db.Model, ModelMixin): def is_expired(self): return self.expired < arrow.now() + + +class AliasUsedOn(db.Model, ModelMixin): + """Used to know where an alias is created""" + + __table_args__ = ( + db.UniqueConstraint("gen_email_id", "hostname", name="uq_alias_used"), + ) + + gen_email_id = db.Column( + db.ForeignKey(GenEmail.id, ondelete="cascade"), nullable=False + ) + + hostname = db.Column(db.String(1024), nullable=False) + + +class ApiKey(db.Model, ModelMixin): + """used in browser extension to identify user""" + + user_id = db.Column(db.ForeignKey(User.id, ondelete="cascade"), nullable=False) + code = db.Column(db.String(128), unique=True, nullable=False) + name = db.Column(db.String(128), nullable=False) + last_used = db.Column(ArrowType, default=None) + times = db.Column(db.Integer, default=0, nullable=False) + + user = db.relationship(User) + + @classmethod + def create(cls, user_id, name): + # generate unique code + found = False + while not found: + code = random_string(60) + + if not cls.get_by(code=code): + found = True + + a = cls(user_id=user_id, code=code, name=name) + db.session.add(a) + return a diff --git a/migrations/versions/e505cb517589_.py b/migrations/versions/e505cb517589_.py new file mode 100644 index 00000000..ac8c579d --- /dev/null +++ b/migrations/versions/e505cb517589_.py @@ -0,0 +1,52 @@ +"""empty message + +Revision ID: e505cb517589 +Revises: 83f4dbe125c4 +Create Date: 2019-11-28 21:59:13.064634 + +""" +import sqlalchemy_utils +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'e505cb517589' +down_revision = '83f4dbe125c4' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('api_key', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('created_at', sqlalchemy_utils.types.arrow.ArrowType(), nullable=False), + sa.Column('updated_at', sqlalchemy_utils.types.arrow.ArrowType(), nullable=True), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('code', sa.String(length=128), nullable=False), + sa.Column('name', sa.String(length=128), nullable=False), + sa.Column('last_used', sqlalchemy_utils.types.arrow.ArrowType(), nullable=True), + sa.Column('times', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('code') + ) + op.create_table('alias_used_on', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('created_at', sqlalchemy_utils.types.arrow.ArrowType(), nullable=False), + sa.Column('updated_at', sqlalchemy_utils.types.arrow.ArrowType(), nullable=True), + sa.Column('gen_email_id', sa.Integer(), nullable=False), + sa.Column('hostname', sa.String(length=1024), nullable=False), + sa.ForeignKeyConstraint(['gen_email_id'], ['gen_email.id'], ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('gen_email_id', 'hostname', name='uq_alias_used') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('alias_used_on') + op.drop_table('api_key') + # ### end Alembic commands ###