initial
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
__pycache__/
|
||||||
|
ENV
|
42
Dockerfile
Normal file
42
Dockerfile
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
FROM python:latest
|
||||||
|
|
||||||
|
LABEL Maintainer="Wolfgang Hottgenroth wolfgang.hottgenroth@icloud.com"
|
||||||
|
|
||||||
|
ARG APP_DIR="/opt/app"
|
||||||
|
ARG CONF_DIR="${APP_DIR}/config"
|
||||||
|
|
||||||
|
ENV DB_HOST="172.16.10.18"
|
||||||
|
ENV DB_NAME="hausverwaltung"
|
||||||
|
ENV DB_USER="hausverwaltung-ui"
|
||||||
|
ENV DB_PASS="test123"
|
||||||
|
|
||||||
|
|
||||||
|
RUN \
|
||||||
|
apt update && \
|
||||||
|
apt install -y libmariadbclient-dev && \
|
||||||
|
pip3 install mariadb && \
|
||||||
|
pip3 install connexion && \
|
||||||
|
pip3 install connexion[swagger-ui] && \
|
||||||
|
pip3 install uwsgi && \
|
||||||
|
pip3 install flask-cors
|
||||||
|
|
||||||
|
RUN \
|
||||||
|
mkdir -p ${APP_DIR} && \
|
||||||
|
mkdir -p ${CONF_DIR} && \
|
||||||
|
useradd -d ${APP_DIR} -u 1000 user
|
||||||
|
|
||||||
|
COPY *.py ${APP_DIR}/
|
||||||
|
COPY swagger.yaml ${APP_DIR}/
|
||||||
|
COPY server.ini ${CONF_DIR}/
|
||||||
|
|
||||||
|
USER 1000:1000
|
||||||
|
WORKDIR ${APP_DIR}
|
||||||
|
VOLUME ${CONF_DIR}
|
||||||
|
|
||||||
|
EXPOSE 5000
|
||||||
|
EXPOSE 9191
|
||||||
|
|
||||||
|
CMD [ "uwsgi", "./config/server.ini" ]
|
||||||
|
|
||||||
|
|
||||||
|
|
46
Objekte.py
Normal file
46
Objekte.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
from dbpool import getConnection
|
||||||
|
|
||||||
|
def get_objekte():
|
||||||
|
try:
|
||||||
|
dbh = getConnection()
|
||||||
|
objekte = []
|
||||||
|
cur = dbh.cursor()
|
||||||
|
cur.execute("SELECT id, shortname, flaeche FROM objekt")
|
||||||
|
for (id, shortname, flaeche) in cur:
|
||||||
|
objekte.append({
|
||||||
|
"id": id,
|
||||||
|
"shortname": shortname,
|
||||||
|
"flaeche": flaeche
|
||||||
|
})
|
||||||
|
return objekte
|
||||||
|
except Exception as err:
|
||||||
|
return str(err), 500
|
||||||
|
finally:
|
||||||
|
dbh.close()
|
||||||
|
|
||||||
|
|
||||||
|
def get_objekt(id=None):
|
||||||
|
try:
|
||||||
|
dbh = getConnection()
|
||||||
|
cur = dbh.cursor()
|
||||||
|
cur.execute("SELECT id, shortname, flaeche FROM objekt WHERE id = ?", (id,))
|
||||||
|
objekt = None
|
||||||
|
try:
|
||||||
|
(id, shortname, flaeche) = cur.next()
|
||||||
|
objekt = {
|
||||||
|
"id": id,
|
||||||
|
"shortname": shortname,
|
||||||
|
"flaeche": flaeche
|
||||||
|
}
|
||||||
|
except StopIteration:
|
||||||
|
return "Objekt not found", 404
|
||||||
|
try:
|
||||||
|
(id, shortname, flaeche) = cur.next()
|
||||||
|
return "More than one Objekt by that id ({}, {}, {})".format(id, shortname, flaeche), 500
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
return objekt
|
||||||
|
except Exception as err:
|
||||||
|
return str(err), 500
|
||||||
|
finally:
|
||||||
|
dbh.close()
|
67
Wohnungen.py
Normal file
67
Wohnungen.py
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
from dbpool import getConnection
|
||||||
|
|
||||||
|
def get_wohnungen():
|
||||||
|
try:
|
||||||
|
dbh = getConnection()
|
||||||
|
wohnungen = []
|
||||||
|
cur = dbh.cursor()
|
||||||
|
cur.execute("""
|
||||||
|
SELECT w.id as id,
|
||||||
|
w.objekt as objekt_id,
|
||||||
|
w.shortname as wohnung,
|
||||||
|
w.flaeche as flaeche,
|
||||||
|
o.shortname as objekt
|
||||||
|
FROM wohnung w, objekt o
|
||||||
|
WHERE o.id = w.objekt
|
||||||
|
""")
|
||||||
|
for (id, objekt_id, wohnung, flaeche, objekt) in cur:
|
||||||
|
wohnungen.append({
|
||||||
|
"id": id,
|
||||||
|
"objekt_id": objekt_id,
|
||||||
|
"wohnung": wohnung,
|
||||||
|
"flaeche": flaeche,
|
||||||
|
"objekt": objekt
|
||||||
|
})
|
||||||
|
return wohnungen
|
||||||
|
except Exception as err:
|
||||||
|
return str(err), 500
|
||||||
|
finally:
|
||||||
|
dbh.close()
|
||||||
|
|
||||||
|
|
||||||
|
def get_wohnung(id=None):
|
||||||
|
try:
|
||||||
|
dbh = getConnection()
|
||||||
|
cur = dbh.cursor()
|
||||||
|
cur.execute("""
|
||||||
|
SELECT w.id as id,
|
||||||
|
w.objekt as objekt_id,
|
||||||
|
w.shortname as wohnung,
|
||||||
|
w.flaeche as flaeche,
|
||||||
|
o.shortname as objekt
|
||||||
|
FROM wohnung w, objekt o
|
||||||
|
WHERE o.id = w.objekt AND
|
||||||
|
w.id = ?
|
||||||
|
""", (id, ))
|
||||||
|
wohnung = None
|
||||||
|
try:
|
||||||
|
(id, objekt_id, wohnung_name, flaeche, objekt_name) = cur.next()
|
||||||
|
wohnung = {
|
||||||
|
"id": id,
|
||||||
|
"objekt_id": objekt_id,
|
||||||
|
"wohnung": wohnung_name,
|
||||||
|
"flaeche": flaeche,
|
||||||
|
"objekt": objekt_name
|
||||||
|
}
|
||||||
|
except StopIteration:
|
||||||
|
return "Wohnung not found", 404
|
||||||
|
try:
|
||||||
|
(id, objekt_id, wohnung_name, flaeche, objekt_name) = cur.next()
|
||||||
|
return "More than one Wohnung by that id ({}, {}, {}, {})".format(id, objekt_name, wohnung_name, flaeche), 500
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
return wohnung
|
||||||
|
except Exception as err:
|
||||||
|
return str(err), 500
|
||||||
|
finally:
|
||||||
|
dbh.close()
|
28
dbpool.py
Normal file
28
dbpool.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import mariadb
|
||||||
|
import os
|
||||||
|
|
||||||
|
pool = None
|
||||||
|
|
||||||
|
def createConnectionPool():
|
||||||
|
global pool
|
||||||
|
|
||||||
|
try:
|
||||||
|
user = os.environ["DB_USER"]
|
||||||
|
password = os.environ["DB_PASS"]
|
||||||
|
host = os.environ["DB_HOST"]
|
||||||
|
database = os.environ["DB_NAME"]
|
||||||
|
except KeyError as err:
|
||||||
|
raise Exception("Database configuration variable {} not available".format(err))
|
||||||
|
|
||||||
|
pool = mariadb.ConnectionPool(
|
||||||
|
user = user,
|
||||||
|
password = password,
|
||||||
|
host = host,
|
||||||
|
database = database,
|
||||||
|
pool_name = 'hv-wep-app',
|
||||||
|
pool_size = 5
|
||||||
|
)
|
||||||
|
|
||||||
|
def getConnection():
|
||||||
|
global pool
|
||||||
|
return pool.get_connection()
|
7
server.ini
Normal file
7
server.ini
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[uwsgi]
|
||||||
|
http = :5000
|
||||||
|
wsgi-file = server.py
|
||||||
|
processes = 4
|
||||||
|
threads = 2
|
||||||
|
stats = :9191
|
||||||
|
|
16
server.py
Normal file
16
server.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import connexion
|
||||||
|
from flask_cors import CORS
|
||||||
|
from dbpool import createConnectionPool
|
||||||
|
|
||||||
|
# prepare database connections
|
||||||
|
createConnectionPool()
|
||||||
|
|
||||||
|
# instantiate the webservice
|
||||||
|
app = connexion.App(__name__)
|
||||||
|
app.add_api('swagger.yaml')
|
||||||
|
|
||||||
|
# CORSify it - otherwise Angular won't accept it
|
||||||
|
CORS(app.app)
|
||||||
|
|
||||||
|
# provide the webservice application to uwsgi
|
||||||
|
application = app.app
|
102
swagger.yaml
Normal file
102
swagger.yaml
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
swagger: '2.0'
|
||||||
|
info:
|
||||||
|
title: Hausverwaltung
|
||||||
|
version: "0.1"
|
||||||
|
|
||||||
|
paths:
|
||||||
|
/hv/objekte:
|
||||||
|
get:
|
||||||
|
tags: [ "Objekte" ]
|
||||||
|
operationId: Objekte.get_objekte
|
||||||
|
summary: Returns all Objekte
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: Successful response.
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/definitions/Objekt'
|
||||||
|
404:
|
||||||
|
description: No Objekte available
|
||||||
|
500:
|
||||||
|
description: Some server error
|
||||||
|
/hv/objekt/{id}:
|
||||||
|
get:
|
||||||
|
tags: [ "Objekte" ]
|
||||||
|
operationId: Objekte.get_objekt
|
||||||
|
summary: Returns Objekt by id
|
||||||
|
parameters:
|
||||||
|
- name: id
|
||||||
|
in: path
|
||||||
|
type: integer
|
||||||
|
required: true
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: Successful response.
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/Objekt'
|
||||||
|
404:
|
||||||
|
description: Objekt not found
|
||||||
|
500:
|
||||||
|
description: Some server error
|
||||||
|
/hv/wohnungen:
|
||||||
|
get:
|
||||||
|
tags: [ "Wohnungen" ]
|
||||||
|
operationId: Wohnungen.get_wohnungen
|
||||||
|
summary: Returns all Wohnungen
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: Successful response.
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/definitions/Wohnung'
|
||||||
|
404:
|
||||||
|
description: No Wohnung available
|
||||||
|
500:
|
||||||
|
description: Some server error
|
||||||
|
/hv/wohnung/{id}:
|
||||||
|
get:
|
||||||
|
tags: [ "Wohnungen" ]
|
||||||
|
operationId: Wohnungen.get_wohnung
|
||||||
|
summary: Returns Wohnung by id
|
||||||
|
parameters:
|
||||||
|
- name: id
|
||||||
|
in: path
|
||||||
|
type: integer
|
||||||
|
required: true
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: Successful response.
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/Wohnung'
|
||||||
|
404:
|
||||||
|
description: Wohnung not found
|
||||||
|
500:
|
||||||
|
description: Some server error
|
||||||
|
|
||||||
|
definitions:
|
||||||
|
Objekt:
|
||||||
|
description: Objekt type
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
shortname:
|
||||||
|
type: string
|
||||||
|
flaeche:
|
||||||
|
type: number
|
||||||
|
Wohnung:
|
||||||
|
description: Wohnung type
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
objekt_id:
|
||||||
|
type: integer
|
||||||
|
wohnung:
|
||||||
|
type: string
|
||||||
|
flaeche:
|
||||||
|
type: number
|
||||||
|
objekt:
|
||||||
|
type: string
|
Reference in New Issue
Block a user