diff options
Diffstat (limited to 'service')
| -rw-r--r-- | service/auth.go | 5 | ||||
| -rw-r--r-- | service/logging.go | 5 | ||||
| -rw-r--r-- | service/service.go | 15 | ||||
| -rw-r--r-- | service/transport.go | 27 | 
4 files changed, 43 insertions, 9 deletions
| diff --git a/service/auth.go b/service/auth.go index 5ee2001..98012af 100644 --- a/service/auth.go +++ b/service/auth.go @@ -5,6 +5,7 @@ import (  	"errors"  	"io"  	"mastodon" +	"mime/multipart"  	"web/model"  ) @@ -142,10 +143,10 @@ func (s *authService) UnRetweet(ctx context.Context, client io.Writer, c *mastod  	return s.Service.UnRetweet(ctx, client, c, id)  } -func (s *authService) PostTweet(ctx context.Context, client io.Writer, c *mastodon.Client, content string, replyToID string) (id string, err error) { +func (s *authService) PostTweet(ctx context.Context, client io.Writer, c *mastodon.Client, content string, replyToID string, files []*multipart.FileHeader) (id string, err error) {  	c, err = s.getClient(ctx)  	if err != nil {  		return  	} -	return s.Service.PostTweet(ctx, client, c, content, replyToID) +	return s.Service.PostTweet(ctx, client, c, content, replyToID, files)  } diff --git a/service/logging.go b/service/logging.go index 0ed40bd..3a95a94 100644 --- a/service/logging.go +++ b/service/logging.go @@ -5,6 +5,7 @@ import (  	"io"  	"log"  	"mastodon" +	"mime/multipart"  	"time"  ) @@ -108,10 +109,10 @@ func (s *loggingService) UnRetweet(ctx context.Context, client io.Writer, c *mas  	return s.Service.UnRetweet(ctx, client, c, id)  } -func (s *loggingService) PostTweet(ctx context.Context, client io.Writer, c *mastodon.Client, content string, replyToID string) (id string, err error) { +func (s *loggingService) PostTweet(ctx context.Context, client io.Writer, c *mastodon.Client, content string, replyToID string, files []*multipart.FileHeader) (id string, err error) {  	defer func(begin time.Time) {  		s.logger.Printf("method=%v, content=%v, reply_to_id=%v, took=%v, err=%v\n",  			"PostTweet", content, replyToID, time.Since(begin), err)  	}(time.Now()) -	return s.Service.PostTweet(ctx, client, c, content, replyToID) +	return s.Service.PostTweet(ctx, client, c, content, replyToID, files)  } diff --git a/service/service.go b/service/service.go index 3bfb163..15dab5d 100644 --- a/service/service.go +++ b/service/service.go @@ -7,6 +7,7 @@ import (  	"errors"  	"fmt"  	"io" +	"mime/multipart"  	"net/http"  	"net/url"  	"path" @@ -36,7 +37,7 @@ type Service interface {  	UnLike(ctx context.Context, client io.Writer, c *mastodon.Client, id string) (err error)  	Retweet(ctx context.Context, client io.Writer, c *mastodon.Client, id string) (err error)  	UnRetweet(ctx context.Context, client io.Writer, c *mastodon.Client, id string) (err error) -	PostTweet(ctx context.Context, client io.Writer, c *mastodon.Client, content string, replyToID string) (id string, err error) +	PostTweet(ctx context.Context, client io.Writer, c *mastodon.Client, content string, replyToID string, files []*multipart.FileHeader) (id string, err error)  }  type service struct { @@ -292,10 +293,20 @@ func (svc *service) UnRetweet(ctx context.Context, client io.Writer, c *mastodon  	return  } -func (svc *service) PostTweet(ctx context.Context, client io.Writer, c *mastodon.Client, content string, replyToID string) (id string, err error) { +func (svc *service) PostTweet(ctx context.Context, client io.Writer, c *mastodon.Client, content string, replyToID string, files []*multipart.FileHeader) (id string, err error) { +	var mediaIds []string +	for _, f := range files { +		a, err := c.UploadMediaFromMultipartFileHeader(ctx, f) +		if err != nil { +			return "", err +		} +		mediaIds = append(mediaIds, a.ID) +	} +  	tweet := &mastodon.Toot{  		Status:      content,  		InReplyToID: replyToID, +		MediaIDs:    mediaIds,  	}  	s, err := c.PostStatus(ctx, tweet) diff --git a/service/transport.go b/service/transport.go index 00f7430..d5a6ee8 100644 --- a/service/transport.go +++ b/service/transport.go @@ -3,6 +3,7 @@ package service  import (  	"context"  	"fmt" +	"mime/multipart"  	"net/http"  	"path" @@ -153,9 +154,18 @@ func NewHandler(s Service, staticDir string) http.Handler {  	r.HandleFunc("/post", func(w http.ResponseWriter, req *http.Request) {  		ctx := getContextWithSession(context.Background(), req) -		content := req.FormValue("content") -		replyToID := req.FormValue("reply_to_id") -		id, err := s.PostTweet(ctx, w, nil, content, replyToID) + +		err := req.ParseMultipartForm(4 << 20) +		if err != nil { +			s.ServeErrorPage(ctx, w, err) +			return +		} + +		content := getMultipartFormValue(req.MultipartForm, "content") +		replyToID := getMultipartFormValue(req.MultipartForm, "reply_to_id") +		files := req.MultipartForm.File["attachments"] + +		id, err := s.PostTweet(ctx, w, nil, content, replyToID, files)  		if err != nil {  			s.ServeErrorPage(ctx, w, err)  			return @@ -178,3 +188,14 @@ func NewHandler(s Service, staticDir string) http.Handler {  	return r  } + +func getMultipartFormValue(mf *multipart.Form, key string) (val string) { +	vals, ok := mf.Value[key] +	if !ok { +		return "" +	} +	if len(vals) < 1 { +		return "" +	} +	return vals[0] +} | 
