Skip to content

Commit

Permalink
refactor interface
Browse files Browse the repository at this point in the history
  • Loading branch information
jfk9w committed Aug 3, 2023
1 parent 26bd21c commit 05f2ab1
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 57 deletions.
19 changes: 19 additions & 0 deletions authorizer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package lkdr

import "context"

type Authorizer interface {
GetCaptchaToken(ctx context.Context, userAgent, siteKey, pageURL string) (string, error)
GetConfirmationCode(ctx context.Context, phone string) (string, error)
}

type authorizerKey struct{}

func WithAuthorizer(ctx context.Context, authorizer Authorizer) context.Context {
return context.WithValue(ctx, authorizerKey{}, authorizer)
}

func getAuthorizer(ctx context.Context) Authorizer {
authorizer, _ := ctx.Value(authorizerKey{}).(Authorizer)
return authorizer
}
48 changes: 12 additions & 36 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"github.com/go-playground/validator"
"github.com/jfk9w-go/based"
"github.com/pkg/errors"
"go.uber.org/multierr"
)

const (
Expand All @@ -26,14 +25,6 @@ type TokenStorage interface {
UpdateTokens(ctx context.Context, phone string, tokens *Tokens) error
}

type ConfirmationProvider interface {
GetConfirmationCode(ctx context.Context, phone string) (string, error)
}

type CaptchaTokenProvider interface {
GetCaptchaToken(ctx context.Context, userAgent, siteKey, pageURL string) (string, error)
}

var validate = based.Lazy[*validator.Validate]{
Fn: func(ctx context.Context) (*validator.Validate, error) {
return validator.New(), nil
Expand All @@ -47,9 +38,7 @@ type ClientBuilder struct {
UserAgent string `validate:"required"`
TokenStorage TokenStorage `validate:"required"`

CaptchaTokenProvider CaptchaTokenProvider
ConfirmationProvider ConfirmationProvider
Transport http.RoundTripper
Transport http.RoundTripper
}

func (b ClientBuilder) Build(ctx context.Context) (*Client, error) {
Expand All @@ -73,8 +62,6 @@ func (b ClientBuilder) Build(ctx context.Context) (*Client, error) {
httpClient: &http.Client{
Transport: b.Transport,
},
captchaTokenProvider: b.CaptchaTokenProvider,
confirmationProvider: b.ConfirmationProvider,
token: based.NewWriteThroughCached[string, *Tokens](
based.WriteThroughCacheStorageFunc[string, *Tokens]{
LoadFn: b.TokenStorage.LoadTokens,
Expand All @@ -87,14 +74,12 @@ func (b ClientBuilder) Build(ctx context.Context) (*Client, error) {
}

type Client struct {
clock based.Clock
phone string
deviceInfo deviceInfo
httpClient *http.Client
captchaTokenProvider CaptchaTokenProvider
confirmationProvider ConfirmationProvider
token *based.WriteThroughCached[*Tokens]
mu based.Locker
clock based.Clock
phone string
deviceInfo deviceInfo
httpClient *http.Client
token *based.WriteThroughCached[*Tokens]
mu based.Locker
}

func (c *Client) Receipt(ctx context.Context, in *ReceiptIn) (*ReceiptOut, error) {
Expand Down Expand Up @@ -138,21 +123,12 @@ func (c *Client) ensureToken(ctx context.Context) (string, error) {
}

func (c *Client) authorize(ctx context.Context) (*Tokens, error) {
var err error

if c.captchaTokenProvider == nil {
err = multierr.Append(err, errors.New("captcha token provider not set"))
}

if c.confirmationProvider == nil {
err = multierr.Append(err, errors.New("confirmation provider not set"))
}

if err != nil {
return nil, err
authorizer := getAuthorizer(ctx)
if authorizer == nil {
return nil, errors.New("authorizer is required, but not set")
}

captchaToken, err := c.captchaTokenProvider.GetCaptchaToken(ctx, c.deviceInfo.MetaDetails.UserAgent, captchaSiteKey, captchaPageURL)
captchaToken, err := authorizer.GetCaptchaToken(ctx, c.deviceInfo.MetaDetails.UserAgent, captchaSiteKey, captchaPageURL)
if err != nil {
return nil, errors.Wrap(err, "get captcha token")
}
Expand All @@ -171,7 +147,7 @@ func (c *Client) authorize(ctx context.Context) (*Tokens, error) {
}
}

code, err := c.confirmationProvider.GetConfirmationCode(ctx, c.phone)
code, err := authorizer.GetConfirmationCode(ctx, c.phone)
if err != nil {
return nil, errors.Wrap(err, "get confirmation code")
}
Expand Down
38 changes: 17 additions & 21 deletions example/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,12 @@ func (s jsonTokenStorage) open(flag int) (*os.File, error) {
return file, nil
}

type rucaptchaTokenProvider struct {
client *rucaptcha.Client
type authorizer struct {
rucaptchaClient *rucaptcha.Client
}

func (p *rucaptchaTokenProvider) GetCaptchaToken(ctx context.Context, userAgent, siteKey, pageURL string) (string, error) {
solved, err := p.client.Solve(ctx, &rucaptcha.YandexSmartCaptchaIn{
func (a *authorizer) GetCaptchaToken(ctx context.Context, userAgent, siteKey, pageURL string) (string, error) {
solved, err := a.rucaptchaClient.Solve(ctx, &rucaptcha.YandexSmartCaptchaIn{
UserAgent: userAgent,
SiteKey: siteKey,
PageURL: pageURL,
Expand All @@ -114,9 +114,7 @@ func (p *rucaptchaTokenProvider) GetCaptchaToken(ctx context.Context, userAgent,
return solved.Answer, nil
}

type stdinConfirmationProvider struct{}

func (p stdinConfirmationProvider) GetConfirmationCode(ctx context.Context, phone string) (string, error) {
func (a *authorizer) GetConfirmationCode(ctx context.Context, phone string) (string, error) {
reader := bufio.NewReader(os.Stdin)
fmt.Printf("Enter confirmation code for %s: ", phone)
text, err := reader.ReadString('\n')
Expand All @@ -143,25 +141,11 @@ func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

rucaptchaClient, err := rucaptcha.ClientBuilder{
Config: rucaptcha.Config{
Key: config.RucaptchaKey,
},
}.Build(ctx)

if err != nil {
panic(err)
}

client, err := lkdr.ClientBuilder{
Phone: config.Phone,
Clock: based.StandardClock,
DeviceID: config.DeviceID,
UserAgent: config.UserAgent,
CaptchaTokenProvider: &rucaptchaTokenProvider{
client: rucaptchaClient,
},
ConfirmationProvider: stdinConfirmationProvider{},
TokenStorage: jsonTokenStorage{
path: config.TokensFile,
},
Expand All @@ -171,6 +155,18 @@ func main() {
panic(err)
}

rucaptchaClient, err := rucaptcha.ClientBuilder{
Config: rucaptcha.Config{
Key: config.RucaptchaKey,
},
}.Build(ctx)

if err != nil {
panic(err)
}

ctx = lkdr.WithAuthorizer(ctx, &authorizer{rucaptchaClient: rucaptchaClient})

receipts, err := client.Receipt(ctx, &lkdr.ReceiptIn{
Limit: 1,
Offset: 0,
Expand Down

0 comments on commit 05f2ab1

Please sign in to comment.