# API/db/dbModels.py
from mlapi.app import database, app, bcrypt
import datetime
[docs]class User(database.Model):
''' User Model for storing user related details
Attributes
----------
id: int
email: str(255)
password: str(255)
uses: int
is_admin: int
Methods
-------
set_uses
get_uses
subtract_use
'''
__tablename__ = "users"
id = database.Column(database.Integer, primary_key=True, autoincrement=True)
email = database.Column(database.String(255), unique=True, nullable=False)
password = database.Column(database.String(255), nullable=False)
uses = database.Column(database.Integer, nullable=False)
is_admin = database.Column(database.Integer, nullable=True)
def __init__(self, email, password, uses=100, is_admin=False):
self.email = email
self.password = bcrypt.generate_password_hash(
password, app.config.get('BCRYPT_LOG_ROUNDS')
).decode()
self.uses = uses #Default amount of uses 100
self.is_admin = is_admin
def __repr__(self):
return '<User {}> {}, uses: {}'.format(self.email, "Admin" if self.is_admin else "", self.uses)
[docs] def set_uses(self, uses):
'''Sets uses.
'''
self.uses = uses
[docs] def get_uses(self):
'''Returns uses.
'''
return self.uses
[docs] def subtract_use(self):
'''Subtracts uses.
'''
if self.uses > 0:
self.uses -= 1
else:
self.uses = 0
database.session.commit()
return self.uses
[docs]class BlacklistToken(database.Model):
"""
Token Model for storing JWT tokens
"""
__tablename__ = 'blacklist_tokens'
id = database.Column(database.Integer, primary_key=True, autoincrement=True)
token = database.Column(database.String(500), unique=True, nullable=False)
blacklisted_on = database.Column(database.DateTime, nullable=False)
def __init__(self, token):
self.token = token
self.blacklisted_on = datetime.datetime.now()
def __repr__(self):
return '<id: token: {}'.format(self.token)
[docs]class Request(database.Model):
'''Model for storing user requests.
Attributes
----------
request_type: str of max 6 chars
GET, POST, OPTIONS etc..
request_url: str of max 64 chars
response: str of max 1024 chars
user_id: int
Foreign key from `users` table
headers: str of max 1024 chars
is_xhr: bool (int cast)
1 if the request was triggered via a JavaScript XMLHttpRequest.
data_type: char
Type of data sent. I - image, T - text
data: str of max 1024 chars
Contains path to file on server or plain text.
'''
__tablename__ = 'requests'
id = database.Column(database.Integer, primary_key=True, autoincrement=True)
request_type = database.Column(database.String(6), nullable=False)
request_url = database.Column(database.String(64), nullable=False)
response = database.Column(database.String(1024), unique=False, nullable=False)
date = database.Column(database.DateTime, nullable=False)
headers = database.Column(database.String(1024), nullable=False)
is_xhr = database.Column(database.Integer)
user_id = database.Column(database.Integer, database.ForeignKey('users.id'), nullable=True)
data_type = database.Column(database.String(1), nullable=True)
# Saves path to image or text data
data = database.Column(database.String(1024), unique=False, nullable=True)
def __init__(self, request_type, request_url, response, user_id, is_xhr, headers, data_type=False, data=False):
self.request_type = request_type
self.request_url = request_url
self.user_id = user_id
self.headers = headers
self.response = response
self.is_xhr = is_xhr
self.date = datetime.datetime.now()
self.data_type = data_type
self.data = data