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