package database import ( "context" "fmt" "os" "path/filepath" "go.uber.org/fx" "sneak.berlin/go/vaultik/internal/config" "sneak.berlin/go/vaultik/internal/log" ) // indexDirPerm restricts the local index directory to the owning user; // the index describes the backed-up file tree and must stay private. const indexDirPerm = 0o700 // Module provides database dependencies // //nolint:gochecknoglobals // fx module definitions are package globals by convention var Module = fx.Module("database", fx.Provide( provideDatabase, NewRepositories, ), ) func provideDatabase(lc fx.Lifecycle, cfg *config.Config) (*DB, error) { // Ensure the index directory exists indexDir := filepath.Dir(cfg.IndexPath) err := os.MkdirAll(indexDir, indexDirPerm) if err != nil { return nil, fmt.Errorf("creating index directory: %w", err) } db, err := New(context.Background(), cfg.IndexPath) if err != nil { return nil, fmt.Errorf("opening database: %w", err) } lc.Append(fx.Hook{ OnStop: func(_ context.Context) error { log.Debug("Database module OnStop hook called") err := db.Close() if err != nil { log.Error("Failed to close database in OnStop hook", "error", err) return err } log.Debug("Database closed successfully in OnStop hook") return nil }, }) return db, nil }