complete post request handler
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
afd8f4a9fd
commit
355ea26621
@ -8,4 +8,5 @@ werkzeug
|
|||||||
filetype
|
filetype
|
||||||
sqlalchemy
|
sqlalchemy
|
||||||
flask_sqlalchemy
|
flask_sqlalchemy
|
||||||
rstr
|
rstr
|
||||||
|
pike
|
@ -4,8 +4,9 @@ import sentry_sdk
|
|||||||
from flask import Flask
|
from flask import Flask
|
||||||
from flask_restful import Api
|
from flask_restful import Api
|
||||||
from sentry_sdk.integrations.flask import FlaskIntegration
|
from sentry_sdk.integrations.flask import FlaskIntegration
|
||||||
|
import pika
|
||||||
|
|
||||||
from config import SENTRY_DSN, RELEASE_ID, RELEASEMODE, PORT, DEBUG
|
from config import *
|
||||||
import db
|
import db
|
||||||
from resources import *
|
from resources import *
|
||||||
|
|
||||||
@ -27,13 +28,19 @@ if SENTRY_DSN:
|
|||||||
environment=RELEASEMODE
|
environment=RELEASEMODE
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
app.config['SQLALCHEMY_DATABASE_URI'] = f"postgresql://{POSTGRES_USERNAME}:{POSTGRES_PASSWORD}@{POSTGRES_HOSTNAME}:5432/{POSTGRES_DB}"
|
||||||
api = Api(app)
|
api = Api(app)
|
||||||
db.init_app(app)
|
db.init_app(app)
|
||||||
|
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
db.create_all()
|
db.create_all()
|
||||||
|
|
||||||
|
rabbitmq = pika.BlockingConnection(pika.ConnectionParameters(host=RABBITMQ_HOST))
|
||||||
|
rabbitmq_channel = rabbitmq.channel()
|
||||||
|
rabbitmq_channel.queue_declare(RABBITMQ_QUEUE)
|
||||||
|
|
||||||
formatter = logging.Formatter(
|
formatter = logging.Formatter(
|
||||||
fmt="%(asctime)s - %(levelname)s - %(module)s - %(message)s"
|
fmt="%(asctime)s - %(levelname)s - %(module)s - %(message)s"
|
||||||
)
|
)
|
||||||
|
@ -20,3 +20,13 @@ DEBUG = os.environ.get("INPUT_SERVICE_DEBUG", True)
|
|||||||
SENTRY_DSN = os.environ.get("SENTRY_DSN")
|
SENTRY_DSN = os.environ.get("SENTRY_DSN")
|
||||||
RELEASE_ID = os.environ.get("RELEASE_ID")
|
RELEASE_ID = os.environ.get("RELEASE_ID")
|
||||||
RELEASEMODE = os.environ.get("INPUT_SERVICE_RELEASEMODE")
|
RELEASEMODE = os.environ.get("INPUT_SERVICE_RELEASEMODE")
|
||||||
|
|
||||||
|
RABBITMQ_HOST = os.getenv("INPUT_RABBITMQ_HOSTNAME", "localhost")
|
||||||
|
RABBITMQ_EXCHANGE = os.getenv("INPUT_RABBITMQ_EXCHANGE", "wave-extract")
|
||||||
|
RABBITMQ_QUEUE = os.getenv("INPUT_RABBITMQ_QUEUE", "wave-extract")
|
||||||
|
POSTGRES_HOSTNAME = os.getenv("INPUT_POSTGRES_HOSTNAME", "localhost")
|
||||||
|
POSTGRES_USERNAME = os.getenv("INPUT_POSTGRES_USERNAME", "input-service")
|
||||||
|
POSTGRES_PASSWORD = os.getenv("INPUT_POSTGRES_PASSWORD", "input-service")
|
||||||
|
POSTGRES_DB = os.getenv("INPUT_POSTGRES_DB", "input-service")
|
||||||
|
|
||||||
|
STORAGE_HOSTNAME = os.getenv("INPUT_STORAGE_HOSTNAME", "localhost:8042")
|
@ -22,4 +22,4 @@ class SampleMetadata(db.Model):
|
|||||||
device_id = db.Column(db.Integer, nullable=False)
|
device_id = db.Column(db.Integer, nullable=False)
|
||||||
device_date = db.Column(db.DateTime, nullable=False)
|
device_date = db.Column(db.DateTime, nullable=False)
|
||||||
|
|
||||||
tag = db.Column(db.String(32), nullable=False)
|
tag = db.Column(db.String(32), nullable=False, unique=True)
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
from app import rabbitmq_channel
|
||||||
import logging
|
import logging
|
||||||
import json
|
import json
|
||||||
import rstr
|
import rstr
|
||||||
from flask_restful import Resource, reqparse
|
from flask_restful import Resource, reqparse
|
||||||
from werkzeug.datastructures import FileStorage
|
from werkzeug.datastructures import FileStorage
|
||||||
|
import requests
|
||||||
import filetype
|
import filetype
|
||||||
import db
|
import db
|
||||||
from models import SampleMetadata
|
from models import SampleMetadata
|
||||||
from schemas import *
|
from schemas import *
|
||||||
|
from config import *
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Flask Restful endpoints
|
Flask Restful endpoints
|
||||||
@ -20,7 +23,6 @@ __version__text__ = "1"
|
|||||||
|
|
||||||
LOGGER = logging.getLogger(__name__)
|
LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SampleResource(Resource):
|
class SampleResource(Resource):
|
||||||
"""
|
"""
|
||||||
Sample endpoint
|
Sample endpoint
|
||||||
@ -58,10 +60,29 @@ class SampleResource(Resource):
|
|||||||
'message': 'Input JSON schema invalid'}, 417
|
'message': 'Input JSON schema invalid'}, 417
|
||||||
generated_tag = rstr.xeger(r'^[a-zA-Z]+[0-9a-zA-Z_]*$', 2, 32)
|
generated_tag = rstr.xeger(r'^[a-zA-Z]+[0-9a-zA-Z_]*$', 2, 32)
|
||||||
|
|
||||||
record = SampleMetadata(device_id=desc['device_id'], device_date=desc['date'], tag=generated_tag)
|
record = SampleMetadata(
|
||||||
db.session.add(record)
|
device_id=desc['device_id'],
|
||||||
|
device_date=desc['date'],
|
||||||
|
tag=generated_tag)
|
||||||
|
try:
|
||||||
|
db.session.add(record)
|
||||||
|
requests.post(
|
||||||
|
f"http://{STORAGE_HOSTNAME}/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()
|
db.session.commit()
|
||||||
|
return {"status": "ok", "message": generated_tag}, 200
|
||||||
|
|
||||||
# TODO: Pass data and tag to ObjectStorage
|
|
||||||
# TODO: Pass tag to MQ
|
|
||||||
|
Loading…
Reference in New Issue
Block a user