package service import ( "amocrm/internal/models" "amocrm/internal/models/amo" "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 } // получаем информацию о пользователе по аксес токену 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) 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, 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 }