feedback/internal/app/app_feedback.go

113 lines
2.6 KiB
Go
Raw Normal View History

2023-04-20 02:03:21 +00:00
package app
import (
2023-07-14 01:02:03 +00:00
"context"
"time"
2023-04-20 02:03:21 +00:00
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"go.etcd.io/bbolt"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"penahub.gitlab.yandexcloud.net/backend/templategen_feedback/internal/config"
"penahub.gitlab.yandexcloud.net/backend/templategen_feedback/internal/initialize"
"penahub.gitlab.yandexcloud.net/backend/templategen_feedback/internal/server"
)
func Run(cfg *config.Config) {
cfgLogger := zap.NewDevelopmentConfig()
cfgLogger.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
cfgLogger.EncoderConfig.ConsoleSeparator = " "
2023-07-14 01:02:03 +00:00
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
2023-04-20 02:03:21 +00:00
logger, err := cfgLogger.Build()
if err != nil {
panic(err)
}
logger.Info("RUN", zap.Any("ENV", cfg))
db, err := bbolt.Open("bolt.db", 0666, nil)
if err != nil {
2023-07-14 01:02:03 +00:00
logger.Error("BoltDB", zap.Error(err))
return
2023-04-20 02:03:21 +00:00
}
bot, err := tgbotapi.NewBotAPI(cfg.TelegramToken)
if err != nil {
2023-07-14 01:02:03 +00:00
logger.Error("TelegramBotApi", zap.Error(err))
return
2023-04-20 02:03:21 +00:00
}
repositories, err := initialize.NewRepositories(logger, db)
if err != nil {
2023-07-14 01:02:03 +00:00
logger.Error("BoltDB", zap.Error(err))
return
2023-04-20 02:03:21 +00:00
}
clients := initialize.NewClients(logger, bot, cfg.TelegramChannelID, cfg.TemplatePath)
bot.GetUpdatesChan(tgbotapi.UpdateConfig{
Offset: 0,
Limit: 0,
Timeout: 0,
AllowedUpdates: nil,
})
err = clients.Telegram.SendMessage("Bot started")
2023-04-20 02:03:21 +00:00
if err != nil {
2023-07-14 01:02:03 +00:00
logger.Error("TelegramBot", zap.Error(err))
return
2023-04-20 02:03:21 +00:00
}
2023-07-14 01:02:03 +00:00
// Send alive message
now := time.Now()
alarm := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 0, now.Location())
timer := time.NewTimer(time.Until(alarm))
go func() {
for {
select {
case now = <-timer.C:
err = clients.Telegram.SendMessage("Я пока еще не сдох!")
if err != nil {
logger.Error("TelegramBot", zap.Error(err))
return
}
alarm = now.AddDate(0, 0, 1)
timer.Reset(time.Until(alarm))
case <-ctx.Done():
timer.Stop()
return
}
}
}()
2023-04-20 02:03:21 +00:00
controllers := initialize.NewControllers(logger, repositories.Feedback, clients.Telegram)
if err = controllers.Feedback.WarmUpService(); err != nil {
2023-07-14 01:02:03 +00:00
logger.Error("Controllers.Feedback", zap.Error(err))
return
2023-04-20 02:03:21 +00:00
}
logger.Info("Feedback service", zap.String("status", "warmed up"))
go controllers.Feedback.RunService()
logger.Info("Feedback service", zap.String("status", "started"))
httpSrv := server.NewHTTP(cfg, logger).Register(controllers.List()...)
go func() {
err := httpSrv.Start()
if err != nil {
2023-07-14 01:02:03 +00:00
logger.Error("CanNotServe", zap.Error(err))
return
2023-04-20 02:03:21 +00:00
}
}()
gracefulShutdown(logger, httpSrv, db, controllers)
}