package service import ( "context" "go.infratographer.com/x/gidx" "go.equinixmetal.net/infra9-metal-bridge/internal/metal/models" ) func (s *service) buildProjectRelationships(project *models.ProjectDetails) (Relationships, error) { relations := Relationships{ Relationships: []Relationship{ // Relate project to organization. { Resource: project, Relation: RelateParent, RelatedResource: project.Organization, }, }, } 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) IsProjectID(id gidx.PrefixedID) bool { if idType, ok := s.idPrefixMap[id.Prefix()]; ok { return idType == TypeProject } return false } func (s *service) TouchProject(ctx context.Context, id gidx.PrefixedID) error { logger := s.logger.With("project.id", id.String()) project, err := s.metal.GetProjectDetails(ctx, id) if err != nil { logger.Errorw("failed to get project", "error", err) return err } relationships, err := s.buildProjectRelationships(project) if err != nil { logger.Errorw("failed to build project relationships", "error", err) return err } s.processRelationships(ctx, "metal-relation", relationships.Relationships) s.syncMemberships(ctx, relationships.Memberships) s.logger.Infow("project sync complete", "relationships", len(relationships.Relationships), "memberships", len(relationships.Memberships)) return nil } func (s *service) DeleteProject(ctx context.Context, id gidx.PrefixedID) error { return nil }