// Define parent type with child annotation
var orgResourceType = &v2.ResourceType{
Id: "organization",
DisplayName: "Organization",
Traits: []v2.ResourceType_Trait{v2.ResourceType_TRAIT_GROUP},
}
var projectResourceType = &v2.ResourceType{
Id: "project",
DisplayName: "Project",
Traits: []v2.ResourceType_Trait{v2.ResourceType_TRAIT_GROUP},
}
// In org List(), declare children
func (o *orgBuilder) List(ctx context.Context, _ *v2.ResourceId,
pToken *pagination.Token) ([]*v2.Resource, string, annotations.Annotations, error) {
orgs, err := o.client.ListOrgs(ctx)
if err != nil {
return nil, "", nil, err
}
var resources []*v2.Resource
for _, org := range orgs {
r, _ := resource.NewResource(org.Name, orgResourceType, org.ID,
// Declare that this org has project children
resource.WithAnnotation(&v2.ChildResourceType{
ResourceTypeId: projectResourceType.Id,
}),
)
resources = append(resources, r)
}
return resources, "", nil, nil
}
// In project List(), reference parent
func (p *projectBuilder) List(ctx context.Context, parentID *v2.ResourceId,
pToken *pagination.Token) ([]*v2.Resource, string, annotations.Annotations, error) {
// parentID is the org ID when SDK calls this for each org
if parentID == nil {
return nil, "", nil, nil // Projects only exist within orgs
}
projects, err := p.client.ListProjects(ctx, parentID.Resource)
if err != nil {
return nil, "", nil, err
}
var resources []*v2.Resource
for _, proj := range projects {
r, _ := resource.NewResource(proj.Name, projectResourceType, proj.ID,
resource.WithParentResourceID(parentID),
)
resources = append(resources, r)
}
return resources, "", nil, nil
}