Skip to content
Snippets Groups Projects
main.py 2.77 KiB
from flask import Flask
from http.server import HTTPServer, BaseHTTPRequestHandler
from consts import SSL_CERT_PATH, SSL_KEY_PATH, HOST, PORT
from map_handler.get_measurements import get_all_markers
from map_handler.add_lake import cut_map
from map_handler.process_lake import fetch_divided_map
from map_handler.input_new_data import input_new_Lidar_data
from urllib.parse import urlparse, parse_qs
import ssl
import sqlite3

app = Flask(__name__)
terminate_server = 0

class IceHTTPServer(HTTPServer):
    def __init__(self, server_address, handler_class, cursor):
        super().__init__(server_address, handler_class)
        self.cursor = cursor

    def get_request(self):
        request, client_address = super().get_request()
        return request, client_address


# Custom HTTP class
class IceHTTP(BaseHTTPRequestHandler):

    def __init__(self, request, client_address, server):
        self.cursor = server.cursor
        super().__init__(request, client_address, server)

    def do_GET(self):

        # Root path
        if self.path == '/':  # NB: temporary root path behavior
            self.send_response(200)
            self.send_header("Content-type", "text/plain")
            self.end_headers()

            self.wfile.write(b"Root path hit!")

        elif self.path.startswith('/update_map'):  # NB: should be POST?
            parsed_path = urlparse(self.path)
            query_params = parse_qs(parsed_path.query)
            get_all_markers(self, self.cursor, 'mjosa')  # Get all markers
            # NB: temporary hardcoded waterBodyName
        elif self.path.startswith('/get_relation'):
            parsed_path = urlparse(self.path)
            query_params = parse_qs(parsed_path.query)
            fetch_divided_map(self, 'Mjosa')  # NB temp hardcoded value
        elif self.path == '/divide_new_relation':
            cut_map(self, 'Mjosa')

    def do_POST(self):
        if self.path == '/new_lidar_data':
            input_new_Lidar_data(self,self.cursor, 1, 'Mjosa')  # hardcoded body of water must change later

# Start a server on port 8443 using self defined HTTP class
if __name__ == "__main__":
    try:
        # Initialize database connection
        conn = sqlite3.connect('server/database/icedb')
        cursor = conn.cursor()

        # 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 = IceHTTPServer((HOST, PORT), IceHTTP, cursor)
        server.socket = ssl_context.wrap_socket(server.socket, server_side=True)

        print("Server running on port ", PORT)

        # Run server indefinitely
        server.serve_forever()

    except Exception as e:
        print(f"Server terminated: {PORT}: {e}")