- Add internal/adapters/ai/types.go with neutral shared types (Recipe, DayPlan, RecognizedItem, IngredientClassification, etc.) - Remove types from internal/adapters/openai/ — adapter now uses ai.* - Define Recognizer interface in recognition package - Define MenuGenerator interface in menu package - Define RecipeGenerator interface in recommendation package - Handler structs now hold interfaces, not *openai.Client - Add wire.Bind entries for the three new interface bindings To swap OpenAI for another provider: implement the three interfaces using ai.* types and change the wire.Bind lines in cmd/server/wire.go. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
116 lines
3.1 KiB
Go
116 lines
3.1 KiB
Go
//go:build wireinject
|
|
|
|
package main
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/food-ai/backend/internal/auth"
|
|
"github.com/food-ai/backend/internal/infra/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/infra/middleware"
|
|
"github.com/food-ai/backend/internal/adapters/openai"
|
|
"github.com/food-ai/backend/internal/adapters/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
|
|
newOpenAIAPIKey,
|
|
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
|
|
newOpenAIClient,
|
|
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(recognition.Recognizer), new(*openai.Client)),
|
|
wire.Bind(new(menu.MenuGenerator), new(*openai.Client)),
|
|
wire.Bind(new(recommendation.RecipeGenerator), new(*openai.Client)),
|
|
wire.Bind(new(middleware.AccessTokenValidator), new(*jwtAdapter)),
|
|
)
|
|
return nil, nil
|
|
}
|