package handlers import ( "encoding/json" "fmt" "net/http" "github.com/rede5/gohorsejobs/backend/internal/services" ) type SeederHandlers struct { seederService *services.SeederService } func NewSeederHandlers(seederService *services.SeederService) *SeederHandlers { return &SeederHandlers{seederService: seederService} } // HandleReset handles the database reset request func (h *SeederHandlers) HandleReset(w http.ResponseWriter, r *http.Request) { if err := h.seederService.Reset(r.Context()); err != nil { http.Error(w, fmt.Sprintf("Reset failed: %v", err), http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(map[string]string{"message": "Database reset successfully"}) } // HandleSeedStream handles the seeding process and streams logs via SSE func (h *SeederHandlers) HandleSeedStream(w http.ResponseWriter, r *http.Request) { // Set headers for SSE w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") w.Header().Set("Access-Control-Allow-Origin", "*") // Create a channel for logs logChan := make(chan string) // Context for cancellation ctx := r.Context() // Run Seeder in a goroutine go func() { defer close(logChan) if err := h.seederService.Seed(ctx, logChan); err != nil { logChan <- fmt.Sprintf("❌ Error: %v", err) // Send error event structure // check loop below } }() // Loop to send events flusher, ok := w.(http.Flusher) if !ok { http.Error(w, "Streaming not supported", http.StatusInternalServerError) return } for msg := range logChan { // Detect error message convention from service (if simple string) or structure it eventType := "log" if len(msg) >= 2 && msg[:2] == "❌" { eventType = "error" } else if msg == "✅ Seed Completed Successfully!" { eventType = "done" } // SSE Format: data: json_payload\n\n payload := map[string]string{ "type": eventType, "message": msg, } if eventType == "error" { payload["error"] = msg } data, _ := json.Marshal(payload) fmt.Fprintf(w, "data: %s\n\n", data) flusher.Flush() } }