morz-infoboard/server/backend/internal/httpapi/manage/schedule.go
Jesko Anschütz 83af005fad feat(api): POST /api/v1/screens/{slug}/schedule + Scheduler verdrahtet
ScheduleStore in RouterDeps, HandleUpdateSchedule-Handler, Scheduler-Goroutine
in app.Run(), ScreenStore.GetByID hinzugefügt.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 07:17:45 +01:00

46 lines
1.3 KiB
Go

package manage
import (
"encoding/json"
"net/http"
"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) {
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 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)
}
}