refactor: migrate DI to Wire, replace startup registries with on-demand DB queries
- Add google/wire; generate wire_gen.go from wire.go injector - Move all constructor wiring out of main.go into providers.go / wire.go - Export recognition.IngredientRepository (was unexported, blocked Wire binding) - Delete units/cuisine/tag registry.go files (global state + unused NameFor helpers) - Replace List handlers with NewListHandler(pool) using COALESCE SQL queries - Remove units/cuisine/tag LoadFromDB from server startup; locale.LoadFromDB kept (locale.Supported is used by language middleware on every request) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
111
backend/cmd/server/wire.go
Normal file
111
backend/cmd/server/wire.go
Normal file
@@ -0,0 +1,111 @@
|
||||
//go:build wireinject
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/food-ai/backend/internal/auth"
|
||||
"github.com/food-ai/backend/internal/config"
|
||||
"github.com/food-ai/backend/internal/diary"
|
||||
"github.com/food-ai/backend/internal/dish"
|
||||
"github.com/food-ai/backend/internal/home"
|
||||
"github.com/food-ai/backend/internal/ingredient"
|
||||
"github.com/food-ai/backend/internal/menu"
|
||||
"github.com/food-ai/backend/internal/middleware"
|
||||
"github.com/food-ai/backend/internal/pexels"
|
||||
"github.com/food-ai/backend/internal/product"
|
||||
"github.com/food-ai/backend/internal/recipe"
|
||||
"github.com/food-ai/backend/internal/recognition"
|
||||
"github.com/food-ai/backend/internal/recommendation"
|
||||
"github.com/food-ai/backend/internal/savedrecipe"
|
||||
"github.com/food-ai/backend/internal/user"
|
||||
"github.com/google/wire"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
)
|
||||
|
||||
func initRouter(appConfig *config.Config, pool *pgxpool.Pool) (http.Handler, error) {
|
||||
wire.Build(
|
||||
// Config extractors
|
||||
newGeminiAPIKey,
|
||||
newPexelsAPIKey,
|
||||
newJWTSecret,
|
||||
newJWTAccessDuration,
|
||||
newJWTRefreshDuration,
|
||||
newAllowedOrigins,
|
||||
newFirebaseCredentialsFile,
|
||||
|
||||
// Auth
|
||||
auth.NewFirebaseAuthOrNoop,
|
||||
newJWTManager,
|
||||
newJWTAdapter,
|
||||
newAuthMiddleware,
|
||||
auth.NewService,
|
||||
auth.NewHandler,
|
||||
|
||||
// User
|
||||
user.NewRepository,
|
||||
user.NewService,
|
||||
user.NewHandler,
|
||||
|
||||
// External clients
|
||||
newGeminiClient,
|
||||
newPexelsClient,
|
||||
|
||||
// Ingredient
|
||||
ingredient.NewRepository,
|
||||
ingredient.NewHandler,
|
||||
|
||||
// Product
|
||||
product.NewRepository,
|
||||
product.NewHandler,
|
||||
|
||||
// Dish
|
||||
dish.NewRepository,
|
||||
dish.NewHandler,
|
||||
|
||||
// Recipe
|
||||
recipe.NewRepository,
|
||||
recipe.NewHandler,
|
||||
|
||||
// Saved recipes
|
||||
savedrecipe.NewRepository,
|
||||
savedrecipe.NewHandler,
|
||||
|
||||
// Menu
|
||||
menu.NewRepository,
|
||||
menu.NewHandler,
|
||||
|
||||
// Diary
|
||||
diary.NewRepository,
|
||||
diary.NewHandler,
|
||||
|
||||
// Home
|
||||
home.NewHandler,
|
||||
|
||||
// Recognition & Recommendation
|
||||
recognition.NewHandler,
|
||||
recommendation.NewHandler,
|
||||
|
||||
// List handlers (DB-backed, injected into router)
|
||||
newUnitsListHandler,
|
||||
newCuisineListHandler,
|
||||
newTagListHandler,
|
||||
|
||||
// Router
|
||||
newRouter,
|
||||
|
||||
// Interface bindings
|
||||
wire.Bind(new(user.UserRepository), new(*user.Repository)),
|
||||
wire.Bind(new(menu.PhotoSearcher), new(*pexels.Client)),
|
||||
wire.Bind(new(menu.UserLoader), new(*user.Repository)),
|
||||
wire.Bind(new(menu.ProductLister), new(*product.Repository)),
|
||||
wire.Bind(new(menu.RecipeSaver), new(*dish.Repository)),
|
||||
wire.Bind(new(recommendation.PhotoSearcher), new(*pexels.Client)),
|
||||
wire.Bind(new(recommendation.UserLoader), new(*user.Repository)),
|
||||
wire.Bind(new(recommendation.ProductLister), new(*product.Repository)),
|
||||
wire.Bind(new(recognition.IngredientRepository), new(*ingredient.Repository)),
|
||||
wire.Bind(new(middleware.AccessTokenValidator), new(*jwtAdapter)),
|
||||
)
|
||||
return nil, nil
|
||||
}
|
||||
Reference in New Issue
Block a user