func()

in reference-api/unified_handler.go [52:98]


func (deps *HandlerDeps) UnifiedHandler(w http.ResponseWriter, r *http.Request) {
	repo := r.URL.Query().Get("repo")
	gitRef := r.URL.Query().Get("gitRef")

	if repo == "" || gitRef == "" {
		http.Error(w, "Missing 'repo' or 'gitRef' query parameter", http.StatusBadRequest)
		return
	}

	if gitRef == "latest" {
		http.Error(w, "'latest' is not a valid value for 'gitRef'. Please use an immutable image.", http.StatusBadRequest)
		return
	}

	cacheKey := fmt.Sprintf("%s:%s", repo, gitRef)

	// Check cache first
	if cachedResponse, ok := deps.getFromCache(cacheKey); ok {
		w.WriteHeader(cachedResponse.StatusCode)
		_, _ = w.Write(cachedResponse.Body)
		return
	}

	// Try handling as a release first
	releaseRecorder := &responseRecorder{
		ResponseWriter: httptest.NewRecorder(),
		statusCode:     0, // Use a separate ResponseRecorder
	}
	deps.ReleasesHandler(releaseRecorder, r)

	// If release is found (not 404), cache and return
	if releaseRecorder.statusCode != http.StatusNotFound {
		w.WriteHeader(releaseRecorder.statusCode)
		if _, err := w.Write(releaseRecorder.body.Bytes()); err != nil {
			log.Printf("Error writing response: %v", err)
		}
		deps.storeInCache(cacheKey, releaseRecorder.statusCode, releaseRecorder.body.Bytes())
		return
	}

	// Clear previous response before falling back
	w.Header().Del("Content-Type") // Ensure correct content type is set by CommitsHandler
	w.WriteHeader(http.StatusOK)   // Reset status before falling back

	// Fall back to CommitsHandler
	deps.processAndCacheResponse(deps.CommitsHandler, w, r, cacheKey)
}