aboutsummaryrefslogtreecommitdiff
path: root/service/auth.go
diff options
context:
space:
mode:
Diffstat (limited to 'service/auth.go')
-rw-r--r--service/auth.go151
1 files changed, 151 insertions, 0 deletions
diff --git a/service/auth.go b/service/auth.go
new file mode 100644
index 0000000..cb442a7
--- /dev/null
+++ b/service/auth.go
@@ -0,0 +1,151 @@
+package service
+
+import (
+ "context"
+ "errors"
+ "io"
+ "mastodon"
+ "web/model"
+)
+
+var (
+ ErrInvalidSession = errors.New("invalid session")
+)
+
+type authService struct {
+ sessionRepo model.SessionRepository
+ appRepo model.AppRepository
+ Service
+}
+
+func NewAuthService(sessionRepo model.SessionRepository, appRepo model.AppRepository, s Service) Service {
+ return &authService{sessionRepo, appRepo, s}
+}
+
+func getSessionID(ctx context.Context) (sessionID string, err error) {
+ sessionID, ok := ctx.Value("session_id").(string)
+ if !ok || len(sessionID) < 1 {
+ return "", ErrInvalidSession
+ }
+ return sessionID, nil
+}
+
+func (s *authService) getClient(ctx context.Context) (c *mastodon.Client, err error) {
+ sessionID, err := getSessionID(ctx)
+ if err != nil {
+ return nil, ErrInvalidSession
+ }
+ session, err := s.sessionRepo.Get(sessionID)
+ if err != nil {
+ return nil, ErrInvalidSession
+ }
+ client, err := s.appRepo.Get(session.InstanceURL)
+ if err != nil {
+ return
+ }
+ c = mastodon.NewClient(&mastodon.Config{
+ Server: session.InstanceURL,
+ ClientID: client.ClientID,
+ ClientSecret: client.ClientSecret,
+ AccessToken: session.AccessToken,
+ })
+ return c, nil
+}
+
+func (s *authService) GetAuthUrl(ctx context.Context, instance string) (
+ redirectUrl string, sessionID string, err error) {
+ return s.Service.GetAuthUrl(ctx, instance)
+}
+
+func (s *authService) GetUserToken(ctx context.Context, sessionID string, c *mastodon.Client,
+ code string) (token string, err error) {
+ sessionID, err = getSessionID(ctx)
+ if err != nil {
+ return
+ }
+ c, err = s.getClient(ctx)
+ if err != nil {
+ return
+ }
+
+ token, err = s.Service.GetUserToken(ctx, sessionID, c, code)
+ if err != nil {
+ return
+ }
+
+ err = s.sessionRepo.Update(sessionID, token)
+ if err != nil {
+ return
+ }
+
+ return
+}
+
+func (s *authService) ServeHomePage(ctx context.Context, client io.Writer) (err error) {
+ return s.Service.ServeHomePage(ctx, client)
+}
+
+func (s *authService) ServeErrorPage(ctx context.Context, client io.Writer, err error) {
+ s.Service.ServeErrorPage(ctx, client, err)
+}
+
+func (s *authService) ServeSigninPage(ctx context.Context, client io.Writer) (err error) {
+ return s.Service.ServeSigninPage(ctx, client)
+}
+
+func (s *authService) ServeTimelinePage(ctx context.Context, client io.Writer,
+ c *mastodon.Client, maxID string, sinceID string, minID string) (err error) {
+ c, err = s.getClient(ctx)
+ if err != nil {
+ return
+ }
+ return s.Service.ServeTimelinePage(ctx, client, c, maxID, sinceID, minID)
+}
+
+func (s *authService) ServeThreadPage(ctx context.Context, client io.Writer, c *mastodon.Client, id string, reply bool) (err error) {
+ c, err = s.getClient(ctx)
+ if err != nil {
+ return
+ }
+ return s.Service.ServeThreadPage(ctx, client, c, id, reply)
+}
+
+func (s *authService) Like(ctx context.Context, client io.Writer, c *mastodon.Client, id string) (err error) {
+ c, err = s.getClient(ctx)
+ if err != nil {
+ return
+ }
+ return s.Service.Like(ctx, client, c, id)
+}
+
+func (s *authService) UnLike(ctx context.Context, client io.Writer, c *mastodon.Client, id string) (err error) {
+ c, err = s.getClient(ctx)
+ if err != nil {
+ return
+ }
+ return s.Service.UnLike(ctx, client, c, id)
+}
+
+func (s *authService) Retweet(ctx context.Context, client io.Writer, c *mastodon.Client, id string) (err error) {
+ c, err = s.getClient(ctx)
+ if err != nil {
+ return
+ }
+ return s.Service.Retweet(ctx, client, c, id)
+}
+
+func (s *authService) UnRetweet(ctx context.Context, client io.Writer, c *mastodon.Client, id string) (err error) {
+ c, err = s.getClient(ctx)
+ if err != nil {
+ return
+ }
+ 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) (err error) {
+ c, err = s.getClient(ctx)
+ if err != nil {
+ return
+ }
+ return s.Service.PostTweet(ctx, client, c, content, replyToID)
+}