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