118 lines
2.8 KiB
Go
118 lines
2.8 KiB
Go
package serverimp
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/tech/sendico/payments/methods/internal/service/methods"
|
|
"github.com/tech/sendico/payments/storage"
|
|
mongostorage "github.com/tech/sendico/payments/storage/mongo"
|
|
"github.com/tech/sendico/pkg/db"
|
|
"github.com/tech/sendico/pkg/merrors"
|
|
msg "github.com/tech/sendico/pkg/messaging"
|
|
mb "github.com/tech/sendico/pkg/messaging/broker"
|
|
"github.com/tech/sendico/pkg/mlogger"
|
|
"github.com/tech/sendico/pkg/mservice"
|
|
"github.com/tech/sendico/pkg/server/grpcapp"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
func Create(logger mlogger.Logger, file string, debug bool) (*Imp, error) {
|
|
return &Imp{
|
|
logger: logger.Named("server"),
|
|
file: file,
|
|
debug: debug,
|
|
}, nil
|
|
}
|
|
|
|
func (i *Imp) Shutdown() {
|
|
i.stopDiscovery()
|
|
if i.service != nil {
|
|
i.service.Shutdown()
|
|
}
|
|
i.shutdownApp()
|
|
if i.dbFactory != nil {
|
|
i.dbFactory.CloseConnection()
|
|
i.dbFactory = nil
|
|
}
|
|
}
|
|
|
|
func (i *Imp) Start() error {
|
|
cfg, err := i.loadConfig()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
i.config = cfg
|
|
|
|
i.initDiscovery(cfg)
|
|
|
|
if cfg.Database == nil {
|
|
return merrors.InvalidArgument("database configuration is required")
|
|
}
|
|
|
|
permissionsDB := cfg.PermissionsDatabase
|
|
if permissionsDB == nil {
|
|
i.logger.Info("Permissions_database is not configured, falling back to database settings")
|
|
permissionsDB = cfg.Database
|
|
}
|
|
|
|
i.dbFactory, err = db.NewConnection(i.logger, permissionsDB)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
policy, err := i.dbFactory.Permissions().GetPolicyDescription(context.Background(), mservice.PaymentMethods)
|
|
if err != nil {
|
|
i.dbFactory.CloseConnection()
|
|
i.dbFactory = nil
|
|
return err
|
|
}
|
|
|
|
var broker mb.Broker
|
|
if cfg.Messaging != nil && cfg.Messaging.Driver != "" {
|
|
broker, err = msg.CreateMessagingBroker(i.logger, cfg.Messaging)
|
|
if err != nil {
|
|
i.logger.Warn("Failed to create recipient notifications broker", zap.Error(err))
|
|
}
|
|
}
|
|
|
|
repoFactory := func(logger mlogger.Logger, conn *db.MongoConnection) (storage.Repository, error) {
|
|
return mongostorage.New(
|
|
logger,
|
|
conn,
|
|
mongostorage.WithPaymentMethodsAuth(i.dbFactory.Permissions().Enforcer(), policy.ID),
|
|
)
|
|
}
|
|
|
|
serviceFactory := func(logger mlogger.Logger, repo storage.Repository, producer msg.Producer) (grpcapp.Service, error) {
|
|
opts := []methods.Option{}
|
|
if broker != nil {
|
|
opts = append(opts, methods.WithRecipientEventsBroker(broker))
|
|
}
|
|
|
|
i.startDiscoveryAnnouncer(cfg, producer)
|
|
svc, err := methods.NewService(logger, repo, opts...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
i.service = svc
|
|
return svc, nil
|
|
}
|
|
|
|
app, err := grpcapp.NewApp(i.logger, "payments_methods", cfg.Config, i.debug, repoFactory, serviceFactory)
|
|
if err != nil {
|
|
i.dbFactory.CloseConnection()
|
|
i.dbFactory = nil
|
|
return err
|
|
}
|
|
i.app = app
|
|
|
|
if err := i.app.Start(); err != nil {
|
|
if i.dbFactory != nil {
|
|
i.dbFactory.CloseConnection()
|
|
i.dbFactory = nil
|
|
}
|
|
return err
|
|
}
|
|
return nil
|
|
}
|