common/repository/bitrix/bitrix.go

889 lines
22 KiB
Go

package bitrix
import (
"context"
"database/sql"
"encoding/json"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal/sqlcgen"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
"time"
)
type BitrixRepository struct {
queries *sqlcgen.Queries
pool *sql.DB
}
type Deps struct {
Queries *sqlcgen.Queries
Pool *sql.DB
}
func NewBitrixRepository(deps Deps) *BitrixRepository {
return &BitrixRepository{
queries: deps.Queries,
pool: deps.Pool,
}
}
// методы компании
func (r *BitrixRepository) GettingUserWithPagination(ctx context.Context, req *model.PaginationReq, accountID string) (*model.UserListBitrixResp, error) {
rows, err := r.queries.GetUsersBitrixWithPagination(ctx, sqlcgen.GetUsersBitrixWithPaginationParams{
Accountid: accountID,
Column2: req.Page,
Limit: req.Size,
})
if err != nil {
return nil, err
}
var users []model.BitrixAccountUser
var count int64
for _, row := range rows {
users = append(users, model.BitrixAccountUser{
ID: row.ID,
AccountID: row.Accountid,
BitrixIDUserID: row.Bitrixiduserid,
Name: row.Name,
LastName: row.Lastname,
SecondName: row.Secondname,
Title: row.Title,
Email: row.Email,
UFDepartment: row.Ufdepartment,
WorkPosition: row.Workposition,
CreatedAt: row.Createdat,
})
count = row.TotalCount
}
resp := model.UserListBitrixResp{
Count: count,
Items: users,
}
return &resp, nil
}
func (r *BitrixRepository) SoftDeleteAccount(ctx context.Context, accountID string) error {
err := r.queries.SoftDeleteBitrixAccount(ctx, accountID)
if err != nil {
return err
}
return nil
}
func (r *BitrixRepository) GetCurrentAccount(ctx context.Context, accountID string) (*model.BitrixAccount, error) {
row, err := r.queries.GetCurrentBitrixCompany(ctx, accountID)
if err != nil {
return nil, err
}
user := model.BitrixAccount{
ID: row.ID,
AccountID: row.Accountid,
BitrixID: row.Bitrixid,
CreatedAt: row.Createdat,
Subdomain: row.Subdomain,
}
_, err = r.queries.CheckExpiredBitrixToken(ctx, accountID)
if err != nil {
if err == sql.ErrNoRows {
user.Stale = false
return &user, nil
}
return nil, err
}
user.Stale = true
return &user, nil
}
func (r *BitrixRepository) UpdateCurrentAccount(ctx context.Context, user model.BitrixAccount) error {
err := r.queries.UpdateBitrixAccount(ctx, sqlcgen.UpdateBitrixAccountParams{
Accountid: user.AccountID,
Subdomain: user.Subdomain,
})
if err != nil {
return err
}
return nil
}
func (r *BitrixRepository) CreateAccount(ctx context.Context, userInfo model.BitrixAccount) error {
err := r.queries.CreateBitrixAccount(ctx, sqlcgen.CreateBitrixAccountParams{
Accountid: userInfo.AccountID,
Subdomain: userInfo.Subdomain,
Bitrixid: userInfo.BitrixID,
})
if err != nil {
return err
}
return nil
}
// методы пользователей
func (r *BitrixRepository) AddBitrixAccountUser(ctx context.Context, user model.BitrixAccountUser) error {
err := r.queries.AddBitrixAccountUser(ctx, sqlcgen.AddBitrixAccountUserParams{
Accountid: user.AccountID,
Bitrixiduserid: user.BitrixIDUserID,
Name: user.Name,
Lastname: user.LastName,
Secondname: user.SecondName,
Title: user.Title,
Email: user.Email,
Ufdepartment: user.UFDepartment,
Workposition: user.WorkPosition,
})
if err != nil {
return err
}
return nil
}
func (r *BitrixRepository) UpdateBitrixAccountUser(ctx context.Context, user model.BitrixAccountUser) error {
err := r.queries.UpdateBitrixAccountUser(ctx, sqlcgen.UpdateBitrixAccountUserParams{
Accountid: user.AccountID,
Bitrixiduserid: user.BitrixIDUserID,
Name: user.Name,
Lastname: user.LastName,
Secondname: user.SecondName,
Title: user.Title,
Email: user.Email,
Ufdepartment: user.UFDepartment,
Workposition: user.WorkPosition,
})
if err != nil {
return err
}
return nil
}
func (r *BitrixRepository) GetTokenByID(ctx context.Context, accountID string) (*model.Token, error) {
row, err := r.queries.GetBitrixTokenById(ctx, accountID)
if err != nil {
return nil, err
}
return &model.Token{
AccountID: row.Accountid,
RefreshToken: row.Refreshtoken,
AccessToken: row.Accesstoken,
AuthCode: row.Authcode,
Expiration: row.Expiration.Unix(),
CreatedAt: row.Createdat.Unix(),
}, nil
}
func (r *BitrixRepository) DeleteUsers(ctx context.Context, ids []int64) error {
err := r.queries.DeleteBitrixUsers(ctx, ids)
if err != nil {
return err
}
return nil
}
func (r *BitrixRepository) GetUserUsersByID(ctx context.Context, bitrixCompanyID string) ([]model.BitrixAccountUser, error) {
rows, err := r.queries.GetUserUsersByIDBitrix(ctx, bitrixCompanyID)
if err != nil {
return nil, err
}
var users []model.BitrixAccountUser
for _, row := range rows {
users = append(users, model.BitrixAccountUser{
ID: row.ID,
AccountID: row.Accountid,
BitrixIDUserID: row.Bitrixiduserid,
Name: row.Name,
LastName: row.Lastname,
SecondName: row.Secondname,
Title: row.Title,
Email: row.Email,
UFDepartment: row.Ufdepartment,
WorkPosition: row.Workposition,
CreatedAt: row.Createdat,
})
}
return users, nil
}
// методы webhook
func (r *BitrixRepository) WebhookCreate(ctx context.Context, tokens model.Token) error {
err := r.queries.CreateBitrixWebHook(ctx, sqlcgen.CreateBitrixWebHookParams{
Accountid: tokens.AccountID,
Refreshtoken: tokens.RefreshToken,
Accesstoken: tokens.AccessToken,
Authcode: tokens.AuthCode,
Expiration: time.Unix(tokens.Expiration, 0).In(time.Unix(tokens.CreatedAt, 0).Location()),
Createdat: time.Unix(tokens.CreatedAt, 0),
})
if err != nil {
return err
}
return nil
}
func (r *BitrixRepository) WebhookUpdate(ctx context.Context, token model.Token) error {
err := r.queries.WebhookBitrixUpdate(ctx, sqlcgen.WebhookBitrixUpdateParams{
Accesstoken: token.AccessToken,
Refreshtoken: token.RefreshToken,
Accountid: token.AccountID,
Column3: token.Expiration,
Column4: token.CreatedAt,
})
if err != nil {
return err
}
return nil
}
func (r *BitrixRepository) GetAllTokens(ctx context.Context) ([]model.Token, error) {
rows, err := r.queries.GetAllBitrixTokens(ctx)
if err != nil {
return nil, err
}
var tokens []model.Token
for _, row := range rows {
tokens = append(tokens, model.Token{
AccountID: row.Accountid,
AccessToken: row.Accesstoken,
RefreshToken: row.Refreshtoken,
AuthCode: row.Authcode,
Expiration: row.Expiration.Unix(),
CreatedAt: row.Createdat.Unix(),
})
}
return tokens, nil
}
func (r *BitrixRepository) WebhookDelete(ctx context.Context, bitrixID string) error {
err := r.queries.WebhookBitrixDelete(ctx, bitrixID)
if err != nil {
return err
}
return nil
}
// методы pipelines
func (r *BitrixRepository) GetPipelinesWithPagination(ctx context.Context, req *model.PaginationReq, accountID string) (*model.UserBitrixListPipelinesResp, error) {
rows, err := r.queries.GetBitrixPipelinesWithPagination(ctx, sqlcgen.GetBitrixPipelinesWithPaginationParams{
Accountid: accountID,
Column2: req.Page,
Limit: req.Size,
})
if err != nil {
return nil, err
}
var count int64
var pipelines []model.PipelineBitrix
for _, row := range rows {
count = row.TotalCount
pipelines = append(pipelines, model.PipelineBitrix{
ID: row.ID,
BitrixID: row.Bitrixid,
AccountID: row.Accountid,
Name: row.Name,
EntityTypeId: model.IntegerEntityType(row.Entitytypeid),
Createdat: row.Createdat.Unix(),
})
}
resp := model.UserBitrixListPipelinesResp{
Count: count,
Items: pipelines,
}
return &resp, nil
}
func (r *BitrixRepository) CheckPipelines(ctx context.Context, pipelines []model.PipelineBitrix) error {
dollar1, err := json.Marshal(pipelines)
if err != nil {
return err
}
rows, err := r.queries.CheckBitrixPipelines(ctx, dollar1)
if err != nil {
return err
}
if rows != nil {
var toUpdate []model.PipelineBitrix
for _, row := range rows {
to := model.PipelineBitrix{
BitrixID: row.Bitrixid,
AccountID: row.Accountid,
Name: row.Name,
EntityTypeId: model.IntegerEntityType(row.Entitytypeid),
}
toUpdate = append(toUpdate, to)
}
dollar1, err := json.Marshal(toUpdate)
if err != nil {
return err
}
err = r.queries.UpdateBitrixPipelines(ctx, dollar1)
if err != nil {
return err
}
}
return nil
}
func (r *BitrixRepository) DeletePipelines(ctx context.Context, ids []int64) error {
err := r.queries.DeleteBitrixPipelines(ctx, ids)
if err != nil {
return err
}
return nil
}
func (r *BitrixRepository) GetUserPipelinesByID(ctx context.Context, bitrixID string) ([]model.PipelineBitrix, error) {
rows, err := r.queries.GetUserBitrixPipelinesByID(ctx, bitrixID)
if err != nil {
return nil, err
}
var pipelines []model.PipelineBitrix
for _, row := range rows {
pipeline := model.PipelineBitrix{
ID: row.ID,
BitrixID: row.Bitrixid,
AccountID: row.Accountid,
Name: row.Name,
EntityTypeId: model.IntegerEntityType(row.Entitytypeid),
}
pipelines = append(pipelines, pipeline)
}
return pipelines, nil
}
// методы steps
func (r *BitrixRepository) GetStepsWithPagination(ctx context.Context, req *model.PaginationReq, bitrixID string) (*model.UserListBitrixStepsResp, error) {
rows, err := r.queries.GetBitrixStepsWithPagination(ctx, sqlcgen.GetBitrixStepsWithPaginationParams{
Accountid: bitrixID,
Column2: req.Page,
Limit: req.Size,
})
if err != nil {
return nil, err
}
var count int64
var steps []model.StepBitrix
for _, row := range rows {
count = row.TotalCount
steps = append(steps, model.StepBitrix{
ID: row.ID,
AccountID: row.Accountid,
BitrixID: row.Bitrixid,
EntityID: row.Entityid,
StatusID: row.Statusid,
Name: row.Name,
NameInit: row.Nameinit,
Color: row.Color,
PipelineID: row.Pipelineid,
Createdat: row.Createdat.Unix(),
})
}
resp := model.UserListBitrixStepsResp{
Count: count,
Items: steps,
}
return &resp, nil
}
// todo
func (r *BitrixRepository) CheckSteps(ctx context.Context, steps []model.StepBitrix) error {
dollar1, err := json.Marshal(steps)
if err != nil {
return err
}
rows, err := r.queries.CheckBitrixSteps(ctx, dollar1)
if err != nil {
return err
}
if rows != nil {
var toUpdate []model.StepBitrix
for _, row := range rows {
to := model.StepBitrix{
AccountID: row.Accountid,
BitrixID: row.Bitrixid,
Name: row.Name,
EntityID: row.Entityid,
StatusID: row.Statusid,
NameInit: row.Nameinit,
Color: row.Color,
PipelineID: row.Pipelineid,
}
toUpdate = append(toUpdate, to)
}
dollar1, err := json.Marshal(toUpdate)
if err != nil {
return err
}
err = r.queries.UpdateBitrixSteps(ctx, dollar1)
if err != nil {
return err
}
}
return nil
}
func (r *BitrixRepository) DeleteSteps(ctx context.Context, ids []int64) error {
err := r.queries.DeleteBitrixSteps(ctx, ids)
if err != nil {
return err
}
return nil
}
func (r *BitrixRepository) GetUserStepsByID(ctx context.Context, bitrixID string) ([]model.StepBitrix, error) {
rows, err := r.queries.GetUserBitrixStepsByID(ctx, bitrixID)
if err != nil {
return nil, err
}
var steps []model.StepBitrix
for _, row := range rows {
steps = append(steps, model.StepBitrix{
ID: row.ID,
AccountID: row.Accountid,
BitrixID: row.Bitrixid,
StatusID: row.Statusid,
EntityID: row.Entityid,
Name: row.Name,
NameInit: row.Nameinit,
Color: row.Color,
PipelineID: row.Pipelineid,
})
}
return steps, nil
}
// методы tags todo
// методы fields
func (r *BitrixRepository) GetFieldsWithPagination(ctx context.Context, req *model.PaginationReq, accountID string) (*model.UserListBitrixFieldsResp, error) {
rows, err := r.queries.GetBitrixFieldsWithPagination(ctx, sqlcgen.GetBitrixFieldsWithPaginationParams{
Accountid: accountID,
Column2: req.Page,
Limit: req.Size,
})
if err != nil {
return nil, err
}
var count int64
var fields []model.BitrixField
for _, row := range rows {
count = row.TotalCount
var entityID model.FieldsType
v := string(row.Entityid.([]byte))
entityID = model.FieldsType(v)
var fieldType model.CustomFieldsType
f := string(row.Fieldtype.([]byte))
fieldType = model.CustomFieldsType(f)
fields = append(fields, model.BitrixField{
ID: row.ID,
AccountID: row.Accountid,
EntityID: entityID,
FieldName: row.Fieldname,
EditFromLabel: row.Editfromlabel,
FieldType: fieldType,
Createdat: row.Createdat.Unix(),
BitrixID: row.Bitrixid,
})
}
resp := model.UserListBitrixFieldsResp{
Count: count,
Items: fields,
}
return &resp, nil
}
func (r *BitrixRepository) CheckFields(ctx context.Context, fields []model.BitrixField, accountID string) error {
column2, err := json.Marshal(fields)
if err != nil {
return err
}
rows, err := r.queries.CheckBitrixFields(ctx, sqlcgen.CheckBitrixFieldsParams{
Accountid: accountID,
Column2: column2,
})
if err != nil {
return err
}
if rows != nil {
var toUpdate []model.BitrixField
for _, row := range rows {
var entityID model.FieldsType
v := string(row.Entityid.([]byte))
entityID = model.FieldsType(v)
var fieldType model.CustomFieldsType
f := string(row.Fieldtype.([]byte))
fieldType = model.CustomFieldsType(f)
toUpdate = append(toUpdate, model.BitrixField{
AccountID: row.Accountid,
EntityID: entityID,
FieldName: row.Fieldname,
EditFromLabel: row.Editfromlabel,
FieldType: fieldType,
BitrixID: row.Bitrixid,
})
}
dollar1, err := json.Marshal(toUpdate)
if err != nil {
return err
}
err = r.queries.UpdateBitrixFields(ctx, dollar1)
if err != nil {
return err
}
}
return nil
}
func (r *BitrixRepository) GetUserFieldsByID(ctx context.Context, bitrixID string) ([]model.BitrixField, error) {
rows, err := r.queries.GetUserBitrixFieldsByID(ctx, bitrixID)
if err != nil {
return nil, err
}
var fields []model.BitrixField
for _, row := range rows {
var entityID model.FieldsType
v := string(row.Entityid.([]byte))
entityID = model.FieldsType(v)
var fieldType model.CustomFieldsType
f := string(row.Fieldtype.([]byte))
fieldType = model.CustomFieldsType(f)
fields = append(fields, model.BitrixField{
ID: row.ID,
AccountID: row.Accountid,
FieldName: row.Fieldname,
EditFromLabel: row.Editfromlabel,
Createdat: row.Createdat.Unix(),
EntityID: entityID,
FieldType: fieldType,
BitrixID: row.Bitrixid,
})
}
return fields, err
}
func (r *BitrixRepository) DeleteFields(ctx context.Context, ids []int64) error {
err := r.queries.DeleteBitrixFields(ctx, ids)
if err != nil {
return err
}
return nil
}
// todo mb by name? bec in create field return int id, but getting list return string ))
func (r *BitrixRepository) GetFieldByID(ctx context.Context, bitrixID string) (*model.BitrixField, error) {
row, err := r.queries.GetBitrixFieldByID(ctx, bitrixID)
if err != nil {
return nil, err
}
var entityID model.FieldsType
v := string(row.Entityid.([]byte))
entityID = model.FieldsType(v)
var fieldType model.CustomFieldsType
f := string(row.Fieldtype.([]byte))
fieldType = model.CustomFieldsType(f)
return &model.BitrixField{
ID: row.ID,
AccountID: row.Accountid,
FieldName: row.Fieldname,
EditFromLabel: row.Editfromlabel,
Createdat: row.Createdat.Unix(),
EntityID: entityID,
FieldType: fieldType,
BitrixID: row.Bitrixid,
}, nil
}
// методы rules
func (r *BitrixRepository) ChangeQuizSettings(ctx context.Context, request *model.BitrixRulesReq, accountID string, quizID int) error {
jsonFieldRule, err := json.Marshal(request.FieldsRule)
if err != nil {
return err
}
jsonTagsToAdd, err := json.Marshal(request.TagsToAdd)
if err != nil {
return err
}
_, err = r.queries.ChangeBitrixQuizSettings(ctx, sqlcgen.ChangeBitrixQuizSettingsParams{
Performerid: request.PerformerID,
Pipelineid: request.PipelineID,
Typeid: request.TypeID,
Stageid: request.StageID,
Sourceid: request.SourceID,
Fieldsrule: jsonFieldRule,
Tagstoadd: jsonTagsToAdd,
Leadflag: request.LeadFlag,
Accountid: accountID,
Quizid: int32(quizID),
Statusid: request.StatusID,
})
if err != nil {
return err
}
return nil
}
func (r *BitrixRepository) SetQuizSettings(ctx context.Context, request *model.BitrixRulesReq, accountID string, quizID int) error {
jsonFieldRule, err := json.Marshal(request.FieldsRule)
if err != nil {
return err
}
jsonTagsToAdd, err := json.Marshal(request.TagsToAdd)
if err != nil {
return err
}
_, err = r.queries.SetBitrixQuizSettings(ctx, sqlcgen.SetBitrixQuizSettingsParams{
Performerid: request.PerformerID,
Pipelineid: request.PipelineID,
Typeid: request.TypeID,
Stageid: request.StageID,
Sourceid: request.SourceID,
Fieldsrule: jsonFieldRule,
Tagstoadd: jsonTagsToAdd,
Accountid: accountID,
Quizid: int32(quizID),
Leadflag: request.LeadFlag,
Statusid: request.StatusID,
})
if err != nil {
return err
}
return nil
}
func (r *BitrixRepository) GettingQuizRules(ctx context.Context, quizID int) (*model.BitrixRule, error) {
row, err := r.queries.GetBitrixQuizRule(ctx, int32(quizID))
if err != nil {
return nil, err
}
var fieldsRule model.BitrixFieldRules
err = json.Unmarshal(row.Fieldsrule, &fieldsRule)
if err != nil {
return nil, err
}
var tagsToAdd model.TagsToAdd
err = json.Unmarshal(row.Tagstoadd, &tagsToAdd)
if err != nil {
return nil, err
}
return &model.BitrixRule{
ID: row.ID,
AccountID: row.Accountid,
QuizID: row.Quizid,
PerformerID: row.Performerid,
PipelineID: row.Pipelineid,
TypeID: row.Typeid,
StageID: row.Stageid,
SourceID: row.Sourceid,
FieldsRule: fieldsRule,
TagsToAdd: tagsToAdd,
LeadFlag: row.Leadflag,
StatusID: row.Statusid,
}, nil
}
func (r *BitrixRepository) UpdateFieldRules(ctx context.Context, fieldRules model.BitrixFieldRules, accountID string, quizID int32) error {
jsonFieldsRule, err := json.Marshal(fieldRules)
if err != nil {
return err
}
err = r.queries.UpdateBitrixFieldRules(ctx, sqlcgen.UpdateBitrixFieldRulesParams{
Fieldsrule: jsonFieldsRule,
Accountid: accountID,
Quizid: quizID,
})
if err != nil {
return err
}
return nil
}
// todo need check
func (r *BitrixRepository) GettingBitrixUsersTrueResults(ctx context.Context) ([]model.BitrixUsersTrueResults, error) {
rows, err := r.queries.GettingBitrixUsersTrueResults(ctx)
if err != nil {
return nil, err
}
var results []model.BitrixUsersTrueResults
for _, row := range rows {
var fieldsRule model.BitrixFieldRules
err = json.Unmarshal(row.Fieldsrule, &fieldsRule)
if err != nil {
return nil, err
}
var utm model.UTMSavingMap
err = json.Unmarshal(row.Utm.([]byte), &utm)
if err != nil {
return nil, err
}
var tagsToAdd model.TagsToAdd
err = json.Unmarshal(row.Tagstoadd, &tagsToAdd)
if err != nil {
return nil, err
}
result := model.BitrixUsersTrueResults{
QuizID: row.QuizID,
AnswerID: row.ID,
Result: row.Result.Bool,
QuestionID: row.QuestionID,
Content: row.Content.String,
Session: row.Session.String,
AccessToken: row.Accesstoken,
AmoAccountID: row.Accountid,
UTMs: utm,
FieldsRule: fieldsRule,
TagsToAdd: tagsToAdd,
PerformerID: row.Performerid,
TypeID: row.Typeid,
StageID: row.Stageid,
SourceID: row.Sourceid,
PipelineID: row.Pipelineid,
PerformerName: row.PerformerName,
SubDomain: row.Subdomain,
QuizAccountID: row.Accountid_2,
LeadFlag: row.Leadflag,
StatusID: row.Statusid,
}
results = append(results, result)
}
return results, nil
}
// методы bitrixCRMStatuses todo
type SaveDealBitrixDeps struct {
DealID int32
AnswerID int64
Status string
AccessToken string
}
func (r *BitrixRepository) SaveDealBitrixStatus(ctx context.Context, deps SaveDealBitrixDeps) error {
err := r.queries.SettingDealBitrixStatus(ctx, sqlcgen.SettingDealBitrixStatusParams{
Dealid: deps.DealID,
Answerid: deps.AnswerID,
Status: deps.Status,
Accesstoken: deps.AccessToken,
})
if err != nil {
return err
}
return nil
}
// методы для contact в амо
func (r *BitrixRepository) GetExistingContactBitrix(ctx context.Context, accountID string, fields []string) (map[int32][]model.ContactBitrix, error) {
rows, err := r.queries.GetExistingContactBitrix(ctx, sqlcgen.GetExistingContactBitrixParams{
Accountid: accountID,
Column2: fields,
})
if err != nil {
if err == sql.ErrNoRows {
return nil, pj_errors.ErrNotFound
}
return nil, err
}
result := make(map[int32][]model.ContactBitrix)
for _, row := range rows {
result[row.Bitrixid] = append(result[row.Bitrixid], model.ContactBitrix{
ID: row.ID,
BitrixID: row.Bitrixid,
AccountID: row.Accountid,
Field: row.Field,
})
}
return result, nil
}
func (r *BitrixRepository) InsertContactBitrix(ctx context.Context, val model.ContactBitrix) (int32, error) {
amoID, err := r.queries.InsertContactBitrix(ctx, sqlcgen.InsertContactBitrixParams{
Accountid: val.AccountID,
Bitrixid: val.BitrixID,
Field: val.Field,
})
if err != nil {
return 0, err
}
return amoID, err
}
func (r *BitrixRepository) UpdateBitrixContact(ctx context.Context, id int64, field string, newBitrixID int32) error {
err := r.queries.UpdateBitrixContact(ctx, sqlcgen.UpdateBitrixContactParams{
Field: field,
ID: id,
Bitrixid: newBitrixID,
})
if err != nil {
return err
}
return nil
}