diff --git a/server/__pycache__/consts.cpython-311.pyc b/server/__pycache__/consts.cpython-311.pyc index 9ff52d124944e7e6b5fd6348a75357356a3572d9..2ca87ef4877dfd3535f7985003fbc9593d344e4c 100644 Binary files a/server/__pycache__/consts.cpython-311.pyc and b/server/__pycache__/consts.cpython-311.pyc differ diff --git a/server/consts.py b/server/consts.py index 368377575548ab79ed9c639cb2071523ddff0cb2..295463e89cc15ecc1d0ae51330ff0b7bd6ae44a6 100644 --- a/server/consts.py +++ b/server/consts.py @@ -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 diff --git a/server/database/add_to_db.py b/server/database/add_to_db.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/server/main.py b/server/main.py index 6074e4021613f227c582b959ad30f48d6ccc49bb..408d33145d28f879755f9cff2f37ae33a1ff48c8 100644 --- a/server/main.py +++ b/server/main.py @@ -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}")