package api import ( "encoding/json" "log/slog" "net/http" "time" "github.com/sandrodach/mindsift/internal/auth" "github.com/sandrodach/mindsift/internal/storage" ) // startDoneCleanupTicker deletes completed tasks whose delay ran out (storage/done_cleanup.go), once // shortly after the start and then every hour. func (s *Server) startDoneCleanupTicker() { time.Sleep(2 * time.Minute) s.runDoneCleanup(time.Now()) ticker := time.NewTicker(time.Hour) defer ticker.Stop() for now := range ticker.C { s.runDoneCleanup(now) } } func (s *Server) runDoneCleanup(now time.Time) { deleted, err := s.store.PurgeExpiredDoneTasks(now) if err != nil { slog.Error("Aufräumen erledigter Aufgaben fehlgeschlagen", "error", err) return } if len(deleted) > 0 { slog.Info("Erledigte Aufgaben aufgeräumt", "count", len(deleted)) } s.broadcastDeletedTasks(deleted) } // broadcastDeletedTasks tells everyone who saw the tasks; there are no watcher notifications for this. func (s *Server) broadcastDeletedTasks(deleted []storage.DeletedTask) { for _, d := range deleted { audience := append(s.store.GetTaskListUserIDs(d.TaskListID), d.UserID) s.wsHub.BroadcastToUsers(audience, "TASK_DELETED", map[string]string{"id": d.ID}) } } // handleClearDoneTasks: "Erledigte leeren" for one task list (taskListId) or all the user can edit. func (s *Server) handleClearDoneTasks(w http.ResponseWriter, r *http.Request) { userID := auth.GetUserID(r.Context()) var req struct { TaskListID string `json:"taskListId"` } _ = json.NewDecoder(r.Body).Decode(&req) deleted, err := s.store.ClearDoneTasks(userID, req.TaskListID) if err != nil { writeStoreError(w, http.StatusBadRequest, err) return } s.broadcastDeletedTasks(deleted) writeJSON(w, http.StatusOK, map[string]int{"deleted": len(deleted)}) }