package emgql import "go.equinixmetal.net/infra9-metal-bridge/internal/metal/models" type organization struct { ID string `json:"id"` Name string `json:"name"` Projects []project `json:"projects"` Users []user `json:"users"` } func (o organization) ToOrganizationDetails() models.OrganizationDetails { orgDetails := models.OrganizationDetails{ ID: o.ID, Name: o.Name, } memberships := []*models.Membership[models.OrganizationDetails]{} for _, u := range o.Users { m := u.ToOrganizationMembership() memberships = append(memberships, &m) } pDetails := []*models.ProjectDetails{} for _, p := range o.Projects { details := p.ToProjectDetails() details.Organization = &orgDetails pDetails = append(pDetails, &details) } orgDetails.Memberships = memberships orgDetails.Projects = pDetails return orgDetails } type project struct { ID string `json:"id"` Name string `json:"name"` Users []user `json:"users"` Organization struct { ID string `json:"id"` } `json:"organization"` } func (p project) ToProjectDetails() models.ProjectDetails { memberships := []*models.Membership[models.ProjectDetails]{} for _, u := range p.Users { m := u.ToProjectMembership() memberships = append(memberships, &m) } return models.ProjectDetails{ ID: p.ID, Name: p.Name, Memberships: memberships, Organization: &models.OrganizationDetails{ ID: p.Organization.ID, }, } } type user struct { ID string `json:"id"` Roles []string `json:"roles"` } func (u user) ToOrganizationMembership() models.Membership[models.OrganizationDetails] { return models.Membership[models.OrganizationDetails]{ User: &models.UserDetails{ ID: u.ID, }, Roles: u.Roles, } } func (u user) ToProjectMembership() models.Membership[models.ProjectDetails] { return models.Membership[models.ProjectDetails]{ User: &models.UserDetails{ ID: u.ID, }, Roles: u.Roles, } }