New endpoints
This commit is contained in:
parent
e2a1edcde3
commit
602677eff7
8 changed files with 70 additions and 9 deletions
|
@ -1,7 +1,7 @@
|
||||||
stages:
|
stages:
|
||||||
- quality assurance
|
- quality assurance
|
||||||
|
|
||||||
pylint:
|
backend-pylint:
|
||||||
stage: quality assurance
|
stage: quality assurance
|
||||||
image: python:3.11.4-buster
|
image: python:3.11.4-buster
|
||||||
before_script:
|
before_script:
|
||||||
|
|
12
.vscode/settings.json
vendored
Normal file
12
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"files.exclude": {
|
||||||
|
"**/.git": true,
|
||||||
|
"**/.svn": true,
|
||||||
|
"**/.hg": true,
|
||||||
|
"**/CVS": true,
|
||||||
|
"**/.DS_Store": true,
|
||||||
|
"**/Thumbs.db": true,
|
||||||
|
"**/__pycache__": true
|
||||||
|
},
|
||||||
|
"hide-files.files": []
|
||||||
|
}
|
|
@ -1,11 +1,10 @@
|
||||||
[MAIN]
|
[MAIN]
|
||||||
|
|
||||||
disable=
|
disable=
|
||||||
too-many-instance-attributes,
|
line-too-long,
|
||||||
|
missing-class-docstring,
|
||||||
|
missing-function-docstring,
|
||||||
|
missing-module-docstring,
|
||||||
too-few-public-methods,
|
too-few-public-methods,
|
||||||
too-many-arguments,
|
too-many-arguments,
|
||||||
missing-module-docstring,
|
too-many-instance-attributes,
|
||||||
missing-function-docstring,
|
|
||||||
missing-class-docstring,
|
|
||||||
too-few-public-methods,
|
|
||||||
line-too-long,
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
# pylint: disable=too-few-public-methods
|
# pylint: disable=too-few-public-methods
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
from flask_smorest import Api
|
from flask_smorest import Api
|
||||||
from config.api_settings import DefaultSettings
|
from config.api_settings import DefaultSettings
|
||||||
|
@ -20,6 +21,7 @@ class Application:
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.config.from_object(DefaultSettings)
|
app.config.from_object(DefaultSettings)
|
||||||
api = None
|
api = None
|
||||||
|
alive_since = None
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_instance():
|
def get_instance():
|
||||||
|
@ -32,3 +34,4 @@ class Application:
|
||||||
raise IsSingletonException("This class is a singleton")
|
raise IsSingletonException("This class is a singleton")
|
||||||
Application.__instance = self
|
Application.__instance = self
|
||||||
self.api = Api(self.app)
|
self.api = Api(self.app)
|
||||||
|
self.alive_since = datetime.now()
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# pylint: disable=wrong-import-position,cyclic-import
|
# pylint: disable=wrong-import-position,cyclic-import
|
||||||
from flask_smorest import Blueprint
|
from flask_smorest import Blueprint
|
||||||
|
|
||||||
routes = Blueprint("support-organizer", "support-organizer", url_prefix="/", description="")
|
routes = Blueprint("interface", "interface", url_prefix="/", description="")
|
||||||
|
|
||||||
from . import apiversion # avoids circular imports problem
|
from . import version, openapi, health # avoids circular imports problem
|
||||||
|
|
32
backend/src/routes/health.py
Normal file
32
backend/src/routes/health.py
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
from datetime import datetime
|
||||||
|
from enum import Enum
|
||||||
|
from flask.views import MethodView
|
||||||
|
import marshmallow as ma
|
||||||
|
|
||||||
|
from app import Application
|
||||||
|
from . import routes as blp
|
||||||
|
|
||||||
|
instance = Application.get_instance()
|
||||||
|
|
||||||
|
class HealthStatus(Enum):
|
||||||
|
OK = 0
|
||||||
|
WARNING = 1
|
||||||
|
ERROR = 2
|
||||||
|
CRITICAL = 3
|
||||||
|
|
||||||
|
class HealthGet(ma.Schema):
|
||||||
|
alive_since = ma.fields.String()
|
||||||
|
alive_for = ma.fields.String()
|
||||||
|
status = ma.fields.Enum(HealthStatus, type=ma.fields.String)
|
||||||
|
|
||||||
|
@blp.route("/health")
|
||||||
|
class ApiVersion(MethodView):
|
||||||
|
@blp.doc(summary="Returns the status and alive-time of the server")
|
||||||
|
@blp.response(200, HealthGet, description="Successful operation")
|
||||||
|
def get(self):
|
||||||
|
response = {
|
||||||
|
"alive_since": datetime.strftime(instance.alive_since, "%d.%m.%Y %H:%M:%S"),
|
||||||
|
"alive_for": str(datetime.now() - instance.alive_since),
|
||||||
|
"status": HealthStatus.OK
|
||||||
|
}
|
||||||
|
return response
|
15
backend/src/routes/openapi.py
Normal file
15
backend/src/routes/openapi.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
from flask import redirect, url_for
|
||||||
|
from flask.views import MethodView
|
||||||
|
import marshmallow as ma
|
||||||
|
|
||||||
|
from . import routes as blp
|
||||||
|
|
||||||
|
class OpenAPIGet(ma.Schema):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@blp.route("/openapi")
|
||||||
|
class ApiVersion(MethodView):
|
||||||
|
@blp.doc(summary="Get the OpenAPI spec as a JSON.")
|
||||||
|
@blp.response(200, OpenAPIGet, description="Successful operation")
|
||||||
|
def get(self):
|
||||||
|
return redirect(url_for('api-docs.openapi_json'))
|
Loading…
Reference in a new issue