65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
package service
|
|
|
|
import (
|
|
"go.infratographer.com/x/gidx"
|
|
|
|
"go.equinixmetal.net/infra9-metal-bridge/internal/metal/models"
|
|
)
|
|
|
|
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 *models.UserDetails
|
|
}
|