@@ -35,6 +35,7 @@ import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.DbTester; | |||
import org.sonar.db.project.ProjectDto; | |||
import org.sonar.db.scim.ScimUserDto; | |||
import static java.util.Arrays.asList; | |||
import static java.util.Collections.emptyList; | |||
@@ -593,10 +594,11 @@ public class UserDaoIT { | |||
List<UserTelemetryDto> result = underTest.selectUsersForTelemetry(db.getSession()); | |||
assertThat(result) | |||
.extracting(UserTelemetryDto::getUuid, UserTelemetryDto::isActive, UserTelemetryDto::getLastConnectionDate, UserTelemetryDto::getLastSonarlintConnectionDate) | |||
.extracting(UserTelemetryDto::getUuid, UserTelemetryDto::isActive, UserTelemetryDto::getLastConnectionDate, UserTelemetryDto::getLastSonarlintConnectionDate, UserTelemetryDto::getScimUuid) | |||
.containsExactlyInAnyOrder( | |||
tuple(u1.getUuid(), u1.isActive(), u1.getLastConnectionDate(), u1.getLastSonarlintConnectionDate()), | |||
tuple(u2.getUuid(), u2.isActive(), u2.getLastConnectionDate(), u2.getLastSonarlintConnectionDate())); | |||
tuple(u1.getUuid(), u1.isActive(), u1.getLastConnectionDate(), u1.getLastSonarlintConnectionDate(), null), | |||
tuple(u2.getUuid(), u2.isActive(), u2.getLastConnectionDate(), u2.getLastSonarlintConnectionDate(), null) | |||
); | |||
} | |||
@Test | |||
@@ -620,6 +622,22 @@ public class UserDaoIT { | |||
tuple(u2.getUuid(), u2.isActive(), 20_000_000_000L, u2.getLastSonarlintConnectionDate())); | |||
} | |||
@Test | |||
public void selectUserTelemetryWithScim() { | |||
UserDto u1 = insertUser(true); | |||
UserDto u2 = insertUser(false); | |||
ScimUserDto scimUser1 = enableScimForUser(u1); | |||
List<UserTelemetryDto> result = underTest.selectUsersForTelemetry(db.getSession()); | |||
assertThat(result) | |||
.extracting(UserTelemetryDto::getUuid, UserTelemetryDto::isActive, UserTelemetryDto::getLastConnectionDate, UserTelemetryDto::getLastSonarlintConnectionDate, UserTelemetryDto::getScimUuid) | |||
.containsExactlyInAnyOrder( | |||
tuple(u1.getUuid(), u1.isActive(), u1.getLastConnectionDate(), u1.getLastSonarlintConnectionDate(), scimUser1.getScimUserUuid()), | |||
tuple(u2.getUuid(), u2.isActive(), u2.getLastConnectionDate(), u2.getLastSonarlintConnectionDate(), null) | |||
); | |||
} | |||
private UserDto insertActiveUser() { | |||
return insertUser(true); | |||
} | |||
@@ -630,6 +648,11 @@ public class UserDaoIT { | |||
return dto; | |||
} | |||
private ScimUserDto enableScimForUser(UserDto userDto) { | |||
return dbClient.scimUserDao().enableScimForUser(db.getSession(), userDto.getUuid()); | |||
} | |||
private UserGroupDto insertUserGroup(UserDto user) { | |||
GroupDto group = newGroupDto().setName(randomAlphanumeric(30)); | |||
dbClient.groupDao().insert(session, group); |
@@ -30,6 +30,8 @@ public class UserTelemetryDto { | |||
private Long lastConnectionDate = null; | |||
@Nullable | |||
private Long lastSonarlintConnectionDate = null; | |||
@Nullable | |||
private String scimUuid = null; | |||
public String getUuid() { | |||
return uuid; | |||
@@ -77,4 +79,14 @@ public class UserTelemetryDto { | |||
this.lastSonarlintConnectionDate = lastSonarlintConnectionDate; | |||
return this; | |||
} | |||
public UserTelemetryDto setScimUuid(@Nullable String scimUuid) { | |||
this.scimUuid = scimUuid; | |||
return this; | |||
} | |||
@Nullable | |||
public String getScimUuid() { | |||
return scimUuid; | |||
} | |||
} |
@@ -110,8 +110,10 @@ | |||
u.active as "active", | |||
u.external_identity_provider as "externalIdentityProvider", | |||
u.last_connection_date as "lastConnectionDate", | |||
u.last_sonarlint_connection as "lastSonarlintConnectionDate" | |||
u.last_sonarlint_connection as "lastSonarlintConnectionDate", | |||
su.scim_uuid as "scimUuid" | |||
FROM users u | |||
LEFT JOIN scim_users su on su.user_uuid = u.uuid | |||
ORDER BY u.uuid | |||
</select> | |||
@@ -118,6 +118,7 @@ public class TelemetryDataJsonWriter { | |||
if (user.getLastSonarlintConnectionDate() != null) { | |||
json.prop("lastSonarlintActivity", toUtc(user.getLastSonarlintConnectionDate())); | |||
} | |||
json.prop("managed", user.getScimUuid() != null); | |||
json.endObject(); | |||
}); |
@@ -307,21 +307,24 @@ public class TelemetryDataJsonWriterTest { | |||
"status": "active", | |||
"identityProvider": "gitlab", | |||
"lastActivity": "1970-01-01T00:00:00+0000", | |||
"lastSonarlintActivity": "1970-01-01T00:00:00+0000" | |||
"lastSonarlintActivity": "1970-01-01T00:00:00+0000", | |||
"managed": true | |||
}, | |||
{ | |||
"userUuid": "%s", | |||
"status": "inactive", | |||
"identityProvider": "gitlab", | |||
"lastActivity": "1970-01-01T00:00:00+0000", | |||
"lastSonarlintActivity": "1970-01-01T00:00:00+0000" | |||
"lastSonarlintActivity": "1970-01-01T00:00:00+0000", | |||
"managed": false | |||
}, | |||
{ | |||
"userUuid": "%s", | |||
"status": "active", | |||
"identityProvider": "gitlab", | |||
"lastActivity": "1970-01-01T00:00:00+0000", | |||
"lastSonarlintActivity": "1970-01-01T00:00:00+0000" | |||
"lastSonarlintActivity": "1970-01-01T00:00:00+0000", | |||
"managed": true | |||
} | |||
] | |||
} | |||
@@ -482,7 +485,8 @@ public class TelemetryDataJsonWriterTest { | |||
private static List<UserTelemetryDto> attachUsers() { | |||
return IntStream.range(0, 3) | |||
.mapToObj( | |||
i -> new UserTelemetryDto().setUuid("uuid-" + i).setActive(i % 2 == 0).setLastConnectionDate(1L).setLastSonarlintConnectionDate(2L).setExternalIdentityProvider("gitlab")) | |||
i -> new UserTelemetryDto().setUuid("uuid-" + i).setActive(i % 2 == 0).setLastConnectionDate(1L) | |||
.setLastSonarlintConnectionDate(2L).setExternalIdentityProvider("gitlab").setScimUuid(i % 2 == 0 ? "scim-uuid-" + i : null)) | |||
.collect(Collectors.toList()); | |||
} | |||