block-accounting/backend/internal/interface/rest/presenters/organizations.go
2024-05-29 01:57:31 +03:00

90 lines
2.1 KiB
Go

package presenters
import (
"encoding/json"
"fmt"
"github.com/emochka2007/block-accounting/internal/interface/rest/domain"
"github.com/emochka2007/block-accounting/internal/interface/rest/domain/hal"
"github.com/emochka2007/block-accounting/internal/pkg/models"
)
type OrganizationsPresenter interface {
ResponseCreate(organization *models.Organization) ([]byte, error)
ResponseList(orgs []*models.Organization, nextCursor string) ([]byte, error)
Organizations(orgs []*models.Organization) []*hal.Resource
}
type organizationsPresenter struct {
}
func NewOrganizationsPresenter() OrganizationsPresenter {
return &organizationsPresenter{}
}
func (p *organizationsPresenter) ResponseCreate(o *models.Organization) ([]byte, error) {
org := domain.Organization{
Id: o.ID.String(),
Name: o.Name,
Address: o.Address,
CreatedAt: uint64(o.CreatedAt.UnixMilli()),
UpdatedAt: uint64(o.UpdatedAt.UnixMilli()),
}
r := hal.NewResource(
org,
"/organizations/"+org.Id,
hal.WithType("organization"),
)
out, err := json.Marshal(r)
if err != nil {
return nil, fmt.Errorf("error marshal organization create response. %w", err)
}
return out, nil
}
func (p *organizationsPresenter) ResponseList(orgs []*models.Organization, nextCursor string) ([]byte, error) {
dtoOrgs := domain.Collection[*hal.Resource]{
Items: p.Organizations(orgs),
Pagination: domain.Pagination{
NextCursor: nextCursor,
TotalItems: uint32(len(orgs)),
},
}
r := hal.NewResource(
dtoOrgs,
"/organizations",
hal.WithType("organizations"),
)
out, err := json.Marshal(r)
if err != nil {
return nil, fmt.Errorf("error marshal organizations list response. %w", err)
}
return out, nil
}
func (p *organizationsPresenter) Organizations(orgs []*models.Organization) []*hal.Resource {
out := make([]*hal.Resource, len(orgs))
for i, o := range orgs {
org := domain.Organization{
Id: o.ID.String(),
Name: o.Name,
Address: o.Address,
CreatedAt: uint64(o.CreatedAt.UnixMilli()),
UpdatedAt: uint64(o.UpdatedAt.UnixMilli()),
}
r := hal.NewResource(org, "/organizations/"+org.Id)
out[i] = r
}
return out
}