MCPcopy
hub / github.com/PatchMon/PatchMon / Update

Method Update

server-source-code/internal/handler/settings.go:642–697  ·  view source on GitHub ↗

Update handles PATCH or PUT /settings.

(w http.ResponseWriter, r *http.Request)

Source from the content-addressed store, hash-verified

640
641// Update handles PATCH or PUT /settings.
642func (h *SettingsHandler) Update(w http.ResponseWriter, r *http.Request) {
643 s, err := h.settings.GetFirst(r.Context())
644 if err != nil {
645 Error(w, http.StatusInternalServerError, "Failed to load settings")
646 return
647 }
648
649 var req map[string]interface{}
650 if err := decodeJSON(r, &req); err != nil {
651 Error(w, http.StatusBadRequest, "Invalid request body")
652 return
653 }
654
655 // In managed/multi-context mode, prevent self-registration from being enabled.
656 if h.cfg != nil && h.cfg.AdminMode {
657 delete(req, "signupEnabled")
658 delete(req, "signup_enabled")
659 }
660
661 oldInterval := s.UpdateInterval
662 oldComplianceScanInterval := s.ComplianceScanInterval
663 oldPackageCacheRefreshMode := s.PackageCacheRefreshMode
664 oldPackageCacheRefreshMaxAge := s.PackageCacheRefreshMaxAge
665 applySettingsUpdate(s, req, h.enc)
666
667 if err := h.settings.Update(r.Context(), s); err != nil {
668 Error(w, http.StatusInternalServerError, "Failed to update settings")
669 return
670 }
671
672 intervalChanged := s.UpdateInterval != oldInterval && s.UpdateInterval > 0
673 complianceIntervalChanged := s.ComplianceScanInterval != oldComplianceScanInterval && s.ComplianceScanInterval > 0
674 cacheRefreshChanged := s.PackageCacheRefreshMode != oldPackageCacheRefreshMode || s.PackageCacheRefreshMaxAge != oldPackageCacheRefreshMaxAge
675 if h.registry != nil && (intervalChanged || complianceIntervalChanged || cacheRefreshChanged) {
676 msg := map[string]interface{}{
677 "type": "settings_update",
678 "update_interval": s.UpdateInterval,
679 "compliance_scan_interval": s.ComplianceScanInterval,
680 "package_cache_refresh_mode": s.PackageCacheRefreshMode,
681 "package_cache_refresh_max_age": s.PackageCacheRefreshMaxAge,
682 }
683 pushed := 0
684 for _, apiID := range h.registry.GetConnectedApiIDs() {
685 if err := h.registry.SendJSON(apiID, msg); err != nil {
686 slog.Warn("failed to push settings_update to agent", "api_id", apiID, "error", err)
687 } else {
688 pushed++
689 }
690 }
691 if pushed > 0 {
692 slog.Info("pushed settings_update to connected agents", "interval", s.UpdateInterval, "compliance_scan_interval", s.ComplianceScanInterval, "count", pushed)
693 }
694 }
695
696 JSON(w, http.StatusOK, settingsToResponse(s, h.enc))
697}
698
699func settingsToResponse(s *models.Settings, enc *util.Encryption) map[string]interface{} {

Callers 3

VersionCheckUpdatesMethod · 0.45
UploadLogoMethod · 0.45
ResetLogoMethod · 0.45

Calls 8

ErrorFunction · 0.85
decodeJSONFunction · 0.85
applySettingsUpdateFunction · 0.85
settingsToResponseFunction · 0.85
GetFirstMethod · 0.80
GetConnectedApiIDsMethod · 0.80
JSONFunction · 0.70
SendJSONMethod · 0.65

Tested by

no test coverage detected