First files

This commit is contained in:
Firq 2023-09-26 22:00:26 +02:00
parent 12103a7946
commit 0a6d0b941c
Signed by: Firq
GPG key ID: 3ACC61C8CEC83C20
9 changed files with 128 additions and 0 deletions

2
backend/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
.venv/
__pycache__/

11
backend/.pylintrc Normal file
View file

@ -0,0 +1,11 @@
[MAIN]
disable=
too-many-instance-attributes,
too-few-public-methods,
too-many-arguments,
missing-module-docstring,
missing-function-docstring,
missing-class-docstring,
too-few-public-methods,
line-too-long,

4
backend/requirements.txt Normal file
View file

@ -0,0 +1,4 @@
flask~=2.3.3
flask-smorest~=0.42.1
marshmallow~=3.20.1
gevent~=23.9.1

34
backend/src/app.py Normal file
View file

@ -0,0 +1,34 @@
# pylint: disable=too-few-public-methods
from flask import Flask
from flask_smorest import Api
from config.api_settings import DefaultSettings
class IsSingletonException(Exception):
pass
class Application:
"""
This is a singleton that can be accessed using get_instance()
It has 2 properties
- app: Used for WSGI servers and such
- api: Used for Blueprints
"""
__instance = None
app = Flask(__name__)
app.config.from_object(DefaultSettings)
api = None
@staticmethod
def get_instance():
if Application.__instance is None:
Application()
return Application.__instance
def __init__(self):
if Application.__instance is not None:
raise IsSingletonException("This class is a singleton")
Application.__instance = self
self.api = Api(self.app)

View file

@ -0,0 +1,28 @@
# pylint: disable=too-few-public-methods
import os
class DefaultSettings:
API_TITLE = "Support Organizer"
API_VERSION = 0.1
OPENAPI_VERSION = "3.1.0"
# openapi.json settings
OPENAPI_URL_PREFIX = "/"
OPENAPI_JSON_PATH = "openapi.json"
# swagger settings
OPENAPI_SWAGGER_UI_PATH = "/swagger"
OPENAPI_SWAGGER_UI_URL = "https://cdn.jsdelivr.net/npm/swagger-ui-dist/"
SWAGGER_UI_DOC_EXPANSION = "list"
# redoc settings
OPENAPI_REDOC_PATH = "/redoc"
OPENAPI_REDOC_URL = "https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js"
# Info settings
API_SPEC_OPTIONS = {
'info': {
'description': 'Support Organizer for FGO'
}
}
FILE_SAVE_DIRECTORY = f"{os.getcwd()}/temp"

View file

@ -0,0 +1,2 @@
[server]
port=5000

View file

@ -0,0 +1,6 @@
# pylint: disable=wrong-import-position,cyclic-import
from flask_smorest import Blueprint
routes = Blueprint("support-organizer", "support-organizer", url_prefix="/", description="")
from . import apiversion # avoids circular imports problem

View file

@ -0,0 +1,15 @@
from flask.views import MethodView
import marshmallow as ma
from config.api_settings import DefaultSettings
from . import routes as blp
class ApiVersionGet(ma.Schema):
version = ma.fields.String(example="0.1")
@blp.route("/version")
class ApiVersion(MethodView):
@blp.doc(summary="Get the REST interface version identification.")
@blp.response(200, ApiVersionGet, description="Successful operation")
def get(self):
return { "version": DefaultSettings.API_VERSION }

26
backend/src/server.py Normal file
View file

@ -0,0 +1,26 @@
# pylint: disable=multiple-statements,wrong-import-position,wrong-import-order
from gevent.monkey import patch_all; patch_all()
from gevent.pywsgi import WSGIServer
import configparser
from app import Application
from routes import routes
instance = Application.get_instance()
app = instance.app
api = instance.api
api.register_blueprint(routes)
config = configparser.ConfigParser()
config.read('config/config.ini')
port = int(config['server']['port']) or 5000
if __name__ == '__main__':
http_Server = WSGIServer(("127.0.0.1", port), app)
try:
print(f"Server available on http://127.0.0.1:{port}/")
print(f"View docs on http://127.0.0.1:{port}/swagger")
http_Server.serve_forever()
except KeyboardInterrupt:
print("Keyboard interrupt received, stopping...")