#!/usr/bin/env python3 import logging from xeger import Xeger from flask_restful import Resource from flask import request import requests import filetype from db import db from models import SampleMetadata from rabbitmqqueue import rabbitmq_channel from config import * """ Flask Restful endpoints """ __author__ = '@tormakris' __copyright__ = "Copyright 2020, Birbnetes Team" __module_name__ = "endpoints" __version__text__ = "1" LOGGER = logging.getLogger(__name__) class SampleResource(Resource): """ Sample endpoint See: https://swagger.kmlabz.com/?urls.primaryName=Input%20Service """ def post(self): """ Post request send to the endpoint :return: """ if 'file' not in request.files: return {"status": "error", "message": "no file found"}, 469 else: soundfile = request.files['file'] if 'date' not in request.form: return {"status": "error", "message": "no date found"}, 470 else: date = request.form.get("date") if 'device_id' not in request.form: return {"status": "error", "message": "no device_id found"}, 471 else: device_id = request.form.get("device_id") kind = filetype.guess(soundfile) if kind is None or kind.mime != 'wav': LOGGER.error( f"Input file was not WAV. Recieved metadata: device_id: {device_id}") return {'status': 'error', 'message': 'Input file not WAV.'}, 415 xeger = Xeger(limit=32) generated_tag = xeger.xeger(r'^[a-zA-Z]+[0-9a-zA-Z_]*$') record = SampleMetadata( device_id=device_id, device_date=date, tag=generated_tag) try: db.session.add(record) requests.post( f"http://{STORAGE_HOSTNAME}/v1/storage/object", files={ 'tag': (None, generated_tag), 'file': ( 'wave.wav', soundfile, kind.mime)}) rabbitmq_channel.basic_publish( exchange=RABBITMQ_EXCHANGE, routing_key='feature', body=generated_tag) except Exception as e: LOGGER.exception(e) db.session.rollback() return {"status": "exception", "message": str( e), "hint": "DB or downstream service error"}, 569 db.session.commit() return {"status": "ok", "message": generated_tag}, 200 def get(self): """ Get all stored items :return: """ samples = SampleMetadata.query.all() return {"status": "ok", "message": samples}, 200 class SampleParameterResource(Resource): """ Sample endpoint with parameters """ def get(self, tag: str): """ Get a specific item :param tag: :return: """ sample = SampleMetadata.query.filter_by(tag=tag).first_or_404() return {"status": "ok", "message": sample}, 200