package main import ( "log" "net/http" "time" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "mengyastore-backend/internal/auth" "mengyastore-backend/internal/config" "mengyastore-backend/internal/database" "mengyastore-backend/internal/handlers" "mengyastore-backend/internal/storage" ) func main() { cfg, err := config.Load("data/json/settings.json") if err != nil { log.Fatalf("load config failed: %v", err) } // Initialise database db, err := database.Open(cfg.DatabaseDSN) if err != nil { log.Fatalf("init database failed: %v", err) } store, err := storage.NewJSONStore(db) if err != nil { log.Fatalf("init store failed: %v", err) } orderStore, err := storage.NewOrderStore(db) if err != nil { log.Fatalf("init order store failed: %v", err) } siteStore, err := storage.NewSiteStore(db) if err != nil { log.Fatalf("init site store failed: %v", err) } wishlistStore, err := storage.NewWishlistStore(db) if err != nil { log.Fatalf("init wishlist store failed: %v", err) } chatStore, err := storage.NewChatStore(db) if err != nil { log.Fatalf("init chat store failed: %v", err) } r := gin.Default() r.Use(cors.New(cors.Config{ AllowOrigins: []string{"*"}, AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"}, AllowHeaders: []string{"Origin", "Content-Type", "Accept", "Authorization"}, ExposeHeaders: []string{"Content-Length"}, AllowCredentials: false, MaxAge: 12 * time.Hour, })) r.GET("/api/health", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"status": "ok"}) }) authClient := auth.NewSproutGateClient(cfg.AuthAPIURL) publicHandler := handlers.NewPublicHandler(store) adminHandler := handlers.NewAdminHandler(store, cfg, siteStore, orderStore, chatStore) orderHandler := handlers.NewOrderHandler(store, orderStore, siteStore, authClient) statsHandler := handlers.NewStatsHandler(orderStore, siteStore) wishlistHandler := handlers.NewWishlistHandler(wishlistStore, authClient) chatHandler := handlers.NewChatHandler(chatStore, authClient) r.GET("/api/products", publicHandler.ListProducts) r.POST("/api/checkout", orderHandler.CreateOrder) r.POST("/api/products/:id/view", publicHandler.RecordProductView) r.GET("/api/stats", statsHandler.GetStats) r.POST("/api/site/visit", statsHandler.RecordVisit) r.GET("/api/site/maintenance", statsHandler.GetMaintenance) r.GET("/api/orders", orderHandler.ListMyOrders) r.POST("/api/orders/:id/confirm", orderHandler.ConfirmOrder) r.GET("/api/admin/token", adminHandler.GetAdminToken) r.GET("/api/admin/products", adminHandler.ListAllProducts) r.POST("/api/admin/products", adminHandler.CreateProduct) r.PUT("/api/admin/products/:id", adminHandler.UpdateProduct) r.PATCH("/api/admin/products/:id/status", adminHandler.ToggleProduct) r.DELETE("/api/admin/products/:id", adminHandler.DeleteProduct) r.POST("/api/admin/site/maintenance", adminHandler.SetMaintenance) r.GET("/api/admin/site/smtp", adminHandler.GetSMTPConfig) r.POST("/api/admin/site/smtp", adminHandler.SetSMTPConfig) r.GET("/api/admin/orders", adminHandler.ListAllOrders) r.DELETE("/api/admin/orders/:id", adminHandler.DeleteOrder) r.GET("/api/wishlist", wishlistHandler.GetWishlist) r.POST("/api/wishlist", wishlistHandler.AddToWishlist) r.DELETE("/api/wishlist/:id", wishlistHandler.RemoveFromWishlist) // Chat routes (user) r.GET("/api/chat/messages", chatHandler.GetMyMessages) r.POST("/api/chat/messages", chatHandler.SendMyMessage) // Chat routes (admin) r.GET("/api/admin/chat", adminHandler.GetAllConversations) r.GET("/api/admin/chat/:account", adminHandler.GetConversation) r.POST("/api/admin/chat/:account", adminHandler.AdminReply) r.DELETE("/api/admin/chat/:account", adminHandler.ClearConversation) log.Println("萌芽小店后端启动于 http://localhost:8080") if err := r.Run(":8080"); err != nil { log.Fatalf("server run failed: %v", err) } }