package service import ( "go.infratographer.com/x/gidx" ) const ( RelateOwner RelationshipType = "owner" RelateParent RelationshipType = "parent" ) type RelationshipType string type IDPrefixableResource interface { PrefixedID() gidx.PrefixedID } type Relationships struct { Relationships []Relationship Memberships []ResourceMemberships } func (r Relationships) DeDupe() Relationships { rels := make(map[string]bool) mems := make(map[string]bool) var results Relationships for _, rel := range r.Relationships { key := rel.Resource.PrefixedID().String() + "/" + string(rel.Relation) + "/" + rel.RelatedResource.PrefixedID().String() if _, ok := rels[key]; !ok { rels[key] = true results.Relationships = append(results.Relationships, rel) } } for _, member := range r.Memberships { key := member.Resource.PrefixedID().String() + "/" + member.Role + "/" + member.Member.PrefixedID().String() if _, ok := mems[key]; !ok { mems[key] = true results.Memberships = append(results.Memberships, member) } } return results } type Relationship struct { Resource IDPrefixableResource Relation RelationshipType RelatedResource IDPrefixableResource } type ResourceMemberships struct { Resource IDPrefixableResource Role string Member IDPrefixableResource }