tss-rocks/backend/internal/server/server.go
CDN 05ddc1f783
Some checks failed
Build Backend / Build Docker Image (push) Successful in 3m33s
Test Backend / test (push) Failing after 31s
[feature] migrate to monorepo
2025-02-21 00:49:20 +08:00

90 lines
2.2 KiB
Go

package server
import (
"context"
"fmt"
"net/http"
"github.com/gin-gonic/gin"
"github.com/rs/zerolog/log"
"tss-rocks-be/ent"
"tss-rocks-be/internal/config"
"tss-rocks-be/internal/handler"
"tss-rocks-be/internal/middleware"
"tss-rocks-be/internal/service"
"tss-rocks-be/internal/storage"
)
type Server struct {
config *config.Config
router *gin.Engine
handler *handler.Handler
server *http.Server
}
func New(cfg *config.Config, client *ent.Client) (*Server, error) {
// Initialize storage
store, err := storage.NewStorage(context.Background(), &cfg.Storage)
if err != nil {
return nil, fmt.Errorf("failed to initialize storage: %w", err)
}
// Initialize service
svc := service.NewService(client, store)
// Initialize RBAC
if err := svc.InitializeRBAC(context.Background()); err != nil {
return nil, fmt.Errorf("failed to initialize RBAC: %w", err)
}
// Initialize handler
h := handler.NewHandler(cfg, svc)
// Initialize router
router := gin.Default()
// Add CORS middleware if needed
router.Use(middleware.CORS())
// 添加全局中间件
router.Use(gin.Logger())
router.Use(gin.Recovery())
router.Use(middleware.RateLimit(&cfg.RateLimit))
// 添加访问日志中间件
accessLog, err := middleware.AccessLog(&cfg.AccessLog)
if err != nil {
return nil, fmt.Errorf("failed to initialize access log: %w", err)
}
router.Use(accessLog)
// 为上传路由添加文件验证中间件
router.POST("/api/v1/media/upload", middleware.ValidateUpload(&cfg.Storage.Upload))
// Register routes
h.RegisterRoutes(router)
return &Server{
config: cfg,
router: router,
handler: h,
}, nil
}
func (s *Server) Start() error {
addr := fmt.Sprintf("%s:%d", s.config.Server.Host, s.config.Server.Port)
s.server = &http.Server{
Addr: addr,
Handler: s.router,
}
log.Info().Msgf("Starting server on %s", addr)
return s.server.ListenAndServe()
}
func (s *Server) Shutdown(ctx context.Context) error {
if s.server != nil {
return s.server.Shutdown(ctx)
}
return nil
}