Files
sendico/api/payments/methods/internal/server/internal/serverimp.go
2026-02-18 01:35:28 +01:00

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
}