reworked add pena-social-auth client for gen aurhamourl

This commit is contained in:
Pavel 2024-04-09 15:13:21 +03:00
parent 8ae7d51ad6
commit 3d88dcad04
5 changed files with 98 additions and 18 deletions

@ -7,6 +7,7 @@ import (
"amocrm/internal/server/http" "amocrm/internal/server/http"
"amocrm/internal/service" "amocrm/internal/service"
"amocrm/pkg/closer" "amocrm/pkg/closer"
pena_social_auth "amocrm/pkg/pena-social-auth"
"context" "context"
"errors" "errors"
"time" "time"
@ -34,14 +35,20 @@ func Run(ctx context.Context, config initialize.Config, logger *zap.Logger) erro
return err return err
} }
socialAithClient := pena_social_auth.NewClient(pena_social_auth.Deps{
PenaSocialAuthURL: config.PenaSocialAuthURL,
Logger: logger,
ReturnURL: config.ReturnURL,
})
repo := repository.NewRepository(repository.Deps{ repo := repository.NewRepository(repository.Deps{
MdbUser: mdb.Collection("amoUsers"), MdbUser: mdb.Collection("amoUsers"),
}) })
svc := service.NewService(service.Deps{ svc := service.NewService(service.Deps{
Repository: repo, Repository: repo,
Logger: logger, Logger: logger,
ConnectLink: config.ConnectLink, SocialAuthClient: socialAithClient,
}) })
controller := controllers.NewController(controllers.Deps{ controller := controllers.NewController(controllers.Deps{

@ -154,8 +154,7 @@ func (c *Controller) GetCurrentAccount(ctx *fiber.Ctx) error {
// при запросе на этот контроллер приходит только токен из которого получаем id аккаунта в ис // при запросе на этот контроллер приходит только токен из которого получаем id аккаунта в ис
// отдает ссылку на подключение к amocrm и создает модель в монге имеющую связь с аккаунтом // отдает ссылку на подключение к amocrm и создает модель в монге имеющую связь с аккаунтом
// в постгресе по accountid // в постгресе по accountid
// создем запись в базе данных с пустыми полями и accountID, после аворизации через pena-social-auth // ссылку составляет сервис соц авторизации
// его клиент присылает на этот сервис запрос с отстальными данными пользователя, они добавляются
func (c *Controller) ConnectAccount(ctx *fiber.Ctx) error { func (c *Controller) ConnectAccount(ctx *fiber.Ctx) error {
accountID, ok := middleware.GetAccountId(ctx) accountID, ok := middleware.GetAccountId(ctx)
if !ok { if !ok {

@ -10,7 +10,8 @@ type Config struct {
MongoPassword string `env:"MONGO_PASSWORD" envDefault:"test"` MongoPassword string `env:"MONGO_PASSWORD" envDefault:"test"`
MongoDatabase string `env:"MONGO_DB" envDefault:"admin"` MongoDatabase string `env:"MONGO_DB" envDefault:"admin"`
MongoAuth string `env:"MONGO_AUTH" envDefault:"admin"` MongoAuth string `env:"MONGO_AUTH" envDefault:"admin"`
//ссылка для коннекта аккаунта к амо всегда одинаковая, содержит: // урл в соц аус сервисе для генерации ссылки для авторизации в амо
//client_id - id интеграции,state - параметр состояния, mode - popup или post_message PenaSocialAuthURL string `env:"PENA_SOCIAL_AUTH_URL"`
ConnectLink string `env:"CONNECT_LINK"` // урл на который будет возвращен пользователь после авторизации
ReturnURL string `env:"RETURN_URL"`
} }

@ -3,27 +3,28 @@ package service
import ( import (
"amocrm/internal/models" "amocrm/internal/models"
"amocrm/internal/repository" "amocrm/internal/repository"
pena_social_auth "amocrm/pkg/pena-social-auth"
"context" "context"
"go.uber.org/zap" "go.uber.org/zap"
) )
type Deps struct { type Deps struct {
Repository *repository.Repository Repository *repository.Repository
Logger *zap.Logger Logger *zap.Logger
ConnectLink string SocialAuthClient *pena_social_auth.Client
} }
type Service struct { type Service struct {
repository *repository.Repository repository *repository.Repository
logger *zap.Logger logger *zap.Logger
connectLink string socialAuthClient *pena_social_auth.Client
} }
func NewService(deps Deps) *Service { func NewService(deps Deps) *Service {
return &Service{ return &Service{
repository: deps.Repository, repository: deps.Repository,
logger: deps.Logger, logger: deps.Logger,
connectLink: deps.ConnectLink, socialAuthClient: deps.SocialAuthClient,
} }
} }
@ -97,8 +98,13 @@ func (s *Service) ConnectAccount(ctx context.Context, accountID string) (*models
return nil, err return nil, err
} }
link, err := s.socialAuthClient.GenerateAmocrmAuthURL()
if err != nil {
s.logger.Error("error sending request to pena social auth service:", zap.Error(err))
}
response := models.ConnectAccountResp{ response := models.ConnectAccountResp{
Link: s.connectLink, Link: link,
} }
return &response, nil return &response, nil

@ -0,0 +1,67 @@
package pena_social_auth
import (
"encoding/json"
"fmt"
"github.com/gofiber/fiber/v2"
"go.uber.org/zap"
"net/http"
)
type Deps struct {
PenaSocialAuthURL string
FiberClient *fiber.Client
Logger *zap.Logger
ReturnURL string
}
type Client struct {
penaSocialAuthURL string
fiberClient *fiber.Client
logger *zap.Logger
returnURL string
}
func NewClient(deps Deps) *Client {
if deps.FiberClient == nil {
deps.FiberClient = fiber.AcquireClient()
}
return &Client{
penaSocialAuthURL: deps.PenaSocialAuthURL,
fiberClient: deps.FiberClient,
returnURL: deps.ReturnURL,
logger: deps.Logger,
}
}
type GenAuthURLResp struct {
URL string `json:"url"`
}
func (c *Client) GenerateAmocrmAuthURL() (string, error) {
url := c.penaSocialAuthURL + "?accessToken=" + "" + "&returnUrl=" + c.returnURL
statusCode, resp, errs := c.fiberClient.Get(url).Bytes()
if len(errs) > 0 {
for _, err := range errs {
c.logger.Error("error sending request in GenerateAmocrmAuthURL", zap.Error(err))
}
return "", fmt.Errorf("request GenerateAmocrmAuthURL failed: %v", errs[0])
}
if statusCode != http.StatusOK {
errorMessage := fmt.Sprintf("received an incorrect response from GenerateAmocrmAuthURL: %d", statusCode)
c.logger.Error(errorMessage, zap.Int("status", statusCode))
return "", fmt.Errorf(errorMessage)
}
var response GenAuthURLResp
err := json.Unmarshal(resp, &response)
if err != nil {
c.logger.Error("error unmarshal GenAuthURLResp:", zap.Error(err))
return "", err
}
return response.URL, nil
}