package signin import ( "context" "errors" "tug/internal/storage" "tug/internal/transport/web" ) type googleLinks struct { a account } var _ web.GoogleLinks = googleLinks{} var googleProblems = []struct { err error want error }{ {storage.ErrGoogleLinkedElsewhere, web.ErrGoogleLinkedElsewhere}, {storage.ErrGoogleAlreadyLinked, web.ErrGoogleAlreadyLinked}, {storage.ErrGoogleNotLinked, web.ErrGoogleNotLinked}, {storage.ErrInvalid, web.ErrNoSession}, } func googleError(err error) error { for _, m := range googleProblems { if errors.Is(err, m.err) { return m.want } } return err } func (g googleLinks) Link(ctx context.Context, p web.Principal, id web.GoogleIdentity) (web.AccountGoogleLink, error) { link, err := g.a.s.LinkGoogle(ctx, g.a.principal(p), id.Subject) if err != nil { return web.AccountGoogleLink{}, googleError(err) } return web.AccountGoogleLink{LinkedAt: link.LinkedAt}, nil } func (g googleLinks) Unlink(ctx context.Context, p web.Principal) (web.AccountGoogleLink, error) { link, _, err := g.a.s.UnlinkGoogle(ctx, g.a.principal(p)) if err != nil { return web.AccountGoogleLink{}, googleError(err) } return web.AccountGoogleLink{LinkedAt: link.LinkedAt}, nil }