Skip to content
Snippets Groups Projects
Commit b5fecb19 authored by Sara Savanovic Djordjevic's avatar Sara Savanovic Djordjevic
Browse files

update: get marker_data from db

parent b3cd23da
No related branches found
No related tags found
No related merge requests found
No preview for this file type
......@@ -6,7 +6,8 @@ PORT = 8443
# Database paths
DB_NAME = 'IceMapDB'
COLLECTION = 'IceData'
#COLLECTION = 'IceData'
COLLECTION = 'TestCollection' # NB: temporary collection
MONGO_URI = "mongodb+srv://icemapcluster.i02epob.mongodb.net/?authSource=%24external&authMechanism=MONGODB-X509&retryWrites=true&w=majority"
# Certificate paths
......
......@@ -8,6 +8,7 @@ from data_structs import Measurement, MarkerTemplate, DateAndTime, Sensor
import ssl
import keyboard
from flask import json
from bson import json_util
app = Flask(__name__)
terminate_server = 0
......@@ -28,10 +29,28 @@ def initDatabase():
except Exception as e:
print(f"Failed to connect to MongoDB: {e}")
class IceHTTPServer(HTTPServer):
def __init__(self, server_address, handler_class, client):
super().__init__(server_address, handler_class)
self.client = client
def get_request(self):
request, client_address = super().get_request()
return request, client_address
# Define HTTP class
# Define custom HTTP class
class IceHTTP(BaseHTTPRequestHandler):
def __init__(self, request, client_address, server):
self.client = server.client
super().__init__(request, client_address, server)
def do_GET(self):
db = self.client[DB_NAME]
col = db[COLLECTION] # Set collection pointer
# Root path
if self.path == '/':
self.send_response(200)
self.send_header("Content-type", "text/plain")
......@@ -41,16 +60,35 @@ class IceHTTP(BaseHTTPRequestHandler):
# Update_map endpoint
elif self.path == '/update_map': # NB: should be POST?
# Fetch marker data
markers_data, resp_code = get_markers()
try:
# Fetch marker data
marker_cursor = col.find({})
marker_data = list(marker_cursor)
# Remove ObjectId field from each document
for document in marker_data:
document.pop('_id', None)
if marker_data: # Data found in DB, convert from BSON to JSON
resp_code = 200
marker_json_list = [json_util.dumps(document) for document in marker_data]
marker_json = "[" + ",".join(marker_json_list) + "]"
else: # Data not found in DB
resp_code = 404
marker_json = '[]'
except Exception as e:
print(f"An error occurred while querying MongoDB: {e}")
resp_code = 500
marker_data = []
# Set headers
self.send_response(resp_code)
self.send_header("Content-type", "application/json")
self.end_headers()
# Write the JSON data to response object
self.wfile.write(str(markers_data).encode('utf-8'))
# Convert marker_data to JSON and write it to the response object
marker_json = json.dumps(marker_data)
self.wfile.write(marker_json.encode('utf-8'))
# Listen for pressing of q key to terminate server
def on_key_press(server, event):
......@@ -66,42 +104,14 @@ if __name__ == "__main__":
# Initialise database connection
client = initDatabase()
db = client[DB_NAME]
testCol = db["TestCollection"]
# NB: temporary test data
sensor1 = Sensor(ID=1, type="Type1", active=True)
sensor2 = Sensor(ID=2, type="Type2", active=False)
datetime1 = DateAndTime(2023, 12, 31, 15, 43)
datetime2 = DateAndTime(2024, 1, 15, 12, 2)
datetime3 = DateAndTime(2024, 1, 31, 18, 10)
measurement1 = Measurement(longitude=10.9771, latitude=60.7066, datetime=datetime1, sensor=sensor1,
precipitation=0.0, thickness=0.0, max_weight=0.0, safety_level=0.0, accuracy=2.5)
measurement2 = Measurement(longitude=10.8171, latitude=60.6366, datetime=datetime2, sensor=sensor2,
precipitation=0.0, thickness=0.0, max_weight=0.0, safety_level=0.0, accuracy=1.5)
measurement3 = Measurement(longitude=10.8471, latitude=60.7366, datetime=datetime3, sensor=sensor1,
precipitation=0.0, thickness=0.0, max_weight=0.0, safety_level=0.0, accuracy=4.0)
testData = [
MarkerTemplate(measurement1, 30.0-measurement1.accuracy, "Green"),
MarkerTemplate(measurement2, 10.0-measurement2.accuracy, "Red"),
MarkerTemplate(measurement3, 20.0-measurement3.accuracy, "Yellow"),
]
data_to_insert = [marker_template.to_dict() for marker_template in testData]
for element in data_to_insert:
insert_result = testCol.insert_one(element)
try:
# Load SSL certificate and private key
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain(SSL_CERT_PATH, SSL_KEY_PATH)
# Create HTTP server with SSL support
server = HTTPServer((HOST, PORT), IceHTTP)
#server = HTTPServer((HOST, PORT), IceHTTP(client))
server = IceHTTPServer((HOST, PORT), IceHTTP, client)
server.socket = ssl_context.wrap_socket(server.socket, server_side=True)
print("Server running on port ", PORT)
......@@ -113,4 +123,4 @@ if __name__ == "__main__":
server.serve_forever()
except Exception as e:
print(f"Failed to start server on port {PORT}: {e}")
print(f"Server terminated: {PORT}: {e}")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment