electricity_bill_calc_service/main.go

111 lines
2.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"electricity_bill_calc/cache"
"electricity_bill_calc/config"
"electricity_bill_calc/global"
"electricity_bill_calc/logger"
"electricity_bill_calc/model"
"electricity_bill_calc/router"
"electricity_bill_calc/service"
"fmt"
"time"
"github.com/shopspring/decimal"
"go.uber.org/zap"
)
func init() {
l := logger.Named("Init")
err := config.SetupSetting()
if err != nil {
l.Fatal("服务配置文件加载失败!", zap.Error(err))
}
l.Info("服务配置已经完成加载。")
err = global.SetupDatabaseConnection()
if err != nil {
l.Fatal("主数据库连接失败!", zap.Error(err))
}
l.Info("主数据库已经连接。")
err = global.SetupRedisConnection()
if err != nil {
l.Fatal("主缓存数据库连接失败!", zap.Error(err))
}
l.Info("主缓存数据库已经连接。")
err = intializeSingularity()
if err != nil {
l.Fatal("奇点账号初始化失败。", zap.Error(err))
}
l.Info("奇点账号已经完成初始化。")
}
func intializeSingularity() error {
singularityExists, err := service.UserService.IsUserExists("000")
if err != nil {
return fmt.Errorf("singularity detect failed: %w", err)
}
if singularityExists {
return nil
}
singularity := &model.User{
Id: "000",
Username: "singularity",
Type: 2,
Enabled: true,
}
singularityName := "Singularity"
singularityExpires, err := model.ParseDate("2099-12-31")
if err != nil {
return fmt.Errorf("singularity expires time parse failed: %w", err)
}
singularityDetail := &model.UserDetail{
Name: &singularityName,
UnitServiceFee: decimal.Zero,
ServiceExpiration: singularityExpires,
}
verifyCode, err := service.UserService.CreateUser(singularity, singularityDetail)
if err != nil {
return fmt.Errorf("singularity account failed to create: %w", err)
}
logger.Info(
fmt.Sprintf("Singularity account created, use %s as verify code to reset password.", verifyCode),
zap.String("account", "singularity"),
zap.String("verifyCode", verifyCode),
)
return nil
}
func DBConnectionKeepLive() {
for range time.Tick(30 * time.Second) {
ctx, cancel := global.TimeoutContext()
defer cancel()
err := global.DB.Ping(ctx)
if err != nil {
continue
}
}
}
func RedisOrphanCleanup() {
cleanLogger := logger.Named("Cache").With(zap.String("function", "Cleanup"))
for range time.Tick(2 * time.Minute) {
cleanLogger.Info("Proceeding cleanup orphan keys.")
err := cache.ClearOrphanRelationItems()
if err != nil {
cleanLogger.Error("Orphan keys clear failed.")
continue
}
}
}
func main() {
// 本次停用检测的原因是使用Ping来保持数据库链接看起来没有什么用处。
// go DBConnectionKeepLive()
go RedisOrphanCleanup()
app := router.App()
app.Listen(fmt.Sprintf(":%d", config.ServerSettings.HttpPort))
}