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 ...@@ -6,7 +6,8 @@ PORT = 8443
# Database paths # Database paths
DB_NAME = 'IceMapDB' 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" MONGO_URI = "mongodb+srv://icemapcluster.i02epob.mongodb.net/?authSource=%24external&authMechanism=MONGODB-X509&retryWrites=true&w=majority"
# Certificate paths # Certificate paths
......
...@@ -8,6 +8,7 @@ from data_structs import Measurement, MarkerTemplate, DateAndTime, Sensor ...@@ -8,6 +8,7 @@ from data_structs import Measurement, MarkerTemplate, DateAndTime, Sensor
import ssl import ssl
import keyboard import keyboard
from flask import json from flask import json
from bson import json_util
app = Flask(__name__) app = Flask(__name__)
terminate_server = 0 terminate_server = 0
...@@ -28,10 +29,28 @@ def initDatabase(): ...@@ -28,10 +29,28 @@ def initDatabase():
except Exception as e: except Exception as e:
print(f"Failed to connect to MongoDB: {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): class IceHTTP(BaseHTTPRequestHandler):
def __init__(self, request, client_address, server):
self.client = server.client
super().__init__(request, client_address, server)
def do_GET(self): def do_GET(self):
db = self.client[DB_NAME]
col = db[COLLECTION] # Set collection pointer
# Root path
if self.path == '/': if self.path == '/':
self.send_response(200) self.send_response(200)
self.send_header("Content-type", "text/plain") self.send_header("Content-type", "text/plain")
...@@ -41,16 +60,35 @@ class IceHTTP(BaseHTTPRequestHandler): ...@@ -41,16 +60,35 @@ class IceHTTP(BaseHTTPRequestHandler):
# Update_map endpoint # Update_map endpoint
elif self.path == '/update_map': # NB: should be POST? elif self.path == '/update_map': # NB: should be POST?
# Fetch marker data try:
markers_data, resp_code = get_markers() # 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 # Set headers
self.send_response(resp_code) self.send_response(resp_code)
self.send_header("Content-type", "application/json") self.send_header("Content-type", "application/json")
self.end_headers() self.end_headers()
# Write the JSON data to response object # Convert marker_data to JSON and write it to the response object
self.wfile.write(str(markers_data).encode('utf-8')) marker_json = json.dumps(marker_data)
self.wfile.write(marker_json.encode('utf-8'))
# Listen for pressing of q key to terminate server # Listen for pressing of q key to terminate server
def on_key_press(server, event): def on_key_press(server, event):
...@@ -66,42 +104,14 @@ if __name__ == "__main__": ...@@ -66,42 +104,14 @@ if __name__ == "__main__":
# Initialise database connection # Initialise database connection
client = initDatabase() 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: try:
# Load SSL certificate and private key # Load SSL certificate and private key
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain(SSL_CERT_PATH, SSL_KEY_PATH) ssl_context.load_cert_chain(SSL_CERT_PATH, SSL_KEY_PATH)
# Create HTTP server with SSL support # 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) server.socket = ssl_context.wrap_socket(server.socket, server_side=True)
print("Server running on port ", PORT) print("Server running on port ", PORT)
...@@ -113,4 +123,4 @@ if __name__ == "__main__": ...@@ -113,4 +123,4 @@ if __name__ == "__main__":
server.serve_forever() server.serve_forever()
except Exception as e: 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