1
0
Fork 0
photos/cmd/control/control.go

117 lines
2.7 KiB
Go
Raw Normal View History

2020-05-26 15:12:22 +08:00
package main
import (
"fmt"
"net/http"
"strconv"
2020-05-26 15:12:22 +08:00
"time"
"git.makerforce.io/photos/photos/internal/httphelpers"
lib "git.makerforce.io/photos/photos/pkg/bucket"
2020-05-26 15:12:22 +08:00
)
var signer *lib.Signer
2020-05-26 15:12:22 +08:00
func main() {
// Setup bucket signer
var err error
signer, err = lib.NewSignerFromEnv()
2020-05-26 15:12:22 +08:00
2020-05-26 17:48:26 +08:00
server := &http.Server{
2020-05-31 02:22:25 +08:00
Addr: ":8000",
2020-05-26 17:48:26 +08:00
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
}
http.HandleFunc("/list", list)
http.HandleFunc("/read", read)
http.HandleFunc("/write", write)
err = server.ListenAndServe()
2020-05-31 02:22:25 +08:00
if err != nil {
panic(err)
}
2020-05-26 15:12:22 +08:00
}
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)
2020-05-26 15:12:22 +08:00
if err != nil {
httphelpers.ErrorResponse(w, err)
return
2020-05-26 15:12:22 +08:00
}
w.Header().Add("Location", url)
2020-05-26 15:12:22 +08:00
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"))
2020-06-01 18:07:48 +08:00
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
}
2020-06-01 18:07:48 +08:00
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"))
2020-06-01 18:07:48 +08:00
photo := lib.Photo(req.FormValue("object"))
2020-06-01 18:07:48 +08:00
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
2020-05-26 15:12:22 +08:00
}
2020-06-01 18:07:48 +08:00
httphelpers.ErrorResponse(w, httphelpers.ErrorBadRequest)
2020-05-26 15:12:22 +08:00
}