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

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

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

@ -3,27 +3,28 @@ package service
import (
"amocrm/internal/models"
"amocrm/internal/repository"
pena_social_auth "amocrm/pkg/pena-social-auth"
"context"
"go.uber.org/zap"
)
type Deps struct {
Repository *repository.Repository
Logger *zap.Logger
ConnectLink string
Repository *repository.Repository
Logger *zap.Logger
SocialAuthClient *pena_social_auth.Client
}
type Service struct {
repository *repository.Repository
logger *zap.Logger
connectLink string
repository *repository.Repository
logger *zap.Logger
socialAuthClient *pena_social_auth.Client
}
func NewService(deps Deps) *Service {
return &Service{
repository: deps.Repository,
logger: deps.Logger,
connectLink: deps.ConnectLink,
repository: deps.Repository,
logger: deps.Logger,
socialAuthClient: deps.SocialAuthClient,
}
}
@ -97,8 +98,13 @@ func (s *Service) ConnectAccount(ctx context.Context, accountID string) (*models
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{
Link: s.connectLink,
Link: link,
}
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
}