From 3c70c13edcf50312343aba692f70556b6b661a94 Mon Sep 17 00:00:00 2001 From: Pavel Date: Thu, 11 Apr 2024 16:58:31 +0300 Subject: [PATCH] add get user by id in amo client --- internal/app/app.go | 9 ++++++ internal/models/amo/userInfo.go | 51 +++++++++++++++++++++++++++++++++ internal/models/user.go | 2 +- internal/repository/user.go | 21 +++++++------- internal/service/webhook.go | 27 ++++++++++++++--- pkg/amoClient/amo.go | 35 +++++++++++++++++++++- 6 files changed, 128 insertions(+), 17 deletions(-) diff --git a/internal/app/app.go b/internal/app/app.go index 002fc55..95104d2 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -6,6 +6,7 @@ import ( "amocrm/internal/repository" "amocrm/internal/server/http" "amocrm/internal/service" + "amocrm/internal/workers/data_updater" "amocrm/internal/workers/tokens" amoClient2 "amocrm/pkg/amoClient" "amocrm/pkg/closer" @@ -83,7 +84,14 @@ func Run(ctx context.Context, config initialize.Config, logger *zap.Logger) erro Logger: logger, }) + dataUpdater := data_updater.NewDataUpdaterWC(data_updater.Deps{ + Repo: repo, + AmoClient: amoClient, + Logger: logger, + }) + go tokenUpdater.Start(ctx) + go dataUpdater.Start(ctx) server := http.NewServer(http.ServerConfig{ Controllers: []http.Controller{ @@ -104,6 +112,7 @@ func Run(ctx context.Context, config initialize.Config, logger *zap.Logger) erro shutdownGroup.Add(closer.CloserFunc(mdb.Client().Disconnect)) shutdownGroup.Add(closer.CloserFunc(rateLimiter.Stop)) shutdownGroup.Add(closer.CloserFunc(tokenUpdater.Stop)) + shutdownGroup.Add(closer.CloserFunc(dataUpdater.Stop)) <-ctx.Done() diff --git a/internal/models/amo/userInfo.go b/internal/models/amo/userInfo.go index 1cfac9c..f3f2375 100644 --- a/internal/models/amo/userInfo.go +++ b/internal/models/amo/userInfo.go @@ -107,3 +107,54 @@ type AmocrmUserInformation struct { } `json:"datetime_settings" bson:"datetime_settings"` } `json:"_embedded" bson:"_embedded"` } + +type LeadRights struct { + View string `json:"view"` + Edit string `json:"edit"` + Add string `json:"add"` + Delete string `json:"delete"` + Export string `json:"export"` +} + +type ContactRights struct { + View string `json:"view"` + Edit string `json:"edit"` + Add string `json:"add"` + Delete string `json:"delete"` + Export string `json:"export"` +} + +type CompanyRights struct { + View string `json:"view"` + Edit string `json:"edit"` + Add string `json:"add"` + Delete string `json:"delete"` + Export string `json:"export"` +} + +type TaskRights struct { + Edit string `json:"edit"` + Delete string `json:"delete"` +} + +type StatusRight struct { + EntityType string `json:"entity_type"` + PipelineID int `json:"pipeline_id"` + StatusID int `json:"status_id"` + Rights LeadRights `json:"rights"` +} + +type OneUserInfo struct { + ID int `json:"id"` + Name string `json:"name"` + Email string `json:"email"` + Lang string `json:"lang"` + Role *string `json:"role,omitempty"` + UUID *string `json:"uuid,omitempty"` + Rights Rights `json:"rights"` + Links struct { + Self struct { + Href string `json:"href"` + } `json:"self"` + } `json:"_links"` +} diff --git a/internal/models/user.go b/internal/models/user.go index d19c7cb..f167e62 100644 --- a/internal/models/user.go +++ b/internal/models/user.go @@ -15,7 +15,7 @@ type User struct { /* - айдишник пользвателя, который подключал интеграцию*/ Amouserid int `json:"AmoUserID" bson:"Amouserid"` /* - связь с аккаунтом в амо*/ - Amocrmid int `json:"AmocrmID" bson:"Amocrmid"` + Amocrmid int64 `json:"AmocrmID" bson:"Amocrmid"` /* - страна указанная в настройках амо*/ Country string `json:"Country" bson:"Country"` /* - таймштамп создания аккаунта*/ diff --git a/internal/repository/user.go b/internal/repository/user.go index 782732c..29483bb 100644 --- a/internal/repository/user.go +++ b/internal/repository/user.go @@ -2,8 +2,6 @@ package repository import ( "amocrm/internal/models" - amo2 "amocrm/internal/models/amo" - "amocrm/internal/tools" "context" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" @@ -58,18 +56,19 @@ func (r *Repository) CreateAccount(ctx context.Context, accountID string) error return nil } -func (r *Repository) UpdateAccount(ctx context.Context, accountID string, userInfo *amo2.AmocrmUserInformation) error { +func (r *Repository) UpdateAccount(ctx context.Context, accountID string, userInfo models.User) error { filter := bson.M{"AccountID": accountID} - // todo надо как то получить роль и почту update := bson.M{ "$set": bson.M{ - "ID": userInfo.UUID, // uuid аккаунта - "Name": userInfo.Name, // имя аккаунта амо - "Amocrmid": userInfo.ID, // id аккаунта амо - "Amouserid": userInfo.CurrentUserID, // id текущего пользователя в амо - "Group": tools.ConvertUserGroups(userInfo), // группы пользователя - "Country": userInfo.Country, // страна в настройках амо - "Subdomain": userInfo.Subdomain, // поддомен организации + "ID": userInfo.ID, + "Name": userInfo.Name, + "Amocrmid": userInfo.Amocrmid, + "Amouserid": userInfo.Amouserid, + "Country": userInfo.Country, + "Subdomain": userInfo.Subdomain, + "Group": userInfo.Group, + "Role": userInfo.Role, + "Email": userInfo.Email, }, } diff --git a/internal/service/webhook.go b/internal/service/webhook.go index 282e851..61233ac 100644 --- a/internal/service/webhook.go +++ b/internal/service/webhook.go @@ -3,6 +3,7 @@ package service import ( "amocrm/internal/models" "amocrm/internal/models/amo" + "amocrm/internal/tools" "context" "go.mongodb.org/mongo-driver/bson/primitive" "go.uber.org/zap" @@ -35,20 +36,38 @@ func (s *Service) WebhookCreate(ctx context.Context, req ParamsWebhookCreate) er s.logger.Error("error getting webhook in Service:", zap.Error(err)) return err } - // получаем информацию о пользователе по аксес токену + + // получаем информацию о пользователе по аксес токену и затем по его id userInfo, err := s.amoClient.GetUserInfo(tokens.AccessToken) if err != nil { s.logger.Error("error getting UserInfo in Service:", zap.Error(err)) return err } - // апдейтим информацио о аккаунте - err = s.repository.UpdateAccount(ctx, accountID, userInfo) + + userInfoByID, err := s.amoClient.GetUserByID(tokens.AccessToken, userInfo.ID) + if err != nil { + s.logger.Error("error getting GetUserByID in Service:", zap.Error(err)) + return err + } + + toUpdate := models.User{ + ID: *userInfoByID.UUID, + Name: userInfoByID.Name, + Subdomain: userInfo.Subdomain, + Amocrmid: userInfo.ID, + Amouserid: userInfo.CurrentUserID, + Email: userInfoByID.Email, + Group: tools.ConvertUserGroups(userInfo), + Country: userInfo.Country, + Role: *userInfoByID.Role, + } + + err = s.repository.UpdateAccount(ctx, accountID, toUpdate) if err != nil { s.logger.Error("error update account in mongo on service WebhookCreate", zap.Error(err)) return err } - // заносим в монгу токены обновлять токены видимо стоит где то за 2 минуты до их истечения то есть на 17-18 минутах err = s.repository.WebhookCreate(ctx, models.Token{ ObjID: primitive.NewObjectID(), RefreshToken: tokens.RefreshToken, diff --git a/pkg/amoClient/amo.go b/pkg/amoClient/amo.go index fe0e92b..1e197a6 100644 --- a/pkg/amoClient/amo.go +++ b/pkg/amoClient/amo.go @@ -288,7 +288,7 @@ func (a *Amo) GetUserInfo(accessToken string) (*amo2.AmocrmUserInformation, erro for _, err := range errs { a.logger.Error("error sending request in GetUserInfo", zap.Error(err)) } - return nil, fmt.Errorf("request GetListTags failed: %v", errs[0]) + return nil, fmt.Errorf("request GetUserInfo failed: %v", errs[0]) } if statusCode != fiber.StatusOK { @@ -309,3 +309,36 @@ func (a *Amo) GetUserInfo(accessToken string) (*amo2.AmocrmUserInformation, erro time.Sleep(a.rateLimiter.interval) } } + +func (a *Amo) GetUserByID(accessToken string, id int64) (*amo2.OneUserInfo, error) { + for { + if a.rateLimiter.Check() { + uri := fmt.Sprintf("%s/api/v4/users/%d?with=role,uuid", a.baseApiURL, id) + agent := a.fiberClient.Get(a.baseApiURL + uri) + agent.Set("Authorization", "Bearer "+accessToken) + statusCode, resBody, errs := agent.Bytes() + if len(errs) > 0 { + for _, err := range errs { + a.logger.Error("error sending request in GetUserByID", zap.Error(err)) + } + return nil, fmt.Errorf("request GetUserByID failed: %v", errs[0]) + } + + if statusCode != fiber.StatusOK { + errorMessage := fmt.Sprintf("received an incorrect response from GetUserByID: %d", statusCode) + a.logger.Error(errorMessage, zap.Int("status", statusCode)) + return nil, fmt.Errorf(errorMessage) + } + + var userInfo amo2.OneUserInfo + err := json.Unmarshal(resBody, &userInfo) + if err != nil { + a.logger.Error("error unmarshal OneUserInfo:", zap.Error(err)) + return nil, err + } + + return &userInfo, nil + } + time.Sleep(a.rateLimiter.interval) + } +}