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" "time" ) type ParamsWebhookCreate struct { Code string // Authorization 20 минут Referer string // адрес аккаунта пользователя State string // строка которая передавалась в соц аус сервисе FromWidget string Platform string // ru/global 1/2 } func (s *Service) WebhookCreate(ctx context.Context, req ParamsWebhookCreate) error { accountID, err := s.encrypt.DecryptStr([]byte(req.State)) if err != nil { s.logger.Error("error decrypted state in service WebhookCreate:", zap.Error(err)) return err } // получаем аксес и рефреш токены по коду авторизации forGetTokens := amo.CreateWebHookReq{ GrantType: "authorization_code", Code: req.Code, } tokens, err := s.amoClient.CreateWebHook(&forGetTokens) if err != nil { 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 } 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 } err = s.repository.WebhookCreate(ctx, models.Token{ ObjID: primitive.NewObjectID(), RefreshToken: tokens.RefreshToken, AccessToken: tokens.AccessToken, AccountID: accountID, AuthCode: req.Code, Expiration: time.Now().Unix() + tokens.ExpiresIn, CreatedAt: time.Now().Unix(), }) if err != nil { s.logger.Error("error adding tokens to mongo on service WebhookCreate", zap.Error(err)) return err } return nil } func (s *Service) WebhookDelete(ctx context.Context) error { err := s.repository.WebhookDelete(ctx) if err != nil { return err } return nil }