- Remove marcadores de conflito git em admin_service que causavam erro 500 em ListCompanies. - Implementa SeederService no backend Go com streaming SSE para logs em tempo real. - Expõe endpoints: GET /api/v1/seeder/seed/stream e POST /api/v1/seeder/reset. - Atualiza config do frontend para apontar URL do seeder para a API backend. - Corrige erros de sintaxe na UI do dashboard Backoffice e implementa busca de estatísticas. - Garante lógica correta de UPSERT no seeder (RETURNING id) usando colunas 'identifier' e 'full_name' para evitar abortar transações. - Corrige constraint de role em user_companies no seeder para usar 'admin'.
83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
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()
|
|
}
|
|
}
|