Merge branch 'master' into 4-mongodb_api

# Conflicts:
#	middleware/app_be/views/rest_api.py
This commit is contained in:
Manuel Hude
2020-12-06 14:24:01 +01:00
13 changed files with 154 additions and 47 deletions
@@ -0,0 +1,7 @@
import hashlib
def create_sha512(b: bytes):
h = hashlib.sha512()
h.update(b)
return h.hexdigest()
@@ -0,0 +1,41 @@
import requests
from django.conf import settings
class MinioService:
@staticmethod
def create_file(filename: str, file: bytes) -> bool:
"""Create / save (or overwrite) an file on the minio storage.
:param filename: filename
:param file: bytes representation of the file
:return: Whether file was successfully uploaded
"""
try:
url= settings.AWS_HOST + filename
headers = {'Content-Type': 'binary/octet-stream'}
r = requests.put(url,data=file,headers=headers)
if r.status_code == 200:
print("Successfully uploaded a file!")
else:
print("Something went wrong")
except:
return False
return True
@staticmethod
def read_file(filename: str) -> bytes:
"""Read file on the minio storage.
:param filename: filename
:return: bytes representation of the file or None on error
"""
file_bytes: bytes
try:
url = settings.AWS_HOST + filename
response = requests.get(url, stream=True)
file_bytes=response.content
except:
print("Error downloading file from minio")
return file_bytes
+1 -1
View File
@@ -6,7 +6,7 @@ class WrapperService:
@staticmethod
def wrap_file(file_bytes: bytes) -> str:
file_encoded_b64 = base64.b64encode(file_bytes)
return file_encoded_b64.decode('utf-8')
return file_encoded_b64.decode()
@staticmethod
def unwrap_file(file_str: str) -> bytes:
+2
View File
@@ -220,3 +220,5 @@ DATA_UPLOAD_MAX_MEMORY_SIZE = 104857600
DROPBOX_OAUTH2_ACCESS_TOKEN = 'SDt1aqMQg7EAAAAAAAAAARV4CNnOSTjYLc05W2YAxIArG93DnaK9Si9VbwE-aBbQ'
DROPBOX_IMAGE_FOLDER = '/Apps/AIC Federated Storage Infrastructure/'
AWS_HOST= 'https://aic-fun-bucket-2020.s3.amazonaws.com/'
+4 -2
View File
@@ -1,5 +1,6 @@
import pymongo
class MongoManager:
__instance = None
@@ -17,6 +18,7 @@ class MongoManager:
db = MongoManager.__instance.AIC
coll = db.metadata
db.coll["identifier"]
db.coll["sha512"]
db.coll["location"]
coll.create_index("identifier",unique=True)
coll.create_index([("location", pymongo.GEO2D)])
coll.create_index("identifier", unique=True)
coll.create_index([("location", pymongo.GEO2D)])
+26 -7
View File
@@ -1,14 +1,16 @@
import hashlib
import logging
import json
import base64
from app_be.services.dropboxservice import DropboxService
from app_be.services.mongodbservice import MongoDBService
from app_be.services.minioservice import MinioService
from app_be.services.hashservice import create_sha512
from app_be.services.wrapperservice import WrapperService
from app_be.views.mongo_db import MongoManager
from django.http import JsonResponse
from django.http import HttpRequest
from rest_framework.decorators import api_view
logger = logging.getLogger(__name__)
@@ -35,7 +37,6 @@ class ImageEndpoint:
return JsonResponse({'Result': 'success1'}, safe=False)
@staticmethod
@api_view(['GET'])
def image_api_get_single(request, identifier):
@@ -46,9 +47,24 @@ class ImageEndpoint:
print(metadata)
dropbox_image_bytes = DropboxService.read_file(metadata['filename'])
#minio_image_bytes = MinioService.read_file(metadata['filename'])
if dropbox_image_bytes is None:
return JsonResponse({'Result': 'Error - could not find image in dropbox.', 'id': identifier}, status=404, safe=False)
return JsonResponse({'Result': 'Error - could not find image in dropbox.', 'id': identifier}, status=404,
safe=False)
stored_hash = metadata.get('sha512', '')
actual_dropbox_hash = create_sha512(dropbox_image_bytes)
if stored_hash != actual_dropbox_hash:
return JsonResponse('Stored hash does not match generated one! '
'stored: {} actual: {}'.format(stored_hash, actual_dropbox_hash), safe=False)
# TODO - check hash of MinIO image, too
# actual_minio_hash = '' # create_sha512(minio_image_bytes)
# if stored_hash != actual_minio_hash:
# return JsonResponse('Stored hash does not match generated one! '
# 'stored: {} actual: {}'.format(stored_hash, actual_minio_hash), safe=False)
payload = {
'id': identifier,
@@ -69,12 +85,15 @@ class ImageEndpoint:
filename = payload['metadata']['filename']
decoded_image = WrapperService.unwrap_file(b64encoded_image)
metadata['sha512'] = create_sha512(decoded_image)
MongoDBService.createSingle(metadata,identifier)
decoded_image = WrapperService.unwrap_file(b64encoded_image)
if not DropboxService.create_file(filename, decoded_image):
print("Could not save image to dropbox")
if not MinioService.create_file(filename, decoded_image):
print("Could not save image to minio")
return JsonResponse({'id': identifier, 'filename': filename},
safe=False) # 'metadata': metadata response beinhaltet ObjectId welche nicht serializable is?
@@ -89,4 +108,4 @@ class ImageEndpoint:
print(resp)
return JsonResponse({'Result': 'success1'}, safe=False)
return JsonResponse({'Result': 'success1'}, safe=False)