2024-03-31 18:23:50 +00:00
|
|
|
package app
|
2024-03-31 20:04:15 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"mailnotifier/internal/clients"
|
|
|
|
"mailnotifier/internal/initialize"
|
2024-04-02 14:46:05 +00:00
|
|
|
"mailnotifier/internal/models"
|
2024-03-31 20:04:15 +00:00
|
|
|
"mailnotifier/internal/repository"
|
|
|
|
"mailnotifier/internal/workers"
|
|
|
|
)
|
|
|
|
|
|
|
|
func Run(ctx context.Context, config initialize.Config, logger *zap.Logger) error {
|
2024-04-02 16:16:32 +00:00
|
|
|
defer func() {
|
|
|
|
if r := recover(); r != nil {
|
|
|
|
logger.Error("Recovered from a panic", zap.Any("error", r))
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
ctx, cancel := context.WithCancel(ctx)
|
|
|
|
defer cancel()
|
|
|
|
|
2024-04-02 15:11:02 +00:00
|
|
|
// todo обдумать буфер чтобы не было блокировок, хотя это не предугадать но оптимально подстроить можно
|
2024-04-02 14:46:05 +00:00
|
|
|
welcomeChan := make(chan models.Message, 50)
|
|
|
|
|
2024-03-31 20:04:15 +00:00
|
|
|
mdb, err := initialize.MongoInit(ctx, config)
|
|
|
|
if err != nil {
|
|
|
|
logger.Error("Failed to initialize MongoDB", zap.Error(err))
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
kafka, err := initialize.KafkaConsumerInit(ctx, config)
|
|
|
|
|
2024-04-02 14:46:05 +00:00
|
|
|
repo := repository.NewRepository(mdb.Collection("notify"), welcomeChan)
|
2024-03-31 20:04:15 +00:00
|
|
|
|
|
|
|
mailClient := clients.NewMailClient(clients.Deps{
|
|
|
|
SmtpHost: config.SmtpHost,
|
|
|
|
SmtpApiUrl: config.SmtpApiUrl,
|
|
|
|
SmtpPort: config.SmtpPort,
|
|
|
|
SmtpSender: config.SmtpSender,
|
|
|
|
Username: config.SmtpUsername,
|
|
|
|
Password: config.SmtpPassword,
|
|
|
|
ApiKey: config.SmtpApiKey,
|
|
|
|
Logger: logger,
|
|
|
|
})
|
|
|
|
|
|
|
|
consumer := workers.NewConsumerWC(workers.ConsumerDeps{
|
|
|
|
Repo: repo,
|
|
|
|
KafkaClient: kafka,
|
2024-04-01 14:24:35 +00:00
|
|
|
Logger: logger,
|
2024-03-31 20:04:15 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
notifyer := workers.NewNotifyer(workers.NotifyerDeps{
|
|
|
|
Repo: repo,
|
|
|
|
MailClient: mailClient,
|
2024-04-01 14:24:35 +00:00
|
|
|
Logger: logger,
|
2024-03-31 20:04:15 +00:00
|
|
|
})
|
|
|
|
|
2024-04-02 14:46:05 +00:00
|
|
|
welcomer := workers.NewWelcomer(workers.WelcomerDeps{
|
|
|
|
Repo: repo,
|
|
|
|
MailClient: mailClient,
|
|
|
|
Logger: logger,
|
|
|
|
WelcomeChan: welcomeChan,
|
|
|
|
})
|
|
|
|
|
2024-03-31 20:04:15 +00:00
|
|
|
go consumer.Start(ctx)
|
2024-04-02 14:46:05 +00:00
|
|
|
go welcomer.Start(ctx)
|
2024-03-31 20:04:15 +00:00
|
|
|
go notifyer.Start(ctx)
|
|
|
|
|
|
|
|
<-ctx.Done()
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|