morz-infoboard/server/backend/internal/httpapi/manage/schedule.go
Jesko Anschütz 3a0ac13faa fix(auth): restricted User können nur zugewiesene Screens aufrufen
requireScreenAccess prüft jetzt für Rolle 'restricted' zusätzlich
ob ein Eintrag in user_screen_permissions existiert. Tenant-Match
allein reichte bisher nicht — restricted User konnten alle Screens
des Tenants aufrufen.
2026-03-28 10:17:29 +01:00

59 lines
1.7 KiB
Go

package manage
import (
"encoding/json"
"net/http"
"time"
"git.az-it.net/az/morz-infoboard/server/backend/internal/store"
)
// HandleUpdateSchedule speichert den Zeitplan für ein Display.
// Body: {"schedule_enabled":true,"power_on_time":"06:00","power_off_time":"22:00"}
func HandleUpdateSchedule(screens *store.ScreenStore, schedules *store.ScreenScheduleStore) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
screenSlug := r.PathValue("screenSlug")
screen, err := screens.GetBySlug(r.Context(), screenSlug)
if err != nil {
http.Error(w, "screen not found", http.StatusNotFound)
return
}
if !requireScreenAccess(w, r, screen, screens) {
return
}
var body struct {
ScheduleEnabled bool `json:"schedule_enabled"`
PowerOnTime string `json:"power_on_time"`
PowerOffTime string `json:"power_off_time"`
}
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
http.Error(w, "invalid JSON", http.StatusBadRequest)
return
}
if body.PowerOnTime != "" {
if _, err := time.Parse("15:04", body.PowerOnTime); err != nil {
http.Error(w, "invalid power_on_time format (use HH:MM)", http.StatusBadRequest)
return
}
}
if body.PowerOffTime != "" {
if _, err := time.Parse("15:04", body.PowerOffTime); err != nil {
http.Error(w, "invalid power_off_time format (use HH:MM)", http.StatusBadRequest)
return
}
}
if err := schedules.Upsert(r.Context(), &store.ScreenSchedule{
ScreenID: screen.ID,
ScheduleEnabled: body.ScheduleEnabled,
PowerOnTime: body.PowerOnTime,
PowerOffTime: body.PowerOffTime,
}); err != nil {
http.Error(w, "db error", http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusNoContent)
}
}