summaryrefslogtreecommitdiff
path: root/web-server/opendc/util/database.py
diff options
context:
space:
mode:
authorGeorgios Andreadis <info@gandreadis.com>2020-06-29 16:05:23 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2020-08-24 16:18:36 +0200
commit4f9a40abdc7836345113c047f27fcc96800cb3f5 (patch)
treee443d14e34a884b1a4d9c549f81d51202eddd5f7 /web-server/opendc/util/database.py
parentcd5f7bf3a72913e1602cb4c575e61ac7d5519be0 (diff)
Prepare web-server repository for monorepo
This change prepares the web-server Git repository for the monorepo residing at https://github.com/atlarge-research.com/opendc. To accomodate for this, we move all files into a web-server subdirectory.
Diffstat (limited to 'web-server/opendc/util/database.py')
-rw-r--r--web-server/opendc/util/database.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/web-server/opendc/util/database.py b/web-server/opendc/util/database.py
new file mode 100644
index 00000000..50bc93a8
--- /dev/null
+++ b/web-server/opendc/util/database.py
@@ -0,0 +1,93 @@
+import json
+import urllib.parse
+from datetime import datetime
+
+from bson.json_util import dumps
+from pymongo import MongoClient
+
+DATETIME_STRING_FORMAT = '%Y-%m-%dT%H:%M:%S'
+CONNECTION_POOL = None
+
+
+class Database:
+ def __init__(self):
+ self.opendc_db = None
+
+ def init_database(self, user, password, database, host):
+ user = urllib.parse.quote_plus(user) # TODO: replace this with environment variable
+ password = urllib.parse.quote_plus(password) # TODO: same as above
+ database = urllib.parse.quote_plus(database)
+ host = urllib.parse.quote_plus(host)
+
+ client = MongoClient('mongodb://%s:%s@%s/default_db?authSource=%s' % (user, password, host, database))
+ self.opendc_db = client.opendc
+
+ def fetch_one(self, query, collection):
+ """Uses existing mongo connection to return a single (the first) document in a collection matching the given
+ query as a JSON object.
+
+ The query needs to be in json format, i.e.: `{'name': prefab_name}`.
+ """
+ bson = getattr(self.opendc_db, collection).find_one(query)
+
+ return self.convert_bson_to_json(bson)
+
+ def fetch_all(self, query, collection):
+ """Uses existing mongo connection to return all documents matching a given query, as a list of JSON objects.
+
+ The query needs to be in json format, i.e.: `{'name': prefab_name}`.
+ """
+ results = []
+ cursor = getattr(self.opendc_db, collection).find(query)
+ for doc in cursor:
+ results.append(self.convert_bson_to_json(doc))
+ return results
+
+ def insert(self, obj, collection):
+ """Updates an existing object."""
+ bson = getattr(self.opendc_db, collection).insert(obj)
+
+ return self.convert_bson_to_json(bson)
+
+ def update(self, _id, obj, collection):
+ """Updates an existing object."""
+ bson = getattr(self.opendc_db, collection).update({'_id': _id}, obj)
+
+ return self.convert_bson_to_json(bson)
+
+ def delete_one(self, query, collection):
+ """Deletes one object matching the given query.
+
+ The query needs to be in json format, i.e.: `{'name': prefab_name}`.
+ """
+ bson = getattr(self.opendc_db, collection).delete_one(query)
+
+ return self.convert_bson_to_json(bson)
+
+ def delete_all(self, query, collection):
+ """Deletes all objects matching the given query.
+
+ The query needs to be in json format, i.e.: `{'name': prefab_name}`.
+ """
+ bson = getattr(self.opendc_db, collection).delete_many(query)
+
+ return self.convert_bson_to_json(bson)
+
+ @staticmethod
+ def convert_bson_to_json(bson):
+ """Converts a BSON representation to JSON and returns the JSON representation."""
+ json_string = dumps(bson)
+ return json.loads(json_string)
+
+ @staticmethod
+ def datetime_to_string(datetime_to_convert):
+ """Return a database-compatible string representation of the given datetime object."""
+ return datetime_to_convert.strftime(DATETIME_STRING_FORMAT)
+
+ @staticmethod
+ def string_to_datetime(string_to_convert):
+ """Return a datetime corresponding to the given string representation."""
+ return datetime.strptime(string_to_convert, DATETIME_STRING_FORMAT)
+
+
+DB = Database()