feedback/internal/app/app_feedback.go

136 lines
3.4 KiB
Go

package app
import (
"context"
"github.com/themakers/hlog"
"penahub.gitlab.yandexcloud.net/backend/templategen_feedback/internal/models"
"penahub.gitlab.yandexcloud.net/external/trashlog.git/app"
"penahub.gitlab.yandexcloud.net/external/trashlog.git/wrappers/zaptrashlog"
"time"
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"
)
type Build struct {
Commit string
Version string
BuildTime int64
}
func Run(cfg *config.Config, build Build) {
cfgLogger := zap.NewDevelopmentConfig()
cfgLogger.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
cfgLogger.EncoderConfig.ConsoleSeparator = " "
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
logger, err := cfgLogger.Build()
if err != nil {
panic(err)
}
logger.Info("RUN", zap.Any("ENV", cfg))
clickHouseLogger, err := zaptrashlog.NewCore(ctx, zap.InfoLevel, cfg.TrashLogHost, build.Version, build.Commit, build.BuildTime)
if err != nil {
panic(err)
}
loggerForHlog := logger.WithOptions(zap.WrapCore(func(core zapcore.Core) zapcore.Core {
return zapcore.NewTee(core, clickHouseLogger)
}))
loggerHlog := hlog.New(loggerForHlog).Module(cfg.ModuleLogger)
loggerHlog.With(models.AllFields{})
loggerHlog.Emit(app.InfoSvcStarted{})
db, err := bbolt.Open("bolt.db", 0666, nil)
if err != nil {
logger.Error("BoltDB", zap.Error(err))
return
}
bot, err := tgbotapi.NewBotAPI(cfg.TelegramToken)
if err != nil {
logger.Error("TelegramBotApi", zap.Error(err))
return
}
repositories, err := initialize.NewRepositories(logger, db)
if err != nil {
logger.Error("BoltDB", zap.Error(err))
return
}
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")
if err != nil {
logger.Error("TelegramBot", zap.Error(err))
return
}
// 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
}
}
}()
controllers := initialize.NewControllers(logger, repositories.Feedback, clients.Telegram)
if err = controllers.Feedback.WarmUpService(); err != nil {
logger.Error("Controllers.Feedback", zap.Error(err))
return
}
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, loggerHlog).Register(controllers.List()...)
go func() {
err := httpSrv.Start()
if err != nil {
logger.Error("CanNotServe", zap.Error(err))
return
}
}()
gracefulShutdown(logger, httpSrv, db, controllers)
}