Files
trading_assistant/trading_assistant_api/services/user/main.go
2026-02-10 10:57:11 +08:00

87 lines
1.8 KiB
Go

package main
import (
"context"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"database/sql"
"common/db"
"common/logger"
"common/utils"
"common/httpx"
"user/internal/handler"
"user/internal/repository"
"user/internal/router"
"user/internal/service"
)
var pg *sql.DB
func main() {
port := utils.GetEnv("PORT", "8080")
if err := logger.SetupTimezone("Asia/Shanghai"); err != nil {
logger.L().Printf("setup timezone error: %v", err)
}
if err := logger.SetupFile(utils.GetEnv("LOG_FILE", "/var/log/app/user.log")); err != nil {
logger.L().Printf("setup file logger error: %v", err)
}
srv := &http.Server{
Addr: ":" + port,
Handler: routes(),
}
var err error
pg, err = db.InitPostgres()
if err != nil {
logger.L().Fatalf("postgres init: %v", err)
}
if utils.GetEnv("MIGRATE_ON_START", "0") == "1" {
if err := applySchema("db/schema.sql"); err != nil {
logger.L().Fatalf("apply schema: %v", err)
}
}
logger.L().Printf("user service starting on :%s", port)
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
logger.L().Fatalf("listen: %v", err)
}
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
logger.L().Printf("user service shutting down...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
logger.L().Printf("server shutdown: %v", err)
}
_ = db.ClosePostgres()
logger.L().Printf("user service exited")
}
func routes() http.Handler {
repo := repository.New(pg)
svc := service.New(repo)
h := handler.New(svc)
cors := httpx.CORS()
reqID := httpx.RequestID()
return reqID(cors(router.New(h)))
}
func applySchema(path string) error {
b, err := os.ReadFile(path)
if err != nil {
return err
}
_, err = pg.Exec(string(b))
return err
}