Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,7 @@ public ResponseEntity<ListResponse<PersonalEventResponse>> getPersonalEvents(
@PostMapping
public ResponseEntity<PersonalEventResponse> createPersonalEvent(
@Valid @RequestBody PersonalEventRequest request) {
PersonalEvent personalEvent = personalEventService.createWithRequest(request);
PersonalEventResponse response = PersonalEventResponse.fromEntity(personalEvent);
PersonalEventResponse response = personalEventService.createWithRequest(request);
URI location = URIUtil.buildResourceUri(response.id());
return ResponseEntity.created(location).body(response);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,26 @@ public ListResponse<PersonalEventResponse> listPersonalEvents(
return new ListResponse<>(personalEventResponseList);
}

public PersonalEvent createWithRequest(PersonalEventRequest request) {
public PersonalEventResponse createWithRequest(PersonalEventRequest request) {
User user = userService.getCurrentUser();

List<Discussion> discussions = discussionParticipantService
.getDiscussionsByUserId(user.getId());

PersonalEvent personalEvent = createPersonalEvent(request, user, discussions);

if (request.syncWithGoogleCalendar()) {
String calendarId = calendarService.getCalendarIdByUser(user);
personalEvent.setGoogleEventId(IdGenerator.generateId(user.getId()));
personalEvent.setCalendarId(calendarId);
eventPublisher.publishEvent(new InsertPersonalEvent(List.of(personalEvent)));
}

return PersonalEventResponse.fromEntity(personalEvent);
}

private PersonalEvent createPersonalEvent(PersonalEventRequest request, User user,
List<Discussion> discussions) {
Validator.validateDateTimeRange(request.startDateTime(), request.endDateTime());

PersonalEvent personalEvent = PersonalEvent.builder()
Expand All @@ -79,29 +96,17 @@ public PersonalEvent createWithRequest(PersonalEventRequest request) {
.user(user)
.build();

PersonalEvent result = personalEventRepository.save(personalEvent);

if (request.syncWithGoogleCalendar()) {
String calendarId = calendarService.getCalendarIdByUser(user);
personalEvent.setGoogleEventId(IdGenerator.generateId(user.getId()));
personalEvent.setCalendarId(calendarId);
eventPublisher.publishEvent(new InsertPersonalEvent(List.of(personalEvent)));
}

List<Discussion> discussions = discussionParticipantService.getDiscussionsByUserId(
user.getId());
PersonalEvent savedPersonalEvent = personalEventRepository.save(personalEvent);

discussions.forEach(discussion -> {
personalEventPreprocessor.preprocessOne(result, discussion, user,
true);
personalEventPreprocessor.preprocessOne(savedPersonalEvent, discussion, user, true);
});

return result;
return savedPersonalEvent;
}

public void createPersonalEventsForParticipants(List<User> participants,
Discussion discussion,
SharedEventDto sharedEvent) {
Discussion discussion, SharedEventDto sharedEvent) {
List<Long> userIds = participants.stream().map(User::getId).toList();
Map<Long, String> calendarIdMap = calendarService.getCalendarIdByUsers(userIds);
List<PersonalEvent> events = participants.stream()
Expand Down Expand Up @@ -251,14 +256,14 @@ private Optional<SyncPersonalEvent> syncPersonalEventFromGoogleEvent(
if (personalEventOpt.isPresent()) {
PersonalEvent personalEvent = personalEventOpt.get();
PersonalEvent updatedPersonalEvent = updatePersonalEvent(
PersonalEventRequest.of(googleEvent, personalEvent.getIsAdjustable()),
personalEvent, user, discussions);
PersonalEventRequest.of(googleEvent, personalEvent.getIsAdjustable()),
personalEvent, user, discussions);

yield Optional.of(SyncPersonalEvent.from(updatedPersonalEvent, Status.UPDATED));
}

PersonalEvent personalEvent =
createWithRequest(PersonalEventRequest.of(googleEvent, false));
PersonalEvent personalEvent = createPersonalEvent(
PersonalEventRequest.of(googleEvent, false), user, discussions);

yield Optional.of(SyncPersonalEvent.from(personalEvent, Status.CREATED));
}
Expand Down
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

before commit으로 하신 이유가 있을까여?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

잘 몰라서 그냥 질문임당

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

기존에 비동기로 처리할 때는 AFTER_COMMIT이어도 다른 쓰레드로 실행되어 새로운 트랜잭션을 시작하게 됩니다. 하지만 동기로 처리할 때 AFTER_COMMIT인 상태라면 이전의 트랜잭션 내에서 실행하게 되는데, 이 때 commit이 실행된 이후이기 때문에 이후에 실행되는 SQL이 commit되지 않는 문제가 있다고 합니다. 그래서 BEFORE_COMMIT으로 하게 되었습니다.

그런데 더 찾아보니 현재 구조에서 BEFORE_COMMIT을 하면 문제가 생길 거 같아서 수정하고 다시 올리겠습니다

Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;

@Component
Expand All @@ -29,8 +30,9 @@ public void insert(InsertPersonalEvent event) {
googleCalendarService.insertPersonalEvents(personalEventList);
}

@Async
@TransactionalEventListener(classes = {GoogleCalendarLinkEvent.class})
@TransactionalEventListener(
classes = {GoogleCalendarLinkEvent.class},
phase = TransactionPhase.BEFORE_COMMIT)
public void link(GoogleCalendarLinkEvent event) {
User user = event.user();
googleCalendarService.upsertGoogleCalendar(user);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,13 @@ void createPersonalEvent() throws Exception {
"isAdjustable": false
}
""";
PersonalEvent personalEvent = mock(PersonalEvent.class);
given(personalEvent.getId()).willReturn(1L);
// PersonalEvent personalEvent = mock(PersonalEvent.class);
// given(personalEvent.getId()).willReturn(1L);
PersonalEventResponse personalEventResponse = new PersonalEventResponse(1L, "title",
LocalDateTime.of(2025, 2, 2, 10, 0),
LocalDateTime.of(2025, 2, 2, 12, 0),
false, "testCalendarId");
given(personalEventService.createWithRequest(any())).willReturn(personalEvent);
given(personalEventService.createWithRequest(any())).willReturn(personalEventResponse);

MvcResult result = mockMvc.perform(post("/api/v1/personal-event").
contentType(MediaType.APPLICATION_JSON)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,12 @@ void testCreateWithRequest() {
given(personalEventRepository.save(any(PersonalEvent.class))).willReturn(savedEvent);

// when
PersonalEvent response = personalEventService.createWithRequest(request);
PersonalEventResponse response = personalEventService.createWithRequest(request);

// then
assertThat(response).isNotNull();
assertThat(response.getTitle()).isEqualTo(request.title());
assertThat(response.getStartTime()).isEqualTo(startTime);
assertThat(response.title()).isEqualTo(request.title());
assertThat(response.startDateTime()).isEqualTo(startTime);

verify(userService, times(1)).getCurrentUser();
verify(personalEventRepository, times(1)).save(any(PersonalEvent.class));
Expand Down
Loading