6cf7eb2294
- Added new API endpoint `GET /api/v1/smoke/next_smoke_time` to provide AI-generated suggestions for the next smoking time based on user data. - Introduced a new database table `fa_smoke_ai_next_smoke` to store structured AI time node suggestions. - Updated smoke handler and service to integrate the new AI next smoke time functionality. - Enhanced documentation to reflect the new API endpoint and its usage, including details on how to generate AI time nodes.
115 lines
4.6 KiB
Go
115 lines
4.6 KiB
Go
package main
|
||
|
||
import (
|
||
"log"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
|
||
"wx_service/config"
|
||
authhandler "wx_service/internal/common/auth/handler"
|
||
authservice "wx_service/internal/common/auth/service"
|
||
qiniuhandler "wx_service/internal/common/qiniu/handler"
|
||
qiniuservice "wx_service/internal/common/qiniu/service"
|
||
rediscache "wx_service/internal/common/redis/cache"
|
||
redisservice "wx_service/internal/common/redis/service"
|
||
oahandler "wx_service/internal/common/wechat_official/handler"
|
||
oaservice "wx_service/internal/common/wechat_official/service"
|
||
"wx_service/internal/database"
|
||
lawyerhandler "wx_service/internal/lawyer/handler"
|
||
lawyerservice "wx_service/internal/lawyer/service"
|
||
membershiphandler "wx_service/internal/membership/handler"
|
||
membershipmodel "wx_service/internal/membership/model"
|
||
membershipservice "wx_service/internal/membership/service"
|
||
"wx_service/internal/model"
|
||
rmhandler "wx_service/internal/remove_watermark/handler"
|
||
rmmodel "wx_service/internal/remove_watermark/model"
|
||
rmservice "wx_service/internal/remove_watermark/service"
|
||
"wx_service/internal/routes"
|
||
smokehandler "wx_service/internal/smoke/handler"
|
||
smokemodel "wx_service/internal/smoke/model"
|
||
smokeservice "wx_service/internal/smoke/service"
|
||
)
|
||
|
||
func main() {
|
||
// 1) 加载配置(通常来自环境变量 / .env)
|
||
config.LoadConfig()
|
||
|
||
// 2) 初始化数据库连接
|
||
if err := database.InitDB(); err != nil {
|
||
log.Fatalf("init database failed: %v", err)
|
||
}
|
||
// 3) 自动建表/迁移(开发阶段很方便;生产环境可改为手动迁移)
|
||
if err := database.AutoMigrate(
|
||
&model.MiniProgram{},
|
||
&model.User{},
|
||
&model.UserMembership{},
|
||
&membershipmodel.MembershipRedeemCode{},
|
||
&membershipmodel.MembershipRedemption{},
|
||
&rmmodel.VideoParseLog{},
|
||
&rmmodel.VideoParseUnlock{},
|
||
&rmmodel.VideoDownloadFailure{},
|
||
&smokemodel.SmokeLog{},
|
||
&smokemodel.SmokeUserProfile{},
|
||
&smokemodel.SmokeAIAdvice{},
|
||
&smokemodel.SmokeAIAdviceUnlock{},
|
||
&smokemodel.SmokeAINextSmoke{},
|
||
); err != nil {
|
||
log.Fatalf("auto migrate failed: %v", err)
|
||
}
|
||
|
||
// 4) 初始化 HTTP 框架(Gin)
|
||
gin.SetMode(config.AppConfig.Server.Mode)
|
||
router := gin.Default()
|
||
|
||
// 5) 依赖注入:先创建 service,再创建 handler(handler 只关心 HTTP 输入/输出)
|
||
miniProgramService := authservice.NewMiniProgramService(database.DB)
|
||
authService := authservice.NewAuthService(database.DB, miniProgramService)
|
||
authHandler := authhandler.NewAuthHandler(authService)
|
||
videoService, err := rmservice.NewVideoService(database.DB, config.AppConfig.ShortVideo)
|
||
if err != nil {
|
||
log.Fatalf("init video service failed: %v", err)
|
||
}
|
||
videoHandler := rmhandler.NewVideoHandler(videoService)
|
||
|
||
smokeLogService := smokeservice.NewSmokeLogService(database.DB)
|
||
smokeAIAdviceService := smokeservice.NewSmokeAIAdviceService(database.DB, config.AppConfig.AI)
|
||
smokeProfileService := smokeservice.NewSmokeProfileService(database.DB)
|
||
smokeNextService := smokeservice.NewSmokeNextService(database.DB)
|
||
smokeAINextService := smokeservice.NewSmokeAINextSmokeService(database.DB, config.AppConfig.AI)
|
||
smokeHandler := smokehandler.NewSmokeHandler(smokeLogService, smokeAIAdviceService, smokeProfileService, smokeNextService, smokeAINextService)
|
||
|
||
redeemCodeService := membershipservice.NewRedeemCodeService(database.DB, config.AppConfig.Admin.Token)
|
||
redeemCodeHandler := membershiphandler.NewRedeemCodeHandler(redeemCodeService)
|
||
|
||
qiniuService := qiniuservice.NewQiniuService(config.AppConfig.Qiniu)
|
||
uploadHandler := qiniuhandler.NewUploadHandler(qiniuService)
|
||
|
||
oaService := oaservice.NewWeChatOAService(config.AppConfig.WeChatOA)
|
||
oaOAuthHandler := oahandler.NewOAuthHandler(oaService)
|
||
|
||
var sessionCache *rediscache.SessionUserCache
|
||
redisClient, err := redisservice.NewClient(config.AppConfig.Redis)
|
||
if err != nil {
|
||
log.Printf("redis disabled: %v", err)
|
||
} else if redisClient != nil {
|
||
sessionCache = rediscache.NewSessionUserCache(redisClient.Redis(), redisClient.KeyPrefix(), redisClient.SessionTTL())
|
||
}
|
||
|
||
var lawyerHandler *lawyerhandler.LawyerHandler
|
||
if lawyerDB, ok := database.GetAdditionalDB("lawyer"); ok {
|
||
lawyerService := lawyerservice.NewService(lawyerDB)
|
||
lawyerHandler = lawyerhandler.NewLawyerHandler(lawyerService)
|
||
} else {
|
||
log.Println("lawyer 数据库未配置,/lawyers 接口已禁用")
|
||
}
|
||
|
||
// 6) 注册路由:把 URL 映射到 handler
|
||
routes.Register(router, database.DB, authHandler, videoHandler, smokeHandler, redeemCodeHandler, uploadHandler, oaOAuthHandler, sessionCache, lawyerHandler)
|
||
|
||
// 7) 启动监听端口
|
||
addr := ":" + config.AppConfig.Server.Port
|
||
if err := router.Run(addr); err != nil {
|
||
log.Fatalf("server stopped: %v", err)
|
||
}
|
||
}
|