diff --git a/app/controlplane/pkg/biz/group.go b/app/controlplane/pkg/biz/group.go index 61e9de0ad..4f370d782 100644 --- a/app/controlplane/pkg/biz/group.go +++ b/app/controlplane/pkg/biz/group.go @@ -119,6 +119,8 @@ type ListGroupOpts struct { Description string // MemberEmail is the email of the member to filter by. MemberEmail string + // UserID is the ID of the user to filter by. + UserID *uuid.UUID } // ListMembersOpts defines options for listing members of a group. diff --git a/app/controlplane/pkg/biz/group_integration_test.go b/app/controlplane/pkg/biz/group_integration_test.go index 68c7388c2..a9a712f75 100644 --- a/app/controlplane/pkg/biz/group_integration_test.go +++ b/app/controlplane/pkg/biz/group_integration_test.go @@ -392,6 +392,7 @@ func (s *groupListIntegrationTestSuite) TearDownSubTest() { ctx := context.Background() // Clean up the database after each test _, _ = s.Data.DB.Group.Delete().Exec(ctx) + _, _ = s.Data.DB.Membership.Delete().Exec(ctx) } // Test listing groups with various filters @@ -520,6 +521,35 @@ func (s *groupListIntegrationTestSuite) TestList() { s.Equal(group2.ID, groups[0].ID) }) + s.Run("list groups with member ID", func() { + // Create a second user + user2, err := s.User.UpsertByEmail(ctx, "user2@example.com", nil) + require.NoError(s.T(), err) + + // Add user2 to organization + _, err = s.Membership.Create(ctx, s.org.ID, user2.ID) + require.NoError(s.T(), err) + + // Create a group with user as maintainer + groupWithUser1 := "Group with user 1" + _, err = s.Group.Create(ctx, uuid.MustParse(s.org.ID), "group-with-user1", groupWithUser1, s.userUUID) + require.NoError(s.T(), err) + + // Create a group with user2 as maintainer + groupWithUser2 := "Group with user 2" + user2UUID := uuid.MustParse(user2.ID) + group2, err := s.Group.Create(ctx, uuid.MustParse(s.org.ID), "group-with-user2", groupWithUser2, &user2UUID) + require.NoError(s.T(), err) + + // Filter by member ID + filterOpts := &biz.ListGroupOpts{UserID: &user2UUID} + groups, count, err := s.Group.List(ctx, uuid.MustParse(s.org.ID), filterOpts, nil) + s.NoError(err) + s.Equal(1, len(groups)) + s.Equal(1, count) + s.Equal(group2.ID, groups[0].ID) + }) + s.Run("list groups with pagination", func() { // Create several groups for i := 1; i <= 5; i++ { diff --git a/app/controlplane/pkg/data/ent/client.go b/app/controlplane/pkg/data/ent/client.go index 6cfb85ae1..a5d7652ed 100644 --- a/app/controlplane/pkg/data/ent/client.go +++ b/app/controlplane/pkg/data/ent/client.go @@ -1134,15 +1134,15 @@ func (c *GroupClient) GetX(ctx context.Context, id uuid.UUID) *Group { return obj } -// QueryMembers queries the members edge of a Group. -func (c *GroupClient) QueryMembers(gr *Group) *UserQuery { - query := (&UserClient{config: c.config}).Query() +// QueryGroupMemberships queries the group_memberships edge of a Group. +func (c *GroupClient) QueryGroupMemberships(gr *Group) *GroupMembershipQuery { + query := (&GroupMembershipClient{config: c.config}).Query() query.path = func(context.Context) (fromV *sql.Selector, _ error) { id := gr.ID step := sqlgraph.NewStep( sqlgraph.From(group.Table, group.FieldID, id), - sqlgraph.To(user.Table, user.FieldID), - sqlgraph.Edge(sqlgraph.M2M, false, group.MembersTable, group.MembersPrimaryKey...), + sqlgraph.To(groupmembership.Table, groupmembership.FieldID), + sqlgraph.Edge(sqlgraph.O2M, true, group.GroupMembershipsTable, group.GroupMembershipsColumn), ) fromV = sqlgraph.Neighbors(gr.driver.Dialect(), step) return fromV, nil @@ -1166,22 +1166,6 @@ func (c *GroupClient) QueryOrganization(gr *Group) *OrganizationQuery { return query } -// QueryGroupUsers queries the group_users edge of a Group. -func (c *GroupClient) QueryGroupUsers(gr *Group) *GroupMembershipQuery { - query := (&GroupMembershipClient{config: c.config}).Query() - query.path = func(context.Context) (fromV *sql.Selector, _ error) { - id := gr.ID - step := sqlgraph.NewStep( - sqlgraph.From(group.Table, group.FieldID, id), - sqlgraph.To(groupmembership.Table, groupmembership.FieldID), - sqlgraph.Edge(sqlgraph.O2M, true, group.GroupUsersTable, group.GroupUsersColumn), - ) - fromV = sqlgraph.Neighbors(gr.driver.Dialect(), step) - return fromV, nil - } - return query -} - // Hooks returns the client hooks. func (c *GroupClient) Hooks() []Hook { return c.hooks.Group @@ -3125,31 +3109,15 @@ func (c *UserClient) QueryMemberships(u *User) *MembershipQuery { return query } -// QueryGroup queries the group edge of a User. -func (c *UserClient) QueryGroup(u *User) *GroupQuery { - query := (&GroupClient{config: c.config}).Query() - query.path = func(context.Context) (fromV *sql.Selector, _ error) { - id := u.ID - step := sqlgraph.NewStep( - sqlgraph.From(user.Table, user.FieldID, id), - sqlgraph.To(group.Table, group.FieldID), - sqlgraph.Edge(sqlgraph.M2M, true, user.GroupTable, user.GroupPrimaryKey...), - ) - fromV = sqlgraph.Neighbors(u.driver.Dialect(), step) - return fromV, nil - } - return query -} - -// QueryGroupUsers queries the group_users edge of a User. -func (c *UserClient) QueryGroupUsers(u *User) *GroupMembershipQuery { +// QueryGroupMemberships queries the group_memberships edge of a User. +func (c *UserClient) QueryGroupMemberships(u *User) *GroupMembershipQuery { query := (&GroupMembershipClient{config: c.config}).Query() query.path = func(context.Context) (fromV *sql.Selector, _ error) { id := u.ID step := sqlgraph.NewStep( sqlgraph.From(user.Table, user.FieldID, id), sqlgraph.To(groupmembership.Table, groupmembership.FieldID), - sqlgraph.Edge(sqlgraph.O2M, true, user.GroupUsersTable, user.GroupUsersColumn), + sqlgraph.Edge(sqlgraph.O2M, true, user.GroupMembershipsTable, user.GroupMembershipsColumn), ) fromV = sqlgraph.Neighbors(u.driver.Dialect(), step) return fromV, nil diff --git a/app/controlplane/pkg/data/ent/group.go b/app/controlplane/pkg/data/ent/group.go index 937b7564f..5f67fea4d 100644 --- a/app/controlplane/pkg/data/ent/group.go +++ b/app/controlplane/pkg/data/ent/group.go @@ -41,24 +41,22 @@ type Group struct { // GroupEdges holds the relations/edges for other nodes in the graph. type GroupEdges struct { - // Members holds the value of the members edge. - Members []*User `json:"members,omitempty"` + // GroupMemberships holds the value of the group_memberships edge. + GroupMemberships []*GroupMembership `json:"group_memberships,omitempty"` // Organization holds the value of the organization edge. Organization *Organization `json:"organization,omitempty"` - // GroupUsers holds the value of the group_users edge. - GroupUsers []*GroupMembership `json:"group_users,omitempty"` // loadedTypes holds the information for reporting if a // type was loaded (or requested) in eager-loading or not. - loadedTypes [3]bool + loadedTypes [2]bool } -// MembersOrErr returns the Members value or an error if the edge +// GroupMembershipsOrErr returns the GroupMemberships value or an error if the edge // was not loaded in eager-loading. -func (e GroupEdges) MembersOrErr() ([]*User, error) { +func (e GroupEdges) GroupMembershipsOrErr() ([]*GroupMembership, error) { if e.loadedTypes[0] { - return e.Members, nil + return e.GroupMemberships, nil } - return nil, &NotLoadedError{edge: "members"} + return nil, &NotLoadedError{edge: "group_memberships"} } // OrganizationOrErr returns the Organization value or an error if the edge @@ -72,15 +70,6 @@ func (e GroupEdges) OrganizationOrErr() (*Organization, error) { return nil, &NotLoadedError{edge: "organization"} } -// GroupUsersOrErr returns the GroupUsers value or an error if the edge -// was not loaded in eager-loading. -func (e GroupEdges) GroupUsersOrErr() ([]*GroupMembership, error) { - if e.loadedTypes[2] { - return e.GroupUsers, nil - } - return nil, &NotLoadedError{edge: "group_users"} -} - // scanValues returns the types for scanning values from sql.Rows. func (*Group) scanValues(columns []string) ([]any, error) { values := make([]any, len(columns)) @@ -170,9 +159,9 @@ func (gr *Group) Value(name string) (ent.Value, error) { return gr.selectValues.Get(name) } -// QueryMembers queries the "members" edge of the Group entity. -func (gr *Group) QueryMembers() *UserQuery { - return NewGroupClient(gr.config).QueryMembers(gr) +// QueryGroupMemberships queries the "group_memberships" edge of the Group entity. +func (gr *Group) QueryGroupMemberships() *GroupMembershipQuery { + return NewGroupClient(gr.config).QueryGroupMemberships(gr) } // QueryOrganization queries the "organization" edge of the Group entity. @@ -180,11 +169,6 @@ func (gr *Group) QueryOrganization() *OrganizationQuery { return NewGroupClient(gr.config).QueryOrganization(gr) } -// QueryGroupUsers queries the "group_users" edge of the Group entity. -func (gr *Group) QueryGroupUsers() *GroupMembershipQuery { - return NewGroupClient(gr.config).QueryGroupUsers(gr) -} - // Update returns a builder for updating this Group. // Note that you need to call Group.Unwrap() before calling this method if this Group // was returned from a transaction, and the transaction was committed or rolled back. diff --git a/app/controlplane/pkg/data/ent/group/group.go b/app/controlplane/pkg/data/ent/group/group.go index 01835d4e1..13e613ef0 100644 --- a/app/controlplane/pkg/data/ent/group/group.go +++ b/app/controlplane/pkg/data/ent/group/group.go @@ -29,19 +29,19 @@ const ( FieldDeletedAt = "deleted_at" // FieldMemberCount holds the string denoting the member_count field in the database. FieldMemberCount = "member_count" - // EdgeMembers holds the string denoting the members edge name in mutations. - EdgeMembers = "members" + // EdgeGroupMemberships holds the string denoting the group_memberships edge name in mutations. + EdgeGroupMemberships = "group_memberships" // EdgeOrganization holds the string denoting the organization edge name in mutations. EdgeOrganization = "organization" - // EdgeGroupUsers holds the string denoting the group_users edge name in mutations. - EdgeGroupUsers = "group_users" // Table holds the table name of the group in the database. Table = "groups" - // MembersTable is the table that holds the members relation/edge. The primary key declared below. - MembersTable = "group_memberships" - // MembersInverseTable is the table name for the User entity. - // It exists in this package in order to avoid circular dependency with the "user" package. - MembersInverseTable = "users" + // GroupMembershipsTable is the table that holds the group_memberships relation/edge. + GroupMembershipsTable = "group_memberships" + // GroupMembershipsInverseTable is the table name for the GroupMembership entity. + // It exists in this package in order to avoid circular dependency with the "groupmembership" package. + GroupMembershipsInverseTable = "group_memberships" + // GroupMembershipsColumn is the table column denoting the group_memberships relation/edge. + GroupMembershipsColumn = "group_id" // OrganizationTable is the table that holds the organization relation/edge. OrganizationTable = "groups" // OrganizationInverseTable is the table name for the Organization entity. @@ -49,13 +49,6 @@ const ( OrganizationInverseTable = "organizations" // OrganizationColumn is the table column denoting the organization relation/edge. OrganizationColumn = "organization_id" - // GroupUsersTable is the table that holds the group_users relation/edge. - GroupUsersTable = "group_memberships" - // GroupUsersInverseTable is the table name for the GroupMembership entity. - // It exists in this package in order to avoid circular dependency with the "groupmembership" package. - GroupUsersInverseTable = "group_memberships" - // GroupUsersColumn is the table column denoting the group_users relation/edge. - GroupUsersColumn = "group_id" ) // Columns holds all SQL columns for group fields. @@ -70,12 +63,6 @@ var Columns = []string{ FieldMemberCount, } -var ( - // MembersPrimaryKey and MembersColumn2 are the table columns denoting the - // primary key for the members relation (M2M). - MembersPrimaryKey = []string{"group_id", "user_id"} -) - // ValidColumn reports if the column name is valid (part of the table columns). func ValidColumn(column string) bool { for i := range Columns { @@ -142,17 +129,17 @@ func ByMemberCount(opts ...sql.OrderTermOption) OrderOption { return sql.OrderByField(FieldMemberCount, opts...).ToFunc() } -// ByMembersCount orders the results by members count. -func ByMembersCount(opts ...sql.OrderTermOption) OrderOption { +// ByGroupMembershipsCount orders the results by group_memberships count. +func ByGroupMembershipsCount(opts ...sql.OrderTermOption) OrderOption { return func(s *sql.Selector) { - sqlgraph.OrderByNeighborsCount(s, newMembersStep(), opts...) + sqlgraph.OrderByNeighborsCount(s, newGroupMembershipsStep(), opts...) } } -// ByMembers orders the results by members terms. -func ByMembers(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { +// ByGroupMemberships orders the results by group_memberships terms. +func ByGroupMemberships(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { return func(s *sql.Selector) { - sqlgraph.OrderByNeighborTerms(s, newMembersStep(), append([]sql.OrderTerm{term}, terms...)...) + sqlgraph.OrderByNeighborTerms(s, newGroupMembershipsStep(), append([]sql.OrderTerm{term}, terms...)...) } } @@ -162,25 +149,11 @@ func ByOrganizationField(field string, opts ...sql.OrderTermOption) OrderOption sqlgraph.OrderByNeighborTerms(s, newOrganizationStep(), sql.OrderByField(field, opts...)) } } - -// ByGroupUsersCount orders the results by group_users count. -func ByGroupUsersCount(opts ...sql.OrderTermOption) OrderOption { - return func(s *sql.Selector) { - sqlgraph.OrderByNeighborsCount(s, newGroupUsersStep(), opts...) - } -} - -// ByGroupUsers orders the results by group_users terms. -func ByGroupUsers(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { - return func(s *sql.Selector) { - sqlgraph.OrderByNeighborTerms(s, newGroupUsersStep(), append([]sql.OrderTerm{term}, terms...)...) - } -} -func newMembersStep() *sqlgraph.Step { +func newGroupMembershipsStep() *sqlgraph.Step { return sqlgraph.NewStep( sqlgraph.From(Table, FieldID), - sqlgraph.To(MembersInverseTable, FieldID), - sqlgraph.Edge(sqlgraph.M2M, false, MembersTable, MembersPrimaryKey...), + sqlgraph.To(GroupMembershipsInverseTable, FieldID), + sqlgraph.Edge(sqlgraph.O2M, true, GroupMembershipsTable, GroupMembershipsColumn), ) } func newOrganizationStep() *sqlgraph.Step { @@ -190,10 +163,3 @@ func newOrganizationStep() *sqlgraph.Step { sqlgraph.Edge(sqlgraph.M2O, true, OrganizationTable, OrganizationColumn), ) } -func newGroupUsersStep() *sqlgraph.Step { - return sqlgraph.NewStep( - sqlgraph.From(Table, FieldID), - sqlgraph.To(GroupUsersInverseTable, FieldID), - sqlgraph.Edge(sqlgraph.O2M, true, GroupUsersTable, GroupUsersColumn), - ) -} diff --git a/app/controlplane/pkg/data/ent/group/where.go b/app/controlplane/pkg/data/ent/group/where.go index 1178813c2..8de6100b1 100644 --- a/app/controlplane/pkg/data/ent/group/where.go +++ b/app/controlplane/pkg/data/ent/group/where.go @@ -421,21 +421,21 @@ func MemberCountLTE(v int) predicate.Group { return predicate.Group(sql.FieldLTE(FieldMemberCount, v)) } -// HasMembers applies the HasEdge predicate on the "members" edge. -func HasMembers() predicate.Group { +// HasGroupMemberships applies the HasEdge predicate on the "group_memberships" edge. +func HasGroupMemberships() predicate.Group { return predicate.Group(func(s *sql.Selector) { step := sqlgraph.NewStep( sqlgraph.From(Table, FieldID), - sqlgraph.Edge(sqlgraph.M2M, false, MembersTable, MembersPrimaryKey...), + sqlgraph.Edge(sqlgraph.O2M, true, GroupMembershipsTable, GroupMembershipsColumn), ) sqlgraph.HasNeighbors(s, step) }) } -// HasMembersWith applies the HasEdge predicate on the "members" edge with a given conditions (other predicates). -func HasMembersWith(preds ...predicate.User) predicate.Group { +// HasGroupMembershipsWith applies the HasEdge predicate on the "group_memberships" edge with a given conditions (other predicates). +func HasGroupMembershipsWith(preds ...predicate.GroupMembership) predicate.Group { return predicate.Group(func(s *sql.Selector) { - step := newMembersStep() + step := newGroupMembershipsStep() sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { for _, p := range preds { p(s) @@ -467,29 +467,6 @@ func HasOrganizationWith(preds ...predicate.Organization) predicate.Group { }) } -// HasGroupUsers applies the HasEdge predicate on the "group_users" edge. -func HasGroupUsers() predicate.Group { - return predicate.Group(func(s *sql.Selector) { - step := sqlgraph.NewStep( - sqlgraph.From(Table, FieldID), - sqlgraph.Edge(sqlgraph.O2M, true, GroupUsersTable, GroupUsersColumn), - ) - sqlgraph.HasNeighbors(s, step) - }) -} - -// HasGroupUsersWith applies the HasEdge predicate on the "group_users" edge with a given conditions (other predicates). -func HasGroupUsersWith(preds ...predicate.GroupMembership) predicate.Group { - return predicate.Group(func(s *sql.Selector) { - step := newGroupUsersStep() - sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { - for _, p := range preds { - p(s) - } - }) - }) -} - // And groups predicates with the AND operator between them. func And(predicates ...predicate.Group) predicate.Group { return predicate.Group(sql.AndPredicates(predicates...)) diff --git a/app/controlplane/pkg/data/ent/group_create.go b/app/controlplane/pkg/data/ent/group_create.go index 90d1cd9f3..f0d0d1647 100644 --- a/app/controlplane/pkg/data/ent/group_create.go +++ b/app/controlplane/pkg/data/ent/group_create.go @@ -15,7 +15,6 @@ import ( "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/group" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/groupmembership" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/organization" - "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/user" "github.com/google/uuid" ) @@ -123,19 +122,19 @@ func (gc *GroupCreate) SetNillableID(u *uuid.UUID) *GroupCreate { return gc } -// AddMemberIDs adds the "members" edge to the User entity by IDs. -func (gc *GroupCreate) AddMemberIDs(ids ...uuid.UUID) *GroupCreate { - gc.mutation.AddMemberIDs(ids...) +// AddGroupMembershipIDs adds the "group_memberships" edge to the GroupMembership entity by IDs. +func (gc *GroupCreate) AddGroupMembershipIDs(ids ...uuid.UUID) *GroupCreate { + gc.mutation.AddGroupMembershipIDs(ids...) return gc } -// AddMembers adds the "members" edges to the User entity. -func (gc *GroupCreate) AddMembers(u ...*User) *GroupCreate { - ids := make([]uuid.UUID, len(u)) - for i := range u { - ids[i] = u[i].ID +// AddGroupMemberships adds the "group_memberships" edges to the GroupMembership entity. +func (gc *GroupCreate) AddGroupMemberships(g ...*GroupMembership) *GroupCreate { + ids := make([]uuid.UUID, len(g)) + for i := range g { + ids[i] = g[i].ID } - return gc.AddMemberIDs(ids...) + return gc.AddGroupMembershipIDs(ids...) } // SetOrganization sets the "organization" edge to the Organization entity. @@ -143,21 +142,6 @@ func (gc *GroupCreate) SetOrganization(o *Organization) *GroupCreate { return gc.SetOrganizationID(o.ID) } -// AddGroupUserIDs adds the "group_users" edge to the GroupMembership entity by IDs. -func (gc *GroupCreate) AddGroupUserIDs(ids ...uuid.UUID) *GroupCreate { - gc.mutation.AddGroupUserIDs(ids...) - return gc -} - -// AddGroupUsers adds the "group_users" edges to the GroupMembership entity. -func (gc *GroupCreate) AddGroupUsers(g ...*GroupMembership) *GroupCreate { - ids := make([]uuid.UUID, len(g)) - for i := range g { - ids[i] = g[i].ID - } - return gc.AddGroupUserIDs(ids...) -} - // Mutation returns the GroupMutation object of the builder. func (gc *GroupCreate) Mutation() *GroupMutation { return gc.mutation @@ -296,27 +280,20 @@ func (gc *GroupCreate) createSpec() (*Group, *sqlgraph.CreateSpec) { _spec.SetField(group.FieldMemberCount, field.TypeInt, value) _node.MemberCount = value } - if nodes := gc.mutation.MembersIDs(); len(nodes) > 0 { + if nodes := gc.mutation.GroupMembershipsIDs(); len(nodes) > 0 { edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: false, - Table: group.MembersTable, - Columns: group.MembersPrimaryKey, + Rel: sqlgraph.O2M, + Inverse: true, + Table: group.GroupMembershipsTable, + Columns: []string{group.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), }, } for _, k := range nodes { edge.Target.Nodes = append(edge.Target.Nodes, k) } - createE := &GroupMembershipCreate{config: gc.config, mutation: newGroupMembershipMutation(gc.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } _spec.Edges = append(_spec.Edges, edge) } if nodes := gc.mutation.OrganizationIDs(); len(nodes) > 0 { @@ -336,22 +313,6 @@ func (gc *GroupCreate) createSpec() (*Group, *sqlgraph.CreateSpec) { _node.OrganizationID = nodes[0] _spec.Edges = append(_spec.Edges, edge) } - if nodes := gc.mutation.GroupUsersIDs(); len(nodes) > 0 { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.O2M, - Inverse: true, - Table: group.GroupUsersTable, - Columns: []string{group.GroupUsersColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - _spec.Edges = append(_spec.Edges, edge) - } return _node, _spec } diff --git a/app/controlplane/pkg/data/ent/group_query.go b/app/controlplane/pkg/data/ent/group_query.go index 84c0a7956..968116fb2 100644 --- a/app/controlplane/pkg/data/ent/group_query.go +++ b/app/controlplane/pkg/data/ent/group_query.go @@ -17,21 +17,19 @@ import ( "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/groupmembership" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/organization" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/predicate" - "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/user" "github.com/google/uuid" ) // GroupQuery is the builder for querying Group entities. type GroupQuery struct { config - ctx *QueryContext - order []group.OrderOption - inters []Interceptor - predicates []predicate.Group - withMembers *UserQuery - withOrganization *OrganizationQuery - withGroupUsers *GroupMembershipQuery - modifiers []func(*sql.Selector) + ctx *QueryContext + order []group.OrderOption + inters []Interceptor + predicates []predicate.Group + withGroupMemberships *GroupMembershipQuery + withOrganization *OrganizationQuery + modifiers []func(*sql.Selector) // intermediate query (i.e. traversal path). sql *sql.Selector path func(context.Context) (*sql.Selector, error) @@ -68,9 +66,9 @@ func (gq *GroupQuery) Order(o ...group.OrderOption) *GroupQuery { return gq } -// QueryMembers chains the current query on the "members" edge. -func (gq *GroupQuery) QueryMembers() *UserQuery { - query := (&UserClient{config: gq.config}).Query() +// QueryGroupMemberships chains the current query on the "group_memberships" edge. +func (gq *GroupQuery) QueryGroupMemberships() *GroupMembershipQuery { + query := (&GroupMembershipClient{config: gq.config}).Query() query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { if err := gq.prepareQuery(ctx); err != nil { return nil, err @@ -81,8 +79,8 @@ func (gq *GroupQuery) QueryMembers() *UserQuery { } step := sqlgraph.NewStep( sqlgraph.From(group.Table, group.FieldID, selector), - sqlgraph.To(user.Table, user.FieldID), - sqlgraph.Edge(sqlgraph.M2M, false, group.MembersTable, group.MembersPrimaryKey...), + sqlgraph.To(groupmembership.Table, groupmembership.FieldID), + sqlgraph.Edge(sqlgraph.O2M, true, group.GroupMembershipsTable, group.GroupMembershipsColumn), ) fromU = sqlgraph.SetNeighbors(gq.driver.Dialect(), step) return fromU, nil @@ -112,28 +110,6 @@ func (gq *GroupQuery) QueryOrganization() *OrganizationQuery { return query } -// QueryGroupUsers chains the current query on the "group_users" edge. -func (gq *GroupQuery) QueryGroupUsers() *GroupMembershipQuery { - query := (&GroupMembershipClient{config: gq.config}).Query() - query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { - if err := gq.prepareQuery(ctx); err != nil { - return nil, err - } - selector := gq.sqlQuery(ctx) - if err := selector.Err(); err != nil { - return nil, err - } - step := sqlgraph.NewStep( - sqlgraph.From(group.Table, group.FieldID, selector), - sqlgraph.To(groupmembership.Table, groupmembership.FieldID), - sqlgraph.Edge(sqlgraph.O2M, true, group.GroupUsersTable, group.GroupUsersColumn), - ) - fromU = sqlgraph.SetNeighbors(gq.driver.Dialect(), step) - return fromU, nil - } - return query -} - // First returns the first Group entity from the query. // Returns a *NotFoundError when no Group was found. func (gq *GroupQuery) First(ctx context.Context) (*Group, error) { @@ -321,14 +297,13 @@ func (gq *GroupQuery) Clone() *GroupQuery { return nil } return &GroupQuery{ - config: gq.config, - ctx: gq.ctx.Clone(), - order: append([]group.OrderOption{}, gq.order...), - inters: append([]Interceptor{}, gq.inters...), - predicates: append([]predicate.Group{}, gq.predicates...), - withMembers: gq.withMembers.Clone(), - withOrganization: gq.withOrganization.Clone(), - withGroupUsers: gq.withGroupUsers.Clone(), + config: gq.config, + ctx: gq.ctx.Clone(), + order: append([]group.OrderOption{}, gq.order...), + inters: append([]Interceptor{}, gq.inters...), + predicates: append([]predicate.Group{}, gq.predicates...), + withGroupMemberships: gq.withGroupMemberships.Clone(), + withOrganization: gq.withOrganization.Clone(), // clone intermediate query. sql: gq.sql.Clone(), path: gq.path, @@ -336,14 +311,14 @@ func (gq *GroupQuery) Clone() *GroupQuery { } } -// WithMembers tells the query-builder to eager-load the nodes that are connected to -// the "members" edge. The optional arguments are used to configure the query builder of the edge. -func (gq *GroupQuery) WithMembers(opts ...func(*UserQuery)) *GroupQuery { - query := (&UserClient{config: gq.config}).Query() +// WithGroupMemberships tells the query-builder to eager-load the nodes that are connected to +// the "group_memberships" edge. The optional arguments are used to configure the query builder of the edge. +func (gq *GroupQuery) WithGroupMemberships(opts ...func(*GroupMembershipQuery)) *GroupQuery { + query := (&GroupMembershipClient{config: gq.config}).Query() for _, opt := range opts { opt(query) } - gq.withMembers = query + gq.withGroupMemberships = query return gq } @@ -358,17 +333,6 @@ func (gq *GroupQuery) WithOrganization(opts ...func(*OrganizationQuery)) *GroupQ return gq } -// WithGroupUsers tells the query-builder to eager-load the nodes that are connected to -// the "group_users" edge. The optional arguments are used to configure the query builder of the edge. -func (gq *GroupQuery) WithGroupUsers(opts ...func(*GroupMembershipQuery)) *GroupQuery { - query := (&GroupMembershipClient{config: gq.config}).Query() - for _, opt := range opts { - opt(query) - } - gq.withGroupUsers = query - return gq -} - // GroupBy is used to group vertices by one or more fields/columns. // It is often used with aggregate functions, like: count, max, mean, min, sum. // @@ -447,10 +411,9 @@ func (gq *GroupQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*Group, var ( nodes = []*Group{} _spec = gq.querySpec() - loadedTypes = [3]bool{ - gq.withMembers != nil, + loadedTypes = [2]bool{ + gq.withGroupMemberships != nil, gq.withOrganization != nil, - gq.withGroupUsers != nil, } ) _spec.ScanValues = func(columns []string) ([]any, error) { @@ -474,10 +437,10 @@ func (gq *GroupQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*Group, if len(nodes) == 0 { return nodes, nil } - if query := gq.withMembers; query != nil { - if err := gq.loadMembers(ctx, query, nodes, - func(n *Group) { n.Edges.Members = []*User{} }, - func(n *Group, e *User) { n.Edges.Members = append(n.Edges.Members, e) }); err != nil { + if query := gq.withGroupMemberships; query != nil { + if err := gq.loadGroupMemberships(ctx, query, nodes, + func(n *Group) { n.Edges.GroupMemberships = []*GroupMembership{} }, + func(n *Group, e *GroupMembership) { n.Edges.GroupMemberships = append(n.Edges.GroupMemberships, e) }); err != nil { return nil, err } } @@ -487,74 +450,36 @@ func (gq *GroupQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*Group, return nil, err } } - if query := gq.withGroupUsers; query != nil { - if err := gq.loadGroupUsers(ctx, query, nodes, - func(n *Group) { n.Edges.GroupUsers = []*GroupMembership{} }, - func(n *Group, e *GroupMembership) { n.Edges.GroupUsers = append(n.Edges.GroupUsers, e) }); err != nil { - return nil, err - } - } return nodes, nil } -func (gq *GroupQuery) loadMembers(ctx context.Context, query *UserQuery, nodes []*Group, init func(*Group), assign func(*Group, *User)) error { - edgeIDs := make([]driver.Value, len(nodes)) - byID := make(map[uuid.UUID]*Group) - nids := make(map[uuid.UUID]map[*Group]struct{}) - for i, node := range nodes { - edgeIDs[i] = node.ID - byID[node.ID] = node +func (gq *GroupQuery) loadGroupMemberships(ctx context.Context, query *GroupMembershipQuery, nodes []*Group, init func(*Group), assign func(*Group, *GroupMembership)) error { + fks := make([]driver.Value, 0, len(nodes)) + nodeids := make(map[uuid.UUID]*Group) + for i := range nodes { + fks = append(fks, nodes[i].ID) + nodeids[nodes[i].ID] = nodes[i] if init != nil { - init(node) + init(nodes[i]) } } - query.Where(func(s *sql.Selector) { - joinT := sql.Table(group.MembersTable) - s.Join(joinT).On(s.C(user.FieldID), joinT.C(group.MembersPrimaryKey[1])) - s.Where(sql.InValues(joinT.C(group.MembersPrimaryKey[0]), edgeIDs...)) - columns := s.SelectedColumns() - s.Select(joinT.C(group.MembersPrimaryKey[0])) - s.AppendSelect(columns...) - s.SetDistinct(false) - }) - if err := query.prepareQuery(ctx); err != nil { - return err + if len(query.ctx.Fields) > 0 { + query.ctx.AppendFieldOnce(groupmembership.FieldGroupID) } - qr := QuerierFunc(func(ctx context.Context, q Query) (Value, error) { - return query.sqlAll(ctx, func(_ context.Context, spec *sqlgraph.QuerySpec) { - assign := spec.Assign - values := spec.ScanValues - spec.ScanValues = func(columns []string) ([]any, error) { - values, err := values(columns[1:]) - if err != nil { - return nil, err - } - return append([]any{new(uuid.UUID)}, values...), nil - } - spec.Assign = func(columns []string, values []any) error { - outValue := *values[0].(*uuid.UUID) - inValue := *values[1].(*uuid.UUID) - if nids[inValue] == nil { - nids[inValue] = map[*Group]struct{}{byID[outValue]: {}} - return assign(columns[1:], values[1:]) - } - nids[inValue][byID[outValue]] = struct{}{} - return nil - } - }) - }) - neighbors, err := withInterceptors[[]*User](ctx, query, qr, query.inters) + query.Where(predicate.GroupMembership(func(s *sql.Selector) { + s.Where(sql.InValues(s.C(group.GroupMembershipsColumn), fks...)) + })) + neighbors, err := query.All(ctx) if err != nil { return err } for _, n := range neighbors { - nodes, ok := nids[n.ID] + fk := n.GroupID + node, ok := nodeids[fk] if !ok { - return fmt.Errorf(`unexpected "members" node returned %v`, n.ID) - } - for kn := range nodes { - assign(kn, n) + return fmt.Errorf(`unexpected referenced foreign-key "group_id" returned %v for node %v`, fk, n.ID) } + assign(node, n) } return nil } @@ -587,36 +512,6 @@ func (gq *GroupQuery) loadOrganization(ctx context.Context, query *OrganizationQ } return nil } -func (gq *GroupQuery) loadGroupUsers(ctx context.Context, query *GroupMembershipQuery, nodes []*Group, init func(*Group), assign func(*Group, *GroupMembership)) error { - fks := make([]driver.Value, 0, len(nodes)) - nodeids := make(map[uuid.UUID]*Group) - for i := range nodes { - fks = append(fks, nodes[i].ID) - nodeids[nodes[i].ID] = nodes[i] - if init != nil { - init(nodes[i]) - } - } - if len(query.ctx.Fields) > 0 { - query.ctx.AppendFieldOnce(groupmembership.FieldGroupID) - } - query.Where(predicate.GroupMembership(func(s *sql.Selector) { - s.Where(sql.InValues(s.C(group.GroupUsersColumn), fks...)) - })) - neighbors, err := query.All(ctx) - if err != nil { - return err - } - for _, n := range neighbors { - fk := n.GroupID - node, ok := nodeids[fk] - if !ok { - return fmt.Errorf(`unexpected referenced foreign-key "group_id" returned %v for node %v`, fk, n.ID) - } - assign(node, n) - } - return nil -} func (gq *GroupQuery) sqlCount(ctx context.Context) (int, error) { _spec := gq.querySpec() diff --git a/app/controlplane/pkg/data/ent/group_update.go b/app/controlplane/pkg/data/ent/group_update.go index ee6210b2e..99f088c27 100644 --- a/app/controlplane/pkg/data/ent/group_update.go +++ b/app/controlplane/pkg/data/ent/group_update.go @@ -15,7 +15,6 @@ import ( "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/groupmembership" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/organization" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/predicate" - "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/user" "github.com/google/uuid" ) @@ -136,19 +135,19 @@ func (gu *GroupUpdate) AddMemberCount(i int) *GroupUpdate { return gu } -// AddMemberIDs adds the "members" edge to the User entity by IDs. -func (gu *GroupUpdate) AddMemberIDs(ids ...uuid.UUID) *GroupUpdate { - gu.mutation.AddMemberIDs(ids...) +// AddGroupMembershipIDs adds the "group_memberships" edge to the GroupMembership entity by IDs. +func (gu *GroupUpdate) AddGroupMembershipIDs(ids ...uuid.UUID) *GroupUpdate { + gu.mutation.AddGroupMembershipIDs(ids...) return gu } -// AddMembers adds the "members" edges to the User entity. -func (gu *GroupUpdate) AddMembers(u ...*User) *GroupUpdate { - ids := make([]uuid.UUID, len(u)) - for i := range u { - ids[i] = u[i].ID +// AddGroupMemberships adds the "group_memberships" edges to the GroupMembership entity. +func (gu *GroupUpdate) AddGroupMemberships(g ...*GroupMembership) *GroupUpdate { + ids := make([]uuid.UUID, len(g)) + for i := range g { + ids[i] = g[i].ID } - return gu.AddMemberIDs(ids...) + return gu.AddGroupMembershipIDs(ids...) } // SetOrganization sets the "organization" edge to the Organization entity. @@ -156,45 +155,30 @@ func (gu *GroupUpdate) SetOrganization(o *Organization) *GroupUpdate { return gu.SetOrganizationID(o.ID) } -// AddGroupUserIDs adds the "group_users" edge to the GroupMembership entity by IDs. -func (gu *GroupUpdate) AddGroupUserIDs(ids ...uuid.UUID) *GroupUpdate { - gu.mutation.AddGroupUserIDs(ids...) - return gu -} - -// AddGroupUsers adds the "group_users" edges to the GroupMembership entity. -func (gu *GroupUpdate) AddGroupUsers(g ...*GroupMembership) *GroupUpdate { - ids := make([]uuid.UUID, len(g)) - for i := range g { - ids[i] = g[i].ID - } - return gu.AddGroupUserIDs(ids...) -} - // Mutation returns the GroupMutation object of the builder. func (gu *GroupUpdate) Mutation() *GroupMutation { return gu.mutation } -// ClearMembers clears all "members" edges to the User entity. -func (gu *GroupUpdate) ClearMembers() *GroupUpdate { - gu.mutation.ClearMembers() +// ClearGroupMemberships clears all "group_memberships" edges to the GroupMembership entity. +func (gu *GroupUpdate) ClearGroupMemberships() *GroupUpdate { + gu.mutation.ClearGroupMemberships() return gu } -// RemoveMemberIDs removes the "members" edge to User entities by IDs. -func (gu *GroupUpdate) RemoveMemberIDs(ids ...uuid.UUID) *GroupUpdate { - gu.mutation.RemoveMemberIDs(ids...) +// RemoveGroupMembershipIDs removes the "group_memberships" edge to GroupMembership entities by IDs. +func (gu *GroupUpdate) RemoveGroupMembershipIDs(ids ...uuid.UUID) *GroupUpdate { + gu.mutation.RemoveGroupMembershipIDs(ids...) return gu } -// RemoveMembers removes "members" edges to User entities. -func (gu *GroupUpdate) RemoveMembers(u ...*User) *GroupUpdate { - ids := make([]uuid.UUID, len(u)) - for i := range u { - ids[i] = u[i].ID +// RemoveGroupMemberships removes "group_memberships" edges to GroupMembership entities. +func (gu *GroupUpdate) RemoveGroupMemberships(g ...*GroupMembership) *GroupUpdate { + ids := make([]uuid.UUID, len(g)) + for i := range g { + ids[i] = g[i].ID } - return gu.RemoveMemberIDs(ids...) + return gu.RemoveGroupMembershipIDs(ids...) } // ClearOrganization clears the "organization" edge to the Organization entity. @@ -203,27 +187,6 @@ func (gu *GroupUpdate) ClearOrganization() *GroupUpdate { return gu } -// ClearGroupUsers clears all "group_users" edges to the GroupMembership entity. -func (gu *GroupUpdate) ClearGroupUsers() *GroupUpdate { - gu.mutation.ClearGroupUsers() - return gu -} - -// RemoveGroupUserIDs removes the "group_users" edge to GroupMembership entities by IDs. -func (gu *GroupUpdate) RemoveGroupUserIDs(ids ...uuid.UUID) *GroupUpdate { - gu.mutation.RemoveGroupUserIDs(ids...) - return gu -} - -// RemoveGroupUsers removes "group_users" edges to GroupMembership entities. -func (gu *GroupUpdate) RemoveGroupUsers(g ...*GroupMembership) *GroupUpdate { - ids := make([]uuid.UUID, len(g)) - for i := range g { - ids[i] = g[i].ID - } - return gu.RemoveGroupUserIDs(ids...) -} - // Save executes the query and returns the number of nodes affected by the update operation. func (gu *GroupUpdate) Save(ctx context.Context) (int, error) { return withHooks(ctx, gu.sqlSave, gu.mutation, gu.hooks) @@ -306,70 +269,49 @@ func (gu *GroupUpdate) sqlSave(ctx context.Context) (n int, err error) { if value, ok := gu.mutation.AddedMemberCount(); ok { _spec.AddField(group.FieldMemberCount, field.TypeInt, value) } - if gu.mutation.MembersCleared() { + if gu.mutation.GroupMembershipsCleared() { edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: false, - Table: group.MembersTable, - Columns: group.MembersPrimaryKey, + Rel: sqlgraph.O2M, + Inverse: true, + Table: group.GroupMembershipsTable, + Columns: []string{group.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), }, } - createE := &GroupMembershipCreate{config: gu.config, mutation: newGroupMembershipMutation(gu.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } _spec.Edges.Clear = append(_spec.Edges.Clear, edge) } - if nodes := gu.mutation.RemovedMembersIDs(); len(nodes) > 0 && !gu.mutation.MembersCleared() { + if nodes := gu.mutation.RemovedGroupMembershipsIDs(); len(nodes) > 0 && !gu.mutation.GroupMembershipsCleared() { edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: false, - Table: group.MembersTable, - Columns: group.MembersPrimaryKey, + Rel: sqlgraph.O2M, + Inverse: true, + Table: group.GroupMembershipsTable, + Columns: []string{group.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), }, } for _, k := range nodes { edge.Target.Nodes = append(edge.Target.Nodes, k) } - createE := &GroupMembershipCreate{config: gu.config, mutation: newGroupMembershipMutation(gu.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } _spec.Edges.Clear = append(_spec.Edges.Clear, edge) } - if nodes := gu.mutation.MembersIDs(); len(nodes) > 0 { + if nodes := gu.mutation.GroupMembershipsIDs(); len(nodes) > 0 { edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: false, - Table: group.MembersTable, - Columns: group.MembersPrimaryKey, + Rel: sqlgraph.O2M, + Inverse: true, + Table: group.GroupMembershipsTable, + Columns: []string{group.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), }, } for _, k := range nodes { edge.Target.Nodes = append(edge.Target.Nodes, k) } - createE := &GroupMembershipCreate{config: gu.config, mutation: newGroupMembershipMutation(gu.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } _spec.Edges.Add = append(_spec.Edges.Add, edge) } if gu.mutation.OrganizationCleared() { @@ -401,51 +343,6 @@ func (gu *GroupUpdate) sqlSave(ctx context.Context) (n int, err error) { } _spec.Edges.Add = append(_spec.Edges.Add, edge) } - if gu.mutation.GroupUsersCleared() { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.O2M, - Inverse: true, - Table: group.GroupUsersTable, - Columns: []string{group.GroupUsersColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), - }, - } - _spec.Edges.Clear = append(_spec.Edges.Clear, edge) - } - if nodes := gu.mutation.RemovedGroupUsersIDs(); len(nodes) > 0 && !gu.mutation.GroupUsersCleared() { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.O2M, - Inverse: true, - Table: group.GroupUsersTable, - Columns: []string{group.GroupUsersColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - _spec.Edges.Clear = append(_spec.Edges.Clear, edge) - } - if nodes := gu.mutation.GroupUsersIDs(); len(nodes) > 0 { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.O2M, - Inverse: true, - Table: group.GroupUsersTable, - Columns: []string{group.GroupUsersColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - _spec.Edges.Add = append(_spec.Edges.Add, edge) - } _spec.AddModifiers(gu.modifiers...) if n, err = sqlgraph.UpdateNodes(ctx, gu.driver, _spec); err != nil { if _, ok := err.(*sqlgraph.NotFoundError); ok { @@ -571,19 +468,19 @@ func (guo *GroupUpdateOne) AddMemberCount(i int) *GroupUpdateOne { return guo } -// AddMemberIDs adds the "members" edge to the User entity by IDs. -func (guo *GroupUpdateOne) AddMemberIDs(ids ...uuid.UUID) *GroupUpdateOne { - guo.mutation.AddMemberIDs(ids...) +// AddGroupMembershipIDs adds the "group_memberships" edge to the GroupMembership entity by IDs. +func (guo *GroupUpdateOne) AddGroupMembershipIDs(ids ...uuid.UUID) *GroupUpdateOne { + guo.mutation.AddGroupMembershipIDs(ids...) return guo } -// AddMembers adds the "members" edges to the User entity. -func (guo *GroupUpdateOne) AddMembers(u ...*User) *GroupUpdateOne { - ids := make([]uuid.UUID, len(u)) - for i := range u { - ids[i] = u[i].ID +// AddGroupMemberships adds the "group_memberships" edges to the GroupMembership entity. +func (guo *GroupUpdateOne) AddGroupMemberships(g ...*GroupMembership) *GroupUpdateOne { + ids := make([]uuid.UUID, len(g)) + for i := range g { + ids[i] = g[i].ID } - return guo.AddMemberIDs(ids...) + return guo.AddGroupMembershipIDs(ids...) } // SetOrganization sets the "organization" edge to the Organization entity. @@ -591,45 +488,30 @@ func (guo *GroupUpdateOne) SetOrganization(o *Organization) *GroupUpdateOne { return guo.SetOrganizationID(o.ID) } -// AddGroupUserIDs adds the "group_users" edge to the GroupMembership entity by IDs. -func (guo *GroupUpdateOne) AddGroupUserIDs(ids ...uuid.UUID) *GroupUpdateOne { - guo.mutation.AddGroupUserIDs(ids...) - return guo -} - -// AddGroupUsers adds the "group_users" edges to the GroupMembership entity. -func (guo *GroupUpdateOne) AddGroupUsers(g ...*GroupMembership) *GroupUpdateOne { - ids := make([]uuid.UUID, len(g)) - for i := range g { - ids[i] = g[i].ID - } - return guo.AddGroupUserIDs(ids...) -} - // Mutation returns the GroupMutation object of the builder. func (guo *GroupUpdateOne) Mutation() *GroupMutation { return guo.mutation } -// ClearMembers clears all "members" edges to the User entity. -func (guo *GroupUpdateOne) ClearMembers() *GroupUpdateOne { - guo.mutation.ClearMembers() +// ClearGroupMemberships clears all "group_memberships" edges to the GroupMembership entity. +func (guo *GroupUpdateOne) ClearGroupMemberships() *GroupUpdateOne { + guo.mutation.ClearGroupMemberships() return guo } -// RemoveMemberIDs removes the "members" edge to User entities by IDs. -func (guo *GroupUpdateOne) RemoveMemberIDs(ids ...uuid.UUID) *GroupUpdateOne { - guo.mutation.RemoveMemberIDs(ids...) +// RemoveGroupMembershipIDs removes the "group_memberships" edge to GroupMembership entities by IDs. +func (guo *GroupUpdateOne) RemoveGroupMembershipIDs(ids ...uuid.UUID) *GroupUpdateOne { + guo.mutation.RemoveGroupMembershipIDs(ids...) return guo } -// RemoveMembers removes "members" edges to User entities. -func (guo *GroupUpdateOne) RemoveMembers(u ...*User) *GroupUpdateOne { - ids := make([]uuid.UUID, len(u)) - for i := range u { - ids[i] = u[i].ID +// RemoveGroupMemberships removes "group_memberships" edges to GroupMembership entities. +func (guo *GroupUpdateOne) RemoveGroupMemberships(g ...*GroupMembership) *GroupUpdateOne { + ids := make([]uuid.UUID, len(g)) + for i := range g { + ids[i] = g[i].ID } - return guo.RemoveMemberIDs(ids...) + return guo.RemoveGroupMembershipIDs(ids...) } // ClearOrganization clears the "organization" edge to the Organization entity. @@ -638,27 +520,6 @@ func (guo *GroupUpdateOne) ClearOrganization() *GroupUpdateOne { return guo } -// ClearGroupUsers clears all "group_users" edges to the GroupMembership entity. -func (guo *GroupUpdateOne) ClearGroupUsers() *GroupUpdateOne { - guo.mutation.ClearGroupUsers() - return guo -} - -// RemoveGroupUserIDs removes the "group_users" edge to GroupMembership entities by IDs. -func (guo *GroupUpdateOne) RemoveGroupUserIDs(ids ...uuid.UUID) *GroupUpdateOne { - guo.mutation.RemoveGroupUserIDs(ids...) - return guo -} - -// RemoveGroupUsers removes "group_users" edges to GroupMembership entities. -func (guo *GroupUpdateOne) RemoveGroupUsers(g ...*GroupMembership) *GroupUpdateOne { - ids := make([]uuid.UUID, len(g)) - for i := range g { - ids[i] = g[i].ID - } - return guo.RemoveGroupUserIDs(ids...) -} - // Where appends a list predicates to the GroupUpdate builder. func (guo *GroupUpdateOne) Where(ps ...predicate.Group) *GroupUpdateOne { guo.mutation.Where(ps...) @@ -771,70 +632,49 @@ func (guo *GroupUpdateOne) sqlSave(ctx context.Context) (_node *Group, err error if value, ok := guo.mutation.AddedMemberCount(); ok { _spec.AddField(group.FieldMemberCount, field.TypeInt, value) } - if guo.mutation.MembersCleared() { + if guo.mutation.GroupMembershipsCleared() { edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: false, - Table: group.MembersTable, - Columns: group.MembersPrimaryKey, + Rel: sqlgraph.O2M, + Inverse: true, + Table: group.GroupMembershipsTable, + Columns: []string{group.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), }, } - createE := &GroupMembershipCreate{config: guo.config, mutation: newGroupMembershipMutation(guo.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } _spec.Edges.Clear = append(_spec.Edges.Clear, edge) } - if nodes := guo.mutation.RemovedMembersIDs(); len(nodes) > 0 && !guo.mutation.MembersCleared() { + if nodes := guo.mutation.RemovedGroupMembershipsIDs(); len(nodes) > 0 && !guo.mutation.GroupMembershipsCleared() { edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: false, - Table: group.MembersTable, - Columns: group.MembersPrimaryKey, + Rel: sqlgraph.O2M, + Inverse: true, + Table: group.GroupMembershipsTable, + Columns: []string{group.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), }, } for _, k := range nodes { edge.Target.Nodes = append(edge.Target.Nodes, k) } - createE := &GroupMembershipCreate{config: guo.config, mutation: newGroupMembershipMutation(guo.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } _spec.Edges.Clear = append(_spec.Edges.Clear, edge) } - if nodes := guo.mutation.MembersIDs(); len(nodes) > 0 { + if nodes := guo.mutation.GroupMembershipsIDs(); len(nodes) > 0 { edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: false, - Table: group.MembersTable, - Columns: group.MembersPrimaryKey, + Rel: sqlgraph.O2M, + Inverse: true, + Table: group.GroupMembershipsTable, + Columns: []string{group.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), }, } for _, k := range nodes { edge.Target.Nodes = append(edge.Target.Nodes, k) } - createE := &GroupMembershipCreate{config: guo.config, mutation: newGroupMembershipMutation(guo.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } _spec.Edges.Add = append(_spec.Edges.Add, edge) } if guo.mutation.OrganizationCleared() { @@ -866,51 +706,6 @@ func (guo *GroupUpdateOne) sqlSave(ctx context.Context) (_node *Group, err error } _spec.Edges.Add = append(_spec.Edges.Add, edge) } - if guo.mutation.GroupUsersCleared() { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.O2M, - Inverse: true, - Table: group.GroupUsersTable, - Columns: []string{group.GroupUsersColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), - }, - } - _spec.Edges.Clear = append(_spec.Edges.Clear, edge) - } - if nodes := guo.mutation.RemovedGroupUsersIDs(); len(nodes) > 0 && !guo.mutation.GroupUsersCleared() { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.O2M, - Inverse: true, - Table: group.GroupUsersTable, - Columns: []string{group.GroupUsersColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - _spec.Edges.Clear = append(_spec.Edges.Clear, edge) - } - if nodes := guo.mutation.GroupUsersIDs(); len(nodes) > 0 { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.O2M, - Inverse: true, - Table: group.GroupUsersTable, - Columns: []string{group.GroupUsersColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - _spec.Edges.Add = append(_spec.Edges.Add, edge) - } _spec.AddModifiers(guo.modifiers...) _node = &Group{config: guo.config} _spec.Assign = _node.assignValues diff --git a/app/controlplane/pkg/data/ent/mutation.go b/app/controlplane/pkg/data/ent/mutation.go index f8994d7d4..4aec5d80b 100644 --- a/app/controlplane/pkg/data/ent/mutation.go +++ b/app/controlplane/pkg/data/ent/mutation.go @@ -3378,28 +3378,25 @@ func (m *CASMappingMutation) ResetEdge(name string) error { // GroupMutation represents an operation that mutates the Group nodes in the graph. type GroupMutation struct { config - op Op - typ string - id *uuid.UUID - name *string - description *string - created_at *time.Time - updated_at *time.Time - deleted_at *time.Time - member_count *int - addmember_count *int - clearedFields map[string]struct{} - members map[uuid.UUID]struct{} - removedmembers map[uuid.UUID]struct{} - clearedmembers bool - organization *uuid.UUID - clearedorganization bool - group_users map[uuid.UUID]struct{} - removedgroup_users map[uuid.UUID]struct{} - clearedgroup_users bool - done bool - oldValue func(context.Context) (*Group, error) - predicates []predicate.Group + op Op + typ string + id *uuid.UUID + name *string + description *string + created_at *time.Time + updated_at *time.Time + deleted_at *time.Time + member_count *int + addmember_count *int + clearedFields map[string]struct{} + group_memberships map[uuid.UUID]struct{} + removedgroup_memberships map[uuid.UUID]struct{} + clearedgroup_memberships bool + organization *uuid.UUID + clearedorganization bool + done bool + oldValue func(context.Context) (*Group, error) + predicates []predicate.Group } var _ ent.Mutation = (*GroupMutation)(nil) @@ -3804,58 +3801,58 @@ func (m *GroupMutation) ResetMemberCount() { m.addmember_count = nil } -// AddMemberIDs adds the "members" edge to the User entity by ids. -func (m *GroupMutation) AddMemberIDs(ids ...uuid.UUID) { - if m.members == nil { - m.members = make(map[uuid.UUID]struct{}) +// AddGroupMembershipIDs adds the "group_memberships" edge to the GroupMembership entity by ids. +func (m *GroupMutation) AddGroupMembershipIDs(ids ...uuid.UUID) { + if m.group_memberships == nil { + m.group_memberships = make(map[uuid.UUID]struct{}) } for i := range ids { - m.members[ids[i]] = struct{}{} + m.group_memberships[ids[i]] = struct{}{} } } -// ClearMembers clears the "members" edge to the User entity. -func (m *GroupMutation) ClearMembers() { - m.clearedmembers = true +// ClearGroupMemberships clears the "group_memberships" edge to the GroupMembership entity. +func (m *GroupMutation) ClearGroupMemberships() { + m.clearedgroup_memberships = true } -// MembersCleared reports if the "members" edge to the User entity was cleared. -func (m *GroupMutation) MembersCleared() bool { - return m.clearedmembers +// GroupMembershipsCleared reports if the "group_memberships" edge to the GroupMembership entity was cleared. +func (m *GroupMutation) GroupMembershipsCleared() bool { + return m.clearedgroup_memberships } -// RemoveMemberIDs removes the "members" edge to the User entity by IDs. -func (m *GroupMutation) RemoveMemberIDs(ids ...uuid.UUID) { - if m.removedmembers == nil { - m.removedmembers = make(map[uuid.UUID]struct{}) +// RemoveGroupMembershipIDs removes the "group_memberships" edge to the GroupMembership entity by IDs. +func (m *GroupMutation) RemoveGroupMembershipIDs(ids ...uuid.UUID) { + if m.removedgroup_memberships == nil { + m.removedgroup_memberships = make(map[uuid.UUID]struct{}) } for i := range ids { - delete(m.members, ids[i]) - m.removedmembers[ids[i]] = struct{}{} + delete(m.group_memberships, ids[i]) + m.removedgroup_memberships[ids[i]] = struct{}{} } } -// RemovedMembers returns the removed IDs of the "members" edge to the User entity. -func (m *GroupMutation) RemovedMembersIDs() (ids []uuid.UUID) { - for id := range m.removedmembers { +// RemovedGroupMemberships returns the removed IDs of the "group_memberships" edge to the GroupMembership entity. +func (m *GroupMutation) RemovedGroupMembershipsIDs() (ids []uuid.UUID) { + for id := range m.removedgroup_memberships { ids = append(ids, id) } return } -// MembersIDs returns the "members" edge IDs in the mutation. -func (m *GroupMutation) MembersIDs() (ids []uuid.UUID) { - for id := range m.members { +// GroupMembershipsIDs returns the "group_memberships" edge IDs in the mutation. +func (m *GroupMutation) GroupMembershipsIDs() (ids []uuid.UUID) { + for id := range m.group_memberships { ids = append(ids, id) } return } -// ResetMembers resets all changes to the "members" edge. -func (m *GroupMutation) ResetMembers() { - m.members = nil - m.clearedmembers = false - m.removedmembers = nil +// ResetGroupMemberships resets all changes to the "group_memberships" edge. +func (m *GroupMutation) ResetGroupMemberships() { + m.group_memberships = nil + m.clearedgroup_memberships = false + m.removedgroup_memberships = nil } // ClearOrganization clears the "organization" edge to the Organization entity. @@ -3885,60 +3882,6 @@ func (m *GroupMutation) ResetOrganization() { m.clearedorganization = false } -// AddGroupUserIDs adds the "group_users" edge to the GroupMembership entity by ids. -func (m *GroupMutation) AddGroupUserIDs(ids ...uuid.UUID) { - if m.group_users == nil { - m.group_users = make(map[uuid.UUID]struct{}) - } - for i := range ids { - m.group_users[ids[i]] = struct{}{} - } -} - -// ClearGroupUsers clears the "group_users" edge to the GroupMembership entity. -func (m *GroupMutation) ClearGroupUsers() { - m.clearedgroup_users = true -} - -// GroupUsersCleared reports if the "group_users" edge to the GroupMembership entity was cleared. -func (m *GroupMutation) GroupUsersCleared() bool { - return m.clearedgroup_users -} - -// RemoveGroupUserIDs removes the "group_users" edge to the GroupMembership entity by IDs. -func (m *GroupMutation) RemoveGroupUserIDs(ids ...uuid.UUID) { - if m.removedgroup_users == nil { - m.removedgroup_users = make(map[uuid.UUID]struct{}) - } - for i := range ids { - delete(m.group_users, ids[i]) - m.removedgroup_users[ids[i]] = struct{}{} - } -} - -// RemovedGroupUsers returns the removed IDs of the "group_users" edge to the GroupMembership entity. -func (m *GroupMutation) RemovedGroupUsersIDs() (ids []uuid.UUID) { - for id := range m.removedgroup_users { - ids = append(ids, id) - } - return -} - -// GroupUsersIDs returns the "group_users" edge IDs in the mutation. -func (m *GroupMutation) GroupUsersIDs() (ids []uuid.UUID) { - for id := range m.group_users { - ids = append(ids, id) - } - return -} - -// ResetGroupUsers resets all changes to the "group_users" edge. -func (m *GroupMutation) ResetGroupUsers() { - m.group_users = nil - m.clearedgroup_users = false - m.removedgroup_users = nil -} - // Where appends a list predicates to the GroupMutation builder. func (m *GroupMutation) Where(ps ...predicate.Group) { m.predicates = append(m.predicates, ps...) @@ -4204,16 +4147,13 @@ func (m *GroupMutation) ResetField(name string) error { // AddedEdges returns all edge names that were set/added in this mutation. func (m *GroupMutation) AddedEdges() []string { - edges := make([]string, 0, 3) - if m.members != nil { - edges = append(edges, group.EdgeMembers) + edges := make([]string, 0, 2) + if m.group_memberships != nil { + edges = append(edges, group.EdgeGroupMemberships) } if m.organization != nil { edges = append(edges, group.EdgeOrganization) } - if m.group_users != nil { - edges = append(edges, group.EdgeGroupUsers) - } return edges } @@ -4221,9 +4161,9 @@ func (m *GroupMutation) AddedEdges() []string { // name in this mutation. func (m *GroupMutation) AddedIDs(name string) []ent.Value { switch name { - case group.EdgeMembers: - ids := make([]ent.Value, 0, len(m.members)) - for id := range m.members { + case group.EdgeGroupMemberships: + ids := make([]ent.Value, 0, len(m.group_memberships)) + for id := range m.group_memberships { ids = append(ids, id) } return ids @@ -4231,24 +4171,15 @@ func (m *GroupMutation) AddedIDs(name string) []ent.Value { if id := m.organization; id != nil { return []ent.Value{*id} } - case group.EdgeGroupUsers: - ids := make([]ent.Value, 0, len(m.group_users)) - for id := range m.group_users { - ids = append(ids, id) - } - return ids } return nil } // RemovedEdges returns all edge names that were removed in this mutation. func (m *GroupMutation) RemovedEdges() []string { - edges := make([]string, 0, 3) - if m.removedmembers != nil { - edges = append(edges, group.EdgeMembers) - } - if m.removedgroup_users != nil { - edges = append(edges, group.EdgeGroupUsers) + edges := make([]string, 0, 2) + if m.removedgroup_memberships != nil { + edges = append(edges, group.EdgeGroupMemberships) } return edges } @@ -4257,15 +4188,9 @@ func (m *GroupMutation) RemovedEdges() []string { // the given name in this mutation. func (m *GroupMutation) RemovedIDs(name string) []ent.Value { switch name { - case group.EdgeMembers: - ids := make([]ent.Value, 0, len(m.removedmembers)) - for id := range m.removedmembers { - ids = append(ids, id) - } - return ids - case group.EdgeGroupUsers: - ids := make([]ent.Value, 0, len(m.removedgroup_users)) - for id := range m.removedgroup_users { + case group.EdgeGroupMemberships: + ids := make([]ent.Value, 0, len(m.removedgroup_memberships)) + for id := range m.removedgroup_memberships { ids = append(ids, id) } return ids @@ -4275,16 +4200,13 @@ func (m *GroupMutation) RemovedIDs(name string) []ent.Value { // ClearedEdges returns all edge names that were cleared in this mutation. func (m *GroupMutation) ClearedEdges() []string { - edges := make([]string, 0, 3) - if m.clearedmembers { - edges = append(edges, group.EdgeMembers) + edges := make([]string, 0, 2) + if m.clearedgroup_memberships { + edges = append(edges, group.EdgeGroupMemberships) } if m.clearedorganization { edges = append(edges, group.EdgeOrganization) } - if m.clearedgroup_users { - edges = append(edges, group.EdgeGroupUsers) - } return edges } @@ -4292,12 +4214,10 @@ func (m *GroupMutation) ClearedEdges() []string { // was cleared in this mutation. func (m *GroupMutation) EdgeCleared(name string) bool { switch name { - case group.EdgeMembers: - return m.clearedmembers + case group.EdgeGroupMemberships: + return m.clearedgroup_memberships case group.EdgeOrganization: return m.clearedorganization - case group.EdgeGroupUsers: - return m.clearedgroup_users } return false } @@ -4317,15 +4237,12 @@ func (m *GroupMutation) ClearEdge(name string) error { // It returns an error if the edge is not defined in the schema. func (m *GroupMutation) ResetEdge(name string) error { switch name { - case group.EdgeMembers: - m.ResetMembers() + case group.EdgeGroupMemberships: + m.ResetGroupMemberships() return nil case group.EdgeOrganization: m.ResetOrganization() return nil - case group.EdgeGroupUsers: - m.ResetGroupUsers() - return nil } return fmt.Errorf("unknown Group edge %s", name) } @@ -12898,27 +12815,24 @@ func (m *RobotAccountMutation) ResetEdge(name string) error { // UserMutation represents an operation that mutates the User nodes in the graph. type UserMutation struct { config - op Op - typ string - id *uuid.UUID - email *string - created_at *time.Time - has_restricted_access *bool - first_name *string - last_name *string - clearedFields map[string]struct{} - memberships map[uuid.UUID]struct{} - removedmemberships map[uuid.UUID]struct{} - clearedmemberships bool - group map[uuid.UUID]struct{} - removedgroup map[uuid.UUID]struct{} - clearedgroup bool - group_users map[uuid.UUID]struct{} - removedgroup_users map[uuid.UUID]struct{} - clearedgroup_users bool - done bool - oldValue func(context.Context) (*User, error) - predicates []predicate.User + op Op + typ string + id *uuid.UUID + email *string + created_at *time.Time + has_restricted_access *bool + first_name *string + last_name *string + clearedFields map[string]struct{} + memberships map[uuid.UUID]struct{} + removedmemberships map[uuid.UUID]struct{} + clearedmemberships bool + group_memberships map[uuid.UUID]struct{} + removedgroup_memberships map[uuid.UUID]struct{} + clearedgroup_memberships bool + done bool + oldValue func(context.Context) (*User, error) + predicates []predicate.User } var _ ent.Mutation = (*UserMutation)(nil) @@ -13298,112 +13212,58 @@ func (m *UserMutation) ResetMemberships() { m.removedmemberships = nil } -// AddGroupIDs adds the "group" edge to the Group entity by ids. -func (m *UserMutation) AddGroupIDs(ids ...uuid.UUID) { - if m.group == nil { - m.group = make(map[uuid.UUID]struct{}) +// AddGroupMembershipIDs adds the "group_memberships" edge to the GroupMembership entity by ids. +func (m *UserMutation) AddGroupMembershipIDs(ids ...uuid.UUID) { + if m.group_memberships == nil { + m.group_memberships = make(map[uuid.UUID]struct{}) } for i := range ids { - m.group[ids[i]] = struct{}{} + m.group_memberships[ids[i]] = struct{}{} } } -// ClearGroup clears the "group" edge to the Group entity. -func (m *UserMutation) ClearGroup() { - m.clearedgroup = true +// ClearGroupMemberships clears the "group_memberships" edge to the GroupMembership entity. +func (m *UserMutation) ClearGroupMemberships() { + m.clearedgroup_memberships = true } -// GroupCleared reports if the "group" edge to the Group entity was cleared. -func (m *UserMutation) GroupCleared() bool { - return m.clearedgroup +// GroupMembershipsCleared reports if the "group_memberships" edge to the GroupMembership entity was cleared. +func (m *UserMutation) GroupMembershipsCleared() bool { + return m.clearedgroup_memberships } -// RemoveGroupIDs removes the "group" edge to the Group entity by IDs. -func (m *UserMutation) RemoveGroupIDs(ids ...uuid.UUID) { - if m.removedgroup == nil { - m.removedgroup = make(map[uuid.UUID]struct{}) +// RemoveGroupMembershipIDs removes the "group_memberships" edge to the GroupMembership entity by IDs. +func (m *UserMutation) RemoveGroupMembershipIDs(ids ...uuid.UUID) { + if m.removedgroup_memberships == nil { + m.removedgroup_memberships = make(map[uuid.UUID]struct{}) } for i := range ids { - delete(m.group, ids[i]) - m.removedgroup[ids[i]] = struct{}{} + delete(m.group_memberships, ids[i]) + m.removedgroup_memberships[ids[i]] = struct{}{} } } -// RemovedGroup returns the removed IDs of the "group" edge to the Group entity. -func (m *UserMutation) RemovedGroupIDs() (ids []uuid.UUID) { - for id := range m.removedgroup { +// RemovedGroupMemberships returns the removed IDs of the "group_memberships" edge to the GroupMembership entity. +func (m *UserMutation) RemovedGroupMembershipsIDs() (ids []uuid.UUID) { + for id := range m.removedgroup_memberships { ids = append(ids, id) } return } -// GroupIDs returns the "group" edge IDs in the mutation. -func (m *UserMutation) GroupIDs() (ids []uuid.UUID) { - for id := range m.group { +// GroupMembershipsIDs returns the "group_memberships" edge IDs in the mutation. +func (m *UserMutation) GroupMembershipsIDs() (ids []uuid.UUID) { + for id := range m.group_memberships { ids = append(ids, id) } return } -// ResetGroup resets all changes to the "group" edge. -func (m *UserMutation) ResetGroup() { - m.group = nil - m.clearedgroup = false - m.removedgroup = nil -} - -// AddGroupUserIDs adds the "group_users" edge to the GroupMembership entity by ids. -func (m *UserMutation) AddGroupUserIDs(ids ...uuid.UUID) { - if m.group_users == nil { - m.group_users = make(map[uuid.UUID]struct{}) - } - for i := range ids { - m.group_users[ids[i]] = struct{}{} - } -} - -// ClearGroupUsers clears the "group_users" edge to the GroupMembership entity. -func (m *UserMutation) ClearGroupUsers() { - m.clearedgroup_users = true -} - -// GroupUsersCleared reports if the "group_users" edge to the GroupMembership entity was cleared. -func (m *UserMutation) GroupUsersCleared() bool { - return m.clearedgroup_users -} - -// RemoveGroupUserIDs removes the "group_users" edge to the GroupMembership entity by IDs. -func (m *UserMutation) RemoveGroupUserIDs(ids ...uuid.UUID) { - if m.removedgroup_users == nil { - m.removedgroup_users = make(map[uuid.UUID]struct{}) - } - for i := range ids { - delete(m.group_users, ids[i]) - m.removedgroup_users[ids[i]] = struct{}{} - } -} - -// RemovedGroupUsers returns the removed IDs of the "group_users" edge to the GroupMembership entity. -func (m *UserMutation) RemovedGroupUsersIDs() (ids []uuid.UUID) { - for id := range m.removedgroup_users { - ids = append(ids, id) - } - return -} - -// GroupUsersIDs returns the "group_users" edge IDs in the mutation. -func (m *UserMutation) GroupUsersIDs() (ids []uuid.UUID) { - for id := range m.group_users { - ids = append(ids, id) - } - return -} - -// ResetGroupUsers resets all changes to the "group_users" edge. -func (m *UserMutation) ResetGroupUsers() { - m.group_users = nil - m.clearedgroup_users = false - m.removedgroup_users = nil +// ResetGroupMemberships resets all changes to the "group_memberships" edge. +func (m *UserMutation) ResetGroupMemberships() { + m.group_memberships = nil + m.clearedgroup_memberships = false + m.removedgroup_memberships = nil } // Where appends a list predicates to the UserMutation builder. @@ -13628,15 +13488,12 @@ func (m *UserMutation) ResetField(name string) error { // AddedEdges returns all edge names that were set/added in this mutation. func (m *UserMutation) AddedEdges() []string { - edges := make([]string, 0, 3) + edges := make([]string, 0, 2) if m.memberships != nil { edges = append(edges, user.EdgeMemberships) } - if m.group != nil { - edges = append(edges, user.EdgeGroup) - } - if m.group_users != nil { - edges = append(edges, user.EdgeGroupUsers) + if m.group_memberships != nil { + edges = append(edges, user.EdgeGroupMemberships) } return edges } @@ -13651,15 +13508,9 @@ func (m *UserMutation) AddedIDs(name string) []ent.Value { ids = append(ids, id) } return ids - case user.EdgeGroup: - ids := make([]ent.Value, 0, len(m.group)) - for id := range m.group { - ids = append(ids, id) - } - return ids - case user.EdgeGroupUsers: - ids := make([]ent.Value, 0, len(m.group_users)) - for id := range m.group_users { + case user.EdgeGroupMemberships: + ids := make([]ent.Value, 0, len(m.group_memberships)) + for id := range m.group_memberships { ids = append(ids, id) } return ids @@ -13669,15 +13520,12 @@ func (m *UserMutation) AddedIDs(name string) []ent.Value { // RemovedEdges returns all edge names that were removed in this mutation. func (m *UserMutation) RemovedEdges() []string { - edges := make([]string, 0, 3) + edges := make([]string, 0, 2) if m.removedmemberships != nil { edges = append(edges, user.EdgeMemberships) } - if m.removedgroup != nil { - edges = append(edges, user.EdgeGroup) - } - if m.removedgroup_users != nil { - edges = append(edges, user.EdgeGroupUsers) + if m.removedgroup_memberships != nil { + edges = append(edges, user.EdgeGroupMemberships) } return edges } @@ -13692,15 +13540,9 @@ func (m *UserMutation) RemovedIDs(name string) []ent.Value { ids = append(ids, id) } return ids - case user.EdgeGroup: - ids := make([]ent.Value, 0, len(m.removedgroup)) - for id := range m.removedgroup { - ids = append(ids, id) - } - return ids - case user.EdgeGroupUsers: - ids := make([]ent.Value, 0, len(m.removedgroup_users)) - for id := range m.removedgroup_users { + case user.EdgeGroupMemberships: + ids := make([]ent.Value, 0, len(m.removedgroup_memberships)) + for id := range m.removedgroup_memberships { ids = append(ids, id) } return ids @@ -13710,15 +13552,12 @@ func (m *UserMutation) RemovedIDs(name string) []ent.Value { // ClearedEdges returns all edge names that were cleared in this mutation. func (m *UserMutation) ClearedEdges() []string { - edges := make([]string, 0, 3) + edges := make([]string, 0, 2) if m.clearedmemberships { edges = append(edges, user.EdgeMemberships) } - if m.clearedgroup { - edges = append(edges, user.EdgeGroup) - } - if m.clearedgroup_users { - edges = append(edges, user.EdgeGroupUsers) + if m.clearedgroup_memberships { + edges = append(edges, user.EdgeGroupMemberships) } return edges } @@ -13729,10 +13568,8 @@ func (m *UserMutation) EdgeCleared(name string) bool { switch name { case user.EdgeMemberships: return m.clearedmemberships - case user.EdgeGroup: - return m.clearedgroup - case user.EdgeGroupUsers: - return m.clearedgroup_users + case user.EdgeGroupMemberships: + return m.clearedgroup_memberships } return false } @@ -13752,11 +13589,8 @@ func (m *UserMutation) ResetEdge(name string) error { case user.EdgeMemberships: m.ResetMemberships() return nil - case user.EdgeGroup: - m.ResetGroup() - return nil - case user.EdgeGroupUsers: - m.ResetGroupUsers() + case user.EdgeGroupMemberships: + m.ResetGroupMemberships() return nil } return fmt.Errorf("unknown User edge %s", name) diff --git a/app/controlplane/pkg/data/ent/schema-viz.html b/app/controlplane/pkg/data/ent/schema-viz.html index 3cf38b185..ee23b963c 100644 --- a/app/controlplane/pkg/data/ent/schema-viz.html +++ b/app/controlplane/pkg/data/ent/schema-viz.html @@ -70,7 +70,7 @@ } - const entGraph = JSON.parse("{\"nodes\":[{\"id\":\"APIToken\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"expires_at\",\"type\":\"time.Time\"},{\"name\":\"revoked_at\",\"type\":\"time.Time\"},{\"name\":\"last_used_at\",\"type\":\"time.Time\"},{\"name\":\"organization_id\",\"type\":\"uuid.UUID\"},{\"name\":\"project_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"Attestation\",\"fields\":[{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"bundle\",\"type\":\"[]byte\"},{\"name\":\"workflowrun_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"CASBackend\",\"fields\":[{\"name\":\"location\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"biz.CASBackendProvider\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"secret_name\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"validation_status\",\"type\":\"biz.CASBackendValidationStatus\"},{\"name\":\"validated_at\",\"type\":\"time.Time\"},{\"name\":\"default\",\"type\":\"bool\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"fallback\",\"type\":\"bool\"},{\"name\":\"max_blob_size_bytes\",\"type\":\"int64\"}]},{\"id\":\"CASMapping\",\"fields\":[{\"name\":\"digest\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"workflow_run_id\",\"type\":\"uuid.UUID\"},{\"name\":\"organization_id\",\"type\":\"uuid.UUID\"},{\"name\":\"project_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"Group\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"organization_id\",\"type\":\"uuid.UUID\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"updated_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"member_count\",\"type\":\"int\"}]},{\"id\":\"GroupMembership\",\"fields\":[{\"name\":\"group_id\",\"type\":\"uuid.UUID\"},{\"name\":\"user_id\",\"type\":\"uuid.UUID\"},{\"name\":\"maintainer\",\"type\":\"bool\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"updated_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"}]},{\"id\":\"Integration\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"kind\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"secret_name\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"configuration\",\"type\":\"[]byte\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"}]},{\"id\":\"IntegrationAttachment\",\"fields\":[{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"configuration\",\"type\":\"[]byte\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"workflow_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"Membership\",\"fields\":[{\"name\":\"current\",\"type\":\"bool\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"updated_at\",\"type\":\"time.Time\"},{\"name\":\"role\",\"type\":\"authz.Role\"},{\"name\":\"membership_type\",\"type\":\"authz.MembershipType\"},{\"name\":\"member_id\",\"type\":\"uuid.UUID\"},{\"name\":\"resource_type\",\"type\":\"authz.ResourceType\"},{\"name\":\"resource_id\",\"type\":\"uuid.UUID\"},{\"name\":\"parent_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"OrgInvitation\",\"fields\":[{\"name\":\"receiver_email\",\"type\":\"string\"},{\"name\":\"status\",\"type\":\"biz.OrgInvitationStatus\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"organization_id\",\"type\":\"uuid.UUID\"},{\"name\":\"sender_id\",\"type\":\"uuid.UUID\"},{\"name\":\"role\",\"type\":\"authz.Role\"},{\"name\":\"context\",\"type\":\"biz.OrgInvitationContext\"}]},{\"id\":\"Organization\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"block_on_policy_violation\",\"type\":\"bool\"}]},{\"id\":\"Project\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"organization_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"ProjectVersion\",\"fields\":[{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"updated_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"project_id\",\"type\":\"uuid.UUID\"},{\"name\":\"prerelease\",\"type\":\"bool\"},{\"name\":\"workflow_run_count\",\"type\":\"int\"},{\"name\":\"released_at\",\"type\":\"time.Time\"},{\"name\":\"latest\",\"type\":\"bool\"}]},{\"id\":\"Referrer\",\"fields\":[{\"name\":\"digest\",\"type\":\"string\"},{\"name\":\"kind\",\"type\":\"string\"},{\"name\":\"downloadable\",\"type\":\"bool\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"metadata\",\"type\":\"map[string]string\"},{\"name\":\"annotations\",\"type\":\"map[string]string\"}]},{\"id\":\"RobotAccount\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"revoked_at\",\"type\":\"time.Time\"}]},{\"id\":\"User\",\"fields\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"has_restricted_access\",\"type\":\"bool\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}]},{\"id\":\"Workflow\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"project_old\",\"type\":\"string\"},{\"name\":\"team\",\"type\":\"string\"},{\"name\":\"runs_count\",\"type\":\"int\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"updated_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"public\",\"type\":\"bool\"},{\"name\":\"organization_id\",\"type\":\"uuid.UUID\"},{\"name\":\"project_id\",\"type\":\"uuid.UUID\"},{\"name\":\"latest_run\",\"type\":\"uuid.UUID\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"metadata\",\"type\":\"map[string]interface {}\"}]},{\"id\":\"WorkflowContract\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"scoped_resource_type\",\"type\":\"biz.ContractScope\"},{\"name\":\"scoped_resource_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"WorkflowContractVersion\",\"fields\":[{\"name\":\"body\",\"type\":\"[]byte\"},{\"name\":\"raw_body\",\"type\":\"[]byte\"},{\"name\":\"raw_body_format\",\"type\":\"unmarshal.RawFormat\"},{\"name\":\"revision\",\"type\":\"int\"},{\"name\":\"created_at\",\"type\":\"time.Time\"}]},{\"id\":\"WorkflowRun\",\"fields\":[{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"finished_at\",\"type\":\"time.Time\"},{\"name\":\"state\",\"type\":\"biz.WorkflowRunStatus\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"run_url\",\"type\":\"string\"},{\"name\":\"runner_type\",\"type\":\"string\"},{\"name\":\"attestation\",\"type\":\"*dsse.Envelope\"},{\"name\":\"attestation_digest\",\"type\":\"string\"},{\"name\":\"attestation_state\",\"type\":\"[]byte\"},{\"name\":\"contract_revision_used\",\"type\":\"int\"},{\"name\":\"contract_revision_latest\",\"type\":\"int\"},{\"name\":\"version_id\",\"type\":\"uuid.UUID\"},{\"name\":\"workflow_id\",\"type\":\"uuid.UUID\"}]}],\"edges\":[{\"from\":\"APIToken\",\"to\":\"Project\",\"label\":\"project\"},{\"from\":\"CASMapping\",\"to\":\"CASBackend\",\"label\":\"cas_backend\"},{\"from\":\"CASMapping\",\"to\":\"Organization\",\"label\":\"organization\"},{\"from\":\"CASMapping\",\"to\":\"Project\",\"label\":\"project\"},{\"from\":\"Group\",\"to\":\"User\",\"label\":\"members\"},{\"from\":\"GroupMembership\",\"to\":\"Group\",\"label\":\"group\"},{\"from\":\"GroupMembership\",\"to\":\"User\",\"label\":\"user\"},{\"from\":\"IntegrationAttachment\",\"to\":\"Integration\",\"label\":\"integration\"},{\"from\":\"IntegrationAttachment\",\"to\":\"Workflow\",\"label\":\"workflow\"},{\"from\":\"Membership\",\"to\":\"Membership\",\"label\":\"children\"},{\"from\":\"OrgInvitation\",\"to\":\"Organization\",\"label\":\"organization\"},{\"from\":\"OrgInvitation\",\"to\":\"User\",\"label\":\"sender\"},{\"from\":\"Organization\",\"to\":\"Membership\",\"label\":\"memberships\"},{\"from\":\"Organization\",\"to\":\"WorkflowContract\",\"label\":\"workflow_contracts\"},{\"from\":\"Organization\",\"to\":\"Workflow\",\"label\":\"workflows\"},{\"from\":\"Organization\",\"to\":\"CASBackend\",\"label\":\"cas_backends\"},{\"from\":\"Organization\",\"to\":\"Integration\",\"label\":\"integrations\"},{\"from\":\"Organization\",\"to\":\"APIToken\",\"label\":\"api_tokens\"},{\"from\":\"Organization\",\"to\":\"Project\",\"label\":\"projects\"},{\"from\":\"Organization\",\"to\":\"Group\",\"label\":\"groups\"},{\"from\":\"Project\",\"to\":\"Workflow\",\"label\":\"workflows\"},{\"from\":\"Project\",\"to\":\"ProjectVersion\",\"label\":\"versions\"},{\"from\":\"ProjectVersion\",\"to\":\"WorkflowRun\",\"label\":\"runs\"},{\"from\":\"Referrer\",\"to\":\"Referrer\",\"label\":\"references\"},{\"from\":\"Referrer\",\"to\":\"Workflow\",\"label\":\"workflows\"},{\"from\":\"User\",\"to\":\"Membership\",\"label\":\"memberships\"},{\"from\":\"Workflow\",\"to\":\"RobotAccount\",\"label\":\"robotaccounts\"},{\"from\":\"Workflow\",\"to\":\"WorkflowRun\",\"label\":\"workflowruns\"},{\"from\":\"Workflow\",\"to\":\"WorkflowContract\",\"label\":\"contract\"},{\"from\":\"Workflow\",\"to\":\"WorkflowRun\",\"label\":\"latest_workflow_run\"},{\"from\":\"WorkflowContract\",\"to\":\"WorkflowContractVersion\",\"label\":\"versions\"},{\"from\":\"WorkflowRun\",\"to\":\"WorkflowContractVersion\",\"label\":\"contract_version\"},{\"from\":\"WorkflowRun\",\"to\":\"CASBackend\",\"label\":\"cas_backends\"},{\"from\":\"WorkflowRun\",\"to\":\"Attestation\",\"label\":\"attestation_bundle\"}]}"); + const entGraph = JSON.parse("{\"nodes\":[{\"id\":\"APIToken\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"expires_at\",\"type\":\"time.Time\"},{\"name\":\"revoked_at\",\"type\":\"time.Time\"},{\"name\":\"last_used_at\",\"type\":\"time.Time\"},{\"name\":\"organization_id\",\"type\":\"uuid.UUID\"},{\"name\":\"project_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"Attestation\",\"fields\":[{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"bundle\",\"type\":\"[]byte\"},{\"name\":\"workflowrun_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"CASBackend\",\"fields\":[{\"name\":\"location\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"biz.CASBackendProvider\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"secret_name\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"validation_status\",\"type\":\"biz.CASBackendValidationStatus\"},{\"name\":\"validated_at\",\"type\":\"time.Time\"},{\"name\":\"default\",\"type\":\"bool\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"fallback\",\"type\":\"bool\"},{\"name\":\"max_blob_size_bytes\",\"type\":\"int64\"}]},{\"id\":\"CASMapping\",\"fields\":[{\"name\":\"digest\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"workflow_run_id\",\"type\":\"uuid.UUID\"},{\"name\":\"organization_id\",\"type\":\"uuid.UUID\"},{\"name\":\"project_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"Group\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"organization_id\",\"type\":\"uuid.UUID\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"updated_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"member_count\",\"type\":\"int\"}]},{\"id\":\"GroupMembership\",\"fields\":[{\"name\":\"group_id\",\"type\":\"uuid.UUID\"},{\"name\":\"user_id\",\"type\":\"uuid.UUID\"},{\"name\":\"maintainer\",\"type\":\"bool\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"updated_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"}]},{\"id\":\"Integration\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"kind\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"secret_name\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"configuration\",\"type\":\"[]byte\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"}]},{\"id\":\"IntegrationAttachment\",\"fields\":[{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"configuration\",\"type\":\"[]byte\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"workflow_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"Membership\",\"fields\":[{\"name\":\"current\",\"type\":\"bool\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"updated_at\",\"type\":\"time.Time\"},{\"name\":\"role\",\"type\":\"authz.Role\"},{\"name\":\"membership_type\",\"type\":\"authz.MembershipType\"},{\"name\":\"member_id\",\"type\":\"uuid.UUID\"},{\"name\":\"resource_type\",\"type\":\"authz.ResourceType\"},{\"name\":\"resource_id\",\"type\":\"uuid.UUID\"},{\"name\":\"parent_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"OrgInvitation\",\"fields\":[{\"name\":\"receiver_email\",\"type\":\"string\"},{\"name\":\"status\",\"type\":\"biz.OrgInvitationStatus\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"organization_id\",\"type\":\"uuid.UUID\"},{\"name\":\"sender_id\",\"type\":\"uuid.UUID\"},{\"name\":\"role\",\"type\":\"authz.Role\"},{\"name\":\"context\",\"type\":\"biz.OrgInvitationContext\"}]},{\"id\":\"Organization\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"block_on_policy_violation\",\"type\":\"bool\"}]},{\"id\":\"Project\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"organization_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"ProjectVersion\",\"fields\":[{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"updated_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"project_id\",\"type\":\"uuid.UUID\"},{\"name\":\"prerelease\",\"type\":\"bool\"},{\"name\":\"workflow_run_count\",\"type\":\"int\"},{\"name\":\"released_at\",\"type\":\"time.Time\"},{\"name\":\"latest\",\"type\":\"bool\"}]},{\"id\":\"Referrer\",\"fields\":[{\"name\":\"digest\",\"type\":\"string\"},{\"name\":\"kind\",\"type\":\"string\"},{\"name\":\"downloadable\",\"type\":\"bool\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"metadata\",\"type\":\"map[string]string\"},{\"name\":\"annotations\",\"type\":\"map[string]string\"}]},{\"id\":\"RobotAccount\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"revoked_at\",\"type\":\"time.Time\"}]},{\"id\":\"User\",\"fields\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"has_restricted_access\",\"type\":\"bool\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}]},{\"id\":\"Workflow\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"project_old\",\"type\":\"string\"},{\"name\":\"team\",\"type\":\"string\"},{\"name\":\"runs_count\",\"type\":\"int\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"updated_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"public\",\"type\":\"bool\"},{\"name\":\"organization_id\",\"type\":\"uuid.UUID\"},{\"name\":\"project_id\",\"type\":\"uuid.UUID\"},{\"name\":\"latest_run\",\"type\":\"uuid.UUID\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"metadata\",\"type\":\"map[string]interface {}\"}]},{\"id\":\"WorkflowContract\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"deleted_at\",\"type\":\"time.Time\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"scoped_resource_type\",\"type\":\"biz.ContractScope\"},{\"name\":\"scoped_resource_id\",\"type\":\"uuid.UUID\"}]},{\"id\":\"WorkflowContractVersion\",\"fields\":[{\"name\":\"body\",\"type\":\"[]byte\"},{\"name\":\"raw_body\",\"type\":\"[]byte\"},{\"name\":\"raw_body_format\",\"type\":\"unmarshal.RawFormat\"},{\"name\":\"revision\",\"type\":\"int\"},{\"name\":\"created_at\",\"type\":\"time.Time\"}]},{\"id\":\"WorkflowRun\",\"fields\":[{\"name\":\"created_at\",\"type\":\"time.Time\"},{\"name\":\"finished_at\",\"type\":\"time.Time\"},{\"name\":\"state\",\"type\":\"biz.WorkflowRunStatus\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"run_url\",\"type\":\"string\"},{\"name\":\"runner_type\",\"type\":\"string\"},{\"name\":\"attestation\",\"type\":\"*dsse.Envelope\"},{\"name\":\"attestation_digest\",\"type\":\"string\"},{\"name\":\"attestation_state\",\"type\":\"[]byte\"},{\"name\":\"contract_revision_used\",\"type\":\"int\"},{\"name\":\"contract_revision_latest\",\"type\":\"int\"},{\"name\":\"version_id\",\"type\":\"uuid.UUID\"},{\"name\":\"workflow_id\",\"type\":\"uuid.UUID\"}]}],\"edges\":[{\"from\":\"APIToken\",\"to\":\"Project\",\"label\":\"project\"},{\"from\":\"CASMapping\",\"to\":\"CASBackend\",\"label\":\"cas_backend\"},{\"from\":\"CASMapping\",\"to\":\"Organization\",\"label\":\"organization\"},{\"from\":\"CASMapping\",\"to\":\"Project\",\"label\":\"project\"},{\"from\":\"GroupMembership\",\"to\":\"Group\",\"label\":\"group\"},{\"from\":\"GroupMembership\",\"to\":\"User\",\"label\":\"user\"},{\"from\":\"IntegrationAttachment\",\"to\":\"Integration\",\"label\":\"integration\"},{\"from\":\"IntegrationAttachment\",\"to\":\"Workflow\",\"label\":\"workflow\"},{\"from\":\"Membership\",\"to\":\"Membership\",\"label\":\"children\"},{\"from\":\"OrgInvitation\",\"to\":\"Organization\",\"label\":\"organization\"},{\"from\":\"OrgInvitation\",\"to\":\"User\",\"label\":\"sender\"},{\"from\":\"Organization\",\"to\":\"Membership\",\"label\":\"memberships\"},{\"from\":\"Organization\",\"to\":\"WorkflowContract\",\"label\":\"workflow_contracts\"},{\"from\":\"Organization\",\"to\":\"Workflow\",\"label\":\"workflows\"},{\"from\":\"Organization\",\"to\":\"CASBackend\",\"label\":\"cas_backends\"},{\"from\":\"Organization\",\"to\":\"Integration\",\"label\":\"integrations\"},{\"from\":\"Organization\",\"to\":\"APIToken\",\"label\":\"api_tokens\"},{\"from\":\"Organization\",\"to\":\"Project\",\"label\":\"projects\"},{\"from\":\"Organization\",\"to\":\"Group\",\"label\":\"groups\"},{\"from\":\"Project\",\"to\":\"Workflow\",\"label\":\"workflows\"},{\"from\":\"Project\",\"to\":\"ProjectVersion\",\"label\":\"versions\"},{\"from\":\"ProjectVersion\",\"to\":\"WorkflowRun\",\"label\":\"runs\"},{\"from\":\"Referrer\",\"to\":\"Referrer\",\"label\":\"references\"},{\"from\":\"Referrer\",\"to\":\"Workflow\",\"label\":\"workflows\"},{\"from\":\"User\",\"to\":\"Membership\",\"label\":\"memberships\"},{\"from\":\"Workflow\",\"to\":\"RobotAccount\",\"label\":\"robotaccounts\"},{\"from\":\"Workflow\",\"to\":\"WorkflowRun\",\"label\":\"workflowruns\"},{\"from\":\"Workflow\",\"to\":\"WorkflowContract\",\"label\":\"contract\"},{\"from\":\"Workflow\",\"to\":\"WorkflowRun\",\"label\":\"latest_workflow_run\"},{\"from\":\"WorkflowContract\",\"to\":\"WorkflowContractVersion\",\"label\":\"versions\"},{\"from\":\"WorkflowRun\",\"to\":\"WorkflowContractVersion\",\"label\":\"contract_version\"},{\"from\":\"WorkflowRun\",\"to\":\"CASBackend\",\"label\":\"cas_backends\"},{\"from\":\"WorkflowRun\",\"to\":\"Attestation\",\"label\":\"attestation_bundle\"}]}"); const nodes = new vis.DataSet((entGraph.nodes || []).map(n => ({ id: n.id, diff --git a/app/controlplane/pkg/data/ent/schema/group.go b/app/controlplane/pkg/data/ent/schema/group.go index ded217b05..554c89b82 100644 --- a/app/controlplane/pkg/data/ent/schema/group.go +++ b/app/controlplane/pkg/data/ent/schema/group.go @@ -52,7 +52,7 @@ func (Group) Fields() []ent.Field { func (Group) Edges() []ent.Edge { return []ent.Edge{ // The members of the group - edge.To("members", User.Type).Through("group_users", GroupMembership.Type), + edge.From("group_memberships", GroupMembership.Type).Ref("group"), // The organization this group belongs to edge.From("organization", Organization.Type). Field("organization_id"). diff --git a/app/controlplane/pkg/data/ent/schema/user.go b/app/controlplane/pkg/data/ent/schema/user.go index 7012318aa..d4241e98c 100644 --- a/app/controlplane/pkg/data/ent/schema/user.go +++ b/app/controlplane/pkg/data/ent/schema/user.go @@ -59,7 +59,7 @@ func (User) Fields() []ent.Field { func (User) Edges() []ent.Edge { return []ent.Edge{ edge.To("memberships", Membership.Type).Annotations(entsql.Annotation{OnDelete: entsql.Cascade}), - edge.From("group", Group.Type).Ref("members").Through("group_users", GroupMembership.Type), + edge.From("group_memberships", GroupMembership.Type).Ref("user"), } } diff --git a/app/controlplane/pkg/data/ent/user.go b/app/controlplane/pkg/data/ent/user.go index f926658e7..5e0812f20 100644 --- a/app/controlplane/pkg/data/ent/user.go +++ b/app/controlplane/pkg/data/ent/user.go @@ -38,13 +38,11 @@ type User struct { type UserEdges struct { // Memberships holds the value of the memberships edge. Memberships []*Membership `json:"memberships,omitempty"` - // Group holds the value of the group edge. - Group []*Group `json:"group,omitempty"` - // GroupUsers holds the value of the group_users edge. - GroupUsers []*GroupMembership `json:"group_users,omitempty"` + // GroupMemberships holds the value of the group_memberships edge. + GroupMemberships []*GroupMembership `json:"group_memberships,omitempty"` // loadedTypes holds the information for reporting if a // type was loaded (or requested) in eager-loading or not. - loadedTypes [3]bool + loadedTypes [2]bool } // MembershipsOrErr returns the Memberships value or an error if the edge @@ -56,22 +54,13 @@ func (e UserEdges) MembershipsOrErr() ([]*Membership, error) { return nil, &NotLoadedError{edge: "memberships"} } -// GroupOrErr returns the Group value or an error if the edge +// GroupMembershipsOrErr returns the GroupMemberships value or an error if the edge // was not loaded in eager-loading. -func (e UserEdges) GroupOrErr() ([]*Group, error) { +func (e UserEdges) GroupMembershipsOrErr() ([]*GroupMembership, error) { if e.loadedTypes[1] { - return e.Group, nil + return e.GroupMemberships, nil } - return nil, &NotLoadedError{edge: "group"} -} - -// GroupUsersOrErr returns the GroupUsers value or an error if the edge -// was not loaded in eager-loading. -func (e UserEdges) GroupUsersOrErr() ([]*GroupMembership, error) { - if e.loadedTypes[2] { - return e.GroupUsers, nil - } - return nil, &NotLoadedError{edge: "group_users"} + return nil, &NotLoadedError{edge: "group_memberships"} } // scanValues returns the types for scanning values from sql.Rows. @@ -157,14 +146,9 @@ func (u *User) QueryMemberships() *MembershipQuery { return NewUserClient(u.config).QueryMemberships(u) } -// QueryGroup queries the "group" edge of the User entity. -func (u *User) QueryGroup() *GroupQuery { - return NewUserClient(u.config).QueryGroup(u) -} - -// QueryGroupUsers queries the "group_users" edge of the User entity. -func (u *User) QueryGroupUsers() *GroupMembershipQuery { - return NewUserClient(u.config).QueryGroupUsers(u) +// QueryGroupMemberships queries the "group_memberships" edge of the User entity. +func (u *User) QueryGroupMemberships() *GroupMembershipQuery { + return NewUserClient(u.config).QueryGroupMemberships(u) } // Update returns a builder for updating this User. diff --git a/app/controlplane/pkg/data/ent/user/user.go b/app/controlplane/pkg/data/ent/user/user.go index 4fdcdf9d0..b1ef93cb3 100644 --- a/app/controlplane/pkg/data/ent/user/user.go +++ b/app/controlplane/pkg/data/ent/user/user.go @@ -27,10 +27,8 @@ const ( FieldLastName = "last_name" // EdgeMemberships holds the string denoting the memberships edge name in mutations. EdgeMemberships = "memberships" - // EdgeGroup holds the string denoting the group edge name in mutations. - EdgeGroup = "group" - // EdgeGroupUsers holds the string denoting the group_users edge name in mutations. - EdgeGroupUsers = "group_users" + // EdgeGroupMemberships holds the string denoting the group_memberships edge name in mutations. + EdgeGroupMemberships = "group_memberships" // Table holds the table name of the user in the database. Table = "users" // MembershipsTable is the table that holds the memberships relation/edge. @@ -40,18 +38,13 @@ const ( MembershipsInverseTable = "memberships" // MembershipsColumn is the table column denoting the memberships relation/edge. MembershipsColumn = "user_memberships" - // GroupTable is the table that holds the group relation/edge. The primary key declared below. - GroupTable = "group_memberships" - // GroupInverseTable is the table name for the Group entity. - // It exists in this package in order to avoid circular dependency with the "group" package. - GroupInverseTable = "groups" - // GroupUsersTable is the table that holds the group_users relation/edge. - GroupUsersTable = "group_memberships" - // GroupUsersInverseTable is the table name for the GroupMembership entity. + // GroupMembershipsTable is the table that holds the group_memberships relation/edge. + GroupMembershipsTable = "group_memberships" + // GroupMembershipsInverseTable is the table name for the GroupMembership entity. // It exists in this package in order to avoid circular dependency with the "groupmembership" package. - GroupUsersInverseTable = "group_memberships" - // GroupUsersColumn is the table column denoting the group_users relation/edge. - GroupUsersColumn = "user_id" + GroupMembershipsInverseTable = "group_memberships" + // GroupMembershipsColumn is the table column denoting the group_memberships relation/edge. + GroupMembershipsColumn = "user_id" ) // Columns holds all SQL columns for user fields. @@ -64,12 +57,6 @@ var Columns = []string{ FieldLastName, } -var ( - // GroupPrimaryKey and GroupColumn2 are the table columns denoting the - // primary key for the group relation (M2M). - GroupPrimaryKey = []string{"group_id", "user_id"} -) - // ValidColumn reports if the column name is valid (part of the table columns). func ValidColumn(column string) bool { for i := range Columns { @@ -136,31 +123,17 @@ func ByMemberships(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { } } -// ByGroupCount orders the results by group count. -func ByGroupCount(opts ...sql.OrderTermOption) OrderOption { - return func(s *sql.Selector) { - sqlgraph.OrderByNeighborsCount(s, newGroupStep(), opts...) - } -} - -// ByGroup orders the results by group terms. -func ByGroup(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { +// ByGroupMembershipsCount orders the results by group_memberships count. +func ByGroupMembershipsCount(opts ...sql.OrderTermOption) OrderOption { return func(s *sql.Selector) { - sqlgraph.OrderByNeighborTerms(s, newGroupStep(), append([]sql.OrderTerm{term}, terms...)...) + sqlgraph.OrderByNeighborsCount(s, newGroupMembershipsStep(), opts...) } } -// ByGroupUsersCount orders the results by group_users count. -func ByGroupUsersCount(opts ...sql.OrderTermOption) OrderOption { +// ByGroupMemberships orders the results by group_memberships terms. +func ByGroupMemberships(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { return func(s *sql.Selector) { - sqlgraph.OrderByNeighborsCount(s, newGroupUsersStep(), opts...) - } -} - -// ByGroupUsers orders the results by group_users terms. -func ByGroupUsers(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { - return func(s *sql.Selector) { - sqlgraph.OrderByNeighborTerms(s, newGroupUsersStep(), append([]sql.OrderTerm{term}, terms...)...) + sqlgraph.OrderByNeighborTerms(s, newGroupMembershipsStep(), append([]sql.OrderTerm{term}, terms...)...) } } func newMembershipsStep() *sqlgraph.Step { @@ -170,17 +143,10 @@ func newMembershipsStep() *sqlgraph.Step { sqlgraph.Edge(sqlgraph.O2M, false, MembershipsTable, MembershipsColumn), ) } -func newGroupStep() *sqlgraph.Step { - return sqlgraph.NewStep( - sqlgraph.From(Table, FieldID), - sqlgraph.To(GroupInverseTable, FieldID), - sqlgraph.Edge(sqlgraph.M2M, true, GroupTable, GroupPrimaryKey...), - ) -} -func newGroupUsersStep() *sqlgraph.Step { +func newGroupMembershipsStep() *sqlgraph.Step { return sqlgraph.NewStep( sqlgraph.From(Table, FieldID), - sqlgraph.To(GroupUsersInverseTable, FieldID), - sqlgraph.Edge(sqlgraph.O2M, true, GroupUsersTable, GroupUsersColumn), + sqlgraph.To(GroupMembershipsInverseTable, FieldID), + sqlgraph.Edge(sqlgraph.O2M, true, GroupMembershipsTable, GroupMembershipsColumn), ) } diff --git a/app/controlplane/pkg/data/ent/user/where.go b/app/controlplane/pkg/data/ent/user/where.go index bb37f5e3f..904fdad71 100644 --- a/app/controlplane/pkg/data/ent/user/where.go +++ b/app/controlplane/pkg/data/ent/user/where.go @@ -379,44 +379,21 @@ func HasMembershipsWith(preds ...predicate.Membership) predicate.User { }) } -// HasGroup applies the HasEdge predicate on the "group" edge. -func HasGroup() predicate.User { +// HasGroupMemberships applies the HasEdge predicate on the "group_memberships" edge. +func HasGroupMemberships() predicate.User { return predicate.User(func(s *sql.Selector) { step := sqlgraph.NewStep( sqlgraph.From(Table, FieldID), - sqlgraph.Edge(sqlgraph.M2M, true, GroupTable, GroupPrimaryKey...), + sqlgraph.Edge(sqlgraph.O2M, true, GroupMembershipsTable, GroupMembershipsColumn), ) sqlgraph.HasNeighbors(s, step) }) } -// HasGroupWith applies the HasEdge predicate on the "group" edge with a given conditions (other predicates). -func HasGroupWith(preds ...predicate.Group) predicate.User { +// HasGroupMembershipsWith applies the HasEdge predicate on the "group_memberships" edge with a given conditions (other predicates). +func HasGroupMembershipsWith(preds ...predicate.GroupMembership) predicate.User { return predicate.User(func(s *sql.Selector) { - step := newGroupStep() - sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { - for _, p := range preds { - p(s) - } - }) - }) -} - -// HasGroupUsers applies the HasEdge predicate on the "group_users" edge. -func HasGroupUsers() predicate.User { - return predicate.User(func(s *sql.Selector) { - step := sqlgraph.NewStep( - sqlgraph.From(Table, FieldID), - sqlgraph.Edge(sqlgraph.O2M, true, GroupUsersTable, GroupUsersColumn), - ) - sqlgraph.HasNeighbors(s, step) - }) -} - -// HasGroupUsersWith applies the HasEdge predicate on the "group_users" edge with a given conditions (other predicates). -func HasGroupUsersWith(preds ...predicate.GroupMembership) predicate.User { - return predicate.User(func(s *sql.Selector) { - step := newGroupUsersStep() + step := newGroupMembershipsStep() sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { for _, p := range preds { p(s) diff --git a/app/controlplane/pkg/data/ent/user_create.go b/app/controlplane/pkg/data/ent/user_create.go index 01dd05e2f..af7741543 100644 --- a/app/controlplane/pkg/data/ent/user_create.go +++ b/app/controlplane/pkg/data/ent/user_create.go @@ -12,7 +12,6 @@ import ( "entgo.io/ent/dialect/sql" "entgo.io/ent/dialect/sql/sqlgraph" "entgo.io/ent/schema/field" - "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/group" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/groupmembership" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/membership" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/user" @@ -118,34 +117,19 @@ func (uc *UserCreate) AddMemberships(m ...*Membership) *UserCreate { return uc.AddMembershipIDs(ids...) } -// AddGroupIDs adds the "group" edge to the Group entity by IDs. -func (uc *UserCreate) AddGroupIDs(ids ...uuid.UUID) *UserCreate { - uc.mutation.AddGroupIDs(ids...) +// AddGroupMembershipIDs adds the "group_memberships" edge to the GroupMembership entity by IDs. +func (uc *UserCreate) AddGroupMembershipIDs(ids ...uuid.UUID) *UserCreate { + uc.mutation.AddGroupMembershipIDs(ids...) return uc } -// AddGroup adds the "group" edges to the Group entity. -func (uc *UserCreate) AddGroup(g ...*Group) *UserCreate { +// AddGroupMemberships adds the "group_memberships" edges to the GroupMembership entity. +func (uc *UserCreate) AddGroupMemberships(g ...*GroupMembership) *UserCreate { ids := make([]uuid.UUID, len(g)) for i := range g { ids[i] = g[i].ID } - return uc.AddGroupIDs(ids...) -} - -// AddGroupUserIDs adds the "group_users" edge to the GroupMembership entity by IDs. -func (uc *UserCreate) AddGroupUserIDs(ids ...uuid.UUID) *UserCreate { - uc.mutation.AddGroupUserIDs(ids...) - return uc -} - -// AddGroupUsers adds the "group_users" edges to the GroupMembership entity. -func (uc *UserCreate) AddGroupUsers(g ...*GroupMembership) *UserCreate { - ids := make([]uuid.UUID, len(g)) - for i := range g { - ids[i] = g[i].ID - } - return uc.AddGroupUserIDs(ids...) + return uc.AddGroupMembershipIDs(ids...) } // Mutation returns the UserMutation object of the builder. @@ -278,35 +262,12 @@ func (uc *UserCreate) createSpec() (*User, *sqlgraph.CreateSpec) { } _spec.Edges = append(_spec.Edges, edge) } - if nodes := uc.mutation.GroupIDs(); len(nodes) > 0 { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: true, - Table: user.GroupTable, - Columns: user.GroupPrimaryKey, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(group.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - createE := &GroupMembershipCreate{config: uc.config, mutation: newGroupMembershipMutation(uc.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } - _spec.Edges = append(_spec.Edges, edge) - } - if nodes := uc.mutation.GroupUsersIDs(); len(nodes) > 0 { + if nodes := uc.mutation.GroupMembershipsIDs(); len(nodes) > 0 { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.O2M, Inverse: true, - Table: user.GroupUsersTable, - Columns: []string{user.GroupUsersColumn}, + Table: user.GroupMembershipsTable, + Columns: []string{user.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), diff --git a/app/controlplane/pkg/data/ent/user_query.go b/app/controlplane/pkg/data/ent/user_query.go index 7b208b01b..7cc41dfdf 100644 --- a/app/controlplane/pkg/data/ent/user_query.go +++ b/app/controlplane/pkg/data/ent/user_query.go @@ -13,7 +13,6 @@ import ( "entgo.io/ent/dialect/sql" "entgo.io/ent/dialect/sql/sqlgraph" "entgo.io/ent/schema/field" - "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/group" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/groupmembership" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/membership" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/predicate" @@ -24,14 +23,13 @@ import ( // UserQuery is the builder for querying User entities. type UserQuery struct { config - ctx *QueryContext - order []user.OrderOption - inters []Interceptor - predicates []predicate.User - withMemberships *MembershipQuery - withGroup *GroupQuery - withGroupUsers *GroupMembershipQuery - modifiers []func(*sql.Selector) + ctx *QueryContext + order []user.OrderOption + inters []Interceptor + predicates []predicate.User + withMemberships *MembershipQuery + withGroupMemberships *GroupMembershipQuery + modifiers []func(*sql.Selector) // intermediate query (i.e. traversal path). sql *sql.Selector path func(context.Context) (*sql.Selector, error) @@ -90,30 +88,8 @@ func (uq *UserQuery) QueryMemberships() *MembershipQuery { return query } -// QueryGroup chains the current query on the "group" edge. -func (uq *UserQuery) QueryGroup() *GroupQuery { - query := (&GroupClient{config: uq.config}).Query() - query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { - if err := uq.prepareQuery(ctx); err != nil { - return nil, err - } - selector := uq.sqlQuery(ctx) - if err := selector.Err(); err != nil { - return nil, err - } - step := sqlgraph.NewStep( - sqlgraph.From(user.Table, user.FieldID, selector), - sqlgraph.To(group.Table, group.FieldID), - sqlgraph.Edge(sqlgraph.M2M, true, user.GroupTable, user.GroupPrimaryKey...), - ) - fromU = sqlgraph.SetNeighbors(uq.driver.Dialect(), step) - return fromU, nil - } - return query -} - -// QueryGroupUsers chains the current query on the "group_users" edge. -func (uq *UserQuery) QueryGroupUsers() *GroupMembershipQuery { +// QueryGroupMemberships chains the current query on the "group_memberships" edge. +func (uq *UserQuery) QueryGroupMemberships() *GroupMembershipQuery { query := (&GroupMembershipClient{config: uq.config}).Query() query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { if err := uq.prepareQuery(ctx); err != nil { @@ -126,7 +102,7 @@ func (uq *UserQuery) QueryGroupUsers() *GroupMembershipQuery { step := sqlgraph.NewStep( sqlgraph.From(user.Table, user.FieldID, selector), sqlgraph.To(groupmembership.Table, groupmembership.FieldID), - sqlgraph.Edge(sqlgraph.O2M, true, user.GroupUsersTable, user.GroupUsersColumn), + sqlgraph.Edge(sqlgraph.O2M, true, user.GroupMembershipsTable, user.GroupMembershipsColumn), ) fromU = sqlgraph.SetNeighbors(uq.driver.Dialect(), step) return fromU, nil @@ -321,14 +297,13 @@ func (uq *UserQuery) Clone() *UserQuery { return nil } return &UserQuery{ - config: uq.config, - ctx: uq.ctx.Clone(), - order: append([]user.OrderOption{}, uq.order...), - inters: append([]Interceptor{}, uq.inters...), - predicates: append([]predicate.User{}, uq.predicates...), - withMemberships: uq.withMemberships.Clone(), - withGroup: uq.withGroup.Clone(), - withGroupUsers: uq.withGroupUsers.Clone(), + config: uq.config, + ctx: uq.ctx.Clone(), + order: append([]user.OrderOption{}, uq.order...), + inters: append([]Interceptor{}, uq.inters...), + predicates: append([]predicate.User{}, uq.predicates...), + withMemberships: uq.withMemberships.Clone(), + withGroupMemberships: uq.withGroupMemberships.Clone(), // clone intermediate query. sql: uq.sql.Clone(), path: uq.path, @@ -347,25 +322,14 @@ func (uq *UserQuery) WithMemberships(opts ...func(*MembershipQuery)) *UserQuery return uq } -// WithGroup tells the query-builder to eager-load the nodes that are connected to -// the "group" edge. The optional arguments are used to configure the query builder of the edge. -func (uq *UserQuery) WithGroup(opts ...func(*GroupQuery)) *UserQuery { - query := (&GroupClient{config: uq.config}).Query() - for _, opt := range opts { - opt(query) - } - uq.withGroup = query - return uq -} - -// WithGroupUsers tells the query-builder to eager-load the nodes that are connected to -// the "group_users" edge. The optional arguments are used to configure the query builder of the edge. -func (uq *UserQuery) WithGroupUsers(opts ...func(*GroupMembershipQuery)) *UserQuery { +// WithGroupMemberships tells the query-builder to eager-load the nodes that are connected to +// the "group_memberships" edge. The optional arguments are used to configure the query builder of the edge. +func (uq *UserQuery) WithGroupMemberships(opts ...func(*GroupMembershipQuery)) *UserQuery { query := (&GroupMembershipClient{config: uq.config}).Query() for _, opt := range opts { opt(query) } - uq.withGroupUsers = query + uq.withGroupMemberships = query return uq } @@ -447,10 +411,9 @@ func (uq *UserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*User, e var ( nodes = []*User{} _spec = uq.querySpec() - loadedTypes = [3]bool{ + loadedTypes = [2]bool{ uq.withMemberships != nil, - uq.withGroup != nil, - uq.withGroupUsers != nil, + uq.withGroupMemberships != nil, } ) _spec.ScanValues = func(columns []string) ([]any, error) { @@ -481,17 +444,10 @@ func (uq *UserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*User, e return nil, err } } - if query := uq.withGroup; query != nil { - if err := uq.loadGroup(ctx, query, nodes, - func(n *User) { n.Edges.Group = []*Group{} }, - func(n *User, e *Group) { n.Edges.Group = append(n.Edges.Group, e) }); err != nil { - return nil, err - } - } - if query := uq.withGroupUsers; query != nil { - if err := uq.loadGroupUsers(ctx, query, nodes, - func(n *User) { n.Edges.GroupUsers = []*GroupMembership{} }, - func(n *User, e *GroupMembership) { n.Edges.GroupUsers = append(n.Edges.GroupUsers, e) }); err != nil { + if query := uq.withGroupMemberships; query != nil { + if err := uq.loadGroupMemberships(ctx, query, nodes, + func(n *User) { n.Edges.GroupMemberships = []*GroupMembership{} }, + func(n *User, e *GroupMembership) { n.Edges.GroupMemberships = append(n.Edges.GroupMemberships, e) }); err != nil { return nil, err } } @@ -529,68 +485,7 @@ func (uq *UserQuery) loadMemberships(ctx context.Context, query *MembershipQuery } return nil } -func (uq *UserQuery) loadGroup(ctx context.Context, query *GroupQuery, nodes []*User, init func(*User), assign func(*User, *Group)) error { - edgeIDs := make([]driver.Value, len(nodes)) - byID := make(map[uuid.UUID]*User) - nids := make(map[uuid.UUID]map[*User]struct{}) - for i, node := range nodes { - edgeIDs[i] = node.ID - byID[node.ID] = node - if init != nil { - init(node) - } - } - query.Where(func(s *sql.Selector) { - joinT := sql.Table(user.GroupTable) - s.Join(joinT).On(s.C(group.FieldID), joinT.C(user.GroupPrimaryKey[0])) - s.Where(sql.InValues(joinT.C(user.GroupPrimaryKey[1]), edgeIDs...)) - columns := s.SelectedColumns() - s.Select(joinT.C(user.GroupPrimaryKey[1])) - s.AppendSelect(columns...) - s.SetDistinct(false) - }) - if err := query.prepareQuery(ctx); err != nil { - return err - } - qr := QuerierFunc(func(ctx context.Context, q Query) (Value, error) { - return query.sqlAll(ctx, func(_ context.Context, spec *sqlgraph.QuerySpec) { - assign := spec.Assign - values := spec.ScanValues - spec.ScanValues = func(columns []string) ([]any, error) { - values, err := values(columns[1:]) - if err != nil { - return nil, err - } - return append([]any{new(uuid.UUID)}, values...), nil - } - spec.Assign = func(columns []string, values []any) error { - outValue := *values[0].(*uuid.UUID) - inValue := *values[1].(*uuid.UUID) - if nids[inValue] == nil { - nids[inValue] = map[*User]struct{}{byID[outValue]: {}} - return assign(columns[1:], values[1:]) - } - nids[inValue][byID[outValue]] = struct{}{} - return nil - } - }) - }) - neighbors, err := withInterceptors[[]*Group](ctx, query, qr, query.inters) - if err != nil { - return err - } - for _, n := range neighbors { - nodes, ok := nids[n.ID] - if !ok { - return fmt.Errorf(`unexpected "group" node returned %v`, n.ID) - } - for kn := range nodes { - assign(kn, n) - } - } - return nil -} -func (uq *UserQuery) loadGroupUsers(ctx context.Context, query *GroupMembershipQuery, nodes []*User, init func(*User), assign func(*User, *GroupMembership)) error { +func (uq *UserQuery) loadGroupMemberships(ctx context.Context, query *GroupMembershipQuery, nodes []*User, init func(*User), assign func(*User, *GroupMembership)) error { fks := make([]driver.Value, 0, len(nodes)) nodeids := make(map[uuid.UUID]*User) for i := range nodes { @@ -604,7 +499,7 @@ func (uq *UserQuery) loadGroupUsers(ctx context.Context, query *GroupMembershipQ query.ctx.AppendFieldOnce(groupmembership.FieldUserID) } query.Where(predicate.GroupMembership(func(s *sql.Selector) { - s.Where(sql.InValues(s.C(user.GroupUsersColumn), fks...)) + s.Where(sql.InValues(s.C(user.GroupMembershipsColumn), fks...)) })) neighbors, err := query.All(ctx) if err != nil { diff --git a/app/controlplane/pkg/data/ent/user_update.go b/app/controlplane/pkg/data/ent/user_update.go index 4c20d693f..9a3b798a1 100644 --- a/app/controlplane/pkg/data/ent/user_update.go +++ b/app/controlplane/pkg/data/ent/user_update.go @@ -10,7 +10,6 @@ import ( "entgo.io/ent/dialect/sql" "entgo.io/ent/dialect/sql/sqlgraph" "entgo.io/ent/schema/field" - "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/group" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/groupmembership" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/membership" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/predicate" @@ -121,34 +120,19 @@ func (uu *UserUpdate) AddMemberships(m ...*Membership) *UserUpdate { return uu.AddMembershipIDs(ids...) } -// AddGroupIDs adds the "group" edge to the Group entity by IDs. -func (uu *UserUpdate) AddGroupIDs(ids ...uuid.UUID) *UserUpdate { - uu.mutation.AddGroupIDs(ids...) +// AddGroupMembershipIDs adds the "group_memberships" edge to the GroupMembership entity by IDs. +func (uu *UserUpdate) AddGroupMembershipIDs(ids ...uuid.UUID) *UserUpdate { + uu.mutation.AddGroupMembershipIDs(ids...) return uu } -// AddGroup adds the "group" edges to the Group entity. -func (uu *UserUpdate) AddGroup(g ...*Group) *UserUpdate { +// AddGroupMemberships adds the "group_memberships" edges to the GroupMembership entity. +func (uu *UserUpdate) AddGroupMemberships(g ...*GroupMembership) *UserUpdate { ids := make([]uuid.UUID, len(g)) for i := range g { ids[i] = g[i].ID } - return uu.AddGroupIDs(ids...) -} - -// AddGroupUserIDs adds the "group_users" edge to the GroupMembership entity by IDs. -func (uu *UserUpdate) AddGroupUserIDs(ids ...uuid.UUID) *UserUpdate { - uu.mutation.AddGroupUserIDs(ids...) - return uu -} - -// AddGroupUsers adds the "group_users" edges to the GroupMembership entity. -func (uu *UserUpdate) AddGroupUsers(g ...*GroupMembership) *UserUpdate { - ids := make([]uuid.UUID, len(g)) - for i := range g { - ids[i] = g[i].ID - } - return uu.AddGroupUserIDs(ids...) + return uu.AddGroupMembershipIDs(ids...) } // Mutation returns the UserMutation object of the builder. @@ -177,46 +161,25 @@ func (uu *UserUpdate) RemoveMemberships(m ...*Membership) *UserUpdate { return uu.RemoveMembershipIDs(ids...) } -// ClearGroup clears all "group" edges to the Group entity. -func (uu *UserUpdate) ClearGroup() *UserUpdate { - uu.mutation.ClearGroup() +// ClearGroupMemberships clears all "group_memberships" edges to the GroupMembership entity. +func (uu *UserUpdate) ClearGroupMemberships() *UserUpdate { + uu.mutation.ClearGroupMemberships() return uu } -// RemoveGroupIDs removes the "group" edge to Group entities by IDs. -func (uu *UserUpdate) RemoveGroupIDs(ids ...uuid.UUID) *UserUpdate { - uu.mutation.RemoveGroupIDs(ids...) +// RemoveGroupMembershipIDs removes the "group_memberships" edge to GroupMembership entities by IDs. +func (uu *UserUpdate) RemoveGroupMembershipIDs(ids ...uuid.UUID) *UserUpdate { + uu.mutation.RemoveGroupMembershipIDs(ids...) return uu } -// RemoveGroup removes "group" edges to Group entities. -func (uu *UserUpdate) RemoveGroup(g ...*Group) *UserUpdate { +// RemoveGroupMemberships removes "group_memberships" edges to GroupMembership entities. +func (uu *UserUpdate) RemoveGroupMemberships(g ...*GroupMembership) *UserUpdate { ids := make([]uuid.UUID, len(g)) for i := range g { ids[i] = g[i].ID } - return uu.RemoveGroupIDs(ids...) -} - -// ClearGroupUsers clears all "group_users" edges to the GroupMembership entity. -func (uu *UserUpdate) ClearGroupUsers() *UserUpdate { - uu.mutation.ClearGroupUsers() - return uu -} - -// RemoveGroupUserIDs removes the "group_users" edge to GroupMembership entities by IDs. -func (uu *UserUpdate) RemoveGroupUserIDs(ids ...uuid.UUID) *UserUpdate { - uu.mutation.RemoveGroupUserIDs(ids...) - return uu -} - -// RemoveGroupUsers removes "group_users" edges to GroupMembership entities. -func (uu *UserUpdate) RemoveGroupUsers(g ...*GroupMembership) *UserUpdate { - ids := make([]uuid.UUID, len(g)) - for i := range g { - ids[i] = g[i].ID - } - return uu.RemoveGroupUserIDs(ids...) + return uu.RemoveGroupMembershipIDs(ids...) } // Save executes the query and returns the number of nodes affected by the update operation. @@ -340,78 +303,12 @@ func (uu *UserUpdate) sqlSave(ctx context.Context) (n int, err error) { } _spec.Edges.Add = append(_spec.Edges.Add, edge) } - if uu.mutation.GroupCleared() { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: true, - Table: user.GroupTable, - Columns: user.GroupPrimaryKey, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(group.FieldID, field.TypeUUID), - }, - } - createE := &GroupMembershipCreate{config: uu.config, mutation: newGroupMembershipMutation(uu.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } - _spec.Edges.Clear = append(_spec.Edges.Clear, edge) - } - if nodes := uu.mutation.RemovedGroupIDs(); len(nodes) > 0 && !uu.mutation.GroupCleared() { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: true, - Table: user.GroupTable, - Columns: user.GroupPrimaryKey, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(group.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - createE := &GroupMembershipCreate{config: uu.config, mutation: newGroupMembershipMutation(uu.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } - _spec.Edges.Clear = append(_spec.Edges.Clear, edge) - } - if nodes := uu.mutation.GroupIDs(); len(nodes) > 0 { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: true, - Table: user.GroupTable, - Columns: user.GroupPrimaryKey, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(group.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - createE := &GroupMembershipCreate{config: uu.config, mutation: newGroupMembershipMutation(uu.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } - _spec.Edges.Add = append(_spec.Edges.Add, edge) - } - if uu.mutation.GroupUsersCleared() { + if uu.mutation.GroupMembershipsCleared() { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.O2M, Inverse: true, - Table: user.GroupUsersTable, - Columns: []string{user.GroupUsersColumn}, + Table: user.GroupMembershipsTable, + Columns: []string{user.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), @@ -419,12 +316,12 @@ func (uu *UserUpdate) sqlSave(ctx context.Context) (n int, err error) { } _spec.Edges.Clear = append(_spec.Edges.Clear, edge) } - if nodes := uu.mutation.RemovedGroupUsersIDs(); len(nodes) > 0 && !uu.mutation.GroupUsersCleared() { + if nodes := uu.mutation.RemovedGroupMembershipsIDs(); len(nodes) > 0 && !uu.mutation.GroupMembershipsCleared() { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.O2M, Inverse: true, - Table: user.GroupUsersTable, - Columns: []string{user.GroupUsersColumn}, + Table: user.GroupMembershipsTable, + Columns: []string{user.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), @@ -435,12 +332,12 @@ func (uu *UserUpdate) sqlSave(ctx context.Context) (n int, err error) { } _spec.Edges.Clear = append(_spec.Edges.Clear, edge) } - if nodes := uu.mutation.GroupUsersIDs(); len(nodes) > 0 { + if nodes := uu.mutation.GroupMembershipsIDs(); len(nodes) > 0 { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.O2M, Inverse: true, - Table: user.GroupUsersTable, - Columns: []string{user.GroupUsersColumn}, + Table: user.GroupMembershipsTable, + Columns: []string{user.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), @@ -562,34 +459,19 @@ func (uuo *UserUpdateOne) AddMemberships(m ...*Membership) *UserUpdateOne { return uuo.AddMembershipIDs(ids...) } -// AddGroupIDs adds the "group" edge to the Group entity by IDs. -func (uuo *UserUpdateOne) AddGroupIDs(ids ...uuid.UUID) *UserUpdateOne { - uuo.mutation.AddGroupIDs(ids...) +// AddGroupMembershipIDs adds the "group_memberships" edge to the GroupMembership entity by IDs. +func (uuo *UserUpdateOne) AddGroupMembershipIDs(ids ...uuid.UUID) *UserUpdateOne { + uuo.mutation.AddGroupMembershipIDs(ids...) return uuo } -// AddGroup adds the "group" edges to the Group entity. -func (uuo *UserUpdateOne) AddGroup(g ...*Group) *UserUpdateOne { +// AddGroupMemberships adds the "group_memberships" edges to the GroupMembership entity. +func (uuo *UserUpdateOne) AddGroupMemberships(g ...*GroupMembership) *UserUpdateOne { ids := make([]uuid.UUID, len(g)) for i := range g { ids[i] = g[i].ID } - return uuo.AddGroupIDs(ids...) -} - -// AddGroupUserIDs adds the "group_users" edge to the GroupMembership entity by IDs. -func (uuo *UserUpdateOne) AddGroupUserIDs(ids ...uuid.UUID) *UserUpdateOne { - uuo.mutation.AddGroupUserIDs(ids...) - return uuo -} - -// AddGroupUsers adds the "group_users" edges to the GroupMembership entity. -func (uuo *UserUpdateOne) AddGroupUsers(g ...*GroupMembership) *UserUpdateOne { - ids := make([]uuid.UUID, len(g)) - for i := range g { - ids[i] = g[i].ID - } - return uuo.AddGroupUserIDs(ids...) + return uuo.AddGroupMembershipIDs(ids...) } // Mutation returns the UserMutation object of the builder. @@ -618,46 +500,25 @@ func (uuo *UserUpdateOne) RemoveMemberships(m ...*Membership) *UserUpdateOne { return uuo.RemoveMembershipIDs(ids...) } -// ClearGroup clears all "group" edges to the Group entity. -func (uuo *UserUpdateOne) ClearGroup() *UserUpdateOne { - uuo.mutation.ClearGroup() +// ClearGroupMemberships clears all "group_memberships" edges to the GroupMembership entity. +func (uuo *UserUpdateOne) ClearGroupMemberships() *UserUpdateOne { + uuo.mutation.ClearGroupMemberships() return uuo } -// RemoveGroupIDs removes the "group" edge to Group entities by IDs. -func (uuo *UserUpdateOne) RemoveGroupIDs(ids ...uuid.UUID) *UserUpdateOne { - uuo.mutation.RemoveGroupIDs(ids...) +// RemoveGroupMembershipIDs removes the "group_memberships" edge to GroupMembership entities by IDs. +func (uuo *UserUpdateOne) RemoveGroupMembershipIDs(ids ...uuid.UUID) *UserUpdateOne { + uuo.mutation.RemoveGroupMembershipIDs(ids...) return uuo } -// RemoveGroup removes "group" edges to Group entities. -func (uuo *UserUpdateOne) RemoveGroup(g ...*Group) *UserUpdateOne { +// RemoveGroupMemberships removes "group_memberships" edges to GroupMembership entities. +func (uuo *UserUpdateOne) RemoveGroupMemberships(g ...*GroupMembership) *UserUpdateOne { ids := make([]uuid.UUID, len(g)) for i := range g { ids[i] = g[i].ID } - return uuo.RemoveGroupIDs(ids...) -} - -// ClearGroupUsers clears all "group_users" edges to the GroupMembership entity. -func (uuo *UserUpdateOne) ClearGroupUsers() *UserUpdateOne { - uuo.mutation.ClearGroupUsers() - return uuo -} - -// RemoveGroupUserIDs removes the "group_users" edge to GroupMembership entities by IDs. -func (uuo *UserUpdateOne) RemoveGroupUserIDs(ids ...uuid.UUID) *UserUpdateOne { - uuo.mutation.RemoveGroupUserIDs(ids...) - return uuo -} - -// RemoveGroupUsers removes "group_users" edges to GroupMembership entities. -func (uuo *UserUpdateOne) RemoveGroupUsers(g ...*GroupMembership) *UserUpdateOne { - ids := make([]uuid.UUID, len(g)) - for i := range g { - ids[i] = g[i].ID - } - return uuo.RemoveGroupUserIDs(ids...) + return uuo.RemoveGroupMembershipIDs(ids...) } // Where appends a list predicates to the UserUpdate builder. @@ -811,78 +672,12 @@ func (uuo *UserUpdateOne) sqlSave(ctx context.Context) (_node *User, err error) } _spec.Edges.Add = append(_spec.Edges.Add, edge) } - if uuo.mutation.GroupCleared() { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: true, - Table: user.GroupTable, - Columns: user.GroupPrimaryKey, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(group.FieldID, field.TypeUUID), - }, - } - createE := &GroupMembershipCreate{config: uuo.config, mutation: newGroupMembershipMutation(uuo.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } - _spec.Edges.Clear = append(_spec.Edges.Clear, edge) - } - if nodes := uuo.mutation.RemovedGroupIDs(); len(nodes) > 0 && !uuo.mutation.GroupCleared() { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: true, - Table: user.GroupTable, - Columns: user.GroupPrimaryKey, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(group.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - createE := &GroupMembershipCreate{config: uuo.config, mutation: newGroupMembershipMutation(uuo.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } - _spec.Edges.Clear = append(_spec.Edges.Clear, edge) - } - if nodes := uuo.mutation.GroupIDs(); len(nodes) > 0 { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2M, - Inverse: true, - Table: user.GroupTable, - Columns: user.GroupPrimaryKey, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(group.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - createE := &GroupMembershipCreate{config: uuo.config, mutation: newGroupMembershipMutation(uuo.config, OpCreate)} - createE.defaults() - _, specE := createE.createSpec() - edge.Target.Fields = specE.Fields - if specE.ID.Value != nil { - edge.Target.Fields = append(edge.Target.Fields, specE.ID) - } - _spec.Edges.Add = append(_spec.Edges.Add, edge) - } - if uuo.mutation.GroupUsersCleared() { + if uuo.mutation.GroupMembershipsCleared() { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.O2M, Inverse: true, - Table: user.GroupUsersTable, - Columns: []string{user.GroupUsersColumn}, + Table: user.GroupMembershipsTable, + Columns: []string{user.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), @@ -890,12 +685,12 @@ func (uuo *UserUpdateOne) sqlSave(ctx context.Context) (_node *User, err error) } _spec.Edges.Clear = append(_spec.Edges.Clear, edge) } - if nodes := uuo.mutation.RemovedGroupUsersIDs(); len(nodes) > 0 && !uuo.mutation.GroupUsersCleared() { + if nodes := uuo.mutation.RemovedGroupMembershipsIDs(); len(nodes) > 0 && !uuo.mutation.GroupMembershipsCleared() { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.O2M, Inverse: true, - Table: user.GroupUsersTable, - Columns: []string{user.GroupUsersColumn}, + Table: user.GroupMembershipsTable, + Columns: []string{user.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), @@ -906,12 +701,12 @@ func (uuo *UserUpdateOne) sqlSave(ctx context.Context) (_node *User, err error) } _spec.Edges.Clear = append(_spec.Edges.Clear, edge) } - if nodes := uuo.mutation.GroupUsersIDs(); len(nodes) > 0 { + if nodes := uuo.mutation.GroupMembershipsIDs(); len(nodes) > 0 { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.O2M, Inverse: true, - Table: user.GroupUsersTable, - Columns: []string{user.GroupUsersColumn}, + Table: user.GroupMembershipsTable, + Columns: []string{user.GroupMembershipsColumn}, Bidi: false, Target: &sqlgraph.EdgeTarget{ IDSpec: sqlgraph.NewFieldSpec(groupmembership.FieldID, field.TypeUUID), diff --git a/app/controlplane/pkg/data/group.go b/app/controlplane/pkg/data/group.go index 28cfb9f64..64175f9e8 100644 --- a/app/controlplane/pkg/data/group.go +++ b/app/controlplane/pkg/data/group.go @@ -60,9 +60,17 @@ func (g GroupRepo) List(ctx context.Context, orgID uuid.UUID, filterOpts *biz.Li query := g.data.DB.Group.Query(). Where(group.DeletedAtIsNil(), group.OrganizationIDEQ(orgID)). - WithMembers().WithOrganization() + WithGroupMemberships().WithOrganization() - // Apply filters as ORs if any filter is provided + // filter by UserID if provided. It will be applied on top of rest of filters + if filterOpts.UserID != nil { + query.Where(group.HasGroupMembershipsWith( + groupmembership.UserID(*filterOpts.UserID), + groupmembership.DeletedAtIsNil(), + )) + } + + // Apply filters as ORs if any additional filter is provided var predicates []predicate.Group if filterOpts.Name != "" { predicates = append(predicates, group.NameContains(filterOpts.Name)) @@ -73,7 +81,12 @@ func (g GroupRepo) List(ctx context.Context, orgID uuid.UUID, filterOpts *biz.Li } if filterOpts.MemberEmail != "" { - predicates = append(predicates, group.HasMembersWith(user.EmailContains(filterOpts.MemberEmail))) + predicates = append(predicates, + group.HasGroupMembershipsWith( + groupmembership.DeletedAtIsNil(), + groupmembership.HasUserWith(user.EmailContains(filterOpts.MemberEmail)), + ), + ) } // Apply OR predicates if any exist @@ -223,17 +236,10 @@ func (g GroupRepo) Create(ctx context.Context, orgID uuid.UUID, opts *biz.Create err := WithTx(ctx, g.data.DB, func(tx *ent.Tx) error { // Create the group with the provided options - builder := tx.Group.Create(). + gr, err := tx.Group.Create(). SetName(opts.Name). SetDescription(opts.Description). - SetOrganizationID(orgID) - - // Add member if userID is provided - if opts.UserID != nil { - builder = builder.AddMemberIDs(*opts.UserID) - } - - gr, err := builder.Save(ctx) + SetOrganizationID(orgID).Save(ctx) if err != nil { if ent.IsConstraintError(err) { return biz.NewErrAlreadyExistsStr("group with the same name already exists") @@ -243,18 +249,13 @@ func (g GroupRepo) Create(ctx context.Context, orgID uuid.UUID, opts *biz.Create // Only add memberships if userID is not nil if opts.UserID != nil { - // Update the group-user member to set it's a group maintainer - if _, grUerr := tx.GroupMembership.Update(). - Where( - groupmembership.GroupIDEQ(gr.ID), - groupmembership.UserIDEQ(*opts.UserID), - ). + // Set user as group maintainer + if _, err = tx.GroupMembership.Create(). + SetGroupID(gr.ID). + SetUserID(*opts.UserID). SetMaintainer(true). - Save(ctx); grUerr != nil { - if ent.IsNotFound(grUerr) { - return biz.NewErrNotFound("group user") - } - return grUerr + Save(ctx); err != nil { + return err } // Update the user membership with the role of maintainer