Multiple implementations of the same back-end application. The aim is to provide quick, side-by-side comparisons of different technologies (languages, frameworks, libraries) while preserving consistent business logic across all implementations.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

174 lines
5.5 KiB

package container
import (
"context"
"os"
"autostore/internal/application/commands"
"autostore/internal/application/interfaces"
"autostore/internal/application/queries"
"autostore/internal/config"
"autostore/internal/domain/specifications"
"autostore/internal/infrastructure/auth"
"autostore/internal/infrastructure/http"
"autostore/internal/infrastructure/logging"
"autostore/internal/infrastructure/repositories"
"autostore/internal/infrastructure/scheduler"
"autostore/internal/infrastructure/services"
"autostore/internal/infrastructure/time"
"autostore/internal/presentation/controllers"
"autostore/internal/presentation/middleware"
"autostore/internal/presentation/server"
)
type Container struct {
config *config.Config
// Infrastructure
logger interfaces.ILogger
timeProvider interfaces.ITimeProvider
authService interfaces.IAuthService
expiredItemsScheduler *scheduler.ExpiredItemsScheduler
// Domain
expirationSpec *specifications.ItemExpirationSpec
// Application
addItemCommand *commands.AddItemCommand
deleteItemCommand *commands.DeleteItemCommand
handleExpiredItemsCommand *commands.HandleExpiredItemsCommand
loginUserCommand *commands.LoginUserCommand
getItemQuery *queries.GetItemQuery
listItemsQuery *queries.ListItemsQuery
// Presentation
itemsController *controllers.ItemsController
authController *controllers.AuthController
jwtMiddleware *middleware.JWTMiddleware
server *server.Server
}
func NewContainer(config *config.Config) *Container {
return &Container{
config: config,
}
}
func (c *Container) Initialize() error {
// Initialize infrastructure
c.logger = logging.NewStandardLogger(os.Stdout)
c.timeProvider = time.NewSystemTimeProvider()
// Initialize user repository
userRepository := repositories.NewFileUserRepository(c.config.DataDirectory, c.logger)
// Initialize user initialization service and create default users
userInitService := services.NewUserInitializationService(userRepository, c.logger)
if err := userInitService.InitializeDefaultUsers(); err != nil {
c.logger.Error(context.Background(), "Failed to initialize default users", "error", err)
// Continue even if user initialization fails
}
// Initialize auth service with user repository
c.authService = auth.NewJWTAuthService(userRepository, c.config.JWTSecret, c.logger)
// Initialize domain
c.expirationSpec = specifications.NewItemExpirationSpec()
// Initialize item repository
itemRepository := repositories.NewFileItemRepository(c.config.DataDirectory, c.logger)
// Initialize order service
orderService := http.NewOrderURLHttpClient(c.logger)
// Initialize application
c.addItemCommand = commands.NewAddItemCommand(itemRepository, orderService, c.timeProvider, c.expirationSpec, c.logger)
c.deleteItemCommand = commands.NewDeleteItemCommand(itemRepository, c.logger)
c.handleExpiredItemsCommand = commands.NewHandleExpiredItemsCommand(itemRepository, orderService, c.timeProvider, c.expirationSpec, c.logger)
c.loginUserCommand = commands.NewLoginUserCommand(c.authService, c.logger)
c.getItemQuery = queries.NewGetItemQuery(itemRepository, c.logger)
c.listItemsQuery = queries.NewListItemsQuery(itemRepository, c.logger)
// Initialize scheduler
c.expiredItemsScheduler = scheduler.NewExpiredItemsScheduler(c.handleExpiredItemsCommand, c.logger)
// Initialize presentation
c.itemsController = controllers.NewItemsController(c.addItemCommand, c.getItemQuery, c.listItemsQuery, c.deleteItemCommand, c.logger)
c.authController = controllers.NewAuthController(c.loginUserCommand, c.logger)
c.jwtMiddleware = middleware.NewJWTMiddleware(c.authService, c.logger)
serverConfig := &server.Config{
Port: c.config.ServerPort,
ReadTimeout: c.config.ReadTimeout,
WriteTimeout: c.config.WriteTimeout,
ShutdownTimeout: c.config.ShutdownTimeout,
}
c.server = server.NewServer(serverConfig, c.logger, c.itemsController, c.authController, c.jwtMiddleware)
return nil
}
// Getters for infrastructure
func (c *Container) GetLogger() interfaces.ILogger {
return c.logger
}
func (c *Container) GetTimeProvider() interfaces.ITimeProvider {
return c.timeProvider
}
func (c *Container) GetAuthService() interfaces.IAuthService {
return c.authService
}
// Getters for domain
func (c *Container) GetExpirationSpec() *specifications.ItemExpirationSpec {
return c.expirationSpec
}
// Getters for application
func (c *Container) GetAddItemCommand() *commands.AddItemCommand {
return c.addItemCommand
}
func (c *Container) GetDeleteItemCommand() *commands.DeleteItemCommand {
return c.deleteItemCommand
}
func (c *Container) GetHandleExpiredItemsCommand() *commands.HandleExpiredItemsCommand {
return c.handleExpiredItemsCommand
}
func (c *Container) GetLoginUserCommand() *commands.LoginUserCommand {
return c.loginUserCommand
}
func (c *Container) GetGetItemQuery() *queries.GetItemQuery {
return c.getItemQuery
}
func (c *Container) GetListItemsQuery() *queries.ListItemsQuery {
return c.listItemsQuery
}
// Getters for presentation
func (c *Container) GetItemsController() *controllers.ItemsController {
return c.itemsController
}
func (c *Container) GetAuthController() *controllers.AuthController {
return c.authController
}
func (c *Container) GetJWTMiddleware() *middleware.JWTMiddleware {
return c.jwtMiddleware
}
func (c *Container) GetServer() *server.Server {
return c.server
}
func (c *Container) GetExpiredItemsScheduler() *scheduler.ExpiredItemsScheduler {
return c.expiredItemsScheduler
}