in pkg/server/meta/accident.go [116:201]
func CreateGetManyAccidentsRequestHandler(metaDb *pgxpool.Pool) http.HandlerFunc {
return func(writer http.ResponseWriter, request *http.Request) {
body := request.Body
all, err := io.ReadAll(body)
if err != nil {
slog.Error("Cannot read body", "error", err)
writer.WriteHeader(http.StatusInternalServerError)
return
}
defer body.Close()
var params accidentRequestParams
if err = json.Unmarshal(all, ¶ms); err != nil {
slog.Error("Cannot unmarshal parameters", "error", err)
writer.WriteHeader(http.StatusInternalServerError)
return
}
sql := "SELECT id, date, affected_test, reason, build_number, kind, externalId, stacktrace, user_name FROM accidents WHERE date >= CURRENT_DATE - INTERVAL '" + params.Interval + "'"
if params.Tests != nil {
sql += " and affected_test in (" + stringArrayToSQL(params.Tests) + ") or affected_test = ''"
}
rows, err := metaDb.Query(request.Context(), sql)
if err != nil {
slog.Error("unable to execute the query", "query", sql, "error", err)
writer.WriteHeader(http.StatusInternalServerError)
return
}
defer rows.Close()
if _, err := writer.Write([]byte("[")); err != nil {
slog.Error("Failed to write JSON array start", "error", err)
return
}
firstItem := true
for rows.Next() {
accident, err := getAccidentFromRow(rows)
if err != nil {
slog.Error("unable to scan row", "error", err)
// We've already started sending the response, so we can't change the status code
// Best we can do is log the error and stop
return
}
// Add comma separator between items (but not before the first item)
if !firstItem {
if _, err := writer.Write([]byte(",")); err != nil {
slog.Error("Failed to write comma separator", "error", err)
return
}
} else {
firstItem = false
}
// Marshal and write this individual item
itemBytes, err := json.Marshal(accident)
if err != nil {
slog.Error("unable to marshal accident", "error", err)
return
}
if _, err := writer.Write(itemBytes); err != nil {
slog.Error("Failed to write item", "error", err)
return
}
// Flush the response writer if it supports flushing
if flusher, ok := writer.(http.Flusher); ok {
flusher.Flush()
}
}
// Check for errors from iterating over rows
if err := rows.Err(); err != nil {
slog.Error("Error iterating over rows", "error", err)
return
}
// Close the JSON array
if _, err := writer.Write([]byte("]")); err != nil {
slog.Error("Failed to write JSON array end", "error", err)
return
}
}
}