diff options
author | r <r@freesoftwareextremist.com> | 2019-12-13 18:08:26 +0000 |
---|---|---|
committer | r <r@freesoftwareextremist.com> | 2019-12-13 18:26:24 +0000 |
commit | 5e4da01c3ae3ae2e870faba9085d9d9213c01c29 (patch) | |
tree | 39d6f1e76b901549f194ddbac3c6cb82e0abd019 /service/auth.go | |
download | bloat-5e4da01c3ae3ae2e870faba9085d9d9213c01c29.tar.gz bloat-5e4da01c3ae3ae2e870faba9085d9d9213c01c29.zip |
Initial commit
Diffstat (limited to 'service/auth.go')
-rw-r--r-- | service/auth.go | 151 |
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) +} |