package service import ( "context" "go.infratographer.com/x/gidx" "go.equinixmetal.net/infra9-metal-bridge/internal/metal/models" ) func (s *service) buildOrganizationRelationships(org *models.OrganizationDetails) (Relationships, error) { relations := Relationships{ Relationships: []Relationship{ // Related org to the root tenant. { Resource: org, Relation: RelateParent, RelatedResource: s.rootResource, }, }, } for _, member := range org.Memberships { for _, role := range member.Roles { if _, ok := s.roles[role]; !ok { s.logger.Warnf("unrecognized organization role '%s' for %s on %s", role, member.User.PrefixedID(), org.PrefixedID()) continue } relations.Memberships = append(relations.Memberships, ResourceMemberships{ Resource: org, Role: role, Member: member.User, }) } } for _, project := range org.Projects { relations.Relationships = append(relations.Relationships, Relationship{ Resource: project, Relation: RelateParent, RelatedResource: org, }) for _, member := range project.Memberships { for _, role := range member.Roles { if _, ok := s.roles[role]; !ok { s.logger.Warnf("unrecognized project role '%s' for %s on %s", role, member.User.PrefixedID(), project.PrefixedID()) continue } relations.Memberships = append(relations.Memberships, ResourceMemberships{ Resource: project, Role: role, Member: member.User, }) } } } return relations, nil } func (s *service) IsOrganizationID(id gidx.PrefixedID) bool { if idType, ok := s.idPrefixMap[id.Prefix()]; ok { return idType == TypeOrganization } return false } func (s *service) TouchOrganization(ctx context.Context, id gidx.PrefixedID) error { logger := s.logger.With("organization.id", id.String()) org, err := s.metal.GetOrganizationDetails(ctx, id) if err != nil { logger.Errorw("failed to get organization", "error", err) return err } relationships, err := s.buildOrganizationRelationships(org) if err != nil { logger.Errorw("failed to build organization relationships", "error", err) return err } s.processRelationships(ctx, "metal-relation", relationships.Relationships) s.processMemberships(ctx, relationships.Memberships) s.logger.Infow("organization sync complete", "relationships", len(relationships.Relationships), "memberships", len(relationships.Memberships)) return nil } func (s *service) DeleteOrganization(ctx context.Context, id gidx.PrefixedID) error { return nil }