From 21313f053b30fcac23e75d1dfcf284c80ccf1478 Mon Sep 17 00:00:00 2001 From: fakz9 Date: Mon, 20 Nov 2023 06:44:44 +0300 Subject: [PATCH] applications --- app.py | 1 + constants.py | 4 +++ database/models.py | 9 +++++++ routes/__init__.py | 1 + routes/application.py | 61 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 76 insertions(+) create mode 100644 routes/application.py diff --git a/app.py b/app.py index 32c4a8d..e9ece98 100644 --- a/app.py +++ b/app.py @@ -29,6 +29,7 @@ blueprints = [ (routes.printing_blueprint, '/printing'), (routes.assembly_blueprint, '/assembly'), (routes.general_blueprint, '/general'), + (routes.application_blueprint, '/application'), ] for blueprint, url_prefix in blueprints: diff --git a/constants.py b/constants.py index b351fe0..d9b0e1a 100644 --- a/constants.py +++ b/constants.py @@ -7,3 +7,7 @@ APP_PATH = os.path.dirname(sys.executable) if getattr(sys, 'frozen', False) else LOGGER_NAME = 'assemblr' LOG_FILE = Path(APP_PATH) / Path(f'{LOGGER_NAME}.log') MAX_LOG_FILE_SIZE_BYTES = 400 * 1024 ** 2 +APKS_PATH = os.path.join(APP_PATH, 'apks') + +if not os.path.isdir(APKS_PATH): + os.mkdir(APKS_PATH) diff --git a/database/models.py b/database/models.py index 2bc612c..4b77fc3 100644 --- a/database/models.py +++ b/database/models.py @@ -33,3 +33,12 @@ class Barcode(db.Model): id = db.Column(db.Integer, primary_key=True, comment='ID пользователя') denco_article = db.Column(db.Integer, nullable=False, comment='Артикул', index=True) barcode = db.Column(db.String, nullable=False, comment='Баркод', index=True) + + +class Application(db.Model): + __tablename__ = 'applications' + id = db.Column(db.Integer, primary_key=True, comment='') + name = db.Column(db.String(40), nullable=False) + version = db.Column(db.String(10), nullable=False) + uploaded = db.Column(db.DateTime, nullable=False) + filename = db.Column(db.String, nullable=False) diff --git a/routes/__init__.py b/routes/__init__.py index b4b52fd..8771ebc 100644 --- a/routes/__init__.py +++ b/routes/__init__.py @@ -4,3 +4,4 @@ from routes.barcode import barcode_blueprint from routes.printing import printing_blueprint from routes.assembly import assembly_blueprint from routes.general import general_blueprint +from routes.application import application_blueprint diff --git a/routes/application.py b/routes/application.py new file mode 100644 index 0000000..93e8f07 --- /dev/null +++ b/routes/application.py @@ -0,0 +1,61 @@ +import datetime +import os.path +import uuid + +from flask import Blueprint, request + +import database +from constants import APKS_PATH + +application_blueprint = Blueprint('application', __name__) + + +@application_blueprint.before_request +def auth(): + API_KEY = 'AF9A20DD9264C134CDA0ADACED834368' + if request.headers.get('Authorization') != API_KEY: + return {'error': 'Unauthorized'}, 401 + + +@application_blueprint.get('/download/') +def download_version(application_name: str, version: str): + application = database.Application.query.filter_by(version=version, + name=application_name).first() + if not application: + return { + "error": f"Application version '{version}' not found." + }, 404 + + +@application_blueprint.get('/version') +def get_version(application_name: str): + version = (database.Application.query. + filter_by(name=application_name). + order_by(database.Application.uploaded.desc()). + with_entities(database.Application.version). + limit(1). + scalar()) + return {'latest_version': version} + + +@application_blueprint.post('/upload') +def upload(application_name: str): + file = request.files.get('file') + version = request.form.get('version') + if (not file) or (not version): + return {"error": "Invalid form data. There is no file or version field"}, 400 + version = version.strip() + application = (database.Application.query. + filter_by(version=version). + with_entities(database.Application.id).first()) + if application: + return {"error": f"Specified version ({version}) already uploaded"}, 400 + filename = uuid.uuid4().hex + '.apk' + file.save(os.path.join(APKS_PATH, filename)) + application = database.Application(name=application_name, + version=version, + uploaded=datetime.datetime.now(), + filename=filename) + database.db.session.add(application) + database.db.session.commit() + return {'filename': filename, 'version': version}