PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); migrate($db); } return $db; } function migrate($db) { // Create tables using the main connection $db->exec("CREATE TABLE IF NOT EXISTS network_shapes ( id INT AUTO_INCREMENT PRIMARY KEY, label VARCHAR(255) NOT NULL DEFAULT '', shape_type ENUM('rectangle','ellipse','zone') DEFAULT 'rectangle', pos_x FLOAT DEFAULT 0, pos_y FLOAT DEFAULT 0, width FLOAT DEFAULT 200, height FLOAT DEFAULT 150, color VARCHAR(7) DEFAULT '#1e3a5f', border_color VARCHAR(7) DEFAULT '#3b82f6', opacity FLOAT DEFAULT 0.15, z_index INT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )"); $db->exec("CREATE TABLE IF NOT EXISTS neptune_users ( id INT AUTO_INCREMENT PRIMARY KEY, user_token VARCHAR(255) NOT NULL UNIQUE, username VARCHAR(255) NOT NULL, email VARCHAR(255) DEFAULT '', role ENUM('admin','user') DEFAULT 'user', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )"); // Connect as root for schema changes try { $root = new PDO("mysql:host=" . (getenv('DB_HOST') ?: 'mysql') . ";dbname=" . (getenv('DB_NAME') ?: 'neptune') . ";charset=utf8mb4", 'root', getenv('MYSQL_ROOT_PASSWORD') ?: 'neptune_root_pass'); $root->exec("CREATE TABLE IF NOT EXISTS node_notes (node_id INT PRIMARY KEY, notes TEXT DEFAULT '')"); } catch (Exception $e) { } }