You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.1 KiB
120 lines
3.1 KiB
import random, json, datetime, sys
|
|
|
|
from flask import Flask, Response, request
|
|
from flasgger import Swagger
|
|
from pymongo import MongoClient
|
|
from bson import json_util
|
|
|
|
from utils import get_logger
|
|
|
|
|
|
app = Flask(__name__)
|
|
swagger = Swagger(app)
|
|
mongo_host = "mongodb"
|
|
if len(sys.argv) == 2:
|
|
mongo_host = sys.argv[1]
|
|
random_numbers = MongoClient(mongo_host, 27017).demo.random_numbers
|
|
logger = get_logger()
|
|
|
|
|
|
@app.route("/random", methods=["PUT"])
|
|
def random_insert():
|
|
"""Add a number number to the list of last 5 numbers
|
|
---
|
|
parameters:
|
|
- name: lower
|
|
in: formData
|
|
type: integer
|
|
required: false
|
|
- name: upper
|
|
in: formData
|
|
type: integer
|
|
required: false
|
|
responses:
|
|
200:
|
|
description: Random number added successfully
|
|
type: integer
|
|
"""
|
|
request_params = request.form
|
|
number = str(
|
|
random.randint(int(request_params["lower"]), int(request_params["upper"]))
|
|
)
|
|
random_numbers.update_one(
|
|
{"_id": "lasts"},
|
|
{
|
|
"$push": {
|
|
"items": {
|
|
"$each": [{"value": number, "date": datetime.datetime.utcnow()}],
|
|
"$sort": {"date": -1},
|
|
"$slice": 5,
|
|
}
|
|
}
|
|
},
|
|
upsert=True,
|
|
)
|
|
return Response(number, status=200, mimetype="application/json")
|
|
|
|
|
|
@app.route("/random", methods=["GET"])
|
|
def random_generator():
|
|
"""Returns a random number in interval
|
|
---
|
|
parameters:
|
|
- name: lower
|
|
in: query
|
|
type: integer
|
|
required: false
|
|
- name: upper
|
|
in: query
|
|
type: integer
|
|
required: false
|
|
responses:
|
|
200:
|
|
description: Random number generated
|
|
type: integer
|
|
"""
|
|
request_args = request.args
|
|
lower = int(request_args.get("lower")) if "lower" in request_args else 10
|
|
upper = int(request_args.get("upper")) if "upper" in request_args else 0
|
|
if upper < lower:
|
|
return Response(
|
|
json.dumps(
|
|
{"error": "Upper boundary must be greater or equal than lower boundary"}
|
|
),
|
|
status=400,
|
|
mimetype="application/json",
|
|
)
|
|
number = str(random.randint(lower, upper))
|
|
return Response(number, status=200, mimetype="application/json")
|
|
|
|
|
|
@app.route("/random-list")
|
|
def last_number_list():
|
|
"""Gets the latest 5 generated numbers
|
|
---
|
|
definitions:
|
|
Number:
|
|
type: int
|
|
responses:
|
|
200:
|
|
description: list of results
|
|
schema:
|
|
$ref: '#/definitions/Number'
|
|
type: array
|
|
"""
|
|
last_numbers = list(random_numbers.find({"_id": "lasts"}))
|
|
if len(last_numbers) == 0:
|
|
extracted = []
|
|
else:
|
|
extracted = [d["value"] for d in last_numbers[0]["items"]]
|
|
return Response(
|
|
json.dumps(extracted, default=json_util.default),
|
|
status=200,
|
|
mimetype="application/json",
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
logger.debug("Random demo app started")
|
|
# starts the app in debug mode, bind on all ip's and on port 5000
|
|
app.run(debug=True, host="0.0.0.0", port=5000)
|
|
|