diff --git a/internal/models/getListFields.go b/internal/models/getListFields.go index a8a1ac8..d35a1d7 100644 --- a/internal/models/getListFields.go +++ b/internal/models/getListFields.go @@ -1,5 +1,10 @@ package models +import ( + "strconv" + "time" +) + type FieldsType string const ( @@ -63,3 +68,23 @@ const ( NameEntityTypeQuote NameEntityType = "QUOTE" NameEntityTypeRequisite NameEntityType = "REQUISITE" ) + +type AddFields struct { + FieldName string `json:"FIELD_NAME"` + EditFormLabel string `json:"EDIT_FORM_LABEL"` + ListColumnLabel string `json:"LIST_COLUMN_LABEL"` + UserTypeID string `json:"USER_TYPE_ID"` // Тип поля + XMLID string `json:"XML_ID"` + Settings map[string]interface{} `json:"SETTINGS"` +} + +func (a *AddFields) GenFieldName() { + currentTime := time.Now().Unix() + currentTimeStr := strconv.FormatInt(currentTime, 10) + a.FieldName = currentTimeStr + a.XMLID = currentTimeStr +} + +type AddFieldsResponse struct { + ID int64 `json:"result"` +} diff --git a/pkg/bitrixClient/bitrix.go b/pkg/bitrixClient/bitrix.go index b3d6c6a..ecb0867 100644 --- a/pkg/bitrixClient/bitrix.go +++ b/pkg/bitrixClient/bitrix.go @@ -202,6 +202,7 @@ func (b *Bitrix) GetListPipelines(entityTypeID models.IntegerEntityType, accessT func (b *Bitrix) GetListFields(fieldType models.FieldsType, accessToken string, domain string) (*models.FieldsResponse, error) { for { if b.rateLimiter.Check() { + var listFields models.FieldsResponse switch fieldType { case models.FieldTypeCompany: fullURL := fmt.Sprintf("https://%s/rest/crm.company.userfield.list", domain) @@ -227,7 +228,6 @@ func (b *Bitrix) GetListFields(fieldType models.FieldsType, accessToken string, return nil, fmt.Errorf(errorMessage) } - var listFields models.FieldsResponse err := json.Unmarshal(resBody, &listFields) if err != nil { b.logger.Error("error unmarshal models.Company:", zap.Error(err)) @@ -260,7 +260,6 @@ func (b *Bitrix) GetListFields(fieldType models.FieldsType, accessToken string, return nil, fmt.Errorf(errorMessage) } - var listFields models.FieldsResponse err := json.Unmarshal(resBody, &listFields) if err != nil { b.logger.Error("error unmarshal models.Lead:", zap.Error(err)) @@ -293,7 +292,6 @@ func (b *Bitrix) GetListFields(fieldType models.FieldsType, accessToken string, return nil, fmt.Errorf(errorMessage) } - var listFields models.FieldsResponse err := json.Unmarshal(resBody, &listFields) if err != nil { b.logger.Error("error unmarshal models.Contact:", zap.Error(err)) @@ -325,7 +323,6 @@ func (b *Bitrix) GetListFields(fieldType models.FieldsType, accessToken string, return nil, fmt.Errorf(errorMessage) } - var listFields models.FieldsResponse err := json.Unmarshal(resBody, &listFields) if err != nil { b.logger.Error("error unmarshal models.Company:", zap.Error(err)) @@ -376,3 +373,147 @@ func (b *Bitrix) GetCurrentUser(accessToken string, domain string) (*models.Resp time.Sleep(b.rateLimiter.Interval) } } + +// before neeed call req.GenFieldName() +func (b *Bitrix) AddFields(req models.AddFields, entity models.FieldsType, accessToken string, domain string) (int64, error) { + for { + if b.rateLimiter.Check() { + var result models.AddFieldsResponse + switch entity { + case models.FieldTypeContact: + bodyBytes, err := json.Marshal(req) + if err != nil { + b.logger.Error("error marshal req in Add Fields:", zap.Error(err)) + return 0, err + } + + uri := fmt.Sprintf("https://%s/rest/crm.contact.userfield.add", domain) + agent := b.fiberClient.Post(uri) + agent.Set("Content-Type", "application/json").Body(bodyBytes) + agent.Set("Authorization", "Bearer "+accessToken) + + statusCode, resBody, errs := agent.Bytes() + if len(errs) > 0 { + for _, err := range errs { + b.logger.Error("error sending request in AddFields", zap.Error(err)) + } + return 0, fmt.Errorf("request AddFields failed: %v", errs[0]) + } + + if statusCode != fiber.StatusOK { + errorMessage := fmt.Sprintf("error AddFields contact statusCode - %d, respBody - %s", statusCode, string(resBody)) + b.logger.Error(errorMessage, zap.Int("status", statusCode)) + return 0, fmt.Errorf(errorMessage) + } + + err = json.Unmarshal(resBody, &result) + if err != nil { + b.logger.Error("error unmarshal AddFields", zap.Error(err)) + return 0, err + } + + return result.ID, nil + case models.FieldTypeCompany: + bodyBytes, err := json.Marshal(req) + if err != nil { + b.logger.Error("error marshal req in Add Fields:", zap.Error(err)) + return 0, err + } + + uri := fmt.Sprintf("https://%s/rest/crm.company.userfield.add", domain) + agent := b.fiberClient.Post(uri) + agent.Set("Content-Type", "application/json").Body(bodyBytes) + agent.Set("Authorization", "Bearer "+accessToken) + + statusCode, resBody, errs := agent.Bytes() + if len(errs) > 0 { + for _, err := range errs { + b.logger.Error("error sending request in AddFields", zap.Error(err)) + } + return 0, fmt.Errorf("request AddFields failed: %v", errs[0]) + } + + if statusCode != fiber.StatusOK { + errorMessage := fmt.Sprintf("error AddFields company statusCode - %d, respBody - %s", statusCode, string(resBody)) + b.logger.Error(errorMessage, zap.Int("status", statusCode)) + return 0, fmt.Errorf(errorMessage) + } + + err = json.Unmarshal(resBody, &result) + if err != nil { + b.logger.Error("error unmarshal AddFields", zap.Error(err)) + return 0, err + } + + return result.ID, nil + case models.FieldTypeDeal: + bodyBytes, err := json.Marshal(req) + if err != nil { + b.logger.Error("error marshal req in Add Fields:", zap.Error(err)) + return 0, err + } + + uri := fmt.Sprintf("https://%s/rest/crm.deal.userfield.add", domain) + agent := b.fiberClient.Post(uri) + agent.Set("Content-Type", "application/json").Body(bodyBytes) + agent.Set("Authorization", "Bearer "+accessToken) + + statusCode, resBody, errs := agent.Bytes() + if len(errs) > 0 { + for _, err := range errs { + b.logger.Error("error sending request in AddFields", zap.Error(err)) + } + return 0, fmt.Errorf("request AddFields failed: %v", errs[0]) + } + + if statusCode != fiber.StatusOK { + errorMessage := fmt.Sprintf("error AddFields deal statusCode - %d, respBody - %s", statusCode, string(resBody)) + b.logger.Error(errorMessage, zap.Int("status", statusCode)) + return 0, fmt.Errorf(errorMessage) + } + + err = json.Unmarshal(resBody, &result) + if err != nil { + b.logger.Error("error unmarshal AddFields", zap.Error(err)) + return 0, err + } + + return result.ID, nil + case models.FieldTypeLead: + bodyBytes, err := json.Marshal(req) + if err != nil { + b.logger.Error("error marshal req in Add Fields:", zap.Error(err)) + return 0, err + } + + uri := fmt.Sprintf("https://%s/rest/crm.lead.userfield.add", domain) + agent := b.fiberClient.Post(uri) + agent.Set("Content-Type", "application/json").Body(bodyBytes) + agent.Set("Authorization", "Bearer "+accessToken) + + statusCode, resBody, errs := agent.Bytes() + if len(errs) > 0 { + for _, err := range errs { + b.logger.Error("error sending request in AddFields", zap.Error(err)) + } + return 0, fmt.Errorf("request AddFields failed: %v", errs[0]) + } + + if statusCode != fiber.StatusOK { + errorMessage := fmt.Sprintf("error AddFields lead statusCode - %d, respBody - %s", statusCode, string(resBody)) + b.logger.Error(errorMessage, zap.Int("status", statusCode)) + return 0, fmt.Errorf(errorMessage) + } + + err = json.Unmarshal(resBody, &result) + if err != nil { + b.logger.Error("error unmarshal AddFields", zap.Error(err)) + return 0, err + } + + return result.ID, nil + } + } + time.Sleep(b.rateLimiter.Interval) + } +} diff --git a/pkg/bitrixClient/bitrix_test.go b/pkg/bitrixClient/bitrix_test.go index 8a133b7..02f2025 100644 --- a/pkg/bitrixClient/bitrix_test.go +++ b/pkg/bitrixClient/bitrix_test.go @@ -2,9 +2,9 @@ package bitrixClient import ( "context" - "encoding/json" "fmt" "go.uber.org/zap" + "penahub.gitlab.yandexcloud.net/backend/quiz/bitrix/internal/models" "penahub.gitlab.yandexcloud.net/backend/quiz/bitrix/internal/workers/limiter" "testing" "time" @@ -22,10 +22,28 @@ func TestGetListFields(t *testing.T) { RateLimiter: lim, }) - result, err := b.GetCurrentUser("9213f0660000071b00717f92000000010000070cbbcdb7c07c2a5e9668d3f7b04c4f8f", "b24-ld76ub.bitrix24.ru") - if err != nil { - fmt.Println(err) + arr := []models.FieldsType{models.FieldTypeLead, models.FieldTypeCompany, models.FieldTypeContact, models.FieldTypeDeal} + + for _, tipe := range arr { + req := models.AddFields{ + EditFormLabel: "ТЕСТОВАЯ СТРОКА ОТ АПИ ГОГОГОГОГОГОГОГОГГО", + ListColumnLabel: "ТЕСТОВАЯ СТРОКА ОТ АПИ ГОГОГОГОГОГОГОГОГГО", + UserTypeID: "string", + Settings: map[string]interface{}{ + "DEFAULT_VALUE": "GOGOGOGOGOGOGO!", + }} + req.GenFieldName() + result, err := b.AddFields(req, tipe, "6142f1660000071b00717f92000000010000075c982e18665711d1c3e5749d1dda6679", "b24-ld76ub.bitrix24.ru") + if err != nil { + fmt.Println(err) + } + fmt.Println(result) } - r, _ := json.Marshal(result) - fmt.Println(string(r)) + + //result, err := b.GetListFields(models.FieldTypeLead, "3434f1660000071b00717f920000000100000748ae9cd373ba39739040870e7dc9fb99", "b24-ld76ub.bitrix24.ru") + //if err != nil { + // fmt.Println(err) + //} + //r, _ := json.Marshal(result) + //fmt.Println(string(r)) }