generated from PenaSide/GolangTemplate
100 lines
3.1 KiB
Go
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)
|
|
}
|