diff --git a/eeos/src/main/java/com/blackcompany/eeos/calendar/application/dto/CalendarResponse.java b/eeos/src/main/java/com/blackcompany/eeos/calendar/application/dto/CalendarResponse.java index e356d34a..113cc3c7 100644 --- a/eeos/src/main/java/com/blackcompany/eeos/calendar/application/dto/CalendarResponse.java +++ b/eeos/src/main/java/com/blackcompany/eeos/calendar/application/dto/CalendarResponse.java @@ -6,7 +6,7 @@ import java.util.Locale; public record CalendarResponse( - Long id, String title, String url, String type, Long startAt, Long endAt, String writer) + Long calendarId, String title, String url, String type, Long startAt, Long endAt, String writer) implements AbstractResponseDto { public static CalendarResponse toResponse(CalendarModel model, String writerName) { diff --git a/eeos/src/main/java/com/blackcompany/eeos/calendar/application/exception/DeniedCalendarTypeException.java b/eeos/src/main/java/com/blackcompany/eeos/calendar/application/exception/DeniedCalendarTypeException.java index ecc4851e..9ccee8d1 100644 --- a/eeos/src/main/java/com/blackcompany/eeos/calendar/application/exception/DeniedCalendarTypeException.java +++ b/eeos/src/main/java/com/blackcompany/eeos/calendar/application/exception/DeniedCalendarTypeException.java @@ -16,6 +16,6 @@ public DeniedCalendarTypeException(Department department) { @Override public String getMessage() { - return String.format("%s 부서는 해당 타입의 칼렌더를 생성할 수 없습니다.", department.name()); + return String.format("%s 부서는 해당 타입의 칼렌더를 생성할 수 없습니다.", department.getKoName()); } } diff --git a/eeos/src/main/java/com/blackcompany/eeos/calendar/persistence/CalendarEntity.java b/eeos/src/main/java/com/blackcompany/eeos/calendar/persistence/CalendarEntity.java index 71096bb4..4ff62fc1 100644 --- a/eeos/src/main/java/com/blackcompany/eeos/calendar/persistence/CalendarEntity.java +++ b/eeos/src/main/java/com/blackcompany/eeos/calendar/persistence/CalendarEntity.java @@ -51,7 +51,7 @@ public class CalendarEntity extends BaseEntity { @Column(name = ENTITY_PREFIX + "_title", nullable = false) private String title; - @Column(name = ENTITY_PREFIX + "_url", nullable = false) + @Column(name = ENTITY_PREFIX + "_url", nullable = true) private String url; @Column(name = ENTITY_PREFIX + "_start_at", nullable = false) diff --git a/eeos/src/main/java/com/blackcompany/eeos/program/application/event/CreatedProgramEvent.java b/eeos/src/main/java/com/blackcompany/eeos/program/application/event/CreatedProgramEvent.java new file mode 100644 index 00000000..8037da4a --- /dev/null +++ b/eeos/src/main/java/com/blackcompany/eeos/program/application/event/CreatedProgramEvent.java @@ -0,0 +1,16 @@ +package com.blackcompany.eeos.program.application.event; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public class CreatedProgramEvent { + + private final Long programId; + + public static CreatedProgramEvent of(Long programId) { + return new CreatedProgramEvent(programId); + } +} diff --git a/eeos/src/main/java/com/blackcompany/eeos/program/application/event/CreatedProgramEventListener.java b/eeos/src/main/java/com/blackcompany/eeos/program/application/event/CreatedProgramEventListener.java new file mode 100644 index 00000000..d83475e4 --- /dev/null +++ b/eeos/src/main/java/com/blackcompany/eeos/program/application/event/CreatedProgramEventListener.java @@ -0,0 +1,51 @@ +package com.blackcompany.eeos.program.application.event; + +import com.blackcompany.eeos.calendar.application.dto.CalendarCreateCommand; +import com.blackcompany.eeos.calendar.application.model.CalendarType; +import com.blackcompany.eeos.calendar.application.usecase.CreateCalendarUsecase; +import com.blackcompany.eeos.program.application.exception.NotFoundProgramException; +import com.blackcompany.eeos.program.application.model.ProgramModel; +import com.blackcompany.eeos.program.application.model.converter.ProgramEntityConverter; +import com.blackcompany.eeos.program.persistence.ProgramRepository; +import java.util.Locale; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +@RequiredArgsConstructor +public class CreatedProgramEventListener { + + private final CreateCalendarUsecase calendarUsecase; + private final ProgramRepository programRepository; + private final ProgramEntityConverter entityConverter; + + @Transactional(propagation = Propagation.REQUIRES_NEW) + @TransactionalEventListener( + value = CreatedProgramEvent.class, + phase = TransactionPhase.AFTER_COMMIT) + public void createCalendar(CreatedProgramEvent event) { + Long programId = event.getProgramId(); + + ProgramModel program = + entityConverter.from( + programRepository + .findById(programId) + .orElseThrow(() -> new NotFoundProgramException(programId))); + + Long programDateMilli = program.getProgramDate().toInstant().toEpochMilli(); + + CalendarCreateCommand command = + new CalendarCreateCommand( + program.getTitle(), + null, + CalendarType.PRESENTATION.name().toLowerCase(Locale.ROOT), + programDateMilli, + programDateMilli); + + calendarUsecase.create(command); + } +} diff --git a/eeos/src/main/java/com/blackcompany/eeos/program/application/service/ProgramService.java b/eeos/src/main/java/com/blackcompany/eeos/program/application/service/ProgramService.java index 61807211..1b9dc595 100644 --- a/eeos/src/main/java/com/blackcompany/eeos/program/application/service/ProgramService.java +++ b/eeos/src/main/java/com/blackcompany/eeos/program/application/service/ProgramService.java @@ -15,6 +15,7 @@ import com.blackcompany.eeos.program.application.dto.converter.ProgramPageResponseConverter; import com.blackcompany.eeos.program.application.dto.converter.ProgramResponseConverter; import com.blackcompany.eeos.program.application.dto.converter.QueryAccessRightResponseConverter; +import com.blackcompany.eeos.program.application.event.CreatedProgramEvent; import com.blackcompany.eeos.program.application.event.DeletedProgramEvent; import com.blackcompany.eeos.program.application.exception.DeniedProgramEditException; import com.blackcompany.eeos.program.application.exception.NotFoundProgramException; @@ -92,6 +93,8 @@ public CommandProgramResponse create(final Long memberId, final CreateProgramReq presentTeamUsecase.save(saveId, request.getTeamIds()); quitUsecase.reserveQuitProgram(model.toBuilder().id(saveId).build()); + applicationEventPublisher.publishEvent(CreatedProgramEvent.of(saveId)); + return responseConverter.from(saveId); }