98 lines
2.2 KiB
Go
98 lines
2.2 KiB
Go
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("photo"))
|
|
|
|
url, err := signer.GetPhoto(bucket, photo)
|
|
if err != nil {
|
|
httphelpers.ErrorResponse(w, err)
|
|
return
|
|
}
|
|
|
|
w.Header().Add("Location", url)
|
|
w.WriteHeader(http.StatusTemporaryRedirect)
|
|
}
|
|
|
|
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("photo"))
|
|
|
|
url, err := signer.PutPhoto(bucket, photo)
|
|
if err != nil {
|
|
httphelpers.ErrorResponse(w, err)
|
|
return
|
|
}
|
|
|
|
w.Header().Add("Location", url)
|
|
w.WriteHeader(http.StatusTemporaryRedirect)
|
|
}
|