mirror of
https://github.com/rjNemo/go-microservices-tuto
synced 2026-06-06 02:16:46 +00:00
52 lines
1.4 KiB
Go
52 lines
1.4 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"path/filepath"
|
|
|
|
"github.com/gorilla/mux"
|
|
hclog "github.com/hashicorp/go-hclog"
|
|
"github.com/rjNemo/go-micro/images/files"
|
|
)
|
|
|
|
// Files is a handler for reading and writing files
|
|
type Files struct {
|
|
log hclog.Logger
|
|
store files.Storage
|
|
}
|
|
|
|
// NewFiles creates a new File handler
|
|
func NewFiles(s files.Storage, l hclog.Logger) *Files {
|
|
return &Files{store: s, log: l}
|
|
}
|
|
|
|
// ServeHTTP implements the http.Handler interface
|
|
func (f *Files) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
id := vars["id"]
|
|
fn := vars["filename"]
|
|
|
|
f.log.Info("Handle POST", "id", id, "filename", fn)
|
|
|
|
// no need to check for invalid id or filename as the mux router will not send requests
|
|
// here unless they have the correct parameters
|
|
|
|
f.saveFile(id, fn, rw, r)
|
|
}
|
|
|
|
func (f *Files) invalidURI(uri string, rw http.ResponseWriter) {
|
|
f.log.Error("Invalid path", "path", uri)
|
|
http.Error(rw, "Invalid file path should be in the format: /[id]/[filepath]", http.StatusBadRequest)
|
|
}
|
|
|
|
// saveFile saves the contents of the request to a file
|
|
func (f *Files) saveFile(id, path string, rw http.ResponseWriter, r *http.Request) {
|
|
f.log.Info("Save file for product", "id", id, "path", path)
|
|
|
|
fp := filepath.Join(id, path)
|
|
err := f.store.Save(fp, r.Body)
|
|
if err != nil {
|
|
f.log.Error("Unable to save file", "error", err)
|
|
http.Error(rw, "Unable to save file", http.StatusInternalServerError)
|
|
}
|
|
}
|