diff --git a/appview/pulls/pulls.go b/appview/pulls/pulls.go index feef02bb..441a9dd7 100644 --- a/appview/pulls/pulls.go +++ b/appview/pulls/pulls.go @@ -39,6 +39,7 @@ import ( "tangled.org/core/rbac" "tangled.org/core/tid" "tangled.org/core/types" + "tangled.org/core/xrpc" comatproto "github.com/bluesky-social/indigo/api/atproto" "github.com/bluesky-social/indigo/atproto/syntax" @@ -48,6 +49,8 @@ import ( "github.com/google/uuid" ) +const ApplicationGzip = "application/gzip" + type Pulls struct { oauth *oauth.OAuth repoResolver *reporesolver.RepoResolver @@ -1227,7 +1230,7 @@ func (s *Pulls) createPullRequest( return } - blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(patch)) + blob, err := xrpc.RepoUploadBlob(r.Context(), client, gz(patch), ApplicationGzip) if err != nil { log.Println("failed to upload patch", err) s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.") @@ -1321,7 +1324,7 @@ func (s *Pulls) createStackedPullRequest( // apply all record creations at once var writes []*comatproto.RepoApplyWrites_Input_Writes_Elem for _, p := range stack { - blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(p.LatestPatch())) + blob, err := xrpc.RepoUploadBlob(r.Context(), client, gz(p.LatestPatch()), ApplicationGzip) if err != nil { log.Println("failed to upload patch blob", err) s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.") @@ -1871,7 +1874,7 @@ func (s *Pulls) resubmitPullHelper( return } - blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(patch)) + blob, err := xrpc.RepoUploadBlob(r.Context(), client, gz(patch), ApplicationGzip) if err != nil { log.Println("failed to upload patch blob", err) s.pages.Notice(w, "resubmit-error", "Failed to update pull request on the PDS. Try again later.") @@ -2014,7 +2017,7 @@ func (s *Pulls) resubmitStackedPullHelper( return } - blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(patch)) + blob, err := xrpc.RepoUploadBlob(r.Context(), client, gz(patch), ApplicationGzip) if err != nil { log.Println("failed to upload patch blob", err) s.pages.Notice(w, "resubmit-error", "Failed to update pull request on the PDS. Try again later.") @@ -2056,7 +2059,7 @@ func (s *Pulls) resubmitStackedPullHelper( return } - blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(patch)) + blob, err := xrpc.RepoUploadBlob(r.Context(), client, gz(patch), ApplicationGzip) if err != nil { log.Println("failed to upload patch blob", err) s.pages.Notice(w, "resubmit-error", "Failed to update pull request on the PDS. Try again later.") diff --git a/appview/repo/artifact.go b/appview/repo/artifact.go index 365f01f3..d91f9983 100644 --- a/appview/repo/artifact.go +++ b/appview/repo/artifact.go @@ -18,6 +18,7 @@ import ( "tangled.org/core/orm" "tangled.org/core/tid" "tangled.org/core/types" + "tangled.org/core/xrpc" comatproto "github.com/bluesky-social/indigo/api/atproto" lexutil "github.com/bluesky-social/indigo/lex/util" @@ -46,7 +47,7 @@ func (rp *Repo) AttachArtifact(w http.ResponseWriter, r *http.Request) { return } - file, handler, err := r.FormFile("artifact") + file, header, err := r.FormFile("artifact") if err != nil { log.Println("failed to upload artifact", err) rp.pages.Notice(w, "upload", "failed to upload artifact") @@ -61,7 +62,7 @@ func (rp *Repo) AttachArtifact(w http.ResponseWriter, r *http.Request) { return } - uploadBlobResp, err := comatproto.RepoUploadBlob(r.Context(), client, file) + uploadBlobResp, err := xrpc.RepoUploadBlob(r.Context(), client, file, header.Header.Get("Content-Type")) if err != nil { log.Println("failed to upload blob", err) rp.pages.Notice(w, "upload", "Failed to upload blob to your PDS. Try again later.") @@ -81,7 +82,7 @@ func (rp *Repo) AttachArtifact(w http.ResponseWriter, r *http.Request) { Val: &tangled.RepoArtifact{ Artifact: uploadBlobResp.Blob, CreatedAt: createdAt.Format(time.RFC3339), - Name: handler.Filename, + Name: header.Filename, Repo: f.RepoAt().String(), Tag: tag.Tag.Hash[:], }, @@ -110,7 +111,7 @@ func (rp *Repo) AttachArtifact(w http.ResponseWriter, r *http.Request) { Tag: tag.Tag.Hash, CreatedAt: createdAt, BlobCid: cid.Cid(uploadBlobResp.Blob.Ref), - Name: handler.Filename, + Name: header.Filename, Size: uint64(uploadBlobResp.Blob.Size), MimeType: uploadBlobResp.Blob.MimeType, } diff --git a/appview/state/profile.go b/appview/state/profile.go index 0caa38c7..7bc6c4d5 100644 --- a/appview/state/profile.go +++ b/appview/state/profile.go @@ -20,6 +20,7 @@ import ( "tangled.org/core/appview/models" "tangled.org/core/appview/pages" "tangled.org/core/orm" + "tangled.org/core/xrpc" ) func (s *State) Profile(w http.ResponseWriter, r *http.Request) { @@ -741,7 +742,7 @@ func (s *State) UploadProfileAvatar(w http.ResponseWriter, r *http.Request) { return } - file, handler, err := r.FormFile("avatar") + file, header, err := r.FormFile("avatar") if err != nil { l.Error("failed to read avatar file", "err", err) s.pages.Notice(w, "avatar-error", "Failed to read avatar file") @@ -749,13 +750,13 @@ func (s *State) UploadProfileAvatar(w http.ResponseWriter, r *http.Request) { } defer file.Close() - if handler.Size > 1000000 { - l.Warn("avatar file too large", "size", handler.Size) + if header.Size > 1000000 { + l.Warn("avatar file too large", "size", header.Size) s.pages.Notice(w, "avatar-error", "Avatar file too large (max 1MB)") return } - contentType := handler.Header.Get("Content-Type") + contentType := header.Header.Get("Content-Type") if contentType != "image/png" && contentType != "image/jpeg" { l.Warn("invalid image type", "contentType", contentType) s.pages.Notice(w, "avatar-error", "Invalid image type (only PNG and JPEG allowed)") @@ -769,7 +770,7 @@ func (s *State) UploadProfileAvatar(w http.ResponseWriter, r *http.Request) { return } - uploadBlobResp, err := comatproto.RepoUploadBlob(r.Context(), client, file) + uploadBlobResp, err := xrpc.RepoUploadBlob(r.Context(), client, file, header.Header.Get("Content-Type")) if err != nil { l.Error("failed to upload avatar blob", "err", err) s.pages.Notice(w, "avatar-error", "Failed to upload avatar to your PDS") diff --git a/xrpc/blob.go b/xrpc/blob.go new file mode 100644 index 00000000..745341d3 --- /dev/null +++ b/xrpc/blob.go @@ -0,0 +1,19 @@ +package xrpc + +import ( + "context" + "io" + + comatproto "github.com/bluesky-social/indigo/api/atproto" + "github.com/bluesky-social/indigo/lex/util" +) + +// RepoUploadBlob calls the XRPC method "com.atproto.repo.uploadBlob". +func RepoUploadBlob(ctx context.Context, c util.LexClient, input io.Reader, contentType string) (*comatproto.RepoUploadBlob_Output, error) { + var out comatproto.RepoUploadBlob_Output + if err := c.LexDo(ctx, util.Procedure, contentType, "com.atproto.repo.uploadBlob", nil, input, &out); err != nil { + return nil, err + } + + return &out, nil +}