feat: per-app telemetry reset button on app detail page

Adds "Telemetria törlése" button that deletes all telemetry records and
known issues for a specific app. Useful after major app updates when old
data is no longer representative.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-23 15:05:46 +01:00
parent 09ad08d511
commit 38f3a1e01e
5 changed files with 70 additions and 1 deletions
+25
View File
@@ -99,12 +99,37 @@ func (s *Server) handleAppDetail(w http.ResponseWriter, r *http.Request, appName
"SuggestedLimit": suggestedLimit,
"Period": period,
"CSRFToken": csrfToken,
"Flash": r.URL.Query().Get("flash"),
}
if err := s.templates.ExecuteTemplate(w, "app_detail.html", data); err != nil {
s.logger.Printf("[ERROR] app_detail.html template: %v", err)
}
}
// handleResetAppTelemetry deletes all telemetry and issues for an app, then redirects back.
func (s *Server) handleResetAppTelemetry(w http.ResponseWriter, r *http.Request, appName string) {
telRows, err := s.store.DeleteAppTelemetry(appName)
if err != nil {
s.logger.Printf("[ERROR] Failed to reset telemetry for %s: %v", appName, err)
http.Error(w, "Internal error", http.StatusInternalServerError)
return
}
issueRows, err := s.store.DeleteAppIssues(appName)
if err != nil {
s.logger.Printf("[ERROR] Failed to reset issues for %s: %v", appName, err)
http.Error(w, "Internal error", http.StatusInternalServerError)
return
}
s.logger.Printf("[INFO] Telemetry reset for %s: %d telemetry rows, %d issues deleted", appName, telRows, issueRows)
period := r.URL.Query().Get("period")
target := "/apps/" + appName + "?flash=telemetry_reset"
if period != "" {
target += "&period=" + period
}
http.Redirect(w, r, target, http.StatusSeeOther)
}
// parsePeriod converts a period string to a time.Time cutoff.
func parsePeriod(s string, defaultDur time.Duration) time.Time {
switch s {