mirror of
https://github.com/kaaninchen/Laterna.git
synced 2026-09-17 19:12:48 +00:00
127 lines
3.2 KiB
Go
127 lines
3.2 KiB
Go
package db
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/siestaw/laterna/server/cmd/internal/logger"
|
|
"github.com/siestaw/laterna/server/cmd/internal/models"
|
|
"github.com/siestaw/laterna/server/cmd/utils"
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
func CreateController() (int64, error) {
|
|
result, err := DB.Exec("INSERT INTO controllers (color, updated_at) VALUES (?, CURRENT_TIMESTAMP)", "#FFFFF")
|
|
if err != nil {
|
|
logger.DBLogger.Printf("Error creating controller: %v", err)
|
|
return 0, err
|
|
}
|
|
|
|
id, err := result.LastInsertId()
|
|
if err != nil {
|
|
logger.DBLogger.Printf("Error fetching controller ID: %v", err)
|
|
return 0, err
|
|
}
|
|
return id, nil
|
|
}
|
|
|
|
func CreateAdmin() string {
|
|
token, err := utils.GenerateToken()
|
|
if err != nil {
|
|
logger.DBLogger.Fatalf("Error generating admin token: %v", err)
|
|
}
|
|
token_hash, err := utils.HashToken(token)
|
|
if err != nil {
|
|
logger.DBLogger.Fatalf("Error hashing admin token: %v", err)
|
|
}
|
|
DB.Exec("INSERT INTO controllers (id, token_hash) VALUES (0, ?)", token_hash)
|
|
return token
|
|
}
|
|
|
|
func DeleteController(id int) error {
|
|
_, err := DB.Exec("DELETE FROM controllers WHERE id = ?", id)
|
|
if err != nil {
|
|
logger.DBLogger.Printf("An error occured while deleting the controller %v: %s", id, err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func IsAdmin(token string) bool {
|
|
stmt := DB.QueryRow("SELECT token_hash FROM controllers WHERE id = 0")
|
|
|
|
var hashToken string
|
|
err := stmt.Scan(&hashToken)
|
|
if err != nil {
|
|
logger.DBLogger.Printf("Error retrieving admin hash: %v", err)
|
|
return false
|
|
}
|
|
err = bcrypt.CompareHashAndPassword([]byte(hashToken), []byte(token))
|
|
return err == nil
|
|
}
|
|
|
|
func ControllerExists(id int) bool {
|
|
row := DB.QueryRow("SELECT COUNT(1) FROM controllers WHERE id = ?", id)
|
|
|
|
var count int
|
|
err := row.Scan(&count)
|
|
if err != nil {
|
|
logger.DBLogger.Printf("ControllerExists: %v", err)
|
|
}
|
|
return count > 0
|
|
}
|
|
|
|
func GetAllColors() ([]models.LampState, error) {
|
|
rows, err := DB.Query("SELECT id, color, updated_at FROM controllers WHERE id > 0")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var controllers []models.LampState
|
|
|
|
for rows.Next() {
|
|
var state models.LampState
|
|
if err := rows.Scan(&state.ID, &state.Color, &state.UpdatedAt); err != nil {
|
|
return nil, err
|
|
}
|
|
controllers = append(controllers, state)
|
|
}
|
|
return controllers, nil
|
|
}
|
|
|
|
func ViewColor(id int) (*models.LampState, error) {
|
|
row := DB.QueryRow("SELECT id, color, updated_at FROM controllers WHERE id = ?", id)
|
|
|
|
var state models.LampState
|
|
err := row.Scan(&state.ID, &state.Color, &state.UpdatedAt)
|
|
if err != nil {
|
|
logger.DBLogger.Print(err)
|
|
return nil, err
|
|
}
|
|
|
|
return &state, nil
|
|
}
|
|
|
|
func SetColor(id int, color string) error {
|
|
if !utils.IsValidHexColor(color) {
|
|
return errors.New("invalid HEX Code: %s")
|
|
}
|
|
currentColor, err := ViewColor(id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if currentColor.Color == color {
|
|
logger.DBLogger.Printf("Lamp %d already has color %s - skipping update", id, color)
|
|
return nil
|
|
}
|
|
|
|
_, err = DB.Exec("UPDATE controllers SET color = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?", color, id)
|
|
if err != nil {
|
|
logger.DBLogger.Printf("Failed to update lamp %d: %v", id, err)
|
|
return err
|
|
}
|
|
|
|
logger.DBLogger.Printf("Lamp %d color updated to %s", id, color)
|
|
return nil
|
|
}
|