package workers import ( "context" "go.uber.org/zap" "mailnotifier/internal/clients" "mailnotifier/internal/proto/notifyer" "mailnotifier/internal/repository" "time" ) //todo тут будут заембенжены шаблоны type Notifyer struct { repo *repository.Repository mailClient *clients.MailClient customerClient *clients.Customer quizClient *clients.QuizClient logger *zap.Logger } type NotifyerDeps struct { Repo *repository.Repository MailClient *clients.MailClient CustomerClient *clients.Customer QuizClient *clients.QuizClient Logger *zap.Logger } func NewNotifyer(deps NotifyerDeps) *Notifyer { return &Notifyer{ repo: deps.Repo, mailClient: deps.MailClient, customerClient: deps.CustomerClient, quizClient: deps.QuizClient, logger: deps.Logger, } } func (n *Notifyer) Start(ctx context.Context) { tiker := time.NewTicker(30 * time.Minute) defer tiker.Stop() for { select { case <-tiker.C: n.notify(ctx) case <-ctx.Done(): return } } } func (n *Notifyer) notify(ctx context.Context) { records, err := n.repo.GetMany(ctx) if err != nil { n.logger.Error("error getting records from mongo", zap.Error(err)) } now := time.Now() for _, record := range records { if record.SendRegistration && !record.SendNoneCreated && now.Sub(record.SendAt) >= 7*24*time.Hour { record.SendNoneCreated = true err = n.repo.Update(ctx, record) if err != nil { n.logger.Error("error updating record for checkCreatedQuiz:", zap.Error(err)) continue } // тут запрос к кору на получение всех квизов, если длина больше 0, то отправляем письмо resp, err := n.quizClient.GetQuizzes(ctx, ¬ifyer.GetQuizzesRequest{ AccountId: record.AccountID, }) if err != nil { n.logger.Error("error getting all created quizzes from core rpc:", zap.Error(err)) continue } if len(resp.QuizIds) > 0 { // отправка письма err = n.mailClient.MailSender(clients.SenderDeps{ Subject: "checkCreatedQuiz", Email: record.Email, TmplPath: "checkCreatedQuiz", // todo заменить на шаблон }) if err != nil { n.logger.Error("error sending message to mailbox checkCreatedQuiz:", zap.Error(err)) } } } if record.SendRegistration && !record.SendUnpublished && now.Sub(record.SendAt) >= 14*24*time.Hour { record.SendUnpublished = true err = n.repo.Update(ctx, record) if err != nil { n.logger.Error("error updating record for checkPublishedQuiz:", zap.Error(err)) continue } // тут запрос к кору на получение всех квизов со start = true, если нет ниодного со start true, то отправляем письмо resp, err := n.quizClient.GetStartedQuizzes(ctx, ¬ifyer.GetStartedQuizzesRequest{ AccountId: record.AccountID, }) if err != nil { n.logger.Error("error getting all started quizzes from core rpc:", zap.Error(err)) continue } if len(resp.QuizIds) == 0 { // отправка письма err = n.mailClient.MailSender(clients.SenderDeps{ Subject: "checkPublishedQuiz", Email: record.Email, TmplPath: "checkPublishedQuiz", // todo заменить на шаблон }) if err != nil { n.logger.Error("error sending message to mailbox checkPublishedQuiz:", zap.Error(err)) } } } if record.SendRegistration && !record.SendPaid && now.Sub(record.SendAt) > 14*24*time.Hour { record.SendPaid = true err = n.repo.Update(ctx, record) if err != nil { n.logger.Error("error updating record for checkPaidHistory:", zap.Error(err)) continue } account, err := n.customerClient.GetAccount(record.AccountID) if err != nil { n.logger.Error("error getting account from customer:", zap.Error(err)) continue } if account.Wallet.Money == 0 && account.Wallet.Spent == 0 { err = n.mailClient.MailSender(clients.SenderDeps{ Subject: "checkPaidHistory", Email: record.Email, TmplPath: "checkPaidHistory", // todo заменить на шаблон }) if err != nil { n.logger.Error("error sending message to mailbox checkPaidHistory:", zap.Error(err)) } } } } }