package dashboard import ( "fmt" "net/http" "strconv" ) type sitesPageData struct { PageData Items []siteDTO // dynamic length — as many slots as configured, no fixed cap } func (s *Server) handleSitesPage(w http.ResponseWriter, r *http.Request) { items, err := s.CA.ListSites(r.Context()) data := sitesPageData{Items: items} data.ActiveNav = "sites" data.Banner = bannerFor(err) s.renderPage(w, "sites_page", data) } func (s *Server) renderSitesTable(w http.ResponseWriter, r *http.Request, actionErr error) { items, listErr := s.CA.ListSites(r.Context()) if actionErr == nil { actionErr = listErr } s.renderFragment(w, "sites_table", sitesPageData{Items: items}, actionErr) } // handleSiteCreate adds a brand-new slot via the "add site" form — same // create-alongside-update pattern as /targets' handleTargetCreate, just // backed by the same PutSite call the per-row form already uses (there's // no separate "create" endpoint on control-api since PUT is already an // upsert). func (s *Server) handleSiteCreate(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { s.renderSitesTable(w, r, fmt.Errorf("invalid form: %w", err)) return } index, convErr := strconv.Atoi(r.PostFormValue("index")) if convErr != nil { s.renderSitesTable(w, r, &apiErr{Status: http.StatusBadRequest, Message: "index должен быть числом"}) return } err := s.CA.PutSite(r.Context(), index, r.PostFormValue("site_id")) s.renderSitesTable(w, r, err) } func (s *Server) handleSitePut(w http.ResponseWriter, r *http.Request) { index, convErr := strconv.Atoi(r.PathValue("index")) if convErr != nil { s.renderSitesTable(w, r, &apiErr{Status: http.StatusBadRequest, Message: "index должен быть числом"}) return } if err := r.ParseForm(); err != nil { s.renderSitesTable(w, r, fmt.Errorf("invalid form: %w", err)) return } err := s.CA.PutSite(r.Context(), index, r.PostFormValue("site_id")) s.renderSitesTable(w, r, err) } func (s *Server) handleSiteDelete(w http.ResponseWriter, r *http.Request) { index, convErr := strconv.Atoi(r.PathValue("index")) if convErr != nil { s.renderSitesTable(w, r, &apiErr{Status: http.StatusBadRequest, Message: "index должен быть числом"}) return } err := s.CA.DeleteSite(r.Context(), index) s.renderSitesTable(w, r, err) }