| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | package query | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							|  |  |  | 	"database/sql" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	sq "github.com/Masterminds/squirrel" | 
					
						
							| 
									
										
										
										
											2022-03-23 09:02:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-27 01:01:45 +02:00
										 |  |  | 	"github.com/zitadel/zitadel/internal/api/authz" | 
					
						
							| 
									
										
										
										
											2023-02-27 22:36:43 +01:00
										 |  |  | 	"github.com/zitadel/zitadel/internal/api/call" | 
					
						
							| 
									
										
										
										
											2022-04-27 01:01:45 +02:00
										 |  |  | 	"github.com/zitadel/zitadel/internal/domain" | 
					
						
							|  |  |  | 	"github.com/zitadel/zitadel/internal/errors" | 
					
						
							|  |  |  | 	"github.com/zitadel/zitadel/internal/query/projection" | 
					
						
							| 
									
										
										
										
											2022-12-01 09:18:53 +01:00
										 |  |  | 	"github.com/zitadel/zitadel/internal/telemetry/tracing" | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 14:49:19 +01:00
										 |  |  | type IDPUserLink struct { | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 	IDPID            string | 
					
						
							|  |  |  | 	UserID           string | 
					
						
							|  |  |  | 	IDPName          string | 
					
						
							|  |  |  | 	ProvidedUserID   string | 
					
						
							|  |  |  | 	ProvidedUsername string | 
					
						
							| 
									
										
										
										
											2022-01-13 08:58:14 +01:00
										 |  |  | 	ResourceOwner    string | 
					
						
							| 
									
										
										
										
											2023-02-28 21:20:58 +01:00
										 |  |  | 	IDPType          domain.IDPType | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 14:49:19 +01:00
										 |  |  | type IDPUserLinks struct { | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 	SearchResponse | 
					
						
							| 
									
										
										
										
											2021-12-08 14:49:19 +01:00
										 |  |  | 	Links []*IDPUserLink | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 14:49:19 +01:00
										 |  |  | type IDPUserLinksSearchQuery struct { | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 	SearchRequest | 
					
						
							|  |  |  | 	Queries []SearchQuery | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 14:49:19 +01:00
										 |  |  | func (q *IDPUserLinksSearchQuery) toQuery(query sq.SelectBuilder) sq.SelectBuilder { | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 	query = q.SearchRequest.toQuery(query) | 
					
						
							|  |  |  | 	for _, q := range q.Queries { | 
					
						
							|  |  |  | 		query = q.toQuery(query) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return query | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							|  |  |  | 	idpUserLinkTable = table{ | 
					
						
							| 
									
										
										
										
											2022-10-27 08:08:36 +02:00
										 |  |  | 		name:          projection.IDPUserLinkTable, | 
					
						
							|  |  |  | 		instanceIDCol: projection.IDPUserLinkInstanceIDCol, | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	IDPUserLinkIDPIDCol = Column{ | 
					
						
							|  |  |  | 		name:  projection.IDPUserLinkIDPIDCol, | 
					
						
							|  |  |  | 		table: idpUserLinkTable, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	IDPUserLinkUserIDCol = Column{ | 
					
						
							|  |  |  | 		name:  projection.IDPUserLinkUserIDCol, | 
					
						
							|  |  |  | 		table: idpUserLinkTable, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	IDPUserLinkExternalUserIDCol = Column{ | 
					
						
							|  |  |  | 		name:  projection.IDPUserLinkExternalUserIDCol, | 
					
						
							|  |  |  | 		table: idpUserLinkTable, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	IDPUserLinkCreationDateCol = Column{ | 
					
						
							|  |  |  | 		name:  projection.IDPUserLinkCreationDateCol, | 
					
						
							|  |  |  | 		table: idpUserLinkTable, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	IDPUserLinkChangeDateCol = Column{ | 
					
						
							|  |  |  | 		name:  projection.IDPUserLinkChangeDateCol, | 
					
						
							|  |  |  | 		table: idpUserLinkTable, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	IDPUserLinkSequenceCol = Column{ | 
					
						
							|  |  |  | 		name:  projection.IDPUserLinkSequenceCol, | 
					
						
							|  |  |  | 		table: idpUserLinkTable, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	IDPUserLinkResourceOwnerCol = Column{ | 
					
						
							|  |  |  | 		name:  projection.IDPUserLinkResourceOwnerCol, | 
					
						
							|  |  |  | 		table: idpUserLinkTable, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-03-23 09:02:39 +01:00
										 |  |  | 	IDPUserLinkInstanceIDCol = Column{ | 
					
						
							|  |  |  | 		name:  projection.IDPUserLinkInstanceIDCol, | 
					
						
							|  |  |  | 		table: idpUserLinkTable, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 	IDPUserLinkDisplayNameCol = Column{ | 
					
						
							|  |  |  | 		name:  projection.IDPUserLinkDisplayNameCol, | 
					
						
							|  |  |  | 		table: idpUserLinkTable, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-11-30 17:01:17 +01:00
										 |  |  | 	IDPUserLinkOwnerRemovedCol = Column{ | 
					
						
							|  |  |  | 		name:  projection.IDPUserLinkOwnerRemovedCol, | 
					
						
							|  |  |  | 		table: idpUserLinkTable, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-30 17:01:17 +01:00
										 |  |  | func (q *Queries) IDPUserLinks(ctx context.Context, queries *IDPUserLinksSearchQuery, withOwnerRemoved bool) (idps *IDPUserLinks, err error) { | 
					
						
							| 
									
										
										
										
											2022-12-01 09:18:53 +01:00
										 |  |  | 	ctx, span := tracing.NewSpan(ctx) | 
					
						
							|  |  |  | 	defer func() { span.EndWithError(err) }() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-27 22:36:43 +01:00
										 |  |  | 	query, scan := prepareIDPUserLinksQuery(ctx, q.client) | 
					
						
							| 
									
										
										
										
											2022-11-30 17:01:17 +01:00
										 |  |  | 	eq := sq.Eq{IDPUserLinkInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID()} | 
					
						
							|  |  |  | 	if !withOwnerRemoved { | 
					
						
							|  |  |  | 		eq[IDPUserLinkOwnerRemovedCol.identifier()] = false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	stmt, args, err := queries.toQuery(query).Where(eq).ToSql() | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, errors.ThrowInvalidArgument(err, "QUERY-4zzFK", "Errors.Query.InvalidRequest") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	rows, err := q.client.QueryContext(ctx, stmt, args...) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, errors.ThrowInternal(err, "QUERY-C1E4D", "Errors.Internal") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	idps, err = scan(rows) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	idps.LatestSequence, err = q.latestSequence(ctx, idpUserLinkTable) | 
					
						
							|  |  |  | 	return idps, err | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-13 08:58:14 +01:00
										 |  |  | func NewIDPUserLinkIDPIDSearchQuery(value string) (SearchQuery, error) { | 
					
						
							|  |  |  | 	return NewTextQuery(IDPUserLinkIDPIDCol, value, TextEquals) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 14:49:19 +01:00
										 |  |  | func NewIDPUserLinksUserIDSearchQuery(value string) (SearchQuery, error) { | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 	return NewTextQuery(IDPUserLinkUserIDCol, value, TextEquals) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 14:49:19 +01:00
										 |  |  | func NewIDPUserLinksResourceOwnerSearchQuery(value string) (SearchQuery, error) { | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 	return NewTextQuery(IDPUserLinkResourceOwnerCol, value, TextEquals) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-28 21:20:58 +01:00
										 |  |  | func NewIDPUserLinksExternalIDSearchQuery(value string) (SearchQuery, error) { | 
					
						
							|  |  |  | 	return NewTextQuery(IDPUserLinkExternalUserIDCol, value, TextEquals) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-27 22:36:43 +01:00
										 |  |  | func prepareIDPUserLinksQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuilder, func(*sql.Rows) (*IDPUserLinks, error)) { | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 	return sq.Select( | 
					
						
							|  |  |  | 			IDPUserLinkIDPIDCol.identifier(), | 
					
						
							|  |  |  | 			IDPUserLinkUserIDCol.identifier(), | 
					
						
							| 
									
										
										
										
											2023-02-28 21:20:58 +01:00
										 |  |  | 			IDPTemplateNameCol.identifier(), | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 			IDPUserLinkExternalUserIDCol.identifier(), | 
					
						
							|  |  |  | 			IDPUserLinkDisplayNameCol.identifier(), | 
					
						
							| 
									
										
										
										
											2023-02-28 21:20:58 +01:00
										 |  |  | 			IDPTemplateTypeCol.identifier(), | 
					
						
							| 
									
										
										
										
											2022-01-13 08:58:14 +01:00
										 |  |  | 			IDPUserLinkResourceOwnerCol.identifier(), | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 			countColumn.identifier()). | 
					
						
							|  |  |  | 			From(idpUserLinkTable.identifier()). | 
					
						
							| 
									
										
										
										
											2023-02-28 21:20:58 +01:00
										 |  |  | 			LeftJoin(join(IDPTemplateIDCol, IDPUserLinkIDPIDCol) + db.Timetravel(call.Took(ctx))). | 
					
						
							| 
									
										
										
										
											2023-02-27 22:36:43 +01:00
										 |  |  | 			PlaceholderFormat(sq.Dollar), | 
					
						
							| 
									
										
										
										
											2021-12-08 14:49:19 +01:00
										 |  |  | 		func(rows *sql.Rows) (*IDPUserLinks, error) { | 
					
						
							|  |  |  | 			idps := make([]*IDPUserLink, 0) | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 			var count uint64 | 
					
						
							|  |  |  | 			for rows.Next() { | 
					
						
							|  |  |  | 				var ( | 
					
						
							|  |  |  | 					idpName = sql.NullString{} | 
					
						
							|  |  |  | 					idpType = sql.NullInt16{} | 
					
						
							| 
									
										
										
										
											2021-12-08 14:49:19 +01:00
										 |  |  | 					idp     = new(IDPUserLink) | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 				) | 
					
						
							|  |  |  | 				err := rows.Scan( | 
					
						
							|  |  |  | 					&idp.IDPID, | 
					
						
							|  |  |  | 					&idp.UserID, | 
					
						
							|  |  |  | 					&idpName, | 
					
						
							|  |  |  | 					&idp.ProvidedUserID, | 
					
						
							|  |  |  | 					&idp.ProvidedUsername, | 
					
						
							|  |  |  | 					&idpType, | 
					
						
							| 
									
										
										
										
											2022-01-13 08:58:14 +01:00
										 |  |  | 					&idp.ResourceOwner, | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 					&count, | 
					
						
							|  |  |  | 				) | 
					
						
							|  |  |  | 				if err != nil { | 
					
						
							|  |  |  | 					return nil, err | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				idp.IDPName = idpName.String | 
					
						
							|  |  |  | 				//IDPType 0 is oidc so we have to set unspecified manually | 
					
						
							|  |  |  | 				if idpType.Valid { | 
					
						
							| 
									
										
										
										
											2023-02-28 21:20:58 +01:00
										 |  |  | 					idp.IDPType = domain.IDPType(idpType.Int16) | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2023-02-28 21:20:58 +01:00
										 |  |  | 					idp.IDPType = domain.IDPTypeUnspecified | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				idps = append(idps, idp) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if err := rows.Close(); err != nil { | 
					
						
							|  |  |  | 				return nil, errors.ThrowInternal(err, "QUERY-nwx6U", "Errors.Query.CloseRows") | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 14:49:19 +01:00
										 |  |  | 			return &IDPUserLinks{ | 
					
						
							| 
									
										
										
										
											2021-12-07 08:33:52 +01:00
										 |  |  | 				Links: idps, | 
					
						
							|  |  |  | 				SearchResponse: SearchResponse{ | 
					
						
							|  |  |  | 					Count: count, | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, nil | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | } |