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