84 lines
2.2 KiB
Go
84 lines
2.2 KiB
Go
package repositories
|
|
|
|
import (
|
|
"backend/models"
|
|
"database/sql"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/gin-contrib/sessions"
|
|
"github.com/gin-gonic/gin"
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
func (r *NodeRepository) IsApiKeyValid(key string) (bool, error) {
|
|
var exists bool
|
|
query := "SELECT exists(SELECT 1 FROM node_api_keys WHERE key_value=$1 AND is_active=true)"
|
|
err := r.DB.Get(&exists, query, key)
|
|
return exists, err
|
|
}
|
|
|
|
func (r *NodeRepository) CreateApiKeyHandler(c *gin.Context, newKey string) (models.CreateApiKeyResponse, error) {
|
|
|
|
var key models.CreateApiKeyResponse
|
|
|
|
var req models.CreateApiKeyRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Format invalide"})
|
|
return key, err
|
|
}
|
|
|
|
query := "INSERT INTO node_api_keys (key_value, key_name) VALUES ($1, $2) RETURNING id, key_name, key_value;"
|
|
err := r.DB.Get(&key, query, newKey, req.KeyName)
|
|
|
|
return key, err
|
|
}
|
|
|
|
func (r *NodeRepository) LoginHandler(c *gin.Context) {
|
|
var req models.LoginRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Format invalide"})
|
|
return
|
|
}
|
|
|
|
log.Println("trying to login")
|
|
|
|
var user struct {
|
|
ID int `db:"id"`
|
|
PasswordHash string `db:"password_hash"`
|
|
Role string `db:"role"`
|
|
}
|
|
|
|
log.Printf("trying to login with %v pswd %v", req.Username, req.Password)
|
|
|
|
query := "SELECT id, password_hash, role FROM users WHERE username = $1"
|
|
err := r.DB.Get(&user, query, req.Username)
|
|
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
c.JSON(http.StatusUnauthorized, gin.H{"error": "Identifiants incorrects"})
|
|
return
|
|
}
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Erreur serveur"})
|
|
return
|
|
}
|
|
|
|
err = bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(req.Password))
|
|
if err != nil {
|
|
c.JSON(http.StatusUnauthorized, gin.H{"error": "Identifiants incorrects"})
|
|
return
|
|
} else {
|
|
session := sessions.Default(c)
|
|
session.Set("user_id", user.ID)
|
|
session.Set("role", user.Role)
|
|
|
|
if err := session.Save(); err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Impossible de créer la session"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "Connexion réussie"})
|
|
return
|
|
}
|
|
}
|