Igris/internal/app/app.go

90 lines
2.0 KiB
Go

package app
import (
"backend/config"
"backend/internal/repository/cache"
"backend/internal/repository/storage"
"backend/internal/repository/storage/types"
"backend/internal/usecase"
cachePackage "backend/pkg/cache"
"backend/pkg/postgres"
"backend/pkg/sms"
"backend/pkg/zohal"
"fmt"
"log"
"gorm.io/gorm"
)
type AppContainer struct {
cfg config.Config
dbConn *gorm.DB
redis *cachePackage.Redis
authService usecase.AuthService
}
func NewAppContainer(cfg config.Config) (*AppContainer, error) {
dbOptions := postgres.DBConnOptions{
User: cfg.DB.User,
Pass: cfg.DB.Pass,
Host: cfg.DB.Host,
Port: uint(cfg.DB.Port),
DBName: cfg.DB.DBName,
}
dbConn, err := postgres.NewPsqlGormConnection(dbOptions)
if err != nil {
return nil, fmt.Errorf("failed to connect to database: %w", err)
}
dbConn.AutoMigrate(&types.User{})
redis, err := cachePackage.NewRedis(cfg.Redis)
if err != nil {
return nil, fmt.Errorf("failed to connect to Redis: %w", err)
}
userRepo := storage.NewUserRepository(dbConn)
sessionRepo := cache.NewSessionRepository(redis)
challengeRepo := cache.NewChallengeRepository(redis)
zohal := zohal.NewZohal(cfg.KYCProvider)
otpRepo := cache.NewOTPRepository(redis)
smsProvider := sms.NewKavenegar(cfg.Kavenegar)
authService := usecase.NewAuthService(
userRepo,
sessionRepo,
challengeRepo,
30,
otpRepo,
zohal,
smsProvider,
cfg,
)
return &AppContainer{
cfg: cfg,
dbConn: dbConn,
redis: redis,
authService: authService,
}, nil
}
func (app *AppContainer) AuthService() usecase.AuthService {
return app.authService
}
func (app *AppContainer) Close() {
if app.redis != nil {
if err := app.redis.Close(); err != nil {
log.Printf("Error closing Redis connection: %v", err)
}
}
if app.dbConn != nil {
if sqlDB, err := app.dbConn.DB(); err == nil {
if err := sqlDB.Close(); err != nil {
log.Printf("Error closing database connection: %v", err)
}
}
}
}