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 { client *Client 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 }