future with sync map

This commit is contained in:
Pavel 2024-05-03 18:25:50 +03:00
parent 712c44458e
commit eaf8ec63db
3 changed files with 99 additions and 133 deletions

2
go.mod

@ -12,7 +12,7 @@ require (
github.com/twmb/franz-go v1.16.1 github.com/twmb/franz-go v1.16.1
go.uber.org/zap v1.27.0 go.uber.org/zap v1.27.0
google.golang.org/protobuf v1.33.0 google.golang.org/protobuf v1.33.0
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240503082031-f6c3470bd872 penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240503151157-e610703cbfc7
penahub.gitlab.yandexcloud.net/backend/quiz/core.git v0.0.0-20240219174804-d78fd38511af penahub.gitlab.yandexcloud.net/backend/quiz/core.git v0.0.0-20240219174804-d78fd38511af
) )

4
go.sum

@ -151,7 +151,7 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6 h1:oV+/HNX+JPoQ3/GUx08hio7d45WpY0AMGrFs7j70QlA= penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6 h1:oV+/HNX+JPoQ3/GUx08hio7d45WpY0AMGrFs7j70QlA=
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6/go.mod h1:lTmpjry+8evVkXWbEC+WMOELcFkRD1lFMc7J09mOndM= penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6/go.mod h1:lTmpjry+8evVkXWbEC+WMOELcFkRD1lFMc7J09mOndM=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240503082031-f6c3470bd872 h1:yOSXTJkpx0MCxKaKnQxGtB2fNLob3FHxFE9SO7/35Q0= penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240503151157-e610703cbfc7 h1:ejEQamCmMllFGT3HlLftchBDq5lzWdvnBTlMqxCFiZo=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240503082031-f6c3470bd872/go.mod h1:oRyhT55ctjqp/7ZxIzkR7OsQ7T/NLibsfrbb7Ytns64= penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240503151157-e610703cbfc7/go.mod h1:oRyhT55ctjqp/7ZxIzkR7OsQ7T/NLibsfrbb7Ytns64=
penahub.gitlab.yandexcloud.net/backend/quiz/core.git v0.0.0-20240219174804-d78fd38511af h1:jQ7HaXSutDX5iepU7VRImxhikK7lV/lBKkiloOZ4Emo= penahub.gitlab.yandexcloud.net/backend/quiz/core.git v0.0.0-20240219174804-d78fd38511af h1:jQ7HaXSutDX5iepU7VRImxhikK7lV/lBKkiloOZ4Emo=
penahub.gitlab.yandexcloud.net/backend/quiz/core.git v0.0.0-20240219174804-d78fd38511af/go.mod h1:5S5YwjSXWmnEKjBjG6MtyGtFmljjukDRS8CwHk/CF/I= penahub.gitlab.yandexcloud.net/backend/quiz/core.git v0.0.0-20240219174804-d78fd38511af/go.mod h1:5S5YwjSXWmnEKjBjG6MtyGtFmljjukDRS8CwHk/CF/I=

