Focus relevant status on like, retweet and reply
[bloat] / service / auth.go
1 package service
2
3 import (
4         "context"
5         "errors"
6         "io"
7         "mastodon"
8         "web/model"
9 )
10
11 var (
12         ErrInvalidSession = errors.New("invalid session")
13 )
14
15 type authService struct {
16         sessionRepo model.SessionRepository
17         appRepo     model.AppRepository
18         Service
19 }
20
21 func NewAuthService(sessionRepo model.SessionRepository, appRepo model.AppRepository, s Service) Service {
22         return &authService{sessionRepo, appRepo, s}
23 }
24
25 func getSessionID(ctx context.Context) (sessionID string, err error) {
26         sessionID, ok := ctx.Value("session_id").(string)
27         if !ok || len(sessionID) < 1 {
28                 return "", ErrInvalidSession
29         }
30         return sessionID, nil
31 }
32
33 func (s *authService) getClient(ctx context.Context) (c *mastodon.Client, err error) {
34         sessionID, err := getSessionID(ctx)
35         if err != nil {
36                 return nil, ErrInvalidSession
37         }
38         session, err := s.sessionRepo.Get(sessionID)
39         if err != nil {
40                 return nil, ErrInvalidSession
41         }
42         client, err := s.appRepo.Get(session.InstanceURL)
43         if err != nil {
44                 return
45         }
46         c = mastodon.NewClient(&mastodon.Config{
47                 Server:       session.InstanceURL,
48                 ClientID:     client.ClientID,
49                 ClientSecret: client.ClientSecret,
50                 AccessToken:  session.AccessToken,
51         })
52         return c, nil
53 }
54
55 func (s *authService) GetAuthUrl(ctx context.Context, instance string) (
56         redirectUrl string, sessionID string, err error) {
57         return s.Service.GetAuthUrl(ctx, instance)
58 }
59
60 func (s *authService) GetUserToken(ctx context.Context, sessionID string, c *mastodon.Client,
61         code string) (token string, err error) {
62         sessionID, err = getSessionID(ctx)
63         if err != nil {
64                 return
65         }
66         c, err = s.getClient(ctx)
67         if err != nil {
68                 return
69         }
70
71         token, err = s.Service.GetUserToken(ctx, sessionID, c, code)
72         if err != nil {
73                 return
74         }
75
76         err = s.sessionRepo.Update(sessionID, token)
77         if err != nil {
78                 return
79         }
80
81         return
82 }
83
84 func (s *authService) ServeHomePage(ctx context.Context, client io.Writer) (err error) {
85         return s.Service.ServeHomePage(ctx, client)
86 }
87
88 func (s *authService) ServeErrorPage(ctx context.Context, client io.Writer, err error) {
89         s.Service.ServeErrorPage(ctx, client, err)
90 }
91
92 func (s *authService) ServeSigninPage(ctx context.Context, client io.Writer) (err error) {
93         return s.Service.ServeSigninPage(ctx, client)
94 }
95
96 func (s *authService) ServeTimelinePage(ctx context.Context, client io.Writer,
97         c *mastodon.Client, maxID string, sinceID string, minID string) (err error) {
98         c, err = s.getClient(ctx)
99         if err != nil {
100                 return
101         }
102         return s.Service.ServeTimelinePage(ctx, client, c, maxID, sinceID, minID)
103 }
104
105 func (s *authService) ServeThreadPage(ctx context.Context, client io.Writer, c *mastodon.Client, id string, reply bool) (err error) {
106         c, err = s.getClient(ctx)
107         if err != nil {
108                 return
109         }
110         return s.Service.ServeThreadPage(ctx, client, c, id, reply)
111 }
112
113 func (s *authService) Like(ctx context.Context, client io.Writer, c *mastodon.Client, id string) (err error) {
114         c, err = s.getClient(ctx)
115         if err != nil {
116                 return
117         }
118         return s.Service.Like(ctx, client, c, id)
119 }
120
121 func (s *authService) UnLike(ctx context.Context, client io.Writer, c *mastodon.Client, id string) (err error) {
122         c, err = s.getClient(ctx)
123         if err != nil {
124                 return
125         }
126         return s.Service.UnLike(ctx, client, c, id)
127 }
128
129 func (s *authService) Retweet(ctx context.Context, client io.Writer, c *mastodon.Client, id string) (err error) {
130         c, err = s.getClient(ctx)
131         if err != nil {
132                 return
133         }
134         return s.Service.Retweet(ctx, client, c, id)
135 }
136
137 func (s *authService) UnRetweet(ctx context.Context, client io.Writer, c *mastodon.Client, id string) (err error) {
138         c, err = s.getClient(ctx)
139         if err != nil {
140                 return
141         }
142         return s.Service.UnRetweet(ctx, client, c, id)
143 }
144
145 func (s *authService) PostTweet(ctx context.Context, client io.Writer, c *mastodon.Client, content string, replyToID string) (id string, err error) {
146         c, err = s.getClient(ctx)
147         if err != nil {
148                 return
149         }
150         return s.Service.PostTweet(ctx, client, c, content, replyToID)
151 }