diff --git a/cmd/api/main.go b/cmd/api/main.go index b8ff6ca..6fa43c9 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -16,6 +16,7 @@ import ( oahandler "wx_service/internal/common/wechat_official/handler" oaservice "wx_service/internal/common/wechat_official/service" "wx_service/internal/database" + expiry "wx_service/internal/expiry" lawyerhandler "wx_service/internal/lawyer/handler" lawyerservice "wx_service/internal/lawyer/service" membershiphandler "wx_service/internal/membership/handler" @@ -116,8 +117,12 @@ func main() { log.Println("lawyer 数据库未配置,/lawyers 接口已禁用") } + expiryRepo := expiry.NewRepository(database.DB) + expiryService := expiry.NewService(expiryRepo) + expiryHandler := expiry.NewHandler(expiryService) + // 6) 注册路由:把 URL 映射到 handler - routes.Register(router, database.DB, authHandler, videoHandler, smokeHandler, redeemCodeHandler, uploadHandler, oaOAuthHandler, sessionCache, lawyerHandler) + routes.Register(router, database.DB, authHandler, videoHandler, smokeHandler, redeemCodeHandler, uploadHandler, oaOAuthHandler, sessionCache, lawyerHandler, expiryHandler) // 7) 启动监听端口 addr := ":" + config.AppConfig.Server.Port diff --git a/internal/expiry/handler.go b/internal/expiry/handler.go new file mode 100644 index 0000000..c0dfa92 --- /dev/null +++ b/internal/expiry/handler.go @@ -0,0 +1,28 @@ +package expiry + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +// Handler 负责 HTTP 层处理。 +type Handler struct { + service *Service +} + +func NewHandler(service *Service) *Handler { + return &Handler{service: service} +} + +// Healthz 用于 expiry 模块健康检查。 +func (h *Handler) Healthz(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "code": 0, + "message": "success", + "data": gin.H{ + "module": "expiry", + "status": "ok", + }, + }) +} diff --git a/internal/expiry/model.go b/internal/expiry/model.go new file mode 100644 index 0000000..2fe889d --- /dev/null +++ b/internal/expiry/model.go @@ -0,0 +1,19 @@ +package expiry + +import "time" + +// ExpiryItem 表示保质期物品。 +// 详细字段会在后续 issue 中完善。 +type ExpiryItem struct { + ID uint `json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} + +// ExpiryUserSettings 表示用户提醒设置。 +// 详细字段会在后续 issue 中完善。 +type ExpiryUserSettings struct { + ID uint `json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} diff --git a/internal/expiry/repository.go b/internal/expiry/repository.go new file mode 100644 index 0000000..d29bbd5 --- /dev/null +++ b/internal/expiry/repository.go @@ -0,0 +1,12 @@ +package expiry + +import "gorm.io/gorm" + +// Repository 封装保质期模块的数据访问能力。 +type Repository struct { + db *gorm.DB +} + +func NewRepository(db *gorm.DB) *Repository { + return &Repository{db: db} +} diff --git a/internal/expiry/service.go b/internal/expiry/service.go new file mode 100644 index 0000000..82a1fb0 --- /dev/null +++ b/internal/expiry/service.go @@ -0,0 +1,10 @@ +package expiry + +// Service 封装保质期模块业务逻辑。 +type Service struct { + repo *Repository +} + +func NewService(repo *Repository) *Service { + return &Service{repo: repo} +} diff --git a/internal/routes/expiry_routes.go b/internal/routes/expiry_routes.go new file mode 100644 index 0000000..5834a45 --- /dev/null +++ b/internal/routes/expiry_routes.go @@ -0,0 +1,19 @@ +package routes + +import ( + "github.com/gin-gonic/gin" + + expiryhandler "wx_service/internal/expiry" +) + +func registerExpiryRoutes(protected *gin.RouterGroup, expiryHandler *expiryhandler.Handler) { + if expiryHandler == nil { + return + } + + // 后续 issue 会补齐完整的物品/设置接口。 + expiry := protected.Group("") + { + _ = expiry + } +} diff --git a/internal/routes/routes.go b/internal/routes/routes.go index 9be7e4f..2ceeada 100644 --- a/internal/routes/routes.go +++ b/internal/routes/routes.go @@ -10,6 +10,7 @@ import ( qiniuhandler "wx_service/internal/common/qiniu/handler" rediscache "wx_service/internal/common/redis/cache" oahandler "wx_service/internal/common/wechat_official/handler" + expiryhandler "wx_service/internal/expiry" lawyerhandler "wx_service/internal/lawyer/handler" membershiphandler "wx_service/internal/membership/handler" "wx_service/internal/middleware" @@ -28,6 +29,7 @@ func Register( oaOAuthHandler *oahandler.OAuthHandler, sessionCache *rediscache.SessionUserCache, lawyerHandler *lawyerhandler.LawyerHandler, + expiryHandler *expiryhandler.Handler, ) { // Register 用来集中注册所有 HTTP 路由,便于工程结构更清晰: // - main 只负责初始化(配置/DB/依赖注入) @@ -57,6 +59,19 @@ func Register( } } + // 保质期提醒模块使用独立前缀 /api/expiry,与现有 /api/v1 并存。 + expiryAPI := router.Group("/api/expiry") + { + expiryAPI.GET("/healthz", expiryHandler.Healthz) + + expiryProtected := expiryAPI.Group("") + expiryProtected.Use(middleware.AuthMiddleware(db, sessionCache)) + expiryProtected.Use(middleware.RequireUserMiddleware()) + { + registerExpiryRoutes(expiryProtected, expiryHandler) + } + } + // 健康检查:用于容器/负载均衡探活 router.GET("/healthz", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"status": "ok"})