@ -8,6 +8,7 @@ import (
"go.uber.org/zap" "go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"sync"
"time" "time"
) )
@ -89,6 +90,7 @@ func (m *Methods) CheckUsers(ctx context.Context, allTokens []model.Token) error
listUser[token.AccountID] = append(listUser[token.AccountID], userData.Embedded.Users...) listUser[token.AccountID] = append(listUser[token.AccountID], userData.Embedded.Users...)
} }
var usersForUpdateAndCreate []model.User
for accountID, users := range listUser { for accountID, users := range listUser {
mainAccount, err := m.repo.AmoRepo.GetCurrentAccount(ctx, accountID) mainAccount, err := m.repo.AmoRepo.GetCurrentAccount(ctx, accountID)
if err != nil { if err != nil {
@ -110,7 +112,7 @@ func (m *Methods) CheckUsers(ctx context.Context, allTokens []model.Token) error
} }
} }
err := m.repo.AmoRepo.CheckAndUpdateUsers(ctx, model.User{ usersForUpdateAndCreate = append(usersForUpdateAndCreate, model.User{
AmoID: user.ID, AmoID: user.ID,
Name: user.FullName, Name: user.FullName,
Group: int32(user.Rights.GroupID), Group: int32(user.Rights.GroupID),
@ -118,13 +120,13 @@ func (m *Methods) CheckUsers(ctx context.Context, allTokens []model.Token) error
Email: user.Email, Email: user.Email,
Amouserid: mainAccount.Amouserid, Amouserid: mainAccount.Amouserid,
}) })
if err != nil {
m.logger.Error("error update users list data in db", zap.Error(err))
return err
}
} }
}
err := m.repo.AmoRepo.CheckAndUpdateUsers(ctx, usersForUpdateAndCreate)
if err != nil {
m.logger.Error("error update users list data in db", zap.Error(err))
return err
} }
return nil return nil
@ -165,79 +167,61 @@ func (m *Methods) CheckPipelinesAndSteps(ctx context.Context, tokens []model.Tok
func (m *Methods) CheckTags(ctx context.Context, tokens []model.Token) error { func (m *Methods) CheckTags(ctx context.Context, tokens []model.Token) error {
for _, token := range tokens { for _, token := range tokens {
var leadsTags []models.Tag var wg sync.WaitGroup
var contactsTags []models.Tag wg.Add(4)
var companiesTags []models.Tag
var customersTags []models.Tag
var tagsMap sync.Map
entityTypes := []model.EntityType{model.LeadsType, model.ContactsType, model.CompaniesType, model.CustomersType} entityTypes := []model.EntityType{model.LeadsType, model.ContactsType, model.CompaniesType, model.CustomersType}
for _, entityType := range entityTypes { for _, entityType := range entityTypes {
page := 1 go func(entityType model.EntityType) {
limit := 250 defer wg.Done()
page := 1
limit := 250
for { for {
req := models.GetListTagsReq{ req := models.GetListTagsReq{
Page: page, Page: page,
Limit: limit, Limit: limit,
EntityType: entityType, EntityType: entityType,
} }
tags, err := m.amoClient.GetListTags(req, token.AccessToken) tags, err := m.amoClient.GetListTags(req, token.AccessToken)
if err != nil { if err != nil {
m.logger.Error("error getting list of tags", zap.Error(err)) m.logger.Error("error getting list of tags", zap.Error(err))
break return
} }
if tags == nil || len(tags.Embedded.Tags) == 0 { if tags == nil || len(tags.Embedded.Tags) == 0 {
break break
} }
switch entityType { tagsMap.Store(entityType, tags.Embedded.Tags)
case model.LeadsType:
leadsTags = append(leadsTags, tags.Embedded.Tags...)
case model.ContactsType:
contactsTags = append(contactsTags, tags.Embedded.Tags...)
case model.CompaniesType:
companiesTags = append(companiesTags, tags.Embedded.Tags...)
case model.CustomersType:
customersTags = append(customersTags, tags.Embedded.Tags...)
}
page++ page++
} }
}(entityType)
} }
wg.Wait()
for _, entityType := range entityTypes { for _, entityType := range entityTypes {
switch entityType { if tags, ok := tagsMap.Load(entityType); ok {
case model.LeadsType: if len(tags.([]models.Tag)) > 0 {
if len(leadsTags) > 0 { err := m.repo.AmoRepo.CheckTags(ctx, tools.ToTag(tags.([]models.Tag), entityType), token.AccountID)
err := m.repo.AmoRepo.CheckTags(ctx, tools.ToTag(leadsTags, entityType), token.AccountID)
if err != nil { if err != nil {
m.logger.Error("error update leads tags in db", zap.Error(err)) switch entityType {
return err case model.LeadsType:
} m.logger.Error("error updating leads tags in db", zap.Error(err))
} return err
case model.ContactsType: case model.ContactsType:
if len(contactsTags) > 0 { m.logger.Error("error updating contacts tags in db", zap.Error(err))
err := m.repo.AmoRepo.CheckTags(ctx, tools.ToTag(contactsTags, entityType), token.AccountID) return err
if err != nil { case model.CompaniesType:
m.logger.Error("error update contacts tags in db", zap.Error(err)) m.logger.Error("error updating companies tags in db", zap.Error(err))
return err return err
} case model.CustomersType:
} m.logger.Error("error updating customer tags in db", zap.Error(err))
case model.CompaniesType: return err
if len(companiesTags) > 0 { }
err := m.repo.AmoRepo.CheckTags(ctx, tools.ToTag(companiesTags, entityType), token.AccountID)
if err != nil {
m.logger.Error("error update companies tags in db", zap.Error(err))
return err
}
}
case model.CustomersType:
if len(customersTags) > 0 {
err := m.repo.AmoRepo.CheckTags(ctx, tools.ToTag(customersTags, entityType), token.AccountID)
if err != nil {
m.logger.Error("error update customer tags in db", zap.Error(err))
return err
} }
} }
} }
@ -248,79 +232,61 @@ func (m *Methods) CheckTags(ctx context.Context, tokens []model.Token) error {
func (m *Methods) CheckFields(ctx context.Context, tokens []model.Token) error { func (m *Methods) CheckFields(ctx context.Context, tokens []model.Token) error {
for _, token := range tokens { for _, token := range tokens {
var leadsFields []models.CustomField var wg sync.WaitGroup
var contactsFields []models.CustomField wg.Add(4)
var companiesFields []models.CustomField
var customersFields []models.CustomField
var fieldsMap sync.Map
entityTypes := []model.EntityType{model.LeadsType, model.ContactsType, model.CompaniesType, model.CustomersType} entityTypes := []model.EntityType{model.LeadsType, model.ContactsType, model.CompaniesType, model.CustomersType}
for _, entityType := range entityTypes { for _, entityType := range entityTypes {
page := 1 go func(entityType model.EntityType) {
limit := 50 defer wg.Done()
page := 1
limit := 50
for { for {
req := models.GetListFieldsReq{ req := models.GetListFieldsReq{
Page: page, Page: page,
Limit: limit, Limit: limit,
EntityType: entityType, EntityType: entityType,
} }
fields, err := m.amoClient.GetListFields(req, token.AccessToken) fields, err := m.amoClient.GetListFields(req, token.AccessToken)
if err != nil { if err != nil {
m.logger.Error("error getting list of fields", zap.Error(err)) m.logger.Error("error getting list of fields", zap.Error(err))
break return
} }
if fields == nil || len(fields.Embedded.CustomFields) == 0 { if fields == nil || len(fields.Embedded.CustomFields) == 0 {
break break
} }
switch entityType { fieldsMap.Store(entityType, fields.Embedded.CustomFields)
case model.LeadsType:
leadsFields = append(leadsFields, fields.Embedded.CustomFields...)
case model.ContactsType:
contactsFields = append(contactsFields, fields.Embedded.CustomFields...)
case model.CompaniesType:
companiesFields = append(companiesFields, fields.Embedded.CustomFields...)
case model.CustomersType:
customersFields = append(customersFields, fields.Embedded.CustomFields...)
}
page++ page++
} }
}(entityType)
} }
wg.Wait()
for _, entityType := range entityTypes { for _, entityType := range entityTypes {
switch entityType { if fields, ok := fieldsMap.Load(entityType); ok {
case model.LeadsType: if len(fields.([]models.CustomField)) > 0 {
if len(leadsFields) > 0 { err := m.repo.AmoRepo.CheckFields(ctx, tools.ToField(fields.([]models.CustomField), entityType), token.AccountID)
err := m.repo.AmoRepo.CheckFields(ctx, tools.ToField(leadsFields, entityType), token.AccountID)
if err != nil { if err != nil {
m.logger.Error("error update leads fields in db", zap.Error(err)) switch entityType {
return err case model.LeadsType:
} m.logger.Error("error updating leads fields in db", zap.Error(err))
} return err
case model.ContactsType: case model.ContactsType:
if len(contactsFields) > 0 { m.logger.Error("error updating contacts fields in db", zap.Error(err))
err := m.repo.AmoRepo.CheckFields(ctx, tools.ToField(contactsFields, entityType), token.AccountID) return err
if err != nil { case model.CompaniesType:
m.logger.Error("error update contacts fields in db", zap.Error(err)) m.logger.Error("error updating companies fields in db", zap.Error(err))
return err return err
} case model.CustomersType:
} m.logger.Error("error updating customer fields in db", zap.Error(err))
case model.CompaniesType: return err
if len(companiesFields) > 0 { }
err := m.repo.AmoRepo.CheckFields(ctx, tools.ToField(companiesFields, entityType), token.AccountID)
if err != nil {
m.logger.Error("error update companies fields", zap.Error(err))
return err
}
}
case model.CustomersType:
if len(customersFields) > 0 {
err := m.repo.AmoRepo.CheckFields(ctx, tools.ToField(customersFields, entityType), token.AccountID)
if err != nil {
m.logger.Error("error update customer fields", zap.Error(err))
return err
} }
} }
} }