func CreateGetManyAccidentsRequestHandler()

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, &params); 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
		}
	}
}