chore: build
This commit is contained in:
+55
-13
@@ -9,6 +9,8 @@ import (
|
||||
|
||||
"backend/internal/modules/auth"
|
||||
"backend/internal/modules/categories"
|
||||
"backend/internal/modules/contactlinks"
|
||||
"backend/internal/modules/customerverification"
|
||||
"backend/internal/modules/media"
|
||||
"backend/internal/modules/orders"
|
||||
"backend/internal/modules/pricing"
|
||||
@@ -43,9 +45,15 @@ func main() {
|
||||
log.Fatalf("connect redis: %v", err)
|
||||
}
|
||||
|
||||
// --- Site module (wired first: users.Service needs it as its
|
||||
// customer-accounts gate) ---
|
||||
siteRepo := site.NewRepository(database)
|
||||
siteService := site.NewService(siteRepo)
|
||||
siteHandler := site.NewHandler(siteService)
|
||||
|
||||
// --- Users module ---
|
||||
usersRepo := users.NewRepository(database)
|
||||
usersService := users.NewService(usersRepo)
|
||||
usersService := users.NewService(usersRepo, siteService, cfg.Seed)
|
||||
usersHandler := users.NewHandler(usersService)
|
||||
|
||||
// --- Auth module (admin space mounted; customer space wired but not mounted) ---
|
||||
@@ -53,19 +61,19 @@ func main() {
|
||||
authService := auth.NewService(usersService, refreshStore, cfg.JWT.Secret, cfg.JWT.AccessTTL, cfg.JWT.RefreshTTL)
|
||||
adminAuthHandler := auth.NewAdminHandler(authService, cfg.Server.CookieSecure)
|
||||
|
||||
// --- Site module ---
|
||||
siteRepo := site.NewRepository(database)
|
||||
siteService := site.NewService(siteRepo)
|
||||
siteHandler := site.NewHandler(siteService)
|
||||
// Customer auth space: registration/login are gated behind
|
||||
// site.Settings.CustomerAccountsEnabled (see auth.CustomerHandler).
|
||||
customerAuthHandler := auth.NewCustomerHandler(authService, usersService, siteService, cfg.Server.CookieSecure)
|
||||
|
||||
// --- Media module (pluggable local/S3 storage) ---
|
||||
mediaStorage, err := buildMediaStorage(cfg.Media)
|
||||
// --- Customer identity verification module (spec: age/ID-restricted
|
||||
// goods gate). Documents are stored privately, never through media/. ---
|
||||
verificationStorage, err := customerverification.NewStorage(cfg.Verification.UploadDir)
|
||||
if err != nil {
|
||||
log.Fatalf("init media storage: %v", err)
|
||||
log.Fatalf("init verification storage: %v", err)
|
||||
}
|
||||
mediaRepo := media.NewRepository(database)
|
||||
mediaService := media.NewService(mediaRepo, mediaStorage, cfg.Media.MaxUploadMB*1024*1024)
|
||||
mediaHandler := media.NewHandler(mediaService)
|
||||
verificationRepo := customerverification.NewRepository(database)
|
||||
verificationService := customerverification.NewService(verificationRepo, verificationStorage)
|
||||
verificationHandler := customerverification.NewHandler(verificationService)
|
||||
|
||||
// --- Categories module ---
|
||||
categoriesRepo := categories.NewRepository(database)
|
||||
@@ -79,14 +87,32 @@ func main() {
|
||||
|
||||
// --- Products module ---
|
||||
productsRepo := products.NewRepository(database)
|
||||
productsService := products.NewService(productsRepo)
|
||||
productsService := products.NewService(productsRepo, categoriesRepo)
|
||||
productsHandler := products.NewHandler(productsService)
|
||||
|
||||
// --- Media module (pluggable local/S3 storage). Wired after products:
|
||||
// each media file is isolated to the single product it was uploaded
|
||||
// for (or to none, e.g. contact link icons) -- Upload validates
|
||||
// product_id via productsService, there is no shared media library. ---
|
||||
mediaStorage, err := buildMediaStorage(cfg.Media)
|
||||
if err != nil {
|
||||
log.Fatalf("init media storage: %v", err)
|
||||
}
|
||||
mediaRepo := media.NewRepository(database)
|
||||
mediaService := media.NewService(mediaRepo, mediaStorage, productsService, categoriesRepo, cfg.Media.MaxUploadMB*1024*1024)
|
||||
mediaHandler := media.NewHandler(mediaService)
|
||||
|
||||
// --- Pricing module (quantity-based tiers, spec section 16) ---
|
||||
pricingRepo := pricing.NewRepository(database)
|
||||
pricingService := pricing.NewService(pricingRepo)
|
||||
pricingHandler := pricing.NewHandler(pricingService)
|
||||
|
||||
// --- Contact links module (admin-defined list of communication apps
|
||||
// shown to customers on the storefront: WhatsApp, Telegram, Signal, ...) ---
|
||||
contactLinksRepo := contactlinks.NewRepository(database)
|
||||
contactLinksService := contactlinks.NewService(contactLinksRepo)
|
||||
contactLinksHandler := contactlinks.NewHandler(contactLinksService)
|
||||
|
||||
// --- Telegram module (notifications, spec section 20) ---
|
||||
telegramRepo := telegram.NewRepository(database)
|
||||
telegramService := telegram.NewService(telegramRepo, telegram.NewHTTPSender(), appLogger)
|
||||
@@ -99,9 +125,14 @@ func main() {
|
||||
ordersHandler := orders.NewHandler(ordersService)
|
||||
|
||||
requireAdmin := appmiddleware.RequireAdmin(cfg.JWT.Secret)
|
||||
requireCustomer := appmiddleware.RequireCustomer(cfg.JWT.Secret)
|
||||
loginRateLimit := appmiddleware.NewPerIPRateLimiter(5, 5).Middleware()
|
||||
orderRateLimit := appmiddleware.NewPerIPRateLimiter(10, 10).Middleware()
|
||||
|
||||
requireOrdersEnabled := orders.RequireOrdersEnabled(siteService)
|
||||
requireAccountsEnabled := orders.RequireAccountsEnabled(siteService)
|
||||
requireVerifiedIfNeeded := orders.RequireApprovedVerificationIfNeeded(siteService, verificationService)
|
||||
|
||||
gin.SetMode(cfg.Server.GinMode)
|
||||
router := gin.New()
|
||||
router.Use(gin.Recovery())
|
||||
@@ -119,14 +150,21 @@ func main() {
|
||||
api := router.Group("/api")
|
||||
|
||||
auth.RegisterAdminRoutes(api, adminAuthHandler, requireAdmin, loginRateLimit)
|
||||
auth.RegisterCustomerRoutes(api, customerAuthHandler, requireCustomer, loginRateLimit)
|
||||
users.RegisterAdminRoutes(api, usersHandler, requireAdmin)
|
||||
site.RegisterRoutes(api, siteHandler, requireAdmin)
|
||||
site.RegisterPublicRoutes(api, siteHandler)
|
||||
media.RegisterAdminRoutes(api, mediaHandler, requireAdmin)
|
||||
media.RegisterPublicRoutes(api, mediaHandler)
|
||||
|
||||
categories.RegisterAdminRoutes(api, categoriesHandler, requireAdmin)
|
||||
categories.RegisterPublicRoutes(api, categoriesHandler)
|
||||
|
||||
contactlinks.RegisterAdminRoutes(api, contactLinksHandler, requireAdmin)
|
||||
contactlinks.RegisterPublicRoutes(api, contactLinksHandler)
|
||||
|
||||
units.RegisterAdminRoutes(api, unitsHandler, requireAdmin)
|
||||
units.RegisterPublicRoutes(api, unitsHandler)
|
||||
|
||||
products.RegisterAdminRoutes(api, productsHandler, requireAdmin)
|
||||
products.RegisterPublicRoutes(api, productsHandler)
|
||||
@@ -136,7 +174,11 @@ func main() {
|
||||
|
||||
telegram.RegisterAdminRoutes(api, telegramHandler, requireAdmin)
|
||||
|
||||
orders.RegisterPublicRoutes(api, ordersHandler, orderRateLimit)
|
||||
customerverification.RegisterCustomerRoutes(api, verificationHandler, requireCustomer)
|
||||
customerverification.RegisterAdminRoutes(api, verificationHandler, requireAdmin)
|
||||
|
||||
orders.RegisterPublicRoutes(api, ordersHandler, orderRateLimit, requireOrdersEnabled, requireAccountsEnabled, requireCustomer, requireVerifiedIfNeeded)
|
||||
orders.RegisterCustomerRoutes(api, ordersHandler, requireCustomer)
|
||||
orders.RegisterAdminRoutes(api, ordersHandler, requireAdmin)
|
||||
|
||||
appLogger.Info("starting server", "port", cfg.Server.Port)
|
||||
|
||||
Reference in New Issue
Block a user