mirror of
https://github.com/emo2007/block-accounting.git
synced 2025-04-16 18:26:28 +00:00
78 lines
2.1 KiB
Go
78 lines
2.1 KiB
Go
package controllers
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log/slog"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/emochka2007/block-accounting/internal/interface/rest/domain"
|
|
"github.com/emochka2007/block-accounting/internal/interface/rest/presenters"
|
|
"github.com/emochka2007/block-accounting/internal/pkg/ctxmeta"
|
|
"github.com/emochka2007/block-accounting/internal/usecase/interactors/transactions"
|
|
)
|
|
|
|
type TransactionsController interface {
|
|
New(w http.ResponseWriter, r *http.Request) ([]byte, error)
|
|
List(w http.ResponseWriter, r *http.Request) ([]byte, error)
|
|
}
|
|
|
|
type transactionsController struct {
|
|
log *slog.Logger
|
|
txInteractor transactions.TransactionsInteractor
|
|
txPresenter presenters.TransactionsPresenter
|
|
}
|
|
|
|
func NewTransactionsController(
|
|
log *slog.Logger,
|
|
txInteractor transactions.TransactionsInteractor,
|
|
txPresenter presenters.TransactionsPresenter,
|
|
) TransactionsController {
|
|
return &transactionsController{
|
|
log: log,
|
|
txInteractor: txInteractor,
|
|
txPresenter: txPresenter,
|
|
}
|
|
}
|
|
|
|
func (c *transactionsController) New(w http.ResponseWriter, r *http.Request) ([]byte, error) {
|
|
req, err := presenters.CreateRequest[domain.NewTransactionRequest](r)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error build new transaction request. %w", err)
|
|
}
|
|
|
|
ctx, cancel := context.WithTimeout(r.Context(), 30000*time.Second)
|
|
defer cancel()
|
|
|
|
organizationID, err := ctxmeta.OrganizationId(ctx)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error fetch organization ID from context. %w", err)
|
|
}
|
|
|
|
requestTx, err := c.txPresenter.RequestTransaction(ctx, req)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error build transaction model from request. %w", err)
|
|
}
|
|
|
|
c.log.Debug(
|
|
"new reuqest",
|
|
slog.Any("req", req),
|
|
slog.String("org id", organizationID.String()),
|
|
)
|
|
|
|
tx, err := c.txInteractor.Create(ctx, transactions.CreateParams{
|
|
OrganizationId: organizationID,
|
|
Tx: requestTx,
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error create new transaction. %w", err)
|
|
}
|
|
|
|
return c.txPresenter.ResponseNewTransaction(ctx, tx)
|
|
}
|
|
|
|
func (c *transactionsController) List(w http.ResponseWriter, r *http.Request) ([]byte, error) {
|
|
panic("implement me!")
|
|
}
|