Files
bridge/internal/metal/providers/emapi/organizations.go
2023-07-17 19:14:23 +00:00

95 lines
2.2 KiB
Go

package emapi
import (
"context"
"fmt"
"net/http"
"go.infratographer.com/x/gidx"
"go.equinixmetal.net/infra9-metal-bridge/internal/metal/models"
)
const (
organizationsPath = "/organizations"
)
// Organizations contains a list of organizations.
type Organizations []*Organization
// ToDetails converts to a generic model organization details.
func (o Organizations) ToDetails() []*models.OrganizationDetails {
orgs := make([]*models.OrganizationDetails, len(o))
var nextIndex int
for _, org := range o {
orgs[nextIndex] = org.ToDetails()
if orgs[nextIndex] != nil {
nextIndex++
}
}
if nextIndex < len(o) {
return orgs[:nextIndex]
}
return orgs
}
// Organization contains organization information.
type Organization struct {
HREF string `json:"href"`
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Memberships Memberships `json:"memberships"`
Projects Projects `json:"projects"`
}
// ToDetails converts the object to a generic orgnization details.
func (o *Organization) ToDetails() *models.OrganizationDetails {
var id string
if o != nil {
id = idOrLinkID(o.ID, o.HREF)
}
if id == "" {
return nil
}
details := &models.OrganizationDetails{
ID: id,
Name: o.Name,
Projects: o.Projects.ToDetails(),
}
details.Memberships = o.Memberships.ToDetailsWithOrganizationDetails(details)
return details
}
// getOrganizationWithMemberships fetches an organization from the equinix metal api with membership user information.
func (c *Client) getOrganizationWithMemberships(ctx context.Context, id string) (*Organization, error) {
var org Organization
_, err := c.DoRequest(ctx, http.MethodGet, organizationsPath+"/"+id+"?include=memberships.user", nil, &org)
if err != nil {
return nil, fmt.Errorf("error loading organization: %w", err)
}
return &org, nil
}
// GetOrganizationDetails fetches the organization id provided with its memberships.
func (c *Client) GetOrganizationDetails(ctx context.Context, id gidx.PrefixedID) (*models.OrganizationDetails, error) {
org, err := c.getOrganizationWithMemberships(ctx, id.String()[gidx.PrefixPartLength+1:])
if err != nil {
return nil, err
}
return org.ToDetails(), nil
}