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