package main import ( "fmt" "net/http" "strconv" "time" "git.makerforce.io/photos/photos/internal/httphelpers" lib "git.makerforce.io/photos/photos/pkg/bucket" ) var signer *lib.Signer func main() { // Setup bucket signer var err error signer, err = lib.NewSignerFromEnv() server := &http.Server{ Addr: ":8000", ReadTimeout: 5 * time.Second, WriteTimeout: 10 * time.Second, } http.HandleFunc("/list", list) http.HandleFunc("/read", read) http.HandleFunc("/write", write) err = server.ListenAndServe() if err != nil { panic(err) } } func list(w http.ResponseWriter, req *http.Request) { if req.Method != http.MethodGet { err := fmt.Errorf("%w: %v", httphelpers.ErrorMethodNotAllowed, req.Method) httphelpers.ErrorResponse(w, err) return } bucket := lib.Bucket(req.FormValue("bucket")) startAfter := req.FormValue("start-after") maxKeysString := req.FormValue("max-keys") if maxKeysString == "" { maxKeysString = "4000" } maxKeys, err := strconv.Atoi(maxKeysString) // Let minio handle error url, err := signer.GetBucketPhotos(bucket, startAfter, maxKeys) if err != nil { httphelpers.ErrorResponse(w, err) return } w.Header().Add("Location", url) w.WriteHeader(http.StatusTemporaryRedirect) } func read(w http.ResponseWriter, req *http.Request) { if req.Method != http.MethodGet { err := fmt.Errorf("%w: %v", httphelpers.ErrorMethodNotAllowed, req.Method) httphelpers.ErrorResponse(w, err) return } bucket := lib.Bucket(req.FormValue("bucket")) photo := lib.Photo(req.FormValue("object")) preview := lib.Preview(req.FormValue("object")) if photo.Validate() == nil { url, err := signer.GetPhoto(bucket, photo) if err != nil { httphelpers.ErrorResponse(w, err) return } w.Header().Add("Location", url) w.WriteHeader(http.StatusTemporaryRedirect) return } else if preview.Validate() == nil { url, err := signer.GetPreview(bucket, preview) if err != nil { httphelpers.ErrorResponse(w, err) return } w.Header().Add("Location", url) w.WriteHeader(http.StatusTemporaryRedirect) return } httphelpers.ErrorResponse(w, httphelpers.ErrorBadRequest) } func write(w http.ResponseWriter, req *http.Request) { if req.Method != http.MethodPut { err := fmt.Errorf("%w: %v", httphelpers.ErrorMethodNotAllowed, req.Method) httphelpers.ErrorResponse(w, err) return } bucket := lib.Bucket(req.FormValue("bucket")) photo := lib.Photo(req.FormValue("object")) if photo.Validate() == nil { url, err := signer.PutPhoto(bucket, photo) if err != nil { httphelpers.ErrorResponse(w, err) return } w.Header().Add("Location", url) w.WriteHeader(http.StatusTemporaryRedirect) return } httphelpers.ErrorResponse(w, httphelpers.ErrorBadRequest) }