/
presign_images_upload.go
80 lines (67 loc) · 2.18 KB
/
presign_images_upload.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package transport
import (
"net/http"
"net/url"
"path"
"github.com/authgear/authgear-server/pkg/api"
"github.com/authgear/authgear-server/pkg/lib/config"
"github.com/authgear/authgear-server/pkg/lib/images"
"github.com/authgear/authgear-server/pkg/util/httproute"
"github.com/authgear/authgear-server/pkg/util/httputil"
"github.com/authgear/authgear-server/pkg/util/log"
"github.com/authgear/authgear-server/pkg/util/uuid"
)
func ConfigurePresignImagesUploadRoute(route httproute.Route) httproute.Route {
return route.
WithMethods("GET", "POST").
WithPathPattern("/_api/admin/images/upload")
}
type JSONResponseWriter interface {
WriteResponse(rw http.ResponseWriter, resp *api.Response)
}
type PresignProvider interface {
PresignPostRequest(url *url.URL) error
}
type PresignImagesUploadResponse struct {
UploadURL string `json:"upload_url"`
}
type PresignImagesUploadHandlerLogger struct{ *log.Logger }
func NewPresignImagesUploadHandlerLogger(lf *log.Factory) PresignImagesUploadHandlerLogger {
return PresignImagesUploadHandlerLogger{lf.New("api-presign-images-upload")}
}
type PresignImagesUploadHandler struct {
JSON JSONResponseWriter
HTTPProto httputil.HTTPProto
HTTPHost httputil.HTTPHost
AppID config.AppID
PresignProvider PresignProvider
Logger PresignImagesUploadHandlerLogger
}
func (h *PresignImagesUploadHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
metadata := &images.FileMetadata{
UploadedBy: images.UploadedByTypeAdminAPI,
}
encodedData, err := images.EncodeFileMetaData(metadata)
if err != nil {
h.Logger.WithError(err).Error("failed to encode metadata")
h.JSON.WriteResponse(resp, &api.Response{Error: err})
return
}
host := string(h.HTTPHost)
u := &url.URL{
Host: host,
Scheme: string(h.HTTPProto),
}
u.Path = path.Join("/_images", string(h.AppID), uuid.New())
q := u.Query()
q.Set(images.QueryMetadata, encodedData)
u.RawQuery = q.Encode()
err = h.PresignProvider.PresignPostRequest(u)
if err != nil {
h.JSON.WriteResponse(resp, &api.Response{Error: err})
return
}
h.JSON.WriteResponse(resp, &api.Response{Result: &PresignImagesUploadResponse{
UploadURL: u.String(),
}})
}