package server import ( "encoding/json" "fmt" "net/http" "gitea.benny.dog/torjus/ezshare/store" "github.com/go-chi/chi/v5" ) type HTTPServer struct { store store.FileStore http.Server } func NewHTTPSever(store store.FileStore) *HTTPServer { srv := &HTTPServer{ store: store, } r := chi.NewRouter() r.Get("/files/{id}", srv.FileHandler) srv.Handler = r return srv } func (s *HTTPServer) FileHandler(w http.ResponseWriter, r *http.Request) { id := chi.URLParam(r, "id") f, err := s.store.GetFile(id) if err != nil { if err == store.ErrNoSuchFile { WriteErrorResponse(w, http.StatusNotFound, "file not found") return } WriteErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("error: %s", err)) return } w.Header().Add("Content-Type", http.DetectContentType(f.Data)) w.Write(f.Data) } func WriteErrorResponse(w http.ResponseWriter, status int, message string) { errMessage := struct { Error string `json:"error"` }{ Error: message, } w.Header().Add("Content-Type", "application/json") w.WriteHeader(status) encoder := json.NewEncoder(w) encoder.Encode(&errMessage) }