- Add package comments to all packages (pkg/config, pkg/logger, internal/*, cmd/platform)
- Fix context key warnings by using custom ContextKey type
- Export ContextKey type to avoid unexported-return warnings
- Update all context value operations to use ContextKey instead of string
- Update RequestIDKey() and UserIDKey() to return ContextKey
- Fix error checking issues (errcheck)
- Properly handle os.Chdir errors in defer statements
- Properly handle os.Setenv/os.Unsetenv errors in tests
- Fix security warnings (gosec)
- Change directory permissions from 0755 to 0750 in tests
- Change file permissions from 0644 to 0600 in tests
- Fix unused parameter warnings (revive)
- Replace unused parameters with _ in:
* RegisterLifecycleHooks lifecycle functions
* Mock logger implementations
* noOpLogger methods
- Fix type assertion issues (staticcheck)
- Remove unnecessary type assertions in tests
- Use simpler compile-time checks
- Fix exported type stuttering warning
- Add nolint directive for ConfigProvider (standard interface pattern)
- Update golangci-lint configuration
- Add version: 2 field (required for newer versions)
- Remove unsupported linters (typecheck, gosimple)
- Move formatters (gofmt, goimports) to separate formatters section
- Simplify linter list to only well-supported linters
All linting issues resolved (0 issues reported by golangci-lint).
All tests pass and code compiles successfully.
68 lines
1.4 KiB
Go
68 lines
1.4 KiB
Go
// Package di provides dependency injection container and providers using uber-go/fx.
|
|
package di
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
"time"
|
|
|
|
"go.uber.org/fx"
|
|
)
|
|
|
|
// Container wraps the FX application and provides lifecycle management.
|
|
type Container struct {
|
|
app *fx.App
|
|
}
|
|
|
|
// NewContainer creates a new DI container with the provided options.
|
|
func NewContainer(opts ...fx.Option) *Container {
|
|
// Add core module
|
|
allOpts := []fx.Option{CoreModule()}
|
|
allOpts = append(allOpts, opts...)
|
|
|
|
app := fx.New(allOpts...)
|
|
|
|
return &Container{
|
|
app: app,
|
|
}
|
|
}
|
|
|
|
// Start starts the container and blocks until shutdown.
|
|
func (c *Container) Start(ctx context.Context) error {
|
|
// Start the FX app
|
|
if err := c.app.Start(ctx); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Wait for interrupt signal
|
|
sigChan := make(chan os.Signal, 1)
|
|
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
|
|
|
|
// Block until signal received
|
|
<-sigChan
|
|
|
|
// Create shutdown context
|
|
shutdownCtx, cancel := context.WithTimeout(context.Background(), c.getShutdownTimeout())
|
|
defer cancel()
|
|
|
|
// Stop the FX app
|
|
if err := c.app.Stop(shutdownCtx); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Stop stops the container gracefully.
|
|
func (c *Container) Stop(ctx context.Context) error {
|
|
return c.app.Stop(ctx)
|
|
}
|
|
|
|
// getShutdownTimeout returns the shutdown timeout duration.
|
|
// Can be made configurable in the future.
|
|
func (c *Container) getShutdownTimeout() time.Duration {
|
|
return 30 * time.Second
|
|
}
|