Skip to content

Commit 4d1c2d9

Browse files
EFRS-1341: Changed registration logic. The first user to confirm their email address becomes the owner
1 parent 3b183f1 commit 4d1c2d9

File tree

10 files changed

+112
-16
lines changed

10 files changed

+112
-16
lines changed

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static com.exadel.frs.commonservice.enums.GlobalRole.OWNER;
2121
import static com.exadel.frs.commonservice.enums.GlobalRole.USER;
2222
import static com.exadel.frs.commonservice.enums.StatisticsType.USER_CREATE;
23+
import static com.exadel.frs.commonservice.enums.TableLockName.USER_LOCK;
2324
import static com.exadel.frs.system.global.Constants.DEMO_GUID;
2425
import static com.exadel.frs.validation.EmailValidator.isInvalid;
2526
import static org.apache.commons.lang3.BooleanUtils.isNotTrue;
@@ -28,7 +29,9 @@
2829
import com.exadel.frs.commonservice.entity.User;
2930
import com.exadel.frs.commonservice.enums.GlobalRole;
3031
import com.exadel.frs.commonservice.enums.Replacer;
32+
import com.exadel.frs.commonservice.enums.TableLockName;
3133
import com.exadel.frs.commonservice.exception.EmptyRequiredFieldException;
34+
import com.exadel.frs.commonservice.repository.TableLockRepository;
3235
import com.exadel.frs.commonservice.repository.UserRepository;
3336
import com.exadel.frs.dto.ui.UserCreateDto;
3437
import com.exadel.frs.dto.ui.UserDeleteDto;
@@ -68,6 +71,7 @@ public class UserService {
6871
private final EmailSender emailSender;
6972
private final Environment env;
7073
private final AuthorizationManager authManager;
74+
private final TableLockRepository lockRepository;
7175

7276
public User getUser(final Long id) {
7377
return userRepository.findById(id)
@@ -191,14 +195,18 @@ public void removeExpiredRegistrationTokens() {
191195
userRepository.deleteByEnabledFalseAndRegTimeBefore(seconds);
192196
}
193197

198+
@Transactional
194199
public void confirmRegistration(final String token) {
195200
val user = userRepository.findByRegistrationToken(token)
196201
.orElseThrow(RegistrationTokenExpiredException::new);
197202

203+
lockRepository.lockByName(USER_LOCK);
204+
if (!userRepository.isOwnerPresent()) {
205+
user.setGlobalRole(OWNER);
206+
}
207+
198208
user.setEnabled(true);
199209
user.setRegistrationToken(null);
200-
201-
userRepository.save(user);
202210
}
203211

204212
private void manageOwnedAppsByUserBeingDeleted(final UserDeleteDto userDeleteDto) {
@@ -228,6 +236,7 @@ public User updateDemoUser(UserCreateDto userCreateDto) {
228236
user.setAllowStatistics(userCreateDto.isAllowStatistics());
229237

230238
if (isMailServerEnabled) {
239+
user.setGlobalRole(USER);
231240
user.setRegistrationToken(generateRegistrationToken());
232241
sendRegistrationTokenToUser(user);
233242
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
databaseChangeLog:
2+
- changeSet:
3+
id: insert-user-lock
4+
author: Volodymyr Bushko
5+
changes:
6+
- insert:
7+
tableName: table_lock
8+
columns:
9+
- column:
10+
name: id
11+
value: 00000000-0000-0000-0000-000000000002
12+
- column:
13+
name: lock_name
14+
value: USER_LOCK

java/admin/src/main/resources/db/changelog/db.changelog-master.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,5 @@ databaseChangeLog:
4949
file: db/changelog/db.changelog-0.2.4.yaml
5050
- include:
5151
file: db/changelog/db.changelog-0.2.5.yaml
52+
- include:
53+
file: db/changelog/db.changelog-0.2.6.yaml

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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import static org.mockito.MockitoAnnotations.initMocks;
3131

3232
import com.exadel.frs.commonservice.exception.EmptyRequiredFieldException;
33+
import com.exadel.frs.commonservice.repository.TableLockRepository;
3334
import com.exadel.frs.dto.ui.UserCreateDto;
3435
import com.exadel.frs.dto.ui.UserDeleteDto;
3536
import com.exadel.frs.dto.ui.UserUpdateDto;
@@ -83,6 +84,9 @@ class UserServiceTest {
8384
@Mock
8485
private AppService appService;
8586

87+
@Mock
88+
private TableLockRepository tableLockRepository;
89+
8690
@InjectMocks
8791
private UserService userService;
8892

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);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
databaseChangeLog:
2+
- changeSet:
3+
id: insert-user-lock
4+
author: Volodymyr Bushko
5+
changes:
6+
- insert:
7+
tableName: table_lock
8+
columns:
9+
- column:
10+
name: id
11+
value: 00000000-0000-0000-0000-000000000002
12+
- column:
13+
name: lock_name
14+
value: USER_LOCK

java/api/src/test/resources/db/changelog/db.changelog-master.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,5 @@ databaseChangeLog:
4949
file: db/changelog/db.changelog-0.2.4.yaml
5050
- include:
5151
file: db/changelog/db.changelog-0.2.5.yaml
52+
- include:
53+
file: db/changelog/db.changelog-0.2.6.yaml

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

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

33
public enum TableLockName {
44

5-
MODEL_STATISTIC_LOCK;
5+
MODEL_STATISTIC_LOCK,
6+
USER_LOCK
67
}

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)