package api import ( "database/sql" "fmt" "testing" "time" "allaboutapps.dev/aw/go-starter/internal/auth" "allaboutapps.dev/aw/go-starter/internal/config" "allaboutapps.dev/aw/go-starter/internal/i18n" "allaboutapps.dev/aw/go-starter/internal/mailer" "allaboutapps.dev/aw/go-starter/internal/persistence" "allaboutapps.dev/aw/go-starter/internal/push" "allaboutapps.dev/aw/go-starter/internal/push/provider" "github.com/dropbox/godropbox/time2" "github.com/rs/zerolog/log" ) // PROVIDERS - define here only providers that for various reasons (e.g. cyclic dependency) can't live in their corresponding packages // or for wrapping providers that only accept sub-configs to prevent the requirements for defining providers for sub-configs. // https://github.com/google/wire/blob/main/docs/guide.md#defining-providers // NewPush creates an instance of the push service and registers the configured push providers. func NewPush(cfg config.Server, db *sql.DB) (*push.Service, error) { pusher := push.New(db) if cfg.Push.UseFCMProvider { fcmProvider, err := provider.NewFCM(cfg.FCMConfig) if err != nil { return nil, fmt.Errorf("failed to create FCM provider: %w", err) } pusher.RegisterProvider(fcmProvider) } if cfg.Push.UseMockProvider { log.Warn().Msg("Initializing mock push provider") mockProvider := provider.NewMock(push.ProviderTypeFCM) pusher.RegisterProvider(mockProvider) } if pusher.GetProviderCount() < 1 { log.Warn().Msg("No providers registered for push service") } return pusher, nil } func NewClock(t ...*testing.T) time2.Clock { var clock time2.Clock useMock := len(t) > 0 && t[0] != nil if useMock { clock = time2.NewMockClock(time.Now()) } else { clock = time2.DefaultClock } return clock } func NewAuthService(config config.Server, db *sql.DB, clock time2.Clock) *auth.Service { return auth.NewService(config, db, clock) } func NewMailer(config config.Server) (*mailer.Mailer, error) { return mailer.NewWithConfig(config.Mailer, config.SMTP) } func NewDB(config config.Server) (*sql.DB, error) { return persistence.NewDB(config.Database) } func NewI18N(config config.Server) (*i18n.Service, error) { return i18n.New(config.I18n) } func NoTest() []*testing.T { return nil }