chore: build
ci-api / test (push) Failing after 8m7s
ci-web / test (push) Failing after 5m5s

This commit is contained in:
Xor290
2026-09-20 12:18:33 +02:00
parent 8f4c7fa47a
commit 919c807004
174 changed files with 9669 additions and 1308 deletions
+55 -13
View File
@@ -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)