// Package modules définit le contrat d'interface pour les modules ProxmoxPanel. // Chaque module implémente l'interface Module et s'enregistre auprès du ModuleRegistry. package modules import ( "database/sql" "net/http" ) // Module est l'interface que chaque module doit implémenter. type Module interface { // ID retourne l'identifiant unique du module (doit correspondre à la table modules en DB). ID() string // Register est appelé au chargement du module actif. // Il reçoit le registry pour enregistrer ses routes, widgets, etc. Register(registry Registry) error } // Registry est l'interface exposée aux modules pour s'enregistrer dans le CORE. type Registry interface { // RegisterRoute enregistre une route HTTP dans le router principal. RegisterRoute(method, path string, handler http.HandlerFunc, requireAdmin bool) // RegisterWSChannel enregistre un handler WebSocket pour un channel nommé. RegisterWSChannel(channel string, handler WSHandler) // RegisterWidget déclare un type de widget disponible pour le dashboard. RegisterWidget(widget WidgetDef) // RegisterSettingsTab ajoute un onglet dans la page paramètres. RegisterSettingsTab(tab SettingsTabDef) // RegisterTranslations fusionne des clés de traduction pour une langue donnée. RegisterTranslations(lang string, keys map[string]string) // RegisterMigration déclare une migration de base de données propre au module. RegisterMigration(version int, sql string, fn MigrationFn) // DB retourne un accès à SQLite avec isolation par module (préfixe de tables). DB() *sql.DB } // WSHandler est un handler WebSocket pour un channel nommé. type WSHandler func(userID int64, send chan<- []byte, recv <-chan []byte) // WidgetDef décrit un type de widget disponible pour le dashboard. type WidgetDef struct { Type string `json:"type"` Name string `json:"name"` Description string `json:"description"` DefaultW int `json:"default_width"` DefaultH int `json:"default_height"` } // SettingsTabDef décrit un onglet de paramètres fourni par un module. type SettingsTabDef struct { ID string `json:"id"` Label string `json:"label"` Icon string `json:"icon"` // Path est le chemin frontend du composant Vue à charger (lazy import). ComponentPath string `json:"component_path"` } // MigrationFn est une fonction de migration optionnelle (pour les migrations non-SQL). type MigrationFn func(db *sql.DB) error