Files
ServiceManager/backend/main.go
2026-01-18 22:22:00 +01:00

143 lines
3.2 KiB
Go

package main
import (
"backend/handlers"
"backend/repositories"
"database/sql"
"fmt"
"log"
"net/http"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
"golang.org/x/crypto/bcrypt"
)
func SeedAdmin(db *sqlx.DB) error {
var count int
err := db.Get(&count, "SELECT count(*) FROM users WHERE role = 'admin'")
if err != nil {
return err
}
if count == 0 {
hash, _ := bcrypt.GenerateFromPassword([]byte("admin"), bcrypt.DefaultCost)
_, err = db.Exec(
"INSERT INTO users (username, email, password_hash, role) VALUES ($1, $2, $3, $4)",
"admin", "admin@localhost", string(hash), "admin",
)
if err == nil {
fmt.Println("✅ Compte admin créé (admin / admin)")
}
return err
}
return nil
}
func NodeAuthMiddleware(repo *repositories.NodeRepository) gin.HandlerFunc {
return func(c *gin.Context) {
key := c.GetHeader("X-Node-API-Key")
if key == "" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Clé API manquante"})
c.Abort()
return
}
isValid, err := repo.IsApiKeyValid(key)
if err != nil || !isValid {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Clé API invalide"})
c.Abort()
return
}
c.Next()
}
}
func AuthRequired(c *gin.Context) {
session := sessions.Default(c)
userID := session.Get("user_id")
if userID == nil {
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Veuillez vous connecter"})
return
}
c.Next()
}
func main() {
r := gin.Default()
store := cookie.NewStore([]byte("ma_cle_secrete_super_secure"))
store.Options(sessions.Options{
Path: "/",
MaxAge: 3600 * 8,
HttpOnly: true,
Secure: false,
SameSite: http.SameSiteLaxMode,
})
r.Use(sessions.Sessions("session_id", store))
dsn := "host=db user=admin password=admin dbname=monitoring sslmode=disable"
db, err := sql.Open("postgres", dsn)
if err != nil {
log.Fatal(err)
}
err = db.Ping()
if err != nil {
log.Fatal("Impossible de joindre la DB:", err)
}
dbSqlx := sqlx.NewDb(db, "postgres")
if err := SeedAdmin(dbSqlx); err != nil {
log.Printf("Erreur lors du seeding: %v", err)
}
nodeRepo := &repositories.NodeRepository{DB: dbSqlx}
nodeHandler := &handlers.NodeHandler{
Repo: nodeRepo,
}
api := r.Group("/api")
{
api.POST("/login", nodeHandler.LoginHandler)
protected := api.Group("/")
protected.Use(AuthRequired)
{
protected.DELETE("/deleteService", nodeHandler.HandleDeleteService)
protected.POST("/createApiKey", nodeHandler.CreateApiKeyHandler)
protected.POST("/addProcess", nodeHandler.HandleAddService)
protected.GET("/retrieveNodeList", nodeHandler.HandleRetrieveNodeList)
protected.GET("/retrieveApiKeys", nodeHandler.HandleRetrieveApiKeys)
}
nodes := api.Group("/")
nodes.Use(NodeAuthMiddleware(nodeRepo))
{
nodes.POST("/register", nodeHandler.HandleRegisterNode)
nodes.POST("/registerService", nodeHandler.HandleRegisterService)
nodes.POST("/updateServiceStatus", nodeHandler.HandleUpdateServiceStatus)
}
}
log.Println("Backend running on :8080")
if err := r.Run(":8080"); err != nil {
log.Fatalf("Erreur lors du lancement du serveur: %v", err)
}
}