block-accounting/backend/internal/factory/interface.go
2024-06-04 00:54:17 +03:00

153 lines
4.0 KiB
Go

package factory
import (
"log/slog"
"os"
"github.com/google/wire"
"github.com/emochka2007/block-accounting/internal/infrastructure/repository/auth"
"github.com/emochka2007/block-accounting/internal/interface/rest"
"github.com/emochka2007/block-accounting/internal/interface/rest/controllers"
"github.com/emochka2007/block-accounting/internal/interface/rest/presenters"
"github.com/emochka2007/block-accounting/internal/pkg/config"
"github.com/emochka2007/block-accounting/internal/pkg/logger"
"github.com/emochka2007/block-accounting/internal/usecase/interactors/chain"
"github.com/emochka2007/block-accounting/internal/usecase/interactors/jwt"
"github.com/emochka2007/block-accounting/internal/usecase/interactors/organizations"
"github.com/emochka2007/block-accounting/internal/usecase/interactors/transactions"
"github.com/emochka2007/block-accounting/internal/usecase/interactors/users"
)
var interfaceSet wire.ProviderSet = wire.NewSet(
provideAuthController,
provideOrganizationsController,
provideControllers,
provideTxController,
provideParticipantsController,
provideAuthPresenter,
provideOrganizationsPresenter,
)
func provideLogger(c config.Config) *slog.Logger {
lb := new(logger.LoggerBuilder).WithLevel(logger.MapLevel(c.Common.LogLevel)).WithWriter(os.Stdout)
if c.Common.LogLocal {
lb.Local()
}
if c.Common.LogFile != "" {
logFile, err := os.Open(c.Common.LogFile)
if err != nil {
panic(err)
}
lb.WithWriter(logFile)
}
if c.Common.LogAddSource {
lb.WithSource()
}
return lb.Build()
}
func provideAuthPresenter(
jwtInteractor jwt.JWTInteractor,
) presenters.AuthPresenter {
return presenters.NewAuthPresenter(jwtInteractor)
}
func provideOrganizationsPresenter() presenters.OrganizationsPresenter {
return presenters.NewOrganizationsPresenter()
}
func provideAuthController(
log *slog.Logger,
usersInteractor users.UsersInteractor,
authPresenter presenters.AuthPresenter,
jwtInteractor jwt.JWTInteractor,
repo auth.Repository,
orgInteractor organizations.OrganizationsInteractor,
) controllers.AuthController {
return controllers.NewAuthController(
log.WithGroup("auth-controller"),
authPresenter,
usersInteractor,
jwtInteractor,
repo,
orgInteractor,
)
}
func provideOrganizationsController(
log *slog.Logger,
organizationsInteractor organizations.OrganizationsInteractor,
presenter presenters.OrganizationsPresenter,
) controllers.OrganizationsController {
return controllers.NewOrganizationsController(
log.WithGroup("organizations-controller"),
organizationsInteractor,
presenter,
)
}
func provideTxController(
log *slog.Logger,
txInteractor transactions.TransactionsInteractor,
chainInteractor chain.ChainInteractor,
organizationsInteractor organizations.OrganizationsInteractor,
) controllers.TransactionsController {
return controllers.NewTransactionsController(
log.WithGroup("transactions-controller"),
txInteractor,
presenters.NewTransactionsPresenter(),
chainInteractor,
organizationsInteractor,
)
}
func provideParticipantsController(
log *slog.Logger,
orgInteractor organizations.OrganizationsInteractor,
usersInteractor users.UsersInteractor,
) controllers.ParticipantsController {
return controllers.NewParticipantsController(
log.WithGroup("participants-controller"),
orgInteractor,
usersInteractor,
presenters.NewParticipantsPresenter(),
)
}
func provideControllers(
log *slog.Logger,
authController controllers.AuthController,
orgController controllers.OrganizationsController,
txController controllers.TransactionsController,
participantsController controllers.ParticipantsController,
) *controllers.RootController {
return controllers.NewRootController(
controllers.NewPingController(log.WithGroup("ping-controller")),
authController,
orgController,
txController,
participantsController,
)
}
func provideRestServer(
log *slog.Logger,
controllers *controllers.RootController,
c config.Config,
jwt jwt.JWTInteractor,
) *rest.Server {
return rest.NewServer(
log.WithGroup("rest"),
c.Rest,
controllers,
jwt,
)
}