chore: update
ci-api / test (push) Successful in 22m17s
ci-web / test (push) Successful in 13m44s

This commit is contained in:
Xor290
2026-08-02 18:34:59 +02:00
parent 6992e505ae
commit c5ee5636ef
34 changed files with 2660 additions and 498 deletions
@@ -19,6 +19,8 @@ type Store interface {
UpdatePassword(id, passwordHahs string) (auth.User, error)
GetTelegram(id string) (auth.User, error)
SetTelegram(id, telegram string) (auth.User, error)
GetAlertSettings(id string) (auth.User, error)
SetAlertSettings(id string, discordWebhookURL, telegramBotToken, telegramChatID string) (auth.User, error)
}
func (s *GormStore) UpdateUsername(id, newUsername string) (auth.User, error) {
@@ -71,3 +73,36 @@ func (s *GormStore) SetTelegram(id, telegram string) (auth.User, error) {
}
return user, nil
}
func (s *GormStore) GetAlertSettings(id string) (auth.User, error) {
var user auth.User
if err := s.db.First(&user, "id = ?", id).Error; err != nil {
return auth.User{}, err
}
return user, nil
}
// SetAlertSettings enregistre les réglages d'alerte de cet admin. Une chaîne
// vide efface le champ correspondant (désactive ce canal pour cet admin).
func (s *GormStore) SetAlertSettings(id string, discordWebhookURL, telegramBotToken, telegramChatID string) (auth.User, error) {
updates := map[string]interface{}{
"alert_discord_webhook_url": nullIfEmpty(discordWebhookURL),
"alert_telegram_bot_token": nullIfEmpty(telegramBotToken),
"alert_telegram_chat_id": nullIfEmpty(telegramChatID),
}
if err := s.db.Model(&auth.User{}).Where("id = ?", id).Updates(updates).Error; err != nil {
return auth.User{}, err
}
var user auth.User
if err := s.db.First(&user, "id = ?", id).Error; err != nil {
return auth.User{}, err
}
return user, nil
}
func nullIfEmpty(s string) *string {
if s == "" {
return nil
}
return &s
}
@@ -27,6 +27,32 @@ type newTelegram struct {
Telegram string `json:"telegram" binding:"required,min=3,max=64"`
}
type alertSettingsRequest struct {
DiscordWebhookURL string `json:"discord_webhook_url" binding:"omitempty,max=500,url"`
TelegramBotToken string `json:"telegram_bot_token" binding:"omitempty,max=200"`
TelegramChatID string `json:"telegram_chat_id" binding:"omitempty,max=64"`
}
type alertSettingsResponse struct {
DiscordWebhookURL string `json:"discord_webhook_url"`
TelegramBotToken string `json:"telegram_bot_token"`
TelegramChatID string `json:"telegram_chat_id"`
}
func toAlertSettingsResponse(user auth.User) alertSettingsResponse {
deref := func(s *string) string {
if s == nil {
return ""
}
return *s
}
return alertSettingsResponse{
DiscordWebhookURL: deref(user.AlertDiscordWebhookURL),
TelegramBotToken: deref(user.AlertTelegramBotToken),
TelegramChatID: deref(user.AlertTelegramChatID),
}
}
func (h *Handler) UpdateUsernameById(c *gin.Context) {
var u newUsername
@@ -110,3 +136,40 @@ func (h *Handler) SetTelegramById(c *gin.Context) {
}
c.JSON(http.StatusOK, gin.H{"telegram": user.Telegram})
}
// GetAlerts : réglages d'alerte monitoring (webhook Discord / bot Telegram)
// de l'admin authentifié — chacun configure les siens, rien de partagé.
func (h *Handler) GetAlerts(c *gin.Context) {
p := auth.PrincipalFrom(c)
if p == nil {
c.JSON(http.StatusUnauthorized, gin.H{"error": "non authentifié"})
return
}
user, err := h.store.GetAlertSettings(p.UserID)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "requête invalide"})
return
}
c.JSON(http.StatusOK, toAlertSettingsResponse(user))
}
// SetAlerts : enregistre les réglages d'alerte de l'admin authentifié. Un
// champ vide désactive le canal correspondant.
func (h *Handler) SetAlerts(c *gin.Context) {
var req alertSettingsRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "requête invalide"})
return
}
p := auth.PrincipalFrom(c)
if p == nil {
c.JSON(http.StatusUnauthorized, gin.H{"error": "non authentifié"})
return
}
user, err := h.store.SetAlertSettings(p.UserID, req.DiscordWebhookURL, req.TelegramBotToken, req.TelegramChatID)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "erreur serveur"})
return
}
c.JSON(http.StatusOK, toAlertSettingsResponse(user))
}