Skip to content

Commit 64fa723

Browse files
authored
Merge pull request #33 from devondragon/issue-31-Delete-Account-not-working
Issue 31 delete account not working
2 parents ef82d0c + 2f3d6a4 commit 64fa723

4 files changed

Lines changed: 65 additions & 17 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ repositories {
3737

3838
dependencies {
3939
// DigitalSanctuary Spring User Framework
40-
implementation 'com.digitalsanctuary:ds-spring-user-framework:3.2.0'
40+
implementation 'com.digitalsanctuary:ds-spring-user-framework:3.2.1'
4141

4242
// Spring Boot starters
4343
implementation 'org.springframework.boot:spring-boot-starter-actuator'

src/main/java/com/digitalsanctuary/spring/demo/user/profile/EventRegistration.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.digitalsanctuary.spring.demo.user.profile;
22

33
import com.digitalsanctuary.spring.demo.event.Event;
4+
import jakarta.persistence.CascadeType;
45
import jakarta.persistence.Entity;
56
import jakarta.persistence.GeneratedValue;
67
import jakarta.persistence.GenerationType;
@@ -19,9 +20,9 @@ public class EventRegistration {
1920
private Long id;
2021

2122
@ToString.Exclude
22-
@ManyToOne
23+
@ManyToOne(cascade = CascadeType.REMOVE)
2324
private DemoUserProfile userProfile;
2425

25-
@ManyToOne
26+
@ManyToOne(cascade = CascadeType.REMOVE)
2627
private Event event;
2728
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.digitalsanctuary.spring.demo.user.profile;
2+
3+
import org.springframework.context.event.EventListener;
4+
import org.springframework.stereotype.Component;
5+
import org.springframework.transaction.annotation.Transactional;
6+
import lombok.RequiredArgsConstructor;
7+
import lombok.extern.slf4j.Slf4j;
8+
import com.digitalsanctuary.spring.user.event.UserPreDeleteEvent;
9+
10+
/**
11+
* Listener for user profile deletion events. This class listens for UserPreDeleteEvent and deletes the associated DemoUserProfile. It is assumed that
12+
* the DemoUserProfile is mapped to the User entity with a one-to-one relationship.
13+
*/
14+
@Component
15+
@RequiredArgsConstructor
16+
@Slf4j
17+
public class UserProfileDeletionListener {
18+
private final DemoUserProfileRepository demoUserProfileRepository;
19+
// Inject other repositories if needed (e.g., EventRegistrationRepository)
20+
21+
@EventListener
22+
@Transactional // Joins the transaction started by UserService.deleteUserAccount
23+
public void handleUserPreDelete(UserPreDeleteEvent event) {
24+
Long userId = event.getUser().getId();
25+
log.info("Received UserPreDeleteEvent for userId: {}. Deleting associated DemoUserProfile...", userId);
26+
27+
// Option 1: Delete profile directly (if no further cascades needed from profile)
28+
// Since DemoUserProfile uses @MapsId, its ID is the same as the User's ID
29+
demoUserProfileRepository.findById(userId).ifPresent(profile -> {
30+
log.debug("Found DemoUserProfile for userId: {}. Deleting...", userId);
31+
// If DemoUserProfile itself has relationships needing cleanup (like EventRegistrations)
32+
// that aren't handled by CascadeType.REMOVE or orphanRemoval=true,
33+
// handle them here *before* deleting the profile.
34+
// Example: eventRegistrationRepository.deleteByUserProfile(profile);
35+
demoUserProfileRepository.delete(profile);
36+
log.debug("DemoUserProfile deleted for userId: {}", userId);
37+
});
38+
39+
// Option 2: If DemoUserProfile has CascadeType.REMOVE/orphanRemoval=true
40+
// on its collections (like eventRegistrations), deleting the profile might be enough.
41+
// demoUserProfileRepository.deleteById(userId);
42+
43+
log.info("Finished processing UserPreDeleteEvent for userId: {}", userId);
44+
}
45+
}

src/test/java/com/digitalsanctuary/spring/user/service/UserServiceTest.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
11
package com.digitalsanctuary.spring.user.service;
22

3-
import com.digitalsanctuary.spring.user.dto.UserDto;
4-
import com.digitalsanctuary.spring.user.exceptions.UserAlreadyExistException;
5-
import com.digitalsanctuary.spring.user.persistence.model.Role;
6-
import com.digitalsanctuary.spring.user.persistence.model.User;
7-
import com.digitalsanctuary.spring.user.persistence.repository.PasswordResetTokenRepository;
8-
import com.digitalsanctuary.spring.user.persistence.repository.RoleRepository;
9-
import com.digitalsanctuary.spring.user.persistence.repository.UserRepository;
10-
import com.digitalsanctuary.spring.user.persistence.repository.VerificationTokenRepository;
3+
import static org.mockito.ArgumentMatchers.anyString;
4+
import static org.mockito.Mockito.when;
5+
import java.util.Collections;
116
import org.junit.jupiter.api.Assertions;
127
import org.junit.jupiter.api.BeforeEach;
138
import org.junit.jupiter.api.Test;
149
import org.junit.jupiter.api.extension.ExtendWith;
1510
import org.mockito.Mock;
1611
import org.mockito.junit.jupiter.MockitoExtension;
12+
import org.springframework.context.ApplicationEventPublisher;
1713
import org.springframework.security.core.session.SessionRegistry;
1814
import org.springframework.security.crypto.password.PasswordEncoder;
19-
20-
import java.util.Collections;
21-
22-
import static org.mockito.ArgumentMatchers.*;
23-
import static org.mockito.Mockito.when;
15+
import com.digitalsanctuary.spring.user.dto.UserDto;
16+
import com.digitalsanctuary.spring.user.exceptions.UserAlreadyExistException;
17+
import com.digitalsanctuary.spring.user.persistence.model.Role;
18+
import com.digitalsanctuary.spring.user.persistence.model.User;
19+
import com.digitalsanctuary.spring.user.persistence.repository.PasswordResetTokenRepository;
20+
import com.digitalsanctuary.spring.user.persistence.repository.RoleRepository;
21+
import com.digitalsanctuary.spring.user.persistence.repository.UserRepository;
22+
import com.digitalsanctuary.spring.user.persistence.repository.VerificationTokenRepository;
2423

2524
@ExtendWith(MockitoExtension.class)
2625
public class UserServiceTest {
@@ -43,6 +42,9 @@ public class UserServiceTest {
4342
@Mock
4443
public UserVerificationService userVerificationService;
4544

45+
@Mock
46+
private ApplicationEventPublisher eventPublisher;
47+
4648
@Mock
4749
public AuthorityService authorityService;
4850

@@ -72,7 +74,7 @@ void setUp() {
7274
testUserDto.setRole(1);
7375

7476
userService = new UserService(userRepository, tokenRepository, passwordTokenRepository, passwordEncoder, roleRepository, sessionRegistry,
75-
userEmailService, userVerificationService, authorityService, dsUserDetailsService);
77+
userEmailService, userVerificationService, authorityService, dsUserDetailsService, eventPublisher);
7678
}
7779

7880
@Test

0 commit comments

Comments
 (0)