mirror of
https://github.com/kevin-DL/ShortMe-URL-Shortener.git
synced 2026-01-11 19:14:29 +00:00
88 lines
2.7 KiB
Python
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}'
|