block-accounting/backend/internal/usecase/interactors/organizations/interactor.go
2024-05-18 11:22:53 +03:00

81 lines
1.8 KiB
Go

package organizations
import (
"context"
"fmt"
"log/slog"
"time"
"github.com/emochka2007/block-accounting/internal/pkg/ctxmeta"
"github.com/emochka2007/block-accounting/internal/pkg/hdwallet"
"github.com/emochka2007/block-accounting/internal/pkg/models"
"github.com/emochka2007/block-accounting/internal/usecase/repository/organizations"
"github.com/google/uuid"
)
type CreateParams struct {
Name string
Address string
WalletMnemonic string
}
type OrganizationsInteractor interface {
Create(
ctx context.Context,
params CreateParams,
) (*models.Organization, error)
}
type organizationsInteractor struct {
log *slog.Logger
orgRepository organizations.Repository
}
func NewOrganizationsInteractor(
log *slog.Logger,
orgRepository organizations.Repository,
) OrganizationsInteractor {
return &organizationsInteractor{
log: log,
orgRepository: orgRepository,
}
}
func (i *organizationsInteractor) Create(
ctx context.Context,
params CreateParams,
) (*models.Organization, error) {
var walletSeed []byte
user, err := ctxmeta.User(ctx)
if err != nil {
return nil, fmt.Errorf("error fetch user from context. %w", err)
}
if params.WalletMnemonic == "" {
walletSeed = user.Seed()
} else {
seed, err := hdwallet.NewSeedFromMnemonic(params.WalletMnemonic)
if err != nil {
return nil, fmt.Errorf("error convert organization wallet mnemonic into a seed. %w", err)
}
walletSeed = seed
}
org := models.Organization{
ID: uuid.New(),
Name: params.Name,
Address: params.Address,
WalletSeed: walletSeed,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
if err := i.orgRepository.CreateAndAdd(ctx, org, user); err != nil {
return nil, fmt.Errorf("error create new organization. %w", err)
}
return &org, nil
}