infrastructure

package
v0.1.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 23, 2025 License: MIT Imports: 24 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// MinSecretLength is the minimum length required for security secrets
	MinSecretLength = 32
)

Variables

View Source
var HandlerModule = fx.Options(

	AnnotateHandler(func(core CoreParams) (h.Handler, error) {
		handler := handler.NewStaticHandler(core.Logger, core.Config)
		if handler == nil {
			return nil, errors.New("failed to create static handler")
		}
		core.Logger.Debug("registered handler",
			logging.StringField("handler_name", "StaticHandler"),
			logging.StringField("handler_type", fmt.Sprintf("%T", handler)),
			logging.StringField("operation", "handler_registration"),
		)
		return handler, nil
	}),

	AnnotateHandler(func(core CoreParams, middlewareManager *appmiddleware.Manager) (h.Handler, error) {
		handler := webhandler.NewHomeHandler(core.Logger, core.Renderer)
		if handler == nil {
			return nil, fmt.Errorf("failed to create home handler: renderer=%T", core.Renderer)
		}
		core.Logger.Debug("registered handler",
			logging.StringField("handler_name", "HomeHandler"),
			logging.StringField("handler_type", fmt.Sprintf("%T", handler)),
			logging.StringField("operation", "handler_registration"),
		)
		return handler, nil
	}),
	AnnotateHandler(func(core CoreParams, middlewareManager *appmiddleware.Manager) (h.Handler, error) {
		handler := wh_auth.NewWebLoginHandler(core.Logger, core.Renderer)
		if handler == nil {
			return nil, fmt.Errorf("failed to create web login handler: renderer=%T", core.Renderer)
		}
		core.Logger.Debug("registered handler",
			logging.StringField("handler_name", "WebLoginHandler"),
			logging.StringField("handler_type", fmt.Sprintf("%T", handler)),
			logging.StringField("operation", "handler_registration"),
		)
		return handler, nil
	}),
	AnnotateHandler(
		func(
			core CoreParams,
			services ServiceParams,
			middlewareManager *appmiddleware.Manager,
		) (h.Handler, error) {
			handler, err := handler.NewWebHandler(
				core.Logger,
				core.Renderer,
				handler.WithMiddlewareManager(middlewareManager),
				handler.WithConfig(core.Config),
			)
			if err != nil {
				return nil, fmt.Errorf("failed to create web handler: %w", err)
			}
			core.Logger.Debug(
				"registered handler",
				logging.StringField("handler_name", "WebHandler"),
				logging.StringField("handler_type", fmt.Sprintf("%T", handler)),
				logging.StringField("operation", "handler_registration"),
			)
			return handler, nil
		},
	),

	AnnotateHandler(func(core CoreParams, services ServiceParams) (h.Handler, error) {
		handler := handler.NewAuthHandler(core.Logger, handler.WithUserService(services.UserService))
		if handler == nil {
			return nil, fmt.Errorf("failed to create auth handler: user_service=%T", services.UserService)
		}
		core.Logger.Debug("registered handler",
			logging.StringField("handler_name", "AuthHandler"),
			logging.StringField("handler_type", fmt.Sprintf("%T", handler)),
			logging.StringField("operation", "handler_registration"),
		)
		return handler, nil
	}),

	AnnotateHandler(func(core CoreParams, services ServiceParams) (h.Handler, error) {
		authMiddleware := appmiddleware.NewCookieAuthMiddleware(services.UserService, core.Logger)
		baseHandler := handlers.NewBaseHandler(
			authMiddleware,
			services.FormService,
			core.Logger,
		)
		handler, err := handlers.NewHandler(services.UserService, services.FormService, core.Logger)
		if err != nil {
			return nil, fmt.Errorf("failed to create dashboard handler: %w", err)
		}

		handler.DashboardHandler.Base = baseHandler
		handler.FormHandler.Base = baseHandler
		handler.SubmissionHandler.Base = baseHandler
		handler.SchemaHandler.Base = baseHandler

		core.Logger.Debug("registered handler",
			logging.StringField("handler_name", "DashboardHandler"),
			logging.StringField("handler_type", fmt.Sprintf("%T", handler)),
			logging.StringField("operation", "handler_registration"),
		)
		return handler, nil
	}),
)

HandlerModule provides all HTTP handlers for the application.

View Source
var InfrastructureModule = fx.Options(
	fx.Provide(
		func(logger logging.Logger) (*config.Config, error) {
			logger.Info("InfrastructureModule: Starting configuration loading...")
			cfg, cfgErr := config.New(logger)
			if cfgErr != nil {
				logger.Error("InfrastructureModule: Error loading configuration",
					logging.Error(cfgErr))
				return nil, fmt.Errorf("failed to load configuration: %w", cfgErr)
			}

			logger.Info("InfrastructureModule: Configuration loaded, starting validation...")
			if validationErr := validateConfig(cfg, logger); validationErr != nil {
				logger.Error("InfrastructureModule: Validation failed",
					logging.Error(validationErr))
				return nil, validationErr
			}

			logger.Info("InfrastructureModule: Configuration validated successfully")
			return cfg, nil
		},
		database.NewDB,
	),
)

InfrastructureModule provides core infrastructure dependencies.

RootModule combines all infrastructure-level modules into a single module.

View Source
var ServerModule = fx.Options(
	fx.Provide(server.New),
)

ServerModule provides the HTTP server setup.

View Source
var StoreModule = fx.Options(
	fx.Provide(NewStores),
)

StoreModule provides all database store implementations.

Functions

func AnnotateHandler

func AnnotateHandler(fn any) fx.Option

AnnotateHandler is a helper function that simplifies the creation of handler providers. It wraps the common fx.Provide and fx.Annotate pattern used for handlers.

Types

type CoreParams

type CoreParams struct {
	fx.In
	Logger   logging.Logger
	Renderer *view.Renderer
	Config   *config.Config
}

CoreParams contains core infrastructure dependencies that are commonly needed by handlers. These are typically required for basic handler functionality like logging and rendering.

type Module

type Module struct {
	// contains filtered or unexported fields
}

Module represents the infrastructure module

func NewModule

func NewModule(
	app *fx.App,
	container *dig.Container,
	appConfig *config.Config,
	logger logging.Logger,
	db *sql.DB,
	formService form.Service,
	userService user.Service,
	authMiddleware *appmiddleware.CookieAuthMiddleware,
) *Module

NewModule creates a new infrastructure module

type ServiceContainer

type ServiceContainer struct {
	PageDataService *services.PageDataService
	FormOperations  *services.FormOperations
	TemplateService *services.TemplateService
	ResponseBuilder *services.ResponseBuilder
}

ServiceContainer holds all service instances

type ServiceParams

type ServiceParams struct {
	fx.In
	UserService user.Service
	FormService form.Service
}

ServiceParams contains all service dependencies that handlers might need. This separation makes it easier to manage service dependencies and allows for more granular dependency injection.

type Stores

type Stores struct {
	fx.Out

	UserStore user.Store
	FormStore form.Store
}

Stores groups all database store providers. This struct is used with fx.Out to provide multiple stores to the fx container in a single provider function.

func NewStores

func NewStores(db *database.Database, logger logging.Logger) (Stores, error)

NewStores creates all database stores. This function is responsible for initializing all database stores and providing them to the fx container.

Directories

Path Synopsis
Package database provides database connection and management
Package database provides database connection and management
Package logging provides a unified logging interface using zap
Package logging provides a unified logging interface using zap

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL