Files
ShortMe-URL-Shortener/app/server/db/models.py
2021-03-24 15:13:32 +02:00

88 lines
2.7 KiB
Python

# ------- standard library imports -------
import random
import string
import secrets
from random import choices
from datetime import datetime
# ------- local imports -------
from sqlalchemy import ForeignKey
from .extensions import db
class Url(db.Model):
id = db.Column(db.Integer, primary_key=True)
original_url = db.Column(db.String(512))
short_url = db.Column(db.String(5), unique=True)
visits = db.Column(db.Integer, default=0)
date_created = db.Column(db.DateTime, default=datetime.now)
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.short_url = self.generate_short_url()
def generate_short_url(self):
characters = string.digits + string.ascii_letters
short_url = ''.join(choices(characters, k=5))
url = self.query.filter_by(short_url=short_url).first()
if url:
return self.generate_short_url()
return short_url
def __repr__(self):
return f'{self.original_url}, {self.visits}'
class AuthToken(db.Model):
__tablename__ = 'auth_token'
id = db.Column(db.Integer, primary_key=True)
auth_token = db.Column(db.String(16))
date_created = db.Column(db.DateTime, default=datetime.now)
email_id = db.Column(db.Integer, ForeignKey('email.id'))
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.auth_token = self.generate_auth_token() if self.auth_token is None else self.auth_token
@staticmethod
def generate_auth_token():
generated_token = secrets.token_hex(16)
return generated_token
def __repr__(self):
return f'{self.auth_token}'
class Email(db.Model):
__tablename__ = 'email'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(512), unique=True)
date_created = db.Column(db.DateTime, default=datetime.now)
is_verified = db.Column(db.Boolean, default=False)
verification_code = db.relationship('VerificationCode', backref='email')
auth_token = db.relationship('AuthToken', backref='email')
def __repr__(self):
return f'{self.email}, {self.verification_code}, {self.auth_token}'
class VerificationCode(db.Model):
__tablename__ = 'verification_code'
id = db.Column(db.Integer, primary_key=True)
email_id = db.Column(db.Integer, ForeignKey('email.id'))
verification_code = db.Column(db.String, unique=True)
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.verification_code = self.generate_verification_code()
@staticmethod
def generate_verification_code():
verification_code = ' '.join([str(random.randint(0, 999)).zfill(3) for _ in range(2)])
return verification_code
def __repr__(self):
return f'{self.verification_code}'