Marco Zeisler 6a64eb305b added hashservice.py;
implemented create_sha512();
store image hash to mongoDB;
compare stored with actual dropbox hash;
2020-11-30 19:16:36 +01:00

143 lines
4.5 KiB
Python

import hashlib
import logging
import json
from app_be.services.dropboxservice import DropboxService
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__)
class TestApiClass:
@staticmethod
@api_view(['GET'])
def test_api(request):
logger.debug('Test api call: {}'.format(request))
return JsonResponse({'Result': 'success'}, safe=False)
class ImageEndpoint:
@staticmethod
@api_view(['GET'])
def image_api_get_all(request):
logger.debug('Image GET all call: {}'.format(request))
print(request)
instance = MongoManager.getInstance()
db = instance.AIC
col = db.metadata
try:
for resp in col.find():
print(resp)
except:
print("Could not find Metadata")
return JsonResponse({'Result': 'success1'}, safe=False)
@staticmethod
@api_view(['GET'])
def image_api_get_single(request, identifier):
logger.debug('Image GET single call: {}'.format(request))
instance = MongoManager.getInstance()
db = instance.AIC
col = db.metadata
metadata = None
try:
resp = col.find({"identifier": identifier})
metadata = resp[0]
except:
print("Could not find Metadata")
if metadata is None:
return JsonResponse({'Result': 'Error - could not find metadata.'}, status=404, safe=False)
else:
if '_id' in metadata:
del metadata['_id']
dropbox_image_bytes = DropboxService.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)
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,
'metadata': metadata,
'image_data': WrapperService.wrap_file(dropbox_image_bytes)
}
return JsonResponse(payload, safe=False)
@staticmethod
@api_view(['POST'])
def image_api_post(request: HttpRequest):
logger.debug('Image POST call: {}'.format(request))
payload = json.loads(request.body)
b64encoded_image = payload['image_data']
identifier = payload['id']
metadata = payload['metadata']
filename = payload['metadata']['filename']
instance = MongoManager.getInstance()
db = instance.AIC
col = db.metadata
decoded_image = WrapperService.unwrap_file(b64encoded_image)
metadata['sha512'] = create_sha512(decoded_image)
try:
metadata['identifier'] = identifier
metadata['location'] = [metadata['longitude'], metadata['latitude']]
col.insert_one(metadata)
except:
print("Could not insert Metadata")
if not DropboxService.create_file(filename, decoded_image):
print("Could not save image to dropbox")
return JsonResponse({'id': identifier, 'filename': filename},
safe=False) # 'metadata': metadata response beinhaltet ObjectId welche nicht serializable is?
@staticmethod
@api_view(['DELETE'])
def image_api_delete(request: HttpRequest, identifier):
logger.debug('Image DELETE single call: {}'.format(request))
instance = MongoManager.getInstance()
db = instance.AIC
col = db.metadata
try:
col.delete_one({"identifier": identifier})
except:
print("Could not delete Metadata")
return JsonResponse({'Result': 'success1'}, safe=False)