From 0d5af9736727386bb2d7e441cb13395855a693cf Mon Sep 17 00:00:00 2001 From: Teryk Bellahsene Date: Wed, 22 Mar 2017 18:04:57 +0100 Subject: [PATCH] SONAR-8980 Reindex user when creating an organization (personal or not) --- .../organization/OrganizationCreation.java | 2 +- .../OrganizationCreationImpl.java | 13 +++-- .../server/organization/ws/CreateAction.java | 4 +- .../OrganizationCreationImplTest.java | 50 ++++++++++++++----- .../organization/ws/CreateActionTest.java | 27 ++++++++-- 5 files changed, 74 insertions(+), 22 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationCreation.java b/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationCreation.java index 72ed9b83392..50904435bbc 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationCreation.java +++ b/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationCreation.java @@ -69,7 +69,7 @@ public interface OrganizationCreation { * @throws KeyConflictException if an organization with the specified key already exists * @throws IllegalArgumentException if any field of {@code newOrganization} is invalid according to {@link OrganizationValidation} */ - OrganizationDto create(DbSession dbSession, int createUserId, NewOrganization newOrganization) throws KeyConflictException; + OrganizationDto create(DbSession dbSession, UserDto userCreator, NewOrganization newOrganization) throws KeyConflictException; /** * Create a new guarded organization which details are based on the login of the specified User. diff --git a/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationCreationImpl.java b/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationCreationImpl.java index 4f98271112e..211141d711e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationCreationImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationCreationImpl.java @@ -51,6 +51,7 @@ import org.sonar.server.qualityprofile.DefinedQProfile; import org.sonar.server.qualityprofile.DefinedQProfileCreation; import org.sonar.server.qualityprofile.DefinedQProfileRepository; import org.sonar.server.qualityprofile.index.ActiveRuleIndexer; +import org.sonar.server.user.index.UserIndexer; import static com.google.common.base.Preconditions.checkState; import static java.lang.String.format; @@ -68,22 +69,24 @@ public class OrganizationCreationImpl implements OrganizationCreation { private final DefinedQProfileRepository definedQProfileRepository; private final DefinedQProfileCreation definedQProfileCreation; private final ActiveRuleIndexer activeRuleIndexer; + private final UserIndexer userIndexer; public OrganizationCreationImpl(DbClient dbClient, System2 system2, UuidFactory uuidFactory, - OrganizationValidation organizationValidation, Settings settings, + OrganizationValidation organizationValidation, Settings settings, UserIndexer userIndexer, DefinedQProfileRepository definedQProfileRepository, DefinedQProfileCreation definedQProfileCreation, ActiveRuleIndexer activeRuleIndexer) { this.dbClient = dbClient; this.system2 = system2; this.uuidFactory = uuidFactory; this.organizationValidation = organizationValidation; this.settings = settings; + this.userIndexer = userIndexer; this.definedQProfileRepository = definedQProfileRepository; this.definedQProfileCreation = definedQProfileCreation; this.activeRuleIndexer = activeRuleIndexer; } @Override - public OrganizationDto create(DbSession dbSession, int creatorUserId, NewOrganization newOrganization) throws KeyConflictException { + public OrganizationDto create(DbSession dbSession, UserDto userCreator, NewOrganization newOrganization) throws KeyConflictException { validate(newOrganization); String key = newOrganization.getKey(); if (organizationKeyIsUsed(dbSession, key)) { @@ -92,15 +95,16 @@ public class OrganizationCreationImpl implements OrganizationCreation { OrganizationDto organization = insertOrganization(dbSession, newOrganization, dto -> { }); - insertOrganizationMember(dbSession, organization, creatorUserId); + insertOrganizationMember(dbSession, organization, userCreator.getId()); GroupDto group = insertOwnersGroup(dbSession, organization); insertDefaultTemplate(dbSession, organization, group); List activeRuleChanges = insertQualityProfiles(dbSession, organization); - addCurrentUserToGroup(dbSession, group, creatorUserId); + addCurrentUserToGroup(dbSession, group, userCreator.getId()); dbSession.commit(); // Elasticsearch is updated when DB session is committed + userIndexer.index(userCreator.getLogin()); activeRuleIndexer.index(activeRuleChanges); return organization; @@ -135,6 +139,7 @@ public class OrganizationCreationImpl implements OrganizationCreation { // Elasticsearch is updated when DB session is committed activeRuleIndexer.index(activeRuleChanges); + userIndexer.index(newUser.getLogin()); return Optional.of(organization); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/CreateAction.java b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/CreateAction.java index 50b29c717e4..f7c02a5edc5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/CreateAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/CreateAction.java @@ -29,6 +29,7 @@ import org.sonar.core.config.CorePropertyDefinitions; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.user.UserDto; import org.sonar.server.organization.OrganizationCreation; import org.sonar.server.organization.OrganizationFlags; import org.sonar.server.organization.OrganizationValidation; @@ -101,9 +102,10 @@ public class CreateAction implements OrganizationsWsAction { try (DbSession dbSession = dbClient.openSession(false)) { organizationFlags.checkEnabled(dbSession); + UserDto currentUser = dbClient.userDao().selectActiveUserByLogin(dbSession, userSession.getLogin()); OrganizationDto organization = organizationCreation.create( dbSession, - userSession.getUserId(), + currentUser, newOrganizationBuilder() .setName(name) .setKey(key) diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/OrganizationCreationImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/OrganizationCreationImplTest.java index e92ab944f36..14a9bc843cf 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/OrganizationCreationImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/OrganizationCreationImplTest.java @@ -22,6 +22,7 @@ package org.sonar.server.organization; import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -45,6 +46,11 @@ import org.sonar.db.user.GroupDto; import org.sonar.db.user.UserDto; import org.sonar.db.user.UserMembershipDto; import org.sonar.db.user.UserMembershipQuery; +import org.sonar.server.es.EsTester; +import org.sonar.server.user.index.UserDoc; +import org.sonar.server.user.index.UserIndex; +import org.sonar.server.user.index.UserIndexDefinition; +import org.sonar.server.user.index.UserIndexer; import org.sonar.server.language.LanguageTesting; import org.sonar.server.qualityprofile.ActiveRuleChange; import org.sonar.server.qualityprofile.DefinedQProfile; @@ -62,7 +68,6 @@ import static org.mockito.Mockito.when; import static org.sonar.server.organization.OrganizationCreation.NewOrganization.newOrganizationBuilder; public class OrganizationCreationImplTest { - private static final int SOME_USER_ID = 1; private static final String SOME_UUID = "org-uuid"; private static final long SOME_DATE = 12893434L; private static final String A_LOGIN = "a-login"; @@ -71,6 +76,7 @@ public class OrganizationCreationImplTest { private static final String A_NAME = "a name"; private static final int ANYONE_GROUP_ID = 0; + private OrganizationCreation.NewOrganization FULL_POPULATED_NEW_ORGANIZATION = newOrganizationBuilder() .setName("a-name") .setKey("a-key") @@ -84,6 +90,8 @@ public class OrganizationCreationImplTest { @Rule public DbTester dbTester = DbTester.create(system2); @Rule + public EsTester es = new EsTester(new UserIndexDefinition(new MapSettings())); + @Rule public ExpectedException expectedException = ExpectedException.none(); @Rule public DefinedQProfileRepositoryRule definedQProfileRepositoryRule = new DefinedQProfileRepositoryRule(); @@ -97,17 +105,27 @@ public class OrganizationCreationImplTest { private UuidFactory uuidFactory = mock(UuidFactory.class); private OrganizationValidation organizationValidation = mock(OrganizationValidation.class); private MapSettings settings = new MapSettings(); + private UserIndexer userIndexer = new UserIndexer(dbClient, es.client()); + private UserIndex userIndex = new UserIndex(es.client()); private ActiveRuleIndexer activeRuleIndexer = mock(ActiveRuleIndexer.class); - private OrganizationCreationImpl underTest = new OrganizationCreationImpl(dbClient, system2, uuidFactory, organizationValidation, settings, + private OrganizationCreationImpl underTest = new OrganizationCreationImpl(dbClient, system2, uuidFactory, organizationValidation, settings, userIndexer, definedQProfileRepositoryRule, definedQProfileCreationRule, activeRuleIndexer); + private UserDto someUser; + + @Before + public void setUp() { + someUser = dbTester.users().insertUser(); + userIndexer.index(someUser.getLogin()); + } + @Test public void create_throws_NPE_if_NewOrganization_arg_is_null() throws OrganizationCreation.KeyConflictException { expectedException.expect(NullPointerException.class); expectedException.expectMessage("newOrganization can't be null"); - underTest.create(dbSession, SOME_USER_ID, null); + underTest.create(dbSession, someUser, null); } @Test @@ -141,7 +159,7 @@ public class OrganizationCreationImplTest { private void createThrowsExceptionThrownByOrganizationValidation() throws OrganizationCreation.KeyConflictException { try { - underTest.create(dbSession, SOME_USER_ID, FULL_POPULATED_NEW_ORGANIZATION); + underTest.create(dbSession, someUser, FULL_POPULATED_NEW_ORGANIZATION); fail(exceptionThrownByOrganizationValidation + " should have been thrown"); } catch (IllegalArgumentException e) { assertThat(e).isSameAs(exceptionThrownByOrganizationValidation); @@ -155,7 +173,7 @@ public class OrganizationCreationImplTest { expectedException.expect(IllegalStateException.class); expectedException.expectMessage("initialize must be called first"); - underTest.create(dbSession, SOME_USER_ID, FULL_POPULATED_NEW_ORGANIZATION); + underTest.create(dbSession, someUser, FULL_POPULATED_NEW_ORGANIZATION); } @Test @@ -165,7 +183,7 @@ public class OrganizationCreationImplTest { expectedException.expect(OrganizationCreation.KeyConflictException.class); expectedException.expectMessage("Organization key '" + FULL_POPULATED_NEW_ORGANIZATION.getKey() + "' is already used"); - underTest.create(dbSession, SOME_USER_ID, FULL_POPULATED_NEW_ORGANIZATION); + underTest.create(dbSession, someUser, FULL_POPULATED_NEW_ORGANIZATION); } @Test @@ -173,7 +191,7 @@ public class OrganizationCreationImplTest { mockForSuccessfulInsert(SOME_UUID, SOME_DATE); definedQProfileRepositoryRule.initialize(); - underTest.create(dbSession, SOME_USER_ID, FULL_POPULATED_NEW_ORGANIZATION); + underTest.create(dbSession, someUser, FULL_POPULATED_NEW_ORGANIZATION); OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, FULL_POPULATED_NEW_ORGANIZATION.getKey()).get(); assertThat(organization.getUuid()).isEqualTo(SOME_UUID); @@ -194,7 +212,7 @@ public class OrganizationCreationImplTest { mockForSuccessfulInsert(SOME_UUID, SOME_DATE); definedQProfileRepositoryRule.initialize(); - underTest.create(dbSession, user.getId(), FULL_POPULATED_NEW_ORGANIZATION); + underTest.create(dbSession, user, FULL_POPULATED_NEW_ORGANIZATION); verifyGroupOwners(user, FULL_POPULATED_NEW_ORGANIZATION.getKey(), FULL_POPULATED_NEW_ORGANIZATION.getName()); } @@ -204,7 +222,7 @@ public class OrganizationCreationImplTest { mockForSuccessfulInsert(SOME_UUID, SOME_DATE); definedQProfileRepositoryRule.initialize(); - underTest.create(dbSession, SOME_USER_ID, newOrganizationBuilder() + underTest.create(dbSession, someUser, newOrganizationBuilder() .setKey("key") .setName("name") .build()); @@ -224,7 +242,7 @@ public class OrganizationCreationImplTest { mockForSuccessfulInsert(SOME_UUID, SOME_DATE); definedQProfileRepositoryRule.initialize(); - underTest.create(dbSession, SOME_USER_ID, FULL_POPULATED_NEW_ORGANIZATION); + underTest.create(dbSession, someUser, FULL_POPULATED_NEW_ORGANIZATION); OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, FULL_POPULATED_NEW_ORGANIZATION.getKey()).get(); GroupDto ownersGroup = dbClient.groupDao().selectByName(dbSession, organization.getUuid(), "Owners").get(); @@ -243,12 +261,18 @@ public class OrganizationCreationImplTest { @Test public void create_add_current_user_as_member_of_organization() throws OrganizationCreation.KeyConflictException { + UserDto user = dbTester.users().insertUser(); + userIndexer.index(user.getLogin()); + UserDoc userDoc = userIndex.getNullableByLogin(user.getLogin()); + mockForSuccessfulInsert(SOME_UUID, SOME_DATE); definedQProfileRepositoryRule.initialize(); + userIndexer.index(someUser.getLogin()); - underTest.create(dbSession, SOME_USER_ID, FULL_POPULATED_NEW_ORGANIZATION); + underTest.create(dbSession, someUser, FULL_POPULATED_NEW_ORGANIZATION); - assertThat(dbClient.organizationMemberDao().select(dbSession, SOME_UUID, SOME_USER_ID)).isPresent(); + assertThat(dbClient.organizationMemberDao().select(dbSession, SOME_UUID, someUser.getId())).isPresent(); + assertThat(userIndex.getNullableByLogin(someUser.getLogin()).organizationUuids()).contains(SOME_UUID); } @Test @@ -265,7 +289,7 @@ public class OrganizationCreationImplTest { definedQProfileCreationRule.addChanges(changes[0]); mockForSuccessfulInsert(SOME_UUID, SOME_DATE); - underTest.create(dbSession, SOME_USER_ID, FULL_POPULATED_NEW_ORGANIZATION); + underTest.create(dbSession, someUser, FULL_POPULATED_NEW_ORGANIZATION); OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, FULL_POPULATED_NEW_ORGANIZATION.getKey()).get(); assertThat(definedQProfileCreationRule.getCallLogs()) diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java index e203b128dad..7edbf8d5d88 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java @@ -24,6 +24,7 @@ import java.net.URISyntaxException; import java.util.List; import java.util.Optional; import javax.annotation.Nullable; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -46,6 +47,7 @@ import org.sonar.db.user.GroupDto; import org.sonar.db.user.UserDto; import org.sonar.db.user.UserMembershipDto; import org.sonar.db.user.UserMembershipQuery; +import org.sonar.server.es.EsTester; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.UnauthorizedException; import org.sonar.server.organization.OrganizationCreation; @@ -57,6 +59,9 @@ import org.sonar.server.qualityprofile.DefinedQProfileCreation; import org.sonar.server.qualityprofile.DefinedQProfileRepository; import org.sonar.server.qualityprofile.index.ActiveRuleIndexer; import org.sonar.server.tester.UserSessionRule; +import org.sonar.server.user.index.UserIndex; +import org.sonar.server.user.index.UserIndexDefinition; +import org.sonar.server.user.index.UserIndexer; import org.sonar.server.ws.TestRequest; import org.sonar.server.ws.WsActionTester; import org.sonarqube.ws.MediaTypes; @@ -83,6 +88,8 @@ public class CreateActionTest { @Rule public DbTester dbTester = DbTester.create(system2).setDisableDefaultOrganization(true); @Rule + public EsTester es = new EsTester(new UserIndexDefinition(new MapSettings())); + @Rule public ExpectedException expectedException = ExpectedException.none(); private DbClient dbClient = dbTester.getDbClient(); @@ -91,13 +98,26 @@ public class CreateActionTest { .setProperty(ORGANIZATIONS_ANYONE_CAN_CREATE, false); private UuidFactory uuidFactory = mock(UuidFactory.class); private OrganizationValidation organizationValidation = new OrganizationValidationImpl(); - private OrganizationCreation organizationCreation = new OrganizationCreationImpl(dbClient, system2, uuidFactory, organizationValidation, settings, + private UserIndexer userIndexer = new UserIndexer(dbClient, es.client()); + private UserIndex userIndex = new UserIndex(es.client()); + private OrganizationCreation organizationCreation = new OrganizationCreationImpl(dbClient, system2, uuidFactory, organizationValidation, settings, userIndexer, mock(DefinedQProfileRepository.class), mock(DefinedQProfileCreation.class), mock(ActiveRuleIndexer.class)); private TestOrganizationFlags organizationFlags = TestOrganizationFlags.standalone().setEnabled(true); + + private UserDto user; + private CreateAction underTest = new CreateAction(settings, userSession, dbClient, new OrganizationsWsSupport(organizationValidation), organizationValidation, organizationCreation, organizationFlags); + private WsActionTester wsTester = new WsActionTester(underTest); + @Before + public void setUp() { + user = dbTester.users().insertUser(); + userIndexer.index(user.getLogin()); + userSession.logIn(user); + } + @Test public void verify_define() { WebService.Action action = wsTester.getDef(); @@ -192,7 +212,7 @@ public class CreateActionTest { @Test public void request_succeeds_if_user_is_not_system_administrator_and_logged_in_users_can_create_organizations() { - userSession.logIn(); + userSession.logIn(user); settings.setProperty(ORGANIZATIONS_ANYONE_CAN_CREATE, true); mockForSuccessfulInsert(SOME_UUID, SOME_DATE); @@ -503,6 +523,7 @@ public class CreateActionTest { executeRequest("orgFoo"); assertThat(dbClient.organizationMemberDao().select(dbSession, SOME_UUID, user.getId())).isPresent(); + assertThat(userIndex.getNullableByLogin(user.getLogin()).organizationUuids()).contains(SOME_UUID); } @Test @@ -609,6 +630,6 @@ public class CreateActionTest { } private void logInAsSystemAdministrator() { - userSession.logIn().setSystemAdministrator(); + userSession.logIn(user).setSystemAdministrator(); } } -- 2.39.5