package tokens import ( "amocrm/internal/models" "amocrm/pkg/amoClient" "context" "go.uber.org/zap" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model" "time" ) type Deps struct { AmoClient *amoClient.Amo Repo *dal.AmoDal Logger *zap.Logger } type Token struct { amoClient *amoClient.Amo repo *dal.AmoDal logger *zap.Logger } func NewRefreshWC(deps Deps) *Token { return &Token{ amoClient: deps.AmoClient, repo: deps.Repo, logger: deps.Logger, } } func (wc *Token) Start(ctx context.Context) { ticker := time.NewTicker(5 * time.Minute) defer ticker.Stop() for { select { case <-ticker.C: wc.processTasks(ctx) case <-ctx.Done(): return } } } func (wc *Token) processTasks(ctx context.Context) { tokens, err := wc.repo.AmoRepo.CheckExpired(ctx) if err != nil { wc.logger.Error("error fetch expired tokens in mongo", zap.Error(err)) return } for _, token := range tokens { req := models.UpdateWebHookReq{ GrantType: "refresh_token", RefreshToken: token.RefreshToken, } newTokens, err := wc.amoClient.CreateWebHook(&req) if err != nil { wc.logger.Error("error create webhook for update tokens", zap.Error(err)) continue } err = wc.repo.AmoRepo.WebhookUpdate(ctx, model.Token{ AccountID: token.AccountID, RefreshToken: newTokens.RefreshToken, AccessToken: newTokens.AccessToken, Expiration: time.Now().Unix() + newTokens.ExpiresIn, CreatedAt: time.Now().Unix(), }) if err != nil { wc.logger.Error("error update new tokens in mongo", zap.Error(err)) continue } } } func (wc *Token) Stop(ctx context.Context) error { return nil }