2021-12-14 08:19:02 +01:00
package query
2021-12-16 14:25:38 +01:00
import (
"context"
"database/sql"
sq "github.com/Masterminds/squirrel"
2022-01-20 15:40:25 +01:00
2022-04-27 01:01:45 +02:00
"github.com/zitadel/zitadel/internal/api/authz"
2023-04-11 17:56:51 +02:00
"github.com/zitadel/zitadel/internal/domain"
2022-04-27 01:01:45 +02:00
"github.com/zitadel/zitadel/internal/query/projection"
2023-12-08 16:30:55 +02:00
"github.com/zitadel/zitadel/internal/zerrors"
2021-12-16 14:25:38 +01:00
)
2021-12-14 08:19:02 +01:00
var (
projectGrantMemberTable = table {
2022-10-27 08:08:36 +02:00
name : projection . ProjectGrantMemberProjectionTable ,
alias : "members" ,
instanceIDCol : projection . MemberInstanceID ,
2021-12-14 08:19:02 +01:00
}
ProjectGrantMemberUserID = Column {
name : projection . MemberUserIDCol ,
table : projectGrantMemberTable ,
}
ProjectGrantMemberRoles = Column {
name : projection . MemberRolesCol ,
table : projectGrantMemberTable ,
}
ProjectGrantMemberCreationDate = Column {
name : projection . MemberCreationDate ,
table : projectGrantMemberTable ,
}
ProjectGrantMemberChangeDate = Column {
name : projection . MemberChangeDate ,
table : projectGrantMemberTable ,
}
ProjectGrantMemberSequence = Column {
name : projection . MemberSequence ,
table : projectGrantMemberTable ,
}
ProjectGrantMemberResourceOwner = Column {
name : projection . MemberResourceOwner ,
table : projectGrantMemberTable ,
}
2025-01-15 14:10:30 +05:30
ProjectGrantMemberUserResourceOwner = Column {
name : projection . MemberUserResourceOwner ,
table : projectGrantMemberTable ,
}
2022-03-23 09:02:39 +01:00
ProjectGrantMemberInstanceID = Column {
name : projection . MemberInstanceID ,
table : projectGrantMemberTable ,
}
2021-12-14 08:19:02 +01:00
ProjectGrantMemberProjectID = Column {
name : projection . ProjectGrantMemberProjectIDCol ,
table : projectGrantMemberTable ,
}
ProjectGrantMemberGrantID = Column {
name : projection . ProjectGrantMemberGrantIDCol ,
table : projectGrantMemberTable ,
}
)
2021-12-16 14:25:38 +01:00
type ProjectGrantMembersQuery struct {
MembersQuery
2022-03-24 14:00:24 +01:00
ProjectID , GrantID , OrgID string
2021-12-16 14:25:38 +01:00
}
func ( q * ProjectGrantMembersQuery ) toQuery ( query sq . SelectBuilder ) sq . SelectBuilder {
return q . MembersQuery .
toQuery ( query ) .
2022-03-24 14:00:24 +01:00
Where ( sq . And {
sq . Eq {
ProjectGrantMemberProjectID . identifier ( ) : q . ProjectID ,
ProjectGrantMemberGrantID . identifier ( ) : q . GrantID ,
} ,
sq . Or {
sq . Eq { ProjectGrantColumnResourceOwner . identifier ( ) : q . OrgID } ,
sq . Eq { ProjectGrantColumnGrantedOrgID . identifier ( ) : q . OrgID } ,
} ,
2021-12-16 14:25:38 +01:00
} )
}
2023-11-20 16:21:08 +01:00
func ( q * Queries ) ProjectGrantMembers ( ctx context . Context , queries * ProjectGrantMembersQuery ) ( members * Members , err error ) {
2025-04-02 16:53:06 +02:00
query , scan := prepareProjectGrantMembersQuery ( )
2022-11-30 17:01:17 +01:00
eq := sq . Eq { ProjectGrantMemberInstanceID . identifier ( ) : authz . GetInstance ( ctx ) . InstanceID ( ) }
stmt , args , err := queries . toQuery ( query ) . Where ( eq ) . ToSql ( )
2021-12-16 14:25:38 +01:00
if err != nil {
2023-12-08 16:30:55 +02:00
return nil , zerrors . ThrowInvalidArgument ( err , "QUERY-USNwM" , "Errors.Query.InvalidRequest" )
2021-12-16 14:25:38 +01:00
}
2023-10-19 12:19:10 +02:00
currentSequence , err := q . latestState ( ctx , projectGrantMemberTable )
2021-12-16 14:25:38 +01:00
if err != nil {
return nil , err
}
2023-08-22 14:49:02 +02:00
err = q . client . QueryContext ( ctx , func ( rows * sql . Rows ) error {
members , err = scan ( rows )
return err
} , stmt , args ... )
2021-12-16 14:25:38 +01:00
if err != nil {
2023-12-08 16:30:55 +02:00
return nil , zerrors . ThrowInternal ( err , "QUERY-Pdg1I" , "Errors.Internal" )
2021-12-16 14:25:38 +01:00
}
2023-08-22 14:49:02 +02:00
2023-10-19 12:19:10 +02:00
members . State = currentSequence
2021-12-16 14:25:38 +01:00
return members , err
}
2025-04-02 16:53:06 +02:00
func prepareProjectGrantMembersQuery ( ) ( sq . SelectBuilder , func ( * sql . Rows ) ( * Members , error ) ) {
2021-12-16 14:25:38 +01:00
return sq . Select (
ProjectGrantMemberCreationDate . identifier ( ) ,
ProjectGrantMemberChangeDate . identifier ( ) ,
ProjectGrantMemberSequence . identifier ( ) ,
ProjectGrantMemberResourceOwner . identifier ( ) ,
2025-01-15 14:10:30 +05:30
ProjectGrantMemberUserResourceOwner . identifier ( ) ,
2021-12-16 14:25:38 +01:00
ProjectGrantMemberUserID . identifier ( ) ,
ProjectGrantMemberRoles . identifier ( ) ,
LoginNameNameCol . identifier ( ) ,
HumanEmailCol . identifier ( ) ,
HumanFirstNameCol . identifier ( ) ,
HumanLastNameCol . identifier ( ) ,
HumanDisplayNameCol . identifier ( ) ,
MachineNameCol . identifier ( ) ,
2022-01-20 15:40:25 +01:00
HumanAvatarURLCol . identifier ( ) ,
2023-04-11 17:56:51 +02:00
UserTypeCol . identifier ( ) ,
2021-12-16 14:25:38 +01:00
countColumn . identifier ( ) ,
) . From ( projectGrantMemberTable . identifier ( ) ) .
LeftJoin ( join ( HumanUserIDCol , ProjectGrantMemberUserID ) ) .
LeftJoin ( join ( MachineUserIDCol , ProjectGrantMemberUserID ) ) .
2023-04-11 17:56:51 +02:00
LeftJoin ( join ( UserIDCol , ProjectGrantMemberUserID ) ) .
2021-12-16 14:25:38 +01:00
LeftJoin ( join ( LoginNameUserIDCol , ProjectGrantMemberUserID ) ) .
2025-07-04 18:12:59 +02:00
LeftJoin ( join ( ProjectGrantColumnGrantID , ProjectGrantMemberGrantID ) + " AND " + ProjectGrantMemberProjectID . identifier ( ) + " = " + ProjectGrantColumnProjectID . identifier ( ) ) .
2021-12-16 14:25:38 +01:00
Where (
sq . Eq { LoginNameIsPrimaryCol . identifier ( ) : true } ,
) . PlaceholderFormat ( sq . Dollar ) ,
func ( rows * sql . Rows ) ( * Members , error ) {
members := make ( [ ] * Member , 0 )
var count uint64
for rows . Next ( ) {
member := new ( Member )
var (
preferredLoginName = sql . NullString { }
email = sql . NullString { }
firstName = sql . NullString { }
lastName = sql . NullString { }
displayName = sql . NullString { }
machineName = sql . NullString { }
avatarURL = sql . NullString { }
2023-04-11 17:56:51 +02:00
userType = sql . NullInt32 { }
2021-12-16 14:25:38 +01:00
)
err := rows . Scan (
& member . CreationDate ,
& member . ChangeDate ,
& member . Sequence ,
& member . ResourceOwner ,
2025-01-15 14:10:30 +05:30
& member . UserResourceOwner ,
2021-12-16 14:25:38 +01:00
& member . UserID ,
2022-08-31 09:52:43 +02:00
& member . Roles ,
2021-12-16 14:25:38 +01:00
& preferredLoginName ,
& email ,
& firstName ,
& lastName ,
& displayName ,
& machineName ,
& avatarURL ,
2023-04-11 17:56:51 +02:00
& userType ,
2021-12-16 14:25:38 +01:00
& count ,
)
if err != nil {
return nil , err
}
member . PreferredLoginName = preferredLoginName . String
member . Email = email . String
member . FirstName = firstName . String
member . LastName = lastName . String
member . AvatarURL = avatarURL . String
if displayName . Valid {
member . DisplayName = displayName . String
} else {
member . DisplayName = machineName . String
}
2023-04-11 17:56:51 +02:00
member . UserType = domain . UserType ( userType . Int32 )
2021-12-16 14:25:38 +01:00
members = append ( members , member )
}
if err := rows . Close ( ) ; err != nil {
2023-12-08 16:30:55 +02:00
return nil , zerrors . ThrowInternal ( err , "QUERY-EqJFc" , "Errors.Query.CloseRows" )
2021-12-16 14:25:38 +01:00
}
return & Members {
Members : members ,
SearchResponse : SearchResponse {
Count : count ,
} ,
} , nil
}
}