diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserRepository.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserRepository.java index 8f94b2eecbb..99658bf4822 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserRepository.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserRepository.java @@ -13,17 +13,22 @@ package org.openmetadata.catalog.jdbi3; +import static org.openmetadata.catalog.Entity.TEAM; import static org.openmetadata.common.utils.CommonUtil.listOrEmpty; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; +import javax.ws.rs.core.UriInfo; import lombok.extern.slf4j.Slf4j; import org.openmetadata.catalog.Entity; +import org.openmetadata.catalog.api.teams.CreateTeam.TeamType; import org.openmetadata.catalog.entity.teams.AuthenticationMechanism; import org.openmetadata.catalog.entity.teams.Team; import org.openmetadata.catalog.entity.teams.User; @@ -191,6 +196,35 @@ public class UserRepository extends EntityRepository { return validatedRoles; } + private List getTeamChildren(UUID teamId) throws IOException { + if (teamId.equals(organization.getId())) { // For organization all the parentless teams are children + List children = daoCollection.teamDAO().listTeamsUnderOrganization(teamId.toString()); + return EntityUtil.populateEntityReferencesById(children, Entity.TEAM); + } + List children = findTo(teamId, TEAM, Relationship.PARENT_OF, TEAM); + return EntityUtil.populateEntityReferences(children, TEAM); + } + + public List getGroupTeams(UriInfo uriInfo, String userName) throws IOException { + User user = getByName(uriInfo, userName, Fields.EMPTY_FIELDS, Include.ALL); + List teams = getTeams(user); + return getGroupTeams(teams); + } + + private List getGroupTeams(List teams) throws IOException { + Set result = new HashSet<>(); + for (EntityReference t : teams) { + Team team = Entity.getEntity(t, Fields.EMPTY_FIELDS, Include.ALL); + if (TeamType.GROUP.equals(team.getTeamType())) { + result.add(t); + } else { + List children = getTeamChildren(team.getId()); + result.addAll(getGroupTeams(children)); + } + } + return new ArrayList<>(result); + } + /* Get all the roles that user has been assigned and inherited from the team to User entity */ private List getRoles(User user) throws IOException { List roleIds = findTo(user.getId(), Entity.USER, Relationship.HAS, Entity.ROLE); diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/teams/UserResource.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/teams/UserResource.java index b3380c02040..047c15f9db0 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/teams/UserResource.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/teams/UserResource.java @@ -18,6 +18,7 @@ import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.ExternalDocumentation; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.media.Schema; @@ -65,6 +66,7 @@ import org.openmetadata.catalog.teams.authn.GenerateTokenRequest; import org.openmetadata.catalog.teams.authn.JWTAuthMechanism; import org.openmetadata.catalog.teams.authn.JWTTokenExpiry; import org.openmetadata.catalog.type.EntityHistory; +import org.openmetadata.catalog.type.EntityReference; import org.openmetadata.catalog.type.Include; import org.openmetadata.catalog.type.MetadataOperation; import org.openmetadata.catalog.util.EntityUtil; @@ -292,6 +294,30 @@ public class UserResource extends EntityResource { return addHref(uriInfo, user); } + @GET + @Valid + @Path("/loggedInUser/groupTeams") + @Operation( + operationId = "getCurrentLoggedInUserGroupTeams", + summary = "Get group type of teams for current logged in user", + tags = "users", + description = "Get the group type of teams of user who is authenticated and is currently logged in.", + responses = { + @ApiResponse( + responseCode = "200", + description = "The teams of type 'Group' that a user belongs to", + content = + @Content( + mediaType = "application/json", + array = @ArraySchema(schema = @Schema(implementation = EntityReference.class)))), + @ApiResponse(responseCode = "404", description = "User not found") + }) + public List getCurrentLoggedInUser( + @Context UriInfo uriInfo, @Context SecurityContext securityContext) throws IOException { + String currentUserName = securityContext.getUserPrincipal().getName(); + return dao.getGroupTeams(uriInfo, currentUserName); + } + @GET @Path("/{id}/versions/{version}") @Operation(