Skip to content

Commit a3a21b4

Browse files
authored
implement first user is admin option (#560)
* implement first user is admin option add tests to cover it
1 parent cd9e076 commit a3a21b4

File tree

11 files changed

+86
-7
lines changed

11 files changed

+86
-7
lines changed

.gitignore

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ env.sh
44

55
### Java Wrapper Logs ###
66
*wrapper*.log
7-
7+
*.log
88

99
### STS ###
1010
.apt_generated
@@ -30,7 +30,6 @@ nbdist/
3030

3131
### VSCode ###
3232
.vscode
33-
3433
.env
3534

3635
### Docs ###
@@ -41,4 +40,5 @@ _templates/
4140

4241
classes/
4342

44-
local.log
43+
local.log
44+
*.local.yaml

src/main/java/bio/overture/ego/config/UserDefaultsConfig.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@ public class UserDefaultsConfig {
1919

2020
@Getter private final StatusType defaultUserStatus;
2121

22+
@Getter private final boolean firstUserAsAdmin;
23+
2224
public UserDefaultsConfig(
2325
@Value("${default.user.type}") String userType,
24-
@Value("${default.user.status}") String userStatus) {
26+
@Value("${default.user.status}") String userStatus,
27+
@Value("${default.user.firstUserAsAdmin:false}") boolean firstUserAsAdmin) {
2528
this.defaultUserType = isEmpty(userType) ? USER : resolveUserType(userType);
2629
this.defaultUserStatus = isEmpty(userStatus) ? PENDING : resolveStatusType(userStatus);
30+
this.firstUserAsAdmin = firstUserAsAdmin;
2731
}
2832
}

src/main/java/bio/overture/ego/repository/BaseRepository.java

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
@NoRepositoryBean
1010
public interface BaseRepository<T, ID>
1111
extends PagingAndSortingRepository<T, ID>, JpaSpecificationExecutor {
12+
T findFirstBy();
1213

1314
Set<T> findAllByIdIn(Collection<ID> ids);
1415
}

src/main/java/bio/overture/ego/service/AbstractBaseService.java

+5
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ public void delete(@NonNull ID id) {
5656
getRepository().deleteById(id);
5757
}
5858

59+
@Override
60+
public long countAll() {
61+
return getRepository().count();
62+
}
63+
5964
@Override
6065
@SuppressWarnings("unchecked")
6166
public Page<T> findAll(@NonNull Specification specification, @NonNull Pageable pageable) {

src/main/java/bio/overture/ego/service/BaseService.java

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ default T getById(@NonNull ID id) {
3434

3535
void delete(ID id);
3636

37+
long countAll();
38+
3739
Page<T> findAll(Specification specification, Pageable pageable);
3840

3941
Page<T> findAll(AbstractSpecificationBuilder<T, ID> specificationBuilder, Pageable pageable);

src/main/java/bio/overture/ego/service/UserService.java

+6
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import bio.overture.ego.model.dto.UpdateUserRequest;
4242
import bio.overture.ego.model.entity.*;
4343
import bio.overture.ego.model.enums.ProviderType;
44+
import bio.overture.ego.model.enums.StatusType;
4445
import bio.overture.ego.model.join.UserApplication;
4546
import bio.overture.ego.model.join.UserGroup;
4647
import bio.overture.ego.model.search.SearchFilter;
@@ -99,6 +100,11 @@ public UserService(
99100
public User create(@NonNull CreateUserRequest request) {
100101
validateCreateRequest(request);
101102
val user = USER_CONVERTER.convertToUser(request);
103+
val existingRandomUser = getRepository().findFirstBy();
104+
if (userDefaultsConfig.isFirstUserAsAdmin() && existingRandomUser == null) {
105+
user.setType(ADMIN);
106+
user.setStatus(StatusType.APPROVED);
107+
}
102108
return getRepository().save(user);
103109
}
104110

src/main/resources/application.yml

+2
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ token:
163163
# Default values available for creation of entities
164164
default:
165165
user:
166+
# flag to automatically register first user as an admin
167+
firstUserAsAdmin: false
166168
type: USER
167169
status: APPROVED
168170

src/test/java/bio/overture/ego/controller/AbstractMockedTokenControllerTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.mockito.Mockito.mock;
44
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
55

6+
import bio.overture.ego.model.entity.User;
67
import bio.overture.ego.model.enums.ProviderType;
78
import bio.overture.ego.provider.google.GoogleTokenService;
89
import bio.overture.ego.service.TokenService;
@@ -19,9 +20,12 @@
1920
import org.springframework.test.web.servlet.MockMvc;
2021
import org.springframework.web.context.WebApplicationContext;
2122

23+
import java.util.List;
24+
2225
public abstract class AbstractMockedTokenControllerTest extends AbstractControllerTest {
2326

2427
protected boolean hasRunEntitySetup = false;
28+
protected List<User> testUsers;
2529
protected MockMvc mockMvc;
2630

2731
@Value("${spring.flyway.placeholders.default-provider:GOOGLE}")
@@ -54,7 +58,7 @@ protected boolean enableLogging() {
5458
protected void beforeTest() {
5559
// Initial setup of entities (run once)
5660
if (!hasRunEntitySetup) {
57-
entityGenerator.setupTestUsers();
61+
testUsers = entityGenerator.setupTestUsers();
5862
hasRunEntitySetup = true;
5963
}
6064

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package bio.overture.ego.service;
2+
3+
import bio.overture.ego.model.entity.User;
4+
import bio.overture.ego.model.enums.UserType;
5+
import bio.overture.ego.utils.EntityGenerator;
6+
import lombok.extern.slf4j.Slf4j;
7+
import lombok.val;
8+
import org.junit.Assert;
9+
import org.junit.Test;
10+
import org.junit.runner.RunWith;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.boot.test.context.SpringBootTest;
13+
import org.springframework.test.context.ActiveProfiles;
14+
import org.springframework.test.context.TestPropertySource;
15+
import org.springframework.test.context.junit4.SpringRunner;
16+
import org.springframework.transaction.annotation.Transactional;
17+
18+
@Slf4j
19+
@SpringBootTest
20+
@RunWith(SpringRunner.class)
21+
@ActiveProfiles("test")
22+
@TestPropertySource(properties = "default.user.firstUserAsAdmin=true")
23+
@Transactional
24+
public class FirstUserAsAdminTest {
25+
26+
@Autowired private UserService userService;
27+
@Autowired private EntityGenerator entityGenerator;
28+
29+
@Test
30+
public void testOnlyFirstUserShouldBeAdminByDefault() {
31+
userService.getRepository().deleteAll();
32+
val usersCount = userService.countAll();
33+
Assert.assertEquals(0, usersCount);
34+
User u = entityGenerator.setupUser("First User", UserType.USER);
35+
val user = userService.findById(u.getId()).get();
36+
Assert.assertEquals(user.getType(), UserType.ADMIN);
37+
38+
// add another user make sure they don't get ADMIN type
39+
User u2 = entityGenerator.setupUser("Second User", UserType.USER);
40+
val user2 = userService.findById(u2.getId()).get();
41+
Assert.assertEquals(user2.getType(), UserType.USER);
42+
}
43+
}

src/test/java/bio/overture/ego/service/UserServiceTest.java

+12
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import static bio.overture.ego.utils.CollectionUtils.repeatedCallsOf;
55
import static java.util.stream.Collectors.toList;
66

7+
import bio.overture.ego.model.entity.User;
8+
import bio.overture.ego.model.enums.UserType;
79
import bio.overture.ego.utils.EntityGenerator;
810
import lombok.extern.slf4j.Slf4j;
911
import lombok.val;
@@ -28,6 +30,16 @@ public class UserServiceTest {
2830
@Autowired private RefreshContextService refreshContextService;
2931
@Autowired private TokenService tokenService;
3032

33+
@Test
34+
public void testFirstUserShouldNotBeAdminByDefault() {
35+
userService.getRepository().deleteAll();
36+
val usersCount = userService.countAll();
37+
Assert.assertEquals(0, usersCount);
38+
User u = entityGenerator.setupUser("First User", UserType.USER);
39+
val user = userService.findById(u.getId()).get();
40+
Assert.assertEquals(user.getType(), UserType.USER);
41+
}
42+
3143
@Test
3244
public void testGetManyUsersWithRelations() {
3345
int numUsers = 3;

src/test/java/bio/overture/ego/utils/EntityGenerator.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ public List<User> setupPublicUsers(String... users) {
154154
user -> setupUser(user, USER, UUID.randomUUID().toString(), DEFAULT_PROVIDER_TYPE));
155155
}
156156

157-
public void setupTestUsers() {
158-
setupUsers("First User", "Second User", "Third User");
157+
public List<User> setupTestUsers() {
158+
return setupUsers("First User", "Second User", "Third User");
159159
}
160160

161161
public Group setupGroup(String name) {

0 commit comments

Comments
 (0)