-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathDeleteEventListener.java
95 lines (79 loc) · 3.8 KB
/
DeleteEventListener.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package hanglog.listener;
import static org.springframework.transaction.annotation.Propagation.REQUIRES_NEW;
import hanglog.auth.domain.repository.RefreshTokenRepository;
import hanglog.expense.domain.repository.ExpenseRepository;
import hanglog.image.domain.repository.ImageRepository;
import hanglog.member.domain.MemberDeleteEvent;
import hanglog.trip.domain.TripDeleteEvent;
import hanglog.trip.domain.repository.CustomDayLogRepository;
import hanglog.trip.domain.repository.CustomItemRepository;
import hanglog.trip.domain.repository.DayLogRepository;
import hanglog.trip.domain.repository.ItemRepository;
import hanglog.trip.domain.repository.PlaceRepository;
import hanglog.trip.domain.repository.TripCityRepository;
import hanglog.trip.domain.repository.TripRepository;
import hanglog.trip.dto.ItemElement;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.event.TransactionalEventListener;
@Component
@RequiredArgsConstructor
public class DeleteEventListener {
private final CustomDayLogRepository customDayLogRepository;
private final CustomItemRepository customItemRepository;
private final PlaceRepository placeRepository;
private final ExpenseRepository expenseRepository;
private final ImageRepository imageRepository;
private final ItemRepository itemRepository;
private final DayLogRepository dayLogRepository;
private final TripCityRepository tripCityRepository;
private final TripRepository tripRepository;
private final RefreshTokenRepository refreshTokenRepository;
@Async
@Transactional(propagation = REQUIRES_NEW)
@TransactionalEventListener(fallbackExecution = true)
public void deleteMember(final MemberDeleteEvent event) {
final List<Long> dayLogIds = customDayLogRepository.findDayLogIdsByTripIds(event.getTripIds());
final List<ItemElement> itemElements = customItemRepository.findItemIdsByDayLogIds(dayLogIds);
deletePlaces(itemElements);
deleteExpenses(itemElements);
deleteImageAndItems(itemElements);
dayLogRepository.deleteByIds(dayLogIds);
tripRepository.deleteByMemberId(event.getMemberId());
refreshTokenRepository.deleteByMemberId(event.getMemberId());
}
@Async
@Transactional(propagation = REQUIRES_NEW)
@TransactionalEventListener(fallbackExecution = true)
public void deleteTrip(final TripDeleteEvent event) {
final List<Long> dayLogIds = customDayLogRepository.findDayLogIdsByTripId(event.getTripId());
final List<ItemElement> itemElements = customItemRepository.findItemIdsByDayLogIds(dayLogIds);
deletePlaces(itemElements);
deleteExpenses(itemElements);
deleteImageAndItems(itemElements);
dayLogRepository.deleteByIds(dayLogIds);
tripCityRepository.deleteAllByTripId(event.getTripId());
}
private void deletePlaces(final List<ItemElement> itemElements) {
final List<Long> placeIds = itemElements.stream()
.map(ItemElement::getPlaceId)
.toList();
placeRepository.deleteByIds(placeIds);
}
private void deleteExpenses(final List<ItemElement> itemElements) {
final List<Long> expenseIds = itemElements.stream()
.map(ItemElement::getExpenseId)
.toList();
expenseRepository.deleteByIds(expenseIds);
}
private void deleteImageAndItems(final List<ItemElement> itemElements) {
final List<Long> itemIds = itemElements.stream()
.map(ItemElement::getItemId)
.toList();
imageRepository.deleteByItemIds(itemIds);
itemRepository.deleteByIds(itemIds);
}
}