From 88d416ffcbc8ed9f5d067cc331b7aa8ca08f6bff Mon Sep 17 00:00:00 2001 From: Dave Welsh <dwelsh@savanacorp.net> Date: Tue, 20 Dec 2022 10:01:21 -0500 Subject: [PATCH] Added files from upload service. --- upload_service/app.py | 69 ++++++++++++++++++++++++++ upload_service/fake_model.py | 29 +++++++++++ upload_service/s3Provider.py | 23 +++++++++ upload_service/test_report_provider.py | 12 +++++ 4 files changed, 133 insertions(+) create mode 100644 upload_service/app.py create mode 100644 upload_service/fake_model.py create mode 100644 upload_service/s3Provider.py create mode 100644 upload_service/test_report_provider.py diff --git a/upload_service/app.py b/upload_service/app.py new file mode 100644 index 0000000..6691ed7 --- /dev/null +++ b/upload_service/app.py @@ -0,0 +1,69 @@ +from flask import Flask +from flask import jsonify +from flask import request +from flask import render_template +from s3provider import Provider +from fake_model import LearningModel as Model +import uuid + +app = Flask(__name__) +app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 * 1000 * 20 +app.config['JSON_SORT_KEYS'] = False + +VALID_EXTENSIONS = [ + 'tiff', + 'png', + 'tif' +] + +PREFIX = 'dpath' + +@app.route(f'/{PREFIX}/ping', methods=['GET']) +def ping() : + return 'pong' + +@app.route(f'/{PREFIX}/') +def home(): + return render_template('home.html') + +@app.route(f'/{PREFIX}/report/<int:report_id>') +def get_report(report_id) : + return jsonify(provider.get_report(report_id)) + +@app.route(f'/{PREFIX}/report/image', methods=['POST']) +def upload_image(): + response = validate_request(request) + if response.status_code == 400: + return response + + provider = Provider() + id = uuid.uuid1() + provider.save_binary(request.files['file'], id) + response = jsonify(Model(id).start()) + response.status_code = 201 + return response + +def validate_request(request): + response = jsonify({'message' : 'File successfully uploaded'}) + response.status_code = 201 + + if 'file' not in request.files: + response = jsonify({'message' : 'No file part in the request'}) + response.status_code = 400 + return response + + file = file = request.files['file'] + if invalid_extension(file.filename.rsplit('.', 1)[1].lower()): + response = jsonify({'message' : 'Allowed file types are png, tiff'}) + response.status_code = 400 + return response + if invalid_filename(file): + response = jsonify({'message' : 'No file selected for uploading'}) + response.status_code = 400 + return response + +def invalid_extension(extension) : + return extension not in VALID_EXTENSIONS + +def invalid_filename(file): + return file.filename == '' diff --git a/upload_service/fake_model.py b/upload_service/fake_model.py new file mode 100644 index 0000000..73bb2df --- /dev/null +++ b/upload_service/fake_model.py @@ -0,0 +1,29 @@ +from datetime import datetime +from collections import OrderedDict +import random + +class LearningModel: + + def __init__(self, file_path): + self.file_path = file_path + + def start(self): + now = datetime.now() + predictions = self.__predictions() + diagnosis = 'Severe' if predictions['severe'] > predictions['mild'] else 'Mild' + + response = OrderedDict() + response['id'] = self.file_path + response['runDate'] = now.strftime("%d/%m/%Y %H:%M:%S") + response['diagnosis'] = diagnosis + response['chipPredictions'] = predictions + print(response) + return response + + def __predictions(self): + mild = random.randint(0, 1000) + severe = random.randint(0, 1000) + return { + "mild": mild, + "severe": severe + } \ No newline at end of file diff --git a/upload_service/s3Provider.py b/upload_service/s3Provider.py new file mode 100644 index 0000000..08a160f --- /dev/null +++ b/upload_service/s3Provider.py @@ -0,0 +1,23 @@ +import boto3 + +BUCKET_NAME = 'digpath-cache' +FOLDER_NAME = 'uploadedImages' + +class Provider: + + def save_binary(self, data, id): + s3 = boto3.resource('s3') + object = s3.Object(BUCKET_NAME, f'{FOLDER_NAME}/{id}') + object.put(Body=data) + + + def save_local_file(self, file_path): + s3 = boto3.client('s3') + file_name = file_path.split('/')[-1] + new_report = s3.upload_object(file_path, BUCKET_NAME, FOLDER_NAME + '/' + file_name) + result = new_report.put() + return result + +if __name__ == "__main__": + provider = Provider() + provider.save_local_file('/home/ec2-user/efs/repos/upload-service/reportImage1234.png') \ No newline at end of file diff --git a/upload_service/test_report_provider.py b/upload_service/test_report_provider.py new file mode 100644 index 0000000..803a1e3 --- /dev/null +++ b/upload_service/test_report_provider.py @@ -0,0 +1,12 @@ +from faker import Faker + +fake = Faker() + +def create_report(s3_path): + report = { + "id": id, + "matchRate" : 75.89, + "status": "Running", + "runDate": fake.date_between(start_date='-30d', end_date='today') + } + return report \ No newline at end of file -- GitLab