package api import ( "errors" "fmt" "net/http" "strconv" "github.com/go-chi/chi/v5" "github.com/syonad/clonepack/internal/core" "github.com/syonad/clonepack/internal/store" ) type ProxyHandler struct { repoSvc *core.RepoService dataDir string } func NewProxyHandler(repoSvc *core.RepoService, dataDir string) *ProxyHandler { return &ProxyHandler{repoSvc: repoSvc, dataDir: dataDir} } func (h *ProxyHandler) ServeFile(w http.ResponseWriter, r *http.Request) { ref := chi.URLParam(r, "repo_ref") var repo *store.Repo var err error if id, parseErr := strconv.ParseInt(ref, 10, 64); parseErr == nil { repo, err = h.repoSvc.Get(r.Context(), id) } else { repo, err = h.repoSvc.GetByName(r.Context(), ref) } if errors.Is(err, store.ErrNotFound) { http.NotFound(w, r) return } if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } localDir := fmt.Sprintf("%s/repos/%d/%s", h.dataDir, repo.ID, repo.Type) prefix := fmt.Sprintf("/mirror/%s", ref) http.StripPrefix(prefix, http.FileServer(http.Dir(localDir))).ServeHTTP(w, r) }