From a919367a2be02880ca051bcb331e76697a78f117 Mon Sep 17 00:00:00 2001 From: sureshms Date: Thu, 21 Oct 2021 18:11:05 -0700 Subject: [PATCH] User entity migrated to jdbi3 --- .../catalog/CatalogApplication.java | 6 +- .../catalog/CatalogHealthCheck.java | 16 +- .../openmetadata/catalog/jdbi3/UserDAO3.java | 19 ++ .../catalog/jdbi3/UserRepository3.java | 60 ++++++ ...ository.java => UserRepositoryHelper.java} | 181 +++++++----------- .../catalog/resources/CollectionRegistry.java | 10 + .../catalog/resources/teams/UserResource.java | 10 +- .../catalog/security/CatalogAuthorizer.java | 4 +- .../security/DefaultCatalogAuthorizer.java | 24 +-- .../catalog/security/NoopAuthorizer.java | 4 +- .../resources/teams/UserResourceTest.java | 4 +- 11 files changed, 194 insertions(+), 144 deletions(-) create mode 100644 catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserRepository3.java rename catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/{UserRepository.java => UserRepositoryHelper.java} (68%) diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/CatalogApplication.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/CatalogApplication.java index 7781ffa09cc..57c752cd6bf 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/CatalogApplication.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/CatalogApplication.java @@ -85,7 +85,7 @@ public class CatalogApplication extends Application { // Register Authorizer - registerAuthorizer(catalogConfig, environment, jdbi); + registerAuthorizer(catalogConfig, environment, jdbi3); // Registering config api environment.jersey().register(new ConfigResource(catalogConfig)); @@ -104,7 +104,7 @@ public class CatalogApplication extends Application { environment.jersey().register(new JsonProcessingExceptionMapper(true)); environment.jersey().register(new EarlyEofExceptionMapper()); environment.jersey().register(JsonMappingExceptionMapper.class); - environment.healthChecks().register("UserDatabaseCheck", new CatalogHealthCheck(catalogConfig, jdbi)); + environment.healthChecks().register("UserDatabaseCheck", new CatalogHealthCheck(catalogConfig, jdbi3)); registerResources(catalogConfig, environment, jdbi); registerResources(catalogConfig, environment, jdbi3); @@ -132,7 +132,7 @@ public class CatalogApplication extends Application { super.initialize(bootstrap); } - private void registerAuthorizer(CatalogApplicationConfig catalogConfig, Environment environment, DBI jdbi) + private void registerAuthorizer(CatalogApplicationConfig catalogConfig, Environment environment, Jdbi jdbi) throws NoSuchMethodException, ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException { AuthorizerConfiguration authorizerConf = catalogConfig.getAuthorizerConfiguration(); diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/CatalogHealthCheck.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/CatalogHealthCheck.java index b3b6231becf..0457b2932fb 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/CatalogHealthCheck.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/CatalogHealthCheck.java @@ -17,29 +17,29 @@ package org.openmetadata.catalog; import com.codahale.metrics.health.HealthCheck; -import org.openmetadata.catalog.entity.teams.User; -import org.openmetadata.catalog.jdbi3.UserRepository; +import org.jdbi.v3.core.Jdbi; +import org.openmetadata.catalog.jdbi3.UserRepository3; +import org.openmetadata.catalog.jdbi3.UserRepositoryHelper; import org.openmetadata.catalog.util.EntityUtil; -import org.openmetadata.catalog.util.ResultList; -import org.skife.jdbi.v2.DBI; import java.io.IOException; import static org.openmetadata.catalog.resources.teams.UserResource.FIELD_LIST; public class CatalogHealthCheck extends HealthCheck { - private final UserRepository userRepository; + private final UserRepositoryHelper userRepositoryHelper; private final EntityUtil.Fields fields = new EntityUtil.Fields(FIELD_LIST, "profile"); - public CatalogHealthCheck(CatalogApplicationConfig config, DBI jdbi) { + public CatalogHealthCheck(CatalogApplicationConfig config, Jdbi jdbi) { super(); - this.userRepository = jdbi.onDemand(UserRepository.class); + UserRepository3 repo = jdbi.onDemand(UserRepository3.class); + this.userRepositoryHelper = new UserRepositoryHelper(repo); } @Override protected Result check() throws Exception { try { - ResultList users = userRepository.listAfter(fields, 1, ""); + userRepositoryHelper.listAfter(fields, 1, ""); return Result.healthy(); } catch (IOException e) { return Result.unhealthy(e.getMessage()); diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserDAO3.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserDAO3.java index 8c1acb2c644..1b0f2a596e6 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserDAO3.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserDAO3.java @@ -26,4 +26,23 @@ public interface UserDAO3 extends EntityDAO { @Override @SqlQuery("SELECT count(*) FROM ") int listCount(@Define("table") String table); + + @SqlQuery( + "SELECT json FROM (" + + "SELECT name, json FROM user_entity WHERE " + + "name < :before " + // Pagination by user name + "ORDER BY name DESC " + // Pagination ordering by user name + "LIMIT :limit" + + ") last_rows_subquery ORDER BY name") + List listBefore(@org.skife.jdbi.v2.sqlobject.Bind("limit") int limit, @org.skife.jdbi.v2.sqlobject.Bind("before") String before); + + @SqlQuery("SELECT json FROM user_entity WHERE " + + "name > :after " + // Pagination by user name + "ORDER BY name " + // Pagination ordering by user name + "LIMIT :limit") + List listAfter(@org.skife.jdbi.v2.sqlobject.Bind("limit") int limit, @org.skife.jdbi.v2.sqlobject.Bind("after") String after); + + @SqlQuery("SELECT count(*) FROM user_entity") + int listCount(); + } diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserRepository3.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserRepository3.java new file mode 100644 index 00000000000..3de53c2d287 --- /dev/null +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserRepository3.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openmetadata.catalog.jdbi3; + +import org.jdbi.v3.sqlobject.CreateSqlObject; + +public interface UserRepository3 { + @CreateSqlObject + UserDAO3 userDAO(); + + @CreateSqlObject + EntityRelationshipDAO3 relationshipDAO(); + + @CreateSqlObject + TeamDAO3 teamDAO(); + + @CreateSqlObject + TableDAO3 tableDAO(); + + @CreateSqlObject + DatabaseDAO3 databaseDAO(); + + @CreateSqlObject + MetricsDAO3 metricsDAO(); + + @CreateSqlObject + DashboardDAO3 dashboardDAO(); + + @CreateSqlObject + ReportDAO3 reportDAO(); + + @CreateSqlObject + TopicDAO3 topicDAO(); + + @CreateSqlObject + ChartDAO3 chartDAO(); + + @CreateSqlObject + TaskDAO3 taskDAO(); + + @CreateSqlObject + PipelineDAO3 pipelineDAO(); + + @CreateSqlObject + ModelDAO3 modelDAO(); +} 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/UserRepositoryHelper.java similarity index 68% rename from catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserRepository.java rename to catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/UserRepositoryHelper.java index a9bdeb3941e..8332f9fa248 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/UserRepositoryHelper.java @@ -25,14 +25,13 @@ import org.openmetadata.catalog.resources.teams.UserResource.UserList; import org.openmetadata.catalog.type.EntityReference; import org.openmetadata.catalog.type.TagLabel; import org.openmetadata.catalog.util.EntityInterface; -import org.openmetadata.catalog.util.EntityUpdater; +import org.openmetadata.catalog.util.EntityUpdater3; import org.openmetadata.catalog.util.EntityUtil; import org.openmetadata.catalog.util.EntityUtil.Fields; import org.openmetadata.catalog.util.JsonUtils; import org.openmetadata.catalog.util.RestUtil; import org.openmetadata.catalog.util.RestUtil.PutResponse; import org.openmetadata.catalog.util.ResultList; -import org.skife.jdbi.v2.sqlobject.CreateSqlObject; import org.skife.jdbi.v2.sqlobject.Transaction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,11 +54,15 @@ import static org.openmetadata.catalog.jdbi3.Relationship.CONTAINS; import static org.openmetadata.catalog.jdbi3.Relationship.FOLLOWS; import static org.openmetadata.catalog.jdbi3.Relationship.OWNS; -public abstract class UserRepository { - public static final Logger LOG = LoggerFactory.getLogger(UserRepository.class); +public class UserRepositoryHelper implements EntityRepository { + public static final Logger LOG = LoggerFactory.getLogger(UserRepositoryHelper.class); static final Fields USER_PATCH_FIELDS = new Fields(UserResource.FIELD_LIST, "profile,teams"); static final Fields USER_UPDATE_FIELDS = new Fields(UserResource.FIELD_LIST, "profile,teams"); + public UserRepositoryHelper(UserRepository3 repo3) { this.repo3 = repo3; } + + private final UserRepository3 repo3; + public static List toEntityReference(List teams) { if (teams == null) { return null; @@ -71,87 +74,22 @@ public abstract class UserRepository { return refList; } - @CreateSqlObject - abstract UserDAO userDAO(); - - @CreateSqlObject - abstract EntityRelationshipDAO relationshipDAO(); - - @CreateSqlObject - abstract TeamDAO teamDAO(); - - @CreateSqlObject - abstract TableDAO tableDAO(); - - @CreateSqlObject - abstract DatabaseDAO databaseDAO(); - - @CreateSqlObject - abstract MetricsDAO metricsDAO(); - - @CreateSqlObject - abstract DashboardDAO dashboardDAO(); - - @CreateSqlObject - abstract ReportDAO reportDAO(); - - @CreateSqlObject - abstract TopicDAO topicDAO(); - - @CreateSqlObject - abstract ChartDAO chartDAO(); - - @CreateSqlObject - abstract TaskDAO taskDAO(); - - @CreateSqlObject - abstract PipelineDAO pipelineDAO(); - - @CreateSqlObject - abstract ModelDAO modelDAO(); - - EntityRepository entityRepository = new EntityRepository() { - @Override - public List listAfter(String fqnPrefix, int limitParam, String after) { - return UserRepository.this.userDAO().listAfter(limitParam, after); - } - - @Override - public List listBefore(String fqnPrefix, int limitParam, String before) { - return UserRepository.this.userDAO().listBefore(limitParam, before); - } - - @Override - public int listCount(String fqnPrefix) { - return UserRepository.this.userDAO().listCount(); - } - - @Override - public String getFullyQualifiedName(User entity) { - // User does not have a FullyQualifiedName but needs a valid field to paginate - return entity.getName(); - } - - @Override - public User setFields(User entity, Fields fields) throws IOException, ParseException { - return UserRepository.this.setFields(entity, fields); - } - - @Override - public ResultList getResultList(List entities, String beforeCursor, String afterCursor, - int total) throws GeneralSecurityException, UnsupportedEncodingException { - return new UserList(entities, beforeCursor, afterCursor, total); - } - }; - - @Transaction - public ResultList listAfter(Fields fields, int limitParam, String after) throws IOException, GeneralSecurityException, ParseException { - return EntityUtil.listAfter(entityRepository, User.class, fields, null, limitParam, after); + @Override + public ResultList getResultList(List entities, String beforeCursor, String afterCursor, + int total) throws GeneralSecurityException, UnsupportedEncodingException { + return new UserList(entities, beforeCursor, afterCursor, total); } @Transaction - public ResultList listBefore(Fields fields, int limitParam, String before) throws IOException, GeneralSecurityException, ParseException { - return EntityUtil.listBefore(entityRepository, User.class, fields, null, limitParam, before); + public ResultList listAfter(Fields fields, int limitParam, String after) throws IOException, + GeneralSecurityException, ParseException { + return EntityUtil.listAfter(this, User.class, fields, null, limitParam, after); + } + + @Transaction + public ResultList listBefore(Fields fields, int limitParam, String before) throws IOException, + GeneralSecurityException, ParseException { + return EntityUtil.listBefore(this, User.class, fields, null, limitParam, before); } @Transaction @@ -167,13 +105,13 @@ public abstract class UserRepository { @Transaction public User getByName(String name, Fields fields) throws IOException { - User user = EntityUtil.validate(name, userDAO().findByName(name), User.class); + User user = repo3.userDAO().findEntityByName(name); return setFields(user, fields); } @Transaction public User getByEmail(String email, Fields fields) throws IOException { - User user = EntityUtil.validate(email, userDAO().findByEmail(email), User.class); + User user = EntityUtil.validate(email, repo3.userDAO().findByEmail(email), User.class); return setFields(user, fields); } @@ -189,15 +127,15 @@ public abstract class UserRepository { User user = markUserAsDeactivated(id); // Remove relationship membership to teams - relationshipDAO().deleteTo(user.getId().toString(), CONTAINS.ordinal(), "team"); + repo3.relationshipDAO().deleteTo(user.getId().toString(), CONTAINS.ordinal(), "team"); // Remove follows relationship to entities - relationshipDAO().deleteFrom(id, FOLLOWS.ordinal()); + repo3.relationshipDAO().deleteFrom(id, FOLLOWS.ordinal()); } @Transaction public RestUtil.PutResponse createOrUpdate(User updated) throws IOException { - User stored = JsonUtils.readValue(userDAO().findByName(updated.getName()), User.class); + User stored = JsonUtils.readValue(repo3.userDAO().findJsonByFqn(updated.getName()), User.class); // TODO why are we doing this? List teamIds = new ArrayList<>(); @@ -243,12 +181,33 @@ public abstract class UserRepository { // Patch can't make changes to following fields. Ignore the changes updated.withName(original.getName()).withId(original.getId()); validateRelationships(updated, teamIds); - UserRepository.UserUpdater userUpdater = new UserRepository.UserUpdater(original, updated, true); + UserRepositoryHelper.UserUpdater userUpdater = new UserRepositoryHelper.UserUpdater(original, updated, true); userUpdater.updateAll(); userUpdater.store(); } - private User setFields(User user, Fields fields) throws IOException { + @Override + public List listAfter(String fqnPrefix, int limitParam, String after) { + return null; + } + + @Override + public List listBefore(String fqnPrefix, int limitParam, String before) { + return null; + } + + @Override + public int listCount(String fqnPrefix) { + return 0; + } + + @Override + public String getFullyQualifiedName(User entity) { + return null; + } + + @Override + public User setFields(User user, Fields fields) throws IOException { user.setProfile(fields.contains("profile") ? user.getProfile() : null); user.setTeams(fields.contains("teams") ? getTeams(user) : null); user.setOwns(fields.contains("owns") ? getOwns(user) : null); @@ -258,26 +217,26 @@ public abstract class UserRepository { private List getOwns(User user) throws IOException { // Compile entities owned by the user - List ownedEntities = relationshipDAO().findTo(user.getId().toString(), OWNS.ordinal()); + List ownedEntities = repo3.relationshipDAO().findTo(user.getId().toString(), OWNS.ordinal()); // Compile entities owned by the team the user belongs to List teams = user.getTeams() == null ? getTeams(user) : user.getTeams(); for (EntityReference team : teams) { - ownedEntities.addAll(relationshipDAO().findTo(team.getId().toString(), OWNS.ordinal())); + ownedEntities.addAll(repo3.relationshipDAO().findTo(team.getId().toString(), OWNS.ordinal())); } // Populate details in entity reference - return EntityUtil.getEntityReference(ownedEntities, tableDAO(), databaseDAO(), metricsDAO(), dashboardDAO(), - reportDAO(), topicDAO(), chartDAO(), taskDAO(), modelDAO(), pipelineDAO()); + return EntityUtil.getEntityReference(ownedEntities, repo3.tableDAO(), repo3.databaseDAO(), repo3.metricsDAO(), repo3.dashboardDAO(), + repo3.reportDAO(), repo3.topicDAO(), repo3.chartDAO(), repo3.taskDAO(), repo3.modelDAO(), repo3.pipelineDAO()); } private List getFollows(User user) throws IOException { - return EntityUtil.getEntityReference(relationshipDAO().findTo(user.getId().toString(), FOLLOWS.ordinal()), - tableDAO(), databaseDAO(), metricsDAO(), dashboardDAO(), reportDAO(), topicDAO(), chartDAO(), taskDAO(), - modelDAO(), pipelineDAO()); + return EntityUtil.getEntityReference(repo3.relationshipDAO().findTo(user.getId().toString(), FOLLOWS.ordinal()), + repo3.tableDAO(), repo3.databaseDAO(), repo3.metricsDAO(), repo3.dashboardDAO(), repo3.reportDAO(), + repo3.topicDAO(), repo3.chartDAO(), repo3.taskDAO(), repo3.modelDAO(), repo3.pipelineDAO()); } private User validateUser(String userId) throws IOException { - return EntityUtil.validate(userId, userDAO().findById(userId), User.class); + return repo3.userDAO().findEntityById(userId); } private User createInternal(User user) throws IOException { @@ -302,9 +261,9 @@ public abstract class UserRepository { user.withTeams(null).withHref(null); if (update) { - userDAO().update(user.getId().toString(), JsonUtils.pojoToJson(user)); + repo3.userDAO().update(user.getId().toString(), JsonUtils.pojoToJson(user)); } else { - userDAO().insert(JsonUtils.pojoToJson(user)); + repo3.userDAO().insert(JsonUtils.pojoToJson(user)); } // Restore the relationships @@ -317,19 +276,18 @@ public abstract class UserRepository { } List validatedTeams = new ArrayList<>(); for (UUID teamId : teamIds) { - validatedTeams.add(EntityUtil.getEntityReference( - EntityUtil.validate(teamId.toString(), teamDAO().findById(teamId.toString()), Team.class))); + validatedTeams.add(EntityUtil.getEntityReference(repo3.teamDAO().findEntityById(teamId.toString()))); } return validatedTeams; } /* Add all the teams that user belongs to to User entity */ private List getTeams(User user) throws IOException { - List teamIds = relationshipDAO().findFrom(user.getId().toString(), CONTAINS.ordinal(), "team"); + List teamIds = repo3.relationshipDAO().findFrom(user.getId().toString(), CONTAINS.ordinal(), "team"); List teams = new ArrayList<>(); for (String teamId : teamIds) { LOG.debug("Adding team {}", teamId); - String json = teamDAO().findById(teamId); + String json = repo3.teamDAO().findJsonById(teamId); Team team = JsonUtils.readValue(json, Team.class); if (team != null) { teams.add(team); @@ -341,7 +299,7 @@ public abstract class UserRepository { private void assignTeams(User user, List teams) { // Query - add team to the user for (EntityReference team : teams) { - relationshipDAO().insert(team.getId().toString(), user.getId().toString(), + repo3.relationshipDAO().insert(team.getId().toString(), user.getId().toString(), "team", "user", CONTAINS.ordinal()); } } @@ -353,9 +311,9 @@ public abstract class UserRepository { return user; } user.setDeactivated(true); - user.setName("deactivated." +user.getName()); - user.setDisplayName("Deactivated " +user.getDisplayName()); - userDAO().update(id, JsonUtils.pojoToJson(user)); + user.setName("deactivated." + user.getName()); + user.setDisplayName("Deactivated " + user.getDisplayName()); + repo3.userDAO().update(id, JsonUtils.pojoToJson(user)); return user; } @@ -403,13 +361,13 @@ public abstract class UserRepository { /** * Handles entity updated from PUT and POST operation. */ - public class UserUpdater extends EntityUpdater { + public class UserUpdater extends EntityUpdater3 { final User orig; final User updated; public UserUpdater(User orig, User updated, boolean patchOperation) { - super(new UserRepository.UserEntityInterface(orig), new UserRepository.UserEntityInterface(updated), - patchOperation, relationshipDAO(), null); + super(new UserRepositoryHelper.UserEntityInterface(orig), new UserRepositoryHelper.UserEntityInterface(updated), + patchOperation, repo3.relationshipDAO(), null); this.orig = orig; this.updated = updated; } @@ -425,11 +383,12 @@ public abstract class UserRepository { public void updateTeams() { // Remove teams from original and add teams from updated - relationshipDAO().deleteTo(orig.getId().toString(), CONTAINS.ordinal(), "team"); + repo3.relationshipDAO().deleteTo(orig.getId().toString(), CONTAINS.ordinal(), "team"); if (!updated.getTeams().isEmpty()) { assignTeams(updated, updated.getTeams()); } } + public void store() throws IOException { updated.setVersion(getNewVersion(orig.getVersion())); storeUser(updated, true); diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/CollectionRegistry.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/CollectionRegistry.java index 4c4f2fb28fd..0d715af4a5d 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/CollectionRegistry.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/CollectionRegistry.java @@ -51,6 +51,8 @@ import org.openmetadata.catalog.jdbi3.TeamRepository3; import org.openmetadata.catalog.jdbi3.TeamRepositoryHelper; import org.openmetadata.catalog.jdbi3.TopicRepository3; import org.openmetadata.catalog.jdbi3.TopicRepositoryHelper; +import org.openmetadata.catalog.jdbi3.UserRepository3; +import org.openmetadata.catalog.jdbi3.UserRepositoryHelper; import org.openmetadata.catalog.resources.bots.BotsResource; import org.openmetadata.catalog.resources.charts.ChartResource; import org.openmetadata.catalog.resources.dashboards.DashboardResource; @@ -66,6 +68,7 @@ import org.openmetadata.catalog.resources.services.messaging.MessagingServiceRes import org.openmetadata.catalog.resources.services.pipeline.PipelineServiceResource; import org.openmetadata.catalog.resources.tasks.TaskResource; import org.openmetadata.catalog.resources.teams.TeamResource; +import org.openmetadata.catalog.resources.teams.UserResource; import org.openmetadata.catalog.resources.topics.TopicResource; import org.openmetadata.catalog.type.CollectionDescriptor; import org.openmetadata.catalog.type.CollectionInfo; @@ -319,6 +322,13 @@ public final class CollectionRegistry { environment.jersey().register(teamResource); LOG.info("Registering {}", teamResource); + final UserRepository3 userRepository3 = jdbi.onDemand(UserRepository3.class); + UserRepositoryHelper userRepositoryHelper = new UserRepositoryHelper(userRepository3); + UserResource userResource = new UserResource(userRepositoryHelper, + authorizer); + environment.jersey().register(userResource); + LOG.info("Registering {}", userResource); + LOG.info("Initialized jdbi3"); } 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 01d423f0e66..ffe04ef30c4 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 @@ -29,7 +29,7 @@ import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.responses.ApiResponse; import org.openmetadata.catalog.api.teams.CreateUser; import org.openmetadata.catalog.entity.teams.User; -import org.openmetadata.catalog.jdbi3.UserRepository; +import org.openmetadata.catalog.jdbi3.UserRepositoryHelper; import org.openmetadata.catalog.resources.Collection; import org.openmetadata.catalog.security.CatalogAuthorizer; import org.openmetadata.catalog.security.SecurityUtil; @@ -76,11 +76,11 @@ import java.util.UUID; @Api(value = "User collection", tags = "User collection") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) -@Collection(name = "users", repositoryClass = "org.openmetadata.catalog.jdbi3.UserRepository") +//@Collection(name = "users", repositoryClass = "org.openmetadata.catalog.jdbi3.UserRepositoryHelper") public class UserResource { public static final Logger LOG = LoggerFactory.getLogger(UserResource.class); public static final String USER_COLLECTION_PATH = "v1/users/"; - private final UserRepository dao; + private final UserRepositoryHelper dao; private final CatalogAuthorizer authorizer; public static void addHref(UriInfo uriInfo, EntityReference user) { @@ -96,8 +96,8 @@ public class UserResource { } @Inject - public UserResource(UserRepository dao, CatalogAuthorizer authorizer) { - Objects.requireNonNull(dao, "UserRepository must not be null"); + public UserResource(UserRepositoryHelper dao, CatalogAuthorizer authorizer) { + Objects.requireNonNull(dao, "UserRepositoryHelper must not be null"); this.dao = dao; this.authorizer = authorizer; } diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/security/CatalogAuthorizer.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/security/CatalogAuthorizer.java index 57a3284e7cb..f55bbdccac4 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/security/CatalogAuthorizer.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/security/CatalogAuthorizer.java @@ -16,15 +16,15 @@ package org.openmetadata.catalog.security; +import org.jdbi.v3.core.Jdbi; import org.openmetadata.catalog.type.EntityReference; -import org.skife.jdbi.v2.DBI; public interface CatalogAuthorizer { /** * Initialize the authorizer */ - void init(AuthorizerConfiguration config, DBI jdbi); + void init(AuthorizerConfiguration config, Jdbi jdbi); /** * Check if the authenticated user has given permission on the target entity diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/security/DefaultCatalogAuthorizer.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/security/DefaultCatalogAuthorizer.java index fab967f66be..4981e84753f 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/security/DefaultCatalogAuthorizer.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/security/DefaultCatalogAuthorizer.java @@ -17,14 +17,15 @@ package org.openmetadata.catalog.security; import org.apache.commons.lang3.exception.ExceptionUtils; +import org.jdbi.v3.core.Jdbi; import org.openmetadata.catalog.Entity; import org.openmetadata.catalog.entity.teams.User; import org.openmetadata.catalog.exception.DuplicateEntityException; import org.openmetadata.catalog.exception.EntityNotFoundException; -import org.openmetadata.catalog.jdbi3.UserRepository; +import org.openmetadata.catalog.jdbi3.UserRepository3; +import org.openmetadata.catalog.jdbi3.UserRepositoryHelper; import org.openmetadata.catalog.type.EntityReference; import org.openmetadata.catalog.util.EntityUtil; -import org.skife.jdbi.v2.DBI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,18 +44,19 @@ public class DefaultCatalogAuthorizer implements CatalogAuthorizer { private Set botUsers; private String principalDomain; - private UserRepository userRepository; + private UserRepositoryHelper userRepositoryHelper; private final String fieldsParam = "teams"; @Override - public void init(AuthorizerConfiguration config, DBI dbi) { + public void init(AuthorizerConfiguration config, Jdbi dbi) { LOG.debug("Initializing DefaultCatalogAuthorizer with config {}", config); this.adminUsers = new HashSet<>(config.getAdminPrincipals()); this.botUsers = new HashSet<>(config.getBotPrincipals()); this.principalDomain = config.getPrincipalDomain(); LOG.debug("Admin users: {}", adminUsers); - this.userRepository = dbi.onDemand(UserRepository.class); + UserRepository3 repo = dbi.onDemand(UserRepository3.class); + this.userRepositoryHelper = new UserRepositoryHelper(repo); mayBeAddAdminUsers(); mayBeAddBotUsers(); } @@ -65,7 +67,7 @@ public class DefaultCatalogAuthorizer implements CatalogAuthorizer { adminUsers.stream() .filter(name -> { try { - User user = userRepository.getByName(name, fields); + User user = userRepositoryHelper.getByName(name, fields); if (user != null) { LOG.debug("Entry for user '{}' already exists", name); return false; @@ -84,7 +86,7 @@ public class DefaultCatalogAuthorizer implements CatalogAuthorizer { botUsers.stream() .filter(name -> { try { - User user = userRepository.getByName(name, fields); + User user = userRepositoryHelper.getByName(name, fields); if (user != null) { LOG.debug("Entry for user '{}' already exists", name); return false; @@ -108,7 +110,7 @@ public class DefaultCatalogAuthorizer implements CatalogAuthorizer { String userName = SecurityUtil.getUserName(ctx); EntityUtil.Fields fields = new EntityUtil.Fields(FIELD_LIST, fieldsParam); try { - User user = userRepository.getByName(userName, fields); + User user = userRepositoryHelper.getByName(userName, fields); if (owner.getType().equals(Entity.TEAM)) { for (EntityReference team: user.getTeams()) { if (team.getName().equals(owner.getName())) { @@ -130,7 +132,7 @@ public class DefaultCatalogAuthorizer implements CatalogAuthorizer { String userName = SecurityUtil.getUserName(ctx); EntityUtil.Fields fields = new EntityUtil.Fields(FIELD_LIST, fieldsParam); try { - User user = userRepository.getByName(userName, fields); + User user = userRepositoryHelper.getByName(userName, fields); if (user.getIsAdmin() == null) { return false; } @@ -146,7 +148,7 @@ public class DefaultCatalogAuthorizer implements CatalogAuthorizer { String userName = SecurityUtil.getUserName(ctx); EntityUtil.Fields fields = new EntityUtil.Fields(FIELD_LIST, fieldsParam); try { - User user = userRepository.getByName(userName, fields); + User user = userRepositoryHelper.getByName(userName, fields); if (user.getIsBot() == null) { return false; } @@ -171,7 +173,7 @@ public class DefaultCatalogAuthorizer implements CatalogAuthorizer { .withUpdatedAt(new Date()); try { - User addedUser = userRepository.create(user, null); + User addedUser = userRepositoryHelper.create(user, null); LOG.debug("Added bot user entry: {}", addedUser); } catch (DuplicateEntityException | IOException exception) { // In HA setup the other server may have already added the user. diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/security/NoopAuthorizer.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/security/NoopAuthorizer.java index 48b049624c4..5ed1bddfdfa 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/security/NoopAuthorizer.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/security/NoopAuthorizer.java @@ -16,8 +16,8 @@ package org.openmetadata.catalog.security; +import org.jdbi.v3.core.Jdbi; import org.openmetadata.catalog.type.EntityReference; -import org.skife.jdbi.v2.DBI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,7 +26,7 @@ public class NoopAuthorizer implements CatalogAuthorizer { @Override - public void init(AuthorizerConfiguration config, DBI jdbi) { + public void init(AuthorizerConfiguration config, Jdbi jdbi) { } @Override diff --git a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/teams/UserResourceTest.java b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/teams/UserResourceTest.java index ba5dfae4f12..cdfbd5fb635 100644 --- a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/teams/UserResourceTest.java +++ b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/teams/UserResourceTest.java @@ -26,7 +26,7 @@ import org.openmetadata.catalog.entity.data.Table; import org.openmetadata.catalog.entity.teams.Team; import org.openmetadata.catalog.entity.teams.User; import org.openmetadata.catalog.exception.CatalogExceptionMessage; -import org.openmetadata.catalog.jdbi3.UserRepository; +import org.openmetadata.catalog.jdbi3.UserRepositoryHelper; import org.openmetadata.catalog.resources.databases.TableResourceTest; import org.openmetadata.catalog.resources.teams.UserResource.UserList; import org.openmetadata.catalog.type.EntityReference; @@ -507,7 +507,7 @@ public class UserResourceTest extends CatalogApplicationTest { // Update the user attributes before.setDisplayName(displayName); - before.setTeams(UserRepository.toEntityReference(teams)); + before.setTeams(UserRepositoryHelper.toEntityReference(teams)); before.setProfile(profile); before.setTimezone(timezone); before.setIsBot(isBot);