Add fluoride mode
[bloat] / service / auth.go
1 package service
2
3 import (
4         "context"
5         "errors"
6         "io"
7         "mime/multipart"
8
9         "bloat/model"
10         "mastodon"
11 )
12
13 var (
14         ErrInvalidSession = errors.New("invalid session")
15 )
16
17 type authService struct {
18         sessionRepo model.SessionRepository
19         appRepo     model.AppRepository
20         Service
21 }
22
23 func NewAuthService(sessionRepo model.SessionRepository, appRepo model.AppRepository, s Service) Service {
24         return &authService{sessionRepo, appRepo, s}
25 }
26
27 func (s *authService) getClient(ctx context.Context) (c *model.Client, err error) {
28         sessionID, ok := ctx.Value("session_id").(string)
29         if !ok || len(sessionID) < 1 {
30                 return nil, ErrInvalidSession
31         }
32         session, err := s.sessionRepo.Get(sessionID)
33         if err != nil {
34                 return nil, ErrInvalidSession
35         }
36         client, err := s.appRepo.Get(session.InstanceDomain)
37         if err != nil {
38                 return
39         }
40         mc := mastodon.NewClient(&mastodon.Config{
41                 Server:       client.InstanceURL,
42                 ClientID:     client.ClientID,
43                 ClientSecret: client.ClientSecret,
44                 AccessToken:  session.AccessToken,
45         })
46         c = &model.Client{Client: mc, Session: session}
47         return c, nil
48 }
49
50 func (s *authService) GetAuthUrl(ctx context.Context, instance string) (
51         redirectUrl string, sessionID string, err error) {
52         return s.Service.GetAuthUrl(ctx, instance)
53 }
54
55 func (s *authService) GetUserToken(ctx context.Context, sessionID string, c *model.Client,
56         code string) (token string, err error) {
57         c, err = s.getClient(ctx)
58         if err != nil {
59                 return
60         }
61
62         token, err = s.Service.GetUserToken(ctx, c.Session.ID, c, code)
63         if err != nil {
64                 return
65         }
66
67         c.Session.AccessToken = token
68         err = s.sessionRepo.Add(c.Session)
69         if err != nil {
70                 return
71         }
72
73         return
74 }
75
76 func (s *authService) ServeHomePage(ctx context.Context, client io.Writer) (err error) {
77         return s.Service.ServeHomePage(ctx, client)
78 }
79
80 func (s *authService) ServeErrorPage(ctx context.Context, client io.Writer, err error) {
81         s.Service.ServeErrorPage(ctx, client, err)
82 }
83
84 func (s *authService) ServeSigninPage(ctx context.Context, client io.Writer) (err error) {
85         return s.Service.ServeSigninPage(ctx, client)
86 }
87
88 func (s *authService) ServeTimelinePage(ctx context.Context, client io.Writer,
89         c *model.Client, timelineType string, maxID string, sinceID string, minID string) (err error) {
90         c, err = s.getClient(ctx)
91         if err != nil {
92                 return
93         }
94         return s.Service.ServeTimelinePage(ctx, client, c, timelineType, maxID, sinceID, minID)
95 }
96
97 func (s *authService) ServeThreadPage(ctx context.Context, client io.Writer, c *model.Client, id string, reply bool) (err error) {
98         c, err = s.getClient(ctx)
99         if err != nil {
100                 return
101         }
102         return s.Service.ServeThreadPage(ctx, client, c, id, reply)
103 }
104
105 func (s *authService) ServeNotificationPage(ctx context.Context, client io.Writer, c *model.Client, maxID string, minID string) (err error) {
106         c, err = s.getClient(ctx)
107         if err != nil {
108                 return
109         }
110         return s.Service.ServeNotificationPage(ctx, client, c, maxID, minID)
111 }
112
113 func (s *authService) ServeUserPage(ctx context.Context, client io.Writer, c *model.Client, id string, maxID string, minID string) (err error) {
114         c, err = s.getClient(ctx)
115         if err != nil {
116                 return
117         }
118         return s.Service.ServeUserPage(ctx, client, c, id, maxID, minID)
119 }
120
121 func (s *authService) ServeAboutPage(ctx context.Context, client io.Writer, c *model.Client) (err error) {
122         c, err = s.getClient(ctx)
123         if err != nil {
124                 return
125         }
126         return s.Service.ServeAboutPage(ctx, client, c)
127 }
128
129 func (s *authService) ServeEmojiPage(ctx context.Context, client io.Writer, c *model.Client) (err error) {
130         c, err = s.getClient(ctx)
131         if err != nil {
132                 return
133         }
134         return s.Service.ServeEmojiPage(ctx, client, c)
135 }
136
137 func (s *authService) ServeLikedByPage(ctx context.Context, client io.Writer, c *model.Client, id string) (err error) {
138         c, err = s.getClient(ctx)
139         if err != nil {
140                 return
141         }
142         return s.Service.ServeLikedByPage(ctx, client, c, id)
143 }
144
145 func (s *authService) ServeRetweetedByPage(ctx context.Context, client io.Writer, c *model.Client, id string) (err error) {
146         c, err = s.getClient(ctx)
147         if err != nil {
148                 return
149         }
150         return s.Service.ServeRetweetedByPage(ctx, client, c, id)
151 }
152
153 func (s *authService) ServeFollowingPage(ctx context.Context, client io.Writer, c *model.Client, id string, maxID string, minID string) (err error) {
154         c, err = s.getClient(ctx)
155         if err != nil {
156                 return
157         }
158         return s.Service.ServeFollowingPage(ctx, client, c, id, maxID, minID)
159 }
160
161 func (s *authService) ServeFollowersPage(ctx context.Context, client io.Writer, c *model.Client, id string, maxID string, minID string) (err error) {
162         c, err = s.getClient(ctx)
163         if err != nil {
164                 return
165         }
166         return s.Service.ServeFollowersPage(ctx, client, c, id, maxID, minID)
167 }
168
169 func (s *authService) ServeSearchPage(ctx context.Context, client io.Writer, c *model.Client, q string, qType string, offset int) (err error) {
170         c, err = s.getClient(ctx)
171         if err != nil {
172                 return
173         }
174         return s.Service.ServeSearchPage(ctx, client, c, q, qType, offset)
175 }
176
177 func (s *authService) ServeSettingsPage(ctx context.Context, client io.Writer, c *model.Client) (err error) {
178         c, err = s.getClient(ctx)
179         if err != nil {
180                 return
181         }
182         return s.Service.ServeSettingsPage(ctx, client, c)
183 }
184
185 func (s *authService) SaveSettings(ctx context.Context, client io.Writer, c *model.Client, settings *model.Settings) (err error) {
186         c, err = s.getClient(ctx)
187         if err != nil {
188                 return
189         }
190         return s.Service.SaveSettings(ctx, client, c, settings)
191 }
192
193 func (s *authService) Like(ctx context.Context, client io.Writer, c *model.Client, id string) (count int64, err error) {
194         c, err = s.getClient(ctx)
195         if err != nil {
196                 return
197         }
198         return s.Service.Like(ctx, client, c, id)
199 }
200
201 func (s *authService) UnLike(ctx context.Context, client io.Writer, c *model.Client, id string) (count int64, err error) {
202         c, err = s.getClient(ctx)
203         if err != nil {
204                 return
205         }
206         return s.Service.UnLike(ctx, client, c, id)
207 }
208
209 func (s *authService) Retweet(ctx context.Context, client io.Writer, c *model.Client, id string) (count int64, err error) {
210         c, err = s.getClient(ctx)
211         if err != nil {
212                 return
213         }
214         return s.Service.Retweet(ctx, client, c, id)
215 }
216
217 func (s *authService) UnRetweet(ctx context.Context, client io.Writer, c *model.Client, id string) (count int64, err error) {
218         c, err = s.getClient(ctx)
219         if err != nil {
220                 return
221         }
222         return s.Service.UnRetweet(ctx, client, c, id)
223 }
224
225 func (s *authService) PostTweet(ctx context.Context, client io.Writer, c *model.Client, content string, replyToID string, format string, visibility string, isNSFW bool, files []*multipart.FileHeader) (id string, err error) {
226         c, err = s.getClient(ctx)
227         if err != nil {
228                 return
229         }
230         return s.Service.PostTweet(ctx, client, c, content, replyToID, format, visibility, isNSFW, files)
231 }
232
233 func (s *authService) Follow(ctx context.Context, client io.Writer, c *model.Client, id string) (err error) {
234         c, err = s.getClient(ctx)
235         if err != nil {
236                 return
237         }
238         return s.Service.Follow(ctx, client, c, id)
239 }
240
241 func (s *authService) UnFollow(ctx context.Context, client io.Writer, c *model.Client, id string) (err error) {
242         c, err = s.getClient(ctx)
243         if err != nil {
244                 return
245         }
246         return s.Service.UnFollow(ctx, client, c, id)
247 }