customer/internal/controller/amocrm/amocrm.go
2023-05-16 04:12:34 +03:00

100 lines
3.1 KiB
Go

package amocrm
import (
"context"
"fmt"
"net/http"
"github.com/labstack/echo/v4"
"github.com/sirupsen/logrus"
"penahub.gitlab.yandexcloud.net/pena-services/pena-social-auth/internal/errors"
"penahub.gitlab.yandexcloud.net/pena-services/pena-social-auth/internal/models"
"penahub.gitlab.yandexcloud.net/pena-services/pena-social-auth/internal/utils"
)
//go:generate mockery --name amocrmService
type amocrmService interface {
Auth(ctx context.Context, code string) (*models.Tokens, error)
Link(ctx context.Context, code, accessToken string) (bool, error)
}
//go:generate mockery --name oauthService
type oauthService interface {
GenerateAuthURL() string
GenerateLinkURL(accessToken string) string
ValidateState(state string) bool
}
type Deps struct {
Logger *logrus.Logger
AmocrmService amocrmService
OAuthService oauthService
}
type Controller struct {
logger *logrus.Logger
amocrmService amocrmService
oauthService oauthService
}
func New(deps *Deps) *Controller {
return &Controller{
logger: deps.Logger,
oauthService: deps.OAuthService,
amocrmService: deps.AmocrmService,
}
}
func (receiver *Controller) RedirectAuthURL(ctx echo.Context) error {
return ctx.Redirect(http.StatusTemporaryRedirect, receiver.oauthService.GenerateAuthURL())
}
func (receiver *Controller) GenerateAuthURL(ctx echo.Context) error {
return ctx.JSON(http.StatusOK, models.GenerateURLResponse{
URL: receiver.oauthService.GenerateAuthURL(),
})
}
func (receiver *Controller) RedirectLinkAccountURL(ctx echo.Context) error {
accessToken := ctx.QueryParam("accessToken")
return ctx.Redirect(http.StatusTemporaryRedirect, receiver.oauthService.GenerateLinkURL(accessToken))
}
func (receiver *Controller) GenerateLinkAccountURL(ctx echo.Context) error {
accessToken := ctx.QueryParam("accessToken")
return ctx.JSON(http.StatusOK, models.GenerateURLResponse{
URL: receiver.oauthService.GenerateLinkURL(accessToken),
})
}
func (receiver *Controller) Callback(ctx echo.Context) error {
callbackState := ctx.QueryParam("state")
callbackCode := ctx.QueryParam("code")
callbackAccessToken := ctx.QueryParam("accessToken")
if !receiver.oauthService.ValidateState(callbackState) {
receiver.logger.Errorln("state is not valid on <Callback> of <AmocrmController>")
return utils.DetermineEchoErrorResponse(ctx, errors.ErrInvalidArgs, "state is not valid")
}
if callbackAccessToken != "" {
tokens, err := receiver.amocrmService.Link(ctx.Request().Context(), callbackCode, callbackAccessToken)
if err != nil {
receiver.logger.Errorf("failed to link amocrm account on <Callback> of <AmocrmAuthController>: %v", err)
return utils.DetermineEchoErrorResponse(ctx, err, fmt.Sprintf("failed to link amocrm account: %v", err))
}
return ctx.JSON(http.StatusOK, tokens)
}
tokens, err := receiver.amocrmService.Auth(ctx.Request().Context(), callbackCode)
if err != nil {
receiver.logger.Errorf("failed to amocrm auth on <Callback> of <AmocrmAuthController>: %v", err)
return utils.DetermineEchoErrorResponse(ctx, err, fmt.Sprintf("failed to auth: %v", err))
}
return ctx.JSON(http.StatusOK, tokens)
}