Skip to content

Commit fd96df0

Browse files
Merge pull request #949 from exadel-inc/EFRS-1341_owner_user_bug
EFRS-1341: Changed registration logic
2 parents 1280973 + dc7cb98 commit fd96df0

File tree

6 files changed

+80
-23
lines changed

6 files changed

+80
-23
lines changed

java/admin/src/main/java/com/exadel/frs/service/UserService.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,14 +191,21 @@ public void removeExpiredRegistrationTokens() {
191191
userRepository.deleteByEnabledFalseAndRegTimeBefore(seconds);
192192
}
193193

194+
@Transactional
194195
public void confirmRegistration(final String token) {
195196
val user = userRepository.findByRegistrationToken(token)
196197
.orElseThrow(RegistrationTokenExpiredException::new);
197198

198-
user.setEnabled(true);
199-
user.setRegistrationToken(null);
199+
synchronized (this) {
200+
if (!userRepository.isOwnerPresent()) {
201+
user.setGlobalRole(OWNER);
202+
}
200203

201-
userRepository.save(user);
204+
user.setEnabled(true);
205+
user.setRegistrationToken(null);
206+
207+
userRepository.flush();
208+
}
202209
}
203210

204211
private void manageOwnedAppsByUserBeingDeleted(final UserDeleteDto userDeleteDto) {
@@ -228,6 +235,7 @@ public User updateDemoUser(UserCreateDto userCreateDto) {
228235
user.setAllowStatistics(userCreateDto.isAllowStatistics());
229236

230237
if (isMailServerEnabled) {
238+
user.setGlobalRole(USER);
231239
user.setRegistrationToken(generateRegistrationToken());
232240
sendRegistrationTokenToUser(user);
233241
}

java/admin/src/test/java/com/exadel/frs/DbHelper.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -153,22 +153,32 @@ public Img insertImg() {
153153
}
154154

155155
public User insertUser(String email) {
156-
var user = User.builder()
157-
.email(email)
158-
.firstName("firstName")
159-
.lastName("lastName")
160-
.password(encoder.encode("1234567890"))
161-
.guid(UUID.randomUUID().toString())
162-
.accountNonExpired(true)
163-
.accountNonLocked(true)
164-
.credentialsNonExpired(true)
165-
.enabled(true)
166-
.allowStatistics(false)
167-
.globalRole(USER)
168-
.build();
156+
var user = createUser(email);
157+
user.setEnabled(true);
169158
return userRepository.saveAndFlush(user);
170159
}
171160

161+
public User insertUnconfirmedUser(String email) {
162+
var user = createUser(email);
163+
user.setRegistrationToken(UUID.randomUUID().toString());
164+
return userRepository.saveAndFlush(user);
165+
}
166+
167+
private User createUser(String email) {
168+
return User.builder()
169+
.email(email)
170+
.firstName("firstName")
171+
.lastName("lastName")
172+
.password(encoder.encode("1234567890"))
173+
.guid(UUID.randomUUID().toString())
174+
.accountNonExpired(true)
175+
.accountNonLocked(true)
176+
.credentialsNonExpired(true)
177+
.allowStatistics(false)
178+
.globalRole(USER)
179+
.build();
180+
}
181+
172182
public ResetPasswordToken insertResetPasswordToken(User user) {
173183
var expiresIn = now(UTC).plus(resetPasswordTokenExpires, MILLIS);
174184
var token = new ResetPasswordToken(expiresIn, user);

java/admin/src/test/java/com/exadel/frs/UserServiceTest.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,21 @@
2828
import static org.mockito.Mockito.verifyNoMoreInteractions;
2929
import static org.mockito.Mockito.when;
3030
import static org.mockito.MockitoAnnotations.initMocks;
31-
31+
import com.exadel.frs.commonservice.entity.User;
32+
import com.exadel.frs.commonservice.enums.GlobalRole;
33+
import com.exadel.frs.commonservice.enums.Replacer;
3234
import com.exadel.frs.commonservice.exception.EmptyRequiredFieldException;
35+
import com.exadel.frs.commonservice.exception.IllegalReplacerException;
36+
import com.exadel.frs.commonservice.repository.UserRepository;
3337
import com.exadel.frs.dto.ui.UserCreateDto;
3438
import com.exadel.frs.dto.ui.UserDeleteDto;
3539
import com.exadel.frs.dto.ui.UserUpdateDto;
36-
import com.exadel.frs.commonservice.entity.User;
37-
import com.exadel.frs.commonservice.enums.GlobalRole;
38-
import com.exadel.frs.commonservice.enums.Replacer;
3940
import com.exadel.frs.exception.EmailAlreadyRegisteredException;
40-
import com.exadel.frs.commonservice.exception.IllegalReplacerException;
4141
import com.exadel.frs.exception.IncorrectUserPasswordException;
4242
import com.exadel.frs.exception.InvalidEmailException;
4343
import com.exadel.frs.exception.RegistrationTokenExpiredException;
4444
import com.exadel.frs.exception.UserDoesNotExistException;
4545
import com.exadel.frs.helpers.EmailSender;
46-
import com.exadel.frs.commonservice.repository.UserRepository;
4746
import com.exadel.frs.service.AppService;
4847
import com.exadel.frs.service.UserService;
4948
import com.exadel.frs.system.security.AuthorizationManager;

java/admin/src/test/java/com/exadel/frs/UserServiceTestIT.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.exadel.frs;
1818

1919
import com.exadel.frs.commonservice.entity.User;
20+
import com.exadel.frs.commonservice.enums.GlobalRole;
2021
import com.exadel.frs.commonservice.repository.UserRepository;
2122
import com.exadel.frs.dto.ui.UserCreateDto;
2223
import com.exadel.frs.exception.UserDoesNotExistException;
@@ -36,9 +37,14 @@
3637

3738
import java.util.Optional;
3839
import java.util.UUID;
40+
import org.springframework.transaction.annotation.Transactional;
3941

42+
import static com.exadel.frs.commonservice.enums.GlobalRole.OWNER;
43+
import static com.exadel.frs.commonservice.enums.GlobalRole.USER;
4044
import static org.assertj.core.api.Assertions.assertThat;
4145
import static org.assertj.core.api.Assertions.assertThatThrownBy;
46+
import static org.junit.jupiter.api.Assertions.assertFalse;
47+
import static org.junit.jupiter.api.Assertions.assertTrue;
4248
import static org.mockito.Mockito.when;
4349

4450
@ExtendWith(SpringExtension.class)
@@ -60,6 +66,9 @@ class UserServiceTestIT extends EmbeddedPostgreSQLTest {
6066
@SpyBean
6167
private UserService userService;
6268

69+
@Autowired
70+
private DbHelper dbHelper;
71+
6372
@Autowired
6473
private UserRepository userRepository;
6574

@@ -147,6 +156,34 @@ void autocompleteReturnsUsers() {
147156
assertThat(actual).hasSize(2);
148157
}
149158

159+
@Test
160+
@Transactional
161+
void confirmRegistration_ThereAreTwoUnconfirmedUsers_FirstOfThemShouldBecomeAnOwner() {
162+
userRepository.deleteAll();
163+
164+
val user1 = dbHelper.insertUnconfirmedUser(USER_EMAIL);
165+
val user2 = dbHelper.insertUnconfirmedUser(USER_EMAIL_2);
166+
167+
assertFalse(user1.isEnabled());
168+
assertFalse(user2.isEnabled());
169+
assertThat(user1.getRegistrationToken()).isNotNull();
170+
assertThat(user2.getRegistrationToken()).isNotNull();
171+
assertThat(user1.getGlobalRole()).isEqualByComparingTo(USER);
172+
assertThat(user2.getGlobalRole()).isEqualByComparingTo(USER);
173+
assertThat(userRepository.findAll()).containsOnly(user1, user2);
174+
175+
userService.confirmRegistration(user1.getRegistrationToken());
176+
userService.confirmRegistration(user2.getRegistrationToken());
177+
178+
assertTrue(user1.isEnabled());
179+
assertTrue(user2.isEnabled());
180+
assertThat(user1.getRegistrationToken()).isNull();
181+
assertThat(user2.getRegistrationToken()).isNull();
182+
assertThat(user1.getGlobalRole()).isEqualByComparingTo(OWNER);
183+
assertThat(user2.getGlobalRole()).isEqualByComparingTo(USER);
184+
assertThat(userRepository.findAll()).containsOnly(user1, user2);
185+
}
186+
150187
private void createAndEnableUser(final String email) {
151188
val regToken = UUID.randomUUID().toString();
152189
when(userService.generateRegistrationToken()).thenReturn(regToken);

java/common/src/main/java/com/exadel/frs/commonservice/enums/TableLockName.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22

33
public enum TableLockName {
44

5-
MODEL_STATISTIC_LOCK;
5+
MODEL_STATISTIC_LOCK
66
}

java/common/src/main/java/com/exadel/frs/commonservice/repository/UserRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ public interface UserRepository extends JpaRepository<User, Long> {
4343

4444
User findByGlobalRole(GlobalRole role);
4545

46+
@Query("select count(u) > 0 from User u where u.globalRole = 'O'")
47+
boolean isOwnerPresent();
48+
4649
int deleteByEnabledFalseAndRegTimeBefore(LocalDateTime time);
4750

4851
Optional<User> findByRegistrationToken(String token);

0 commit comments

Comments
 (0)