From 6215ac5df19309874160719e754b2d3bb2a930c5 Mon Sep 17 00:00:00 2001 From: paragon0107 Date: Tue, 1 Apr 2025 20:46:26 +0900 Subject: [PATCH 01/26] =?UTF-8?q?chore:=20=EC=9E=84=EC=8B=9C=20=EC=BB=A4?= =?UTF-8?q?=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- build.gradle.kts | 4 ++ .../schedule/domain/ScheduleRepository.java | 2 + .../ScheduleRepositoryAdapter.java | 20 ++++++ .../ScheduleEntityJpaRepository.java | 2 + .../scheduler/scheduleAlarmScheduler.java | 22 ++++++ .../schedule/service/CloudTaskAdapter.java | 70 +++++++++++++++++++ .../schedule/service/ScheduleService.java | 5 ++ .../service/usecase/ScheduleGetUseCase.java | 3 + 9 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java create mode 100644 src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java diff --git a/.gitignore b/.gitignore index b61eb11b..61f07020 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,5 @@ out/ application-secret.yml braindump-prompt.txt -prioritize-prompt.txt \ No newline at end of file +prioritize-prompt.txt +cloud-task-key.json \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 40bced0b..3b637e60 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -76,6 +76,10 @@ dependencies { implementation("com.google.api-client:google-api-client:2.2.0") implementation ("com.google.oauth-client:google-oauth-client-jetty:1.34.1") implementation("com.google.apis:google-api-services-calendar:v3-rev20250115-2.0.0") + + //Google Cloud Task + implementation ("com.google.cloud:google-cloud-tasks:2.40.0") + implementation ("com.google.auth:google-auth-library-oauth2-http:1.20.0") } kotlin { diff --git a/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java b/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java index fbbb3dc6..10e19ffa 100644 --- a/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java +++ b/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java @@ -33,4 +33,6 @@ public interface ScheduleRepository { List findAllByStartDateAndMemberId(final LocalDate startDate, final long memberId); List findAllAppleByMemberId(final long memberId); + + List findByStartDateAfterAndEndDateLessThanEqual(final LocalDateTime startTime, final LocalDateTime endTime); } diff --git a/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java b/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java index 1ae5a0f0..2360fca0 100644 --- a/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java +++ b/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java @@ -219,6 +219,26 @@ public List findAllByScheduleGroupIdAndStartDateGreaterThanEqual(Strin )).toList(); } + @Override + public List findByStartDateAfterAndEndDateLessThanEqual(final LocalDateTime startTime, final LocalDateTime endTime) { + List scheduleEntities = scheduleEntityJpaRepository.findByStartDateAfterAndEndDateLessThanEqual(startTime, endTime); + return scheduleEntities.stream().map(scheduleEntity -> Schedule.withId( + scheduleEntity.getId(), + scheduleEntity.getMemberId(), + scheduleEntity.getDescription(), + scheduleEntity.getStartDate(), + scheduleEntity.getEndDate(), + scheduleEntity.isAllDay(), + scheduleEntity.getRepeatOption(), + scheduleEntity.getRepeatExpiredDate(), + scheduleEntity.getType(), + scheduleEntity.getScheduleGroupId(), + scheduleEntity.getCreatedAt(), + scheduleEntity.getUpdatedAt(), + scheduleEntity.getTagId() + )).toList(); + } + @Override public void updateTagForSchedules(final long oldTagId, final long newTagId){ scheduleEntityJpaRepository.updateTagForSchedules(oldTagId, newTagId); diff --git a/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleEntityJpaRepository.java b/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleEntityJpaRepository.java index 2dc46840..ccb78352 100644 --- a/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleEntityJpaRepository.java +++ b/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleEntityJpaRepository.java @@ -96,6 +96,8 @@ List findSchedulesByMemberIdAndDateOrderedByOrderNu void deleteAllByScheduleGroupId(final String groupId); + List findByStartDateAfterAndEndDateLessThanEqual(final LocalDateTime startTime, final LocalDateTime endTime); + @Modifying @Query("UPDATE ScheduleEntity s SET s.tagId = :newTagId WHERE s.tagId = :oldTagId") void updateTagForSchedules(@Param("oldTagId") Long oldTagId, @Param("newTagId") Long newTagId); diff --git a/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java b/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java new file mode 100644 index 00000000..71a6f80b --- /dev/null +++ b/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java @@ -0,0 +1,22 @@ +package com.official.memento.schedule.scheduler; + +import com.official.memento.schedule.service.CloudTaskAdapter; +import com.official.memento.schedule.service.usecase.ScheduleGetUseCase; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class scheduleAlarmScheduler { + + private final CloudTaskAdapter cloudTaskAdapter; + + private final ScheduleGetUseCase scheduleGetUseCase; + + @Scheduled(cron = "0 30 0 * * *", zone = "UTC") // 매일 UTC 기준 0시 30분 + public void setScheduleAlarm() { + + scheduleGetUseCase.getSchedulesBetween() + } +} diff --git a/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java b/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java new file mode 100644 index 00000000..37cdcc02 --- /dev/null +++ b/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java @@ -0,0 +1,70 @@ +package com.official.memento.schedule.service; + +import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.cloud.tasks.v2.*; +import com.google.protobuf.ByteString; +import com.google.protobuf.Timestamp; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.FileInputStream; +import java.io.IOException; +import java.time.Instant; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; + +@Service +@RequiredArgsConstructor +public class CloudTaskAdapter { + + @Value("${gcp.project-id}") + private String projectId; + + @Value("${gcp.location-id}") + private String locationId; + + @Value("${gcp.queue-id}") + private String queueId; + + @Value("${gcp.target-url}") + private String targetUrl; + + @Value("${gcp.service-account-key-path}") + private String serviceAccountKeyPath; + + public void createTask(String scheduleId) throws IOException { + ZonedDateTime executeTime = ZonedDateTime.now(ZoneOffset.UTC).plusMinutes(10); + GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(serviceAccountKeyPath)); + CloudTasksSettings settings = CloudTasksSettings.newBuilder() + .setCredentialsProvider(FixedCredentialsProvider.create(credentials)) + .build(); + + try (CloudTasksClient client = CloudTasksClient.create(settings)) { + String queuePath = QueueName.of(projectId, locationId, queueId).toString(); + + Instant instant = executeTime.toInstant(); + Timestamp timestamp = Timestamp.newBuilder() + .setSeconds(instant.getEpochSecond()) + .setNanos(instant.getNano()) + .build(); + + String payload = "{\"scheduleId\":\"" + scheduleId + "\"}"; + + HttpRequest httpRequest = HttpRequest.newBuilder() + .setUrl(targetUrl) + .setHttpMethod(HttpMethod.POST) + .putHeaders("Content-Type", "application/json") + .setBody(ByteString.copyFromUtf8(payload)) + .build(); + + Task task = Task.newBuilder() + .setHttpRequest(httpRequest) + .setScheduleTime(timestamp) + .build(); + + client.createTask(queuePath, task); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/official/memento/schedule/service/ScheduleService.java b/src/main/java/com/official/memento/schedule/service/ScheduleService.java index 64eda222..22e12495 100644 --- a/src/main/java/com/official/memento/schedule/service/ScheduleService.java +++ b/src/main/java/com/official/memento/schedule/service/ScheduleService.java @@ -333,6 +333,11 @@ public List getSchedules(final long memberId, final LocalDate date) { return scheduleRepository.findAllByStartDateAndMemberId(date, memberId); } + @Override + public List getSchedulesBetween(final LocalDateTime startDateTime,final LocalDateTime endDateTime) { + return scheduleRepository.findByStartDateAfterAndEndDateLessThanEqual(startDateTime, endDateTime); + } + private static void checkOwnTag(final long memberId, final Tag tag) { if (tag.getMemberId() != memberId) { throw new InvalidRequestBodyException(ErrorCode.INVALID_REQUEST_BODY); diff --git a/src/main/java/com/official/memento/schedule/service/usecase/ScheduleGetUseCase.java b/src/main/java/com/official/memento/schedule/service/usecase/ScheduleGetUseCase.java index 86e63bef..c9746090 100644 --- a/src/main/java/com/official/memento/schedule/service/usecase/ScheduleGetUseCase.java +++ b/src/main/java/com/official/memento/schedule/service/usecase/ScheduleGetUseCase.java @@ -3,6 +3,7 @@ import com.official.memento.schedule.domain.entity.Schedule; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; public interface ScheduleGetUseCase { @@ -14,4 +15,6 @@ public interface ScheduleGetUseCase { List getSchedules(final long memberId, final LocalDate date); + List getSchedulesBetween(final LocalDateTime startDateTime, final LocalDateTime endDateTime); + } From db6f17db4e050b4798b18fa7a8dae761978522fc Mon Sep 17 00:00:00 2001 From: smg0725 Date: Wed, 2 Apr 2025 13:00:02 +0900 Subject: [PATCH 02/26] =?UTF-8?q?chore:=20=EC=8A=A4=EC=BC=80=EC=A4=84=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=8A=A4=EC=BC=80=EC=A4=84?= =?UTF-8?q?=EB=A7=81=20=EA=B4=80=EB=A0=A8=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schedule/domain/ScheduleRepository.java | 2 +- .../ScheduleRepositoryAdapter.java | 4 ++-- .../persistence/ScheduleEntityJpaRepository.java | 16 +++++++++++++++- .../schedule/service/ScheduleService.java | 2 +- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java b/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java index 10e19ffa..cbe200eb 100644 --- a/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java +++ b/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java @@ -34,5 +34,5 @@ public interface ScheduleRepository { List findAllAppleByMemberId(final long memberId); - List findByStartDateAfterAndEndDateLessThanEqual(final LocalDateTime startTime, final LocalDateTime endTime); + List findSchedulesWithMemberInfoBetween(final LocalDateTime startTime, final LocalDateTime endTime); } diff --git a/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java b/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java index 2360fca0..1c6fced6 100644 --- a/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java +++ b/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java @@ -220,8 +220,8 @@ public List findAllByScheduleGroupIdAndStartDateGreaterThanEqual(Strin } @Override - public List findByStartDateAfterAndEndDateLessThanEqual(final LocalDateTime startTime, final LocalDateTime endTime) { - List scheduleEntities = scheduleEntityJpaRepository.findByStartDateAfterAndEndDateLessThanEqual(startTime, endTime); + public List findSchedulesWithMemberInfoBetween(final LocalDateTime startTime, final LocalDateTime endTime) { + List scheduleEntities = scheduleEntityJpaRepository.findSchedulesWithMemberInfoBetween(startTime, endTime); return scheduleEntities.stream().map(scheduleEntity -> Schedule.withId( scheduleEntity.getId(), scheduleEntity.getMemberId(), diff --git a/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleEntityJpaRepository.java b/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleEntityJpaRepository.java index ccb78352..ed8c6420 100644 --- a/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleEntityJpaRepository.java +++ b/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleEntityJpaRepository.java @@ -92,11 +92,25 @@ List findSchedulesByMemberIdAndDateOrderedByOrderNu LocalDate date ); + @Query(""" + SELECT s.id as scheduleId, + s.memberId as memberId, + s.description as description, + s.startDate as startDate, + s.endDate as endDate, + m.wakeUpTime as wakeUpTime, + m.windDownTime as windDownTime, + m.timeZoneOffset as timeZoneOffset + FROM ScheduleEntity s + JOIN MemberPersonalInfoEntity m ON s.memberId = m.memberId + WHERE s.startDate BETWEEN :start AND :end + """) + List findSchedulesWithMemberInfoBetween(final LocalDateTime startTime, final LocalDateTime endTime); + List findAllByMemberIdAndType(long memberId, ScheduleType type); void deleteAllByScheduleGroupId(final String groupId); - List findByStartDateAfterAndEndDateLessThanEqual(final LocalDateTime startTime, final LocalDateTime endTime); @Modifying @Query("UPDATE ScheduleEntity s SET s.tagId = :newTagId WHERE s.tagId = :oldTagId") diff --git a/src/main/java/com/official/memento/schedule/service/ScheduleService.java b/src/main/java/com/official/memento/schedule/service/ScheduleService.java index 22e12495..eec8a6dd 100644 --- a/src/main/java/com/official/memento/schedule/service/ScheduleService.java +++ b/src/main/java/com/official/memento/schedule/service/ScheduleService.java @@ -335,7 +335,7 @@ public List getSchedules(final long memberId, final LocalDate date) { @Override public List getSchedulesBetween(final LocalDateTime startDateTime,final LocalDateTime endDateTime) { - return scheduleRepository.findByStartDateAfterAndEndDateLessThanEqual(startDateTime, endDateTime); + return scheduleRepository.findSchedulesWithMemberInfoBetween(startDateTime, endDateTime); } private static void checkOwnTag(final long memberId, final Tag tag) { From 4cb50bd35aa820b20c99c33f7ee09b9b36c99b1d Mon Sep 17 00:00:00 2001 From: smg0725 Date: Wed, 2 Apr 2025 13:00:14 +0900 Subject: [PATCH 03/26] =?UTF-8?q?chore:=20=EC=8A=A4=EC=BC=80=EC=A4=84=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=8A=A4=EC=BC=80=EC=A4=84?= =?UTF-8?q?=EB=A7=81=20=EA=B4=80=EB=A0=A8=20=EC=A1=B0=ED=9A=8C=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EC=A0=9D=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ScheduleMemberInfoProjection.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/com/official/memento/schedule/infrastructure/persistence/projection/ScheduleMemberInfoProjection.java diff --git a/src/main/java/com/official/memento/schedule/infrastructure/persistence/projection/ScheduleMemberInfoProjection.java b/src/main/java/com/official/memento/schedule/infrastructure/persistence/projection/ScheduleMemberInfoProjection.java new file mode 100644 index 00000000..42934128 --- /dev/null +++ b/src/main/java/com/official/memento/schedule/infrastructure/persistence/projection/ScheduleMemberInfoProjection.java @@ -0,0 +1,17 @@ +package com.official.memento.schedule.infrastructure.persistence.projection; + +import java.time.LocalDateTime; +import java.time.LocalTime; + +public interface ScheduleMemberInfoProjection { + Long getScheduleId(); + Long getMemberId(); + String getDescription(); + LocalDateTime getStartDate(); + LocalDateTime getEndDate(); + + // MemberPersonalInfoEntity + LocalTime getWakeUpTime(); + LocalTime getWindDownTime(); + Integer getTimeZoneOffset(); +} From a008577aad460ee0fbd9e0b55d7a03561a611fc0 Mon Sep 17 00:00:00 2001 From: smg0725 Date: Wed, 2 Apr 2025 13:00:41 +0900 Subject: [PATCH 04/26] =?UTF-8?q?chore:=20=EC=8A=A4=EC=BC=80=EC=A4=84=20?= =?UTF-8?q?=EC=95=8C=EB=9E=8C=20=EC=8B=9C=EA=B0=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schedule/scheduler/scheduleAlarmScheduler.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java b/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java index 71a6f80b..e0a4905b 100644 --- a/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java +++ b/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java @@ -1,7 +1,11 @@ package com.official.memento.schedule.scheduler; +import com.official.memento.schedule.domain.entity.Schedule; import com.official.memento.schedule.service.CloudTaskAdapter; import com.official.memento.schedule.service.usecase.ScheduleGetUseCase; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -16,7 +20,8 @@ public class scheduleAlarmScheduler { @Scheduled(cron = "0 30 0 * * *", zone = "UTC") // 매일 UTC 기준 0시 30분 public void setScheduleAlarm() { - - scheduleGetUseCase.getSchedulesBetween() + LocalDateTime now = LocalDateTime.now(ZoneId.of("UTC")); + LocalDateTime tomorrow = now.plusDays(1); + List schedules = scheduleGetUseCase.getSchedulesBetween(now, tomorrow); } } From f2a582ce9cd19eecc64cc22ad5a951953c9b6fc8 Mon Sep 17 00:00:00 2001 From: paragon0107 Date: Sat, 5 Apr 2025 10:44:12 +0900 Subject: [PATCH 05/26] =?UTF-8?q?feat:=20querydsl=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index 3b637e60..9f412f32 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -80,6 +80,13 @@ dependencies { //Google Cloud Task implementation ("com.google.cloud:google-cloud-tasks:2.40.0") implementation ("com.google.auth:google-auth-library-oauth2-http:1.20.0") + + //queryDsl + + implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta") + annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jakarta") + annotationProcessor ("jakarta.annotation:jakarta.annotation-api") + annotationProcessor ("jakarta.persistence:jakarta.persistence-api") } kotlin { From 9b0e84170552b05aa4ad3b06a5a6bf8e2c2af584 Mon Sep 17 00:00:00 2001 From: paragon0107 Date: Sat, 5 Apr 2025 10:44:33 +0900 Subject: [PATCH 06/26] =?UTF-8?q?feat:=20querydsl=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memento/global/config/QueryDslConfig.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/com/official/memento/global/config/QueryDslConfig.java diff --git a/src/main/java/com/official/memento/global/config/QueryDslConfig.java b/src/main/java/com/official/memento/global/config/QueryDslConfig.java new file mode 100644 index 00000000..369847bb --- /dev/null +++ b/src/main/java/com/official/memento/global/config/QueryDslConfig.java @@ -0,0 +1,19 @@ +package com.official.memento.global.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@AllArgsConstructor +public class QueryDslConfig { + + private final EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory(final EntityManager entityManager) { + return new JPAQueryFactory(entityManager); + } +} From 6e8fa80601646ef95071bf591612da652ced1486 Mon Sep 17 00:00:00 2001 From: paragon0107 Date: Sat, 5 Apr 2025 10:45:13 +0900 Subject: [PATCH 07/26] =?UTF-8?q?feat:=20ScheduleAlarmCustomRepository=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ScheduleAlarmCustomRepository.java | 49 +++++++++++++++++++ .../projection/ScheduleAlarmProjection.java | 14 ++++++ .../ScheduleMemberInfoProjection.java | 17 ------- 3 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleAlarmCustomRepository.java create mode 100644 src/main/java/com/official/memento/schedule/infrastructure/persistence/projection/ScheduleAlarmProjection.java delete mode 100644 src/main/java/com/official/memento/schedule/infrastructure/persistence/projection/ScheduleMemberInfoProjection.java diff --git a/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleAlarmCustomRepository.java b/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleAlarmCustomRepository.java new file mode 100644 index 00000000..12aa1f09 --- /dev/null +++ b/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleAlarmCustomRepository.java @@ -0,0 +1,49 @@ +package com.official.memento.schedule.infrastructure.persistence; + +import com.official.memento.member.domain.MemberPersonalInfo; +import com.official.memento.member.infrastructure.persistence.entity.MemberPersonalInfoEntity; +import com.official.memento.member.infrastructure.persistence.entity.QMemberPersonalInfoEntity; +import com.official.memento.schedule.infrastructure.persistence.projection.ScheduleAlarmProjection; +import com.querydsl.core.Tuple; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Repository +@RequiredArgsConstructor +public class ScheduleAlarmCustomRepository { + + private final JPAQueryFactory queryFactory; + QScheduleEntity schedule = QScheduleEntity.scheduleEntity; + QMemberPersonalInfoEntity memberPersonalInfo = QMemberPersonalInfoEntity.memberPersonalInfoEntity; + + public List findSchedulesWithMemberInfoBetween( + final LocalDateTime startDate, + final LocalDateTime endDate + ) { + List results = queryFactory + .select(schedule.id, schedule.memberId, schedule.description, schedule.startDate, schedule.endDate, memberPersonalInfo.timeZoneOffset) + .from(schedule) + .join(memberPersonalInfo).on(schedule.memberId.eq(memberPersonalInfo.memberId)) + .where(schedule.startDate.between(startDate, endDate)) + .fetch(); + + return results.stream() + .map(tuple -> new ScheduleAlarmProjection( + tuple.get(schedule.id), + tuple.get(schedule.memberId), + tuple.get(schedule.description), + tuple.get(schedule.startDate), + tuple.get(schedule.endDate), + tuple.get(memberPersonalInfo.timeZoneOffset) + )) + .collect(Collectors.toList()); + } + + +} diff --git a/src/main/java/com/official/memento/schedule/infrastructure/persistence/projection/ScheduleAlarmProjection.java b/src/main/java/com/official/memento/schedule/infrastructure/persistence/projection/ScheduleAlarmProjection.java new file mode 100644 index 00000000..9098a0a7 --- /dev/null +++ b/src/main/java/com/official/memento/schedule/infrastructure/persistence/projection/ScheduleAlarmProjection.java @@ -0,0 +1,14 @@ +package com.official.memento.schedule.infrastructure.persistence.projection; + +import java.time.LocalDateTime; +import java.time.LocalTime; + +public record ScheduleAlarmProjection( + Long scheduleId, + Long memberId, + String description, + LocalDateTime startDate, + LocalDateTime endDate, + Integer timeZoneOffset +) { +} \ No newline at end of file diff --git a/src/main/java/com/official/memento/schedule/infrastructure/persistence/projection/ScheduleMemberInfoProjection.java b/src/main/java/com/official/memento/schedule/infrastructure/persistence/projection/ScheduleMemberInfoProjection.java deleted file mode 100644 index 42934128..00000000 --- a/src/main/java/com/official/memento/schedule/infrastructure/persistence/projection/ScheduleMemberInfoProjection.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.official.memento.schedule.infrastructure.persistence.projection; - -import java.time.LocalDateTime; -import java.time.LocalTime; - -public interface ScheduleMemberInfoProjection { - Long getScheduleId(); - Long getMemberId(); - String getDescription(); - LocalDateTime getStartDate(); - LocalDateTime getEndDate(); - - // MemberPersonalInfoEntity - LocalTime getWakeUpTime(); - LocalTime getWindDownTime(); - Integer getTimeZoneOffset(); -} From be5f723ddd79a66124003da7bfdf0b93ab42a35a Mon Sep 17 00:00:00 2001 From: paragon0107 Date: Sat, 5 Apr 2025 10:45:30 +0900 Subject: [PATCH 08/26] =?UTF-8?q?feat:=20ScheduleAlarmCustomRepository=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../official/memento/schedule/domain/ScheduleRepository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java b/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java index cbe200eb..0ca7f24b 100644 --- a/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java +++ b/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java @@ -1,6 +1,7 @@ package com.official.memento.schedule.domain; import com.official.memento.schedule.domain.entity.Schedule; +import com.official.memento.schedule.domain.entity.ScheduleAlarm; import java.time.LocalDate; import java.time.LocalDateTime; @@ -34,5 +35,5 @@ public interface ScheduleRepository { List findAllAppleByMemberId(final long memberId); - List findSchedulesWithMemberInfoBetween(final LocalDateTime startTime, final LocalDateTime endTime); + List findSchedulesWithMemberInfoBetween(final LocalDateTime startTime, final LocalDateTime endTime); } From 2356c1d3404b94bc37b1b74f0b33e560a6501b67 Mon Sep 17 00:00:00 2001 From: paragon0107 Date: Sat, 5 Apr 2025 10:47:46 +0900 Subject: [PATCH 09/26] =?UTF-8?q?feat:=20ScheduleAlarmRepository=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ScheduleRepositoryAdapter.java | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java b/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java index 1c6fced6..9a809f73 100644 --- a/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java +++ b/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java @@ -5,21 +5,26 @@ import com.official.memento.global.stereotype.Adapter; import com.official.memento.schedule.domain.ScheduleRepository; import com.official.memento.schedule.domain.entity.Schedule; +import com.official.memento.schedule.domain.entity.ScheduleAlarm; import com.official.memento.schedule.domain.enums.ScheduleType; +import com.official.memento.schedule.infrastructure.persistence.ScheduleAlarmCustomRepository; import com.official.memento.schedule.infrastructure.persistence.ScheduleEntity; import com.official.memento.schedule.infrastructure.persistence.ScheduleEntityJpaRepository; +import com.official.memento.schedule.infrastructure.persistence.projection.ScheduleAlarmProjection; import com.official.memento.schedule.infrastructure.persistence.projection.ScheduleOrderInfoProjection; +import lombok.RequiredArgsConstructor; + import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; -import lombok.RequiredArgsConstructor; @Adapter @RequiredArgsConstructor public class ScheduleRepositoryAdapter implements ScheduleRepository { private final ScheduleEntityJpaRepository scheduleEntityJpaRepository; + private final ScheduleAlarmCustomRepository scheduleAlarmCustomRepository; @Override public Schedule save(final Schedule schedule) { @@ -220,22 +225,15 @@ public List findAllByScheduleGroupIdAndStartDateGreaterThanEqual(Strin } @Override - public List findSchedulesWithMemberInfoBetween(final LocalDateTime startTime, final LocalDateTime endTime) { - List scheduleEntities = scheduleEntityJpaRepository.findSchedulesWithMemberInfoBetween(startTime, endTime); - return scheduleEntities.stream().map(scheduleEntity -> Schedule.withId( - scheduleEntity.getId(), - scheduleEntity.getMemberId(), - scheduleEntity.getDescription(), - scheduleEntity.getStartDate(), - scheduleEntity.getEndDate(), - scheduleEntity.isAllDay(), - scheduleEntity.getRepeatOption(), - scheduleEntity.getRepeatExpiredDate(), - scheduleEntity.getType(), - scheduleEntity.getScheduleGroupId(), - scheduleEntity.getCreatedAt(), - scheduleEntity.getUpdatedAt(), - scheduleEntity.getTagId() + public List findSchedulesWithMemberInfoBetween(final LocalDateTime startTime, final LocalDateTime endTime) { + List scheduleAlarmProjections = scheduleAlarmCustomRepository.findSchedulesWithMemberInfoBetween(startTime, endTime); + return scheduleAlarmProjections.stream().map(scheduleEntity -> ScheduleAlarm.of( + scheduleEntity.scheduleId(), + scheduleEntity.memberId(), + scheduleEntity.description(), + scheduleEntity.startDate(), + scheduleEntity.endDate(), + scheduleEntity.timeZoneOffset() )).toList(); } From d34aa775516e3a55ccc415713c1ad4ebca9f9f9f Mon Sep 17 00:00:00 2001 From: paragon0107 Date: Sat, 5 Apr 2025 10:48:04 +0900 Subject: [PATCH 10/26] =?UTF-8?q?feat:=20ScheduleAlarmService=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ScheduleAlarmService.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/com/official/memento/schedule/service/ScheduleAlarmService.java diff --git a/src/main/java/com/official/memento/schedule/service/ScheduleAlarmService.java b/src/main/java/com/official/memento/schedule/service/ScheduleAlarmService.java new file mode 100644 index 00000000..d29db7c2 --- /dev/null +++ b/src/main/java/com/official/memento/schedule/service/ScheduleAlarmService.java @@ -0,0 +1,22 @@ +package com.official.memento.schedule.service; + +import com.official.memento.schedule.domain.ScheduleRepository; +import com.official.memento.schedule.domain.entity.ScheduleAlarm; +import com.official.memento.schedule.service.usecase.ScheduleAlarmGetUseCase; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ScheduleAlarmService implements ScheduleAlarmGetUseCase { + + private final ScheduleRepository scheduleRepository; + + @Override + public List getSchedulesBetween(final LocalDateTime startDateTime, final LocalDateTime endDateTime) { + return scheduleRepository.findSchedulesWithMemberInfoBetween(startDateTime, endDateTime); + } +} From b983425739f2b851226391662ab45c5e769b306d Mon Sep 17 00:00:00 2001 From: paragon0107 Date: Sat, 5 Apr 2025 10:48:20 +0900 Subject: [PATCH 11/26] =?UTF-8?q?feat:=20ScheduleAlarmService=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../official/memento/schedule/service/ScheduleService.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/com/official/memento/schedule/service/ScheduleService.java b/src/main/java/com/official/memento/schedule/service/ScheduleService.java index eec8a6dd..64eda222 100644 --- a/src/main/java/com/official/memento/schedule/service/ScheduleService.java +++ b/src/main/java/com/official/memento/schedule/service/ScheduleService.java @@ -333,11 +333,6 @@ public List getSchedules(final long memberId, final LocalDate date) { return scheduleRepository.findAllByStartDateAndMemberId(date, memberId); } - @Override - public List getSchedulesBetween(final LocalDateTime startDateTime,final LocalDateTime endDateTime) { - return scheduleRepository.findSchedulesWithMemberInfoBetween(startDateTime, endDateTime); - } - private static void checkOwnTag(final long memberId, final Tag tag) { if (tag.getMemberId() != memberId) { throw new InvalidRequestBodyException(ErrorCode.INVALID_REQUEST_BODY); From b002e86831e69b5527596a98516ef40ebf74d690 Mon Sep 17 00:00:00 2001 From: paragon0107 Date: Sat, 5 Apr 2025 10:48:39 +0900 Subject: [PATCH 12/26] =?UTF-8?q?feat:=20ScheduleAlarm=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/usecase/ScheduleAlarmGetUseCase.java | 11 +++++++++++ .../schedule/service/usecase/ScheduleGetUseCase.java | 4 ---- 2 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/official/memento/schedule/service/usecase/ScheduleAlarmGetUseCase.java diff --git a/src/main/java/com/official/memento/schedule/service/usecase/ScheduleAlarmGetUseCase.java b/src/main/java/com/official/memento/schedule/service/usecase/ScheduleAlarmGetUseCase.java new file mode 100644 index 00000000..59ca59da --- /dev/null +++ b/src/main/java/com/official/memento/schedule/service/usecase/ScheduleAlarmGetUseCase.java @@ -0,0 +1,11 @@ +package com.official.memento.schedule.service.usecase; + +import com.official.memento.schedule.domain.entity.Schedule; +import com.official.memento.schedule.domain.entity.ScheduleAlarm; + +import java.time.LocalDateTime; +import java.util.List; + +public interface ScheduleAlarmGetUseCase { + List getSchedulesBetween(final LocalDateTime startDateTime, final LocalDateTime endDateTime); +} diff --git a/src/main/java/com/official/memento/schedule/service/usecase/ScheduleGetUseCase.java b/src/main/java/com/official/memento/schedule/service/usecase/ScheduleGetUseCase.java index c9746090..549cf80e 100644 --- a/src/main/java/com/official/memento/schedule/service/usecase/ScheduleGetUseCase.java +++ b/src/main/java/com/official/memento/schedule/service/usecase/ScheduleGetUseCase.java @@ -3,7 +3,6 @@ import com.official.memento.schedule.domain.entity.Schedule; import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.List; public interface ScheduleGetUseCase { @@ -14,7 +13,4 @@ public interface ScheduleGetUseCase { Schedule getDetail(final long memberId, final long scheduleId); List getSchedules(final long memberId, final LocalDate date); - - List getSchedulesBetween(final LocalDateTime startDateTime, final LocalDateTime endDateTime); - } From 633250e0074d523e9ccf1df6faed09e8e4f8bab0 Mon Sep 17 00:00:00 2001 From: paragon0107 Date: Sat, 5 Apr 2025 10:48:55 +0900 Subject: [PATCH 13/26] =?UTF-8?q?feat:=20ScheduleAlarm=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schedule/domain/entity/ScheduleAlarm.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/java/com/official/memento/schedule/domain/entity/ScheduleAlarm.java diff --git a/src/main/java/com/official/memento/schedule/domain/entity/ScheduleAlarm.java b/src/main/java/com/official/memento/schedule/domain/entity/ScheduleAlarm.java new file mode 100644 index 00000000..93c09c02 --- /dev/null +++ b/src/main/java/com/official/memento/schedule/domain/entity/ScheduleAlarm.java @@ -0,0 +1,36 @@ +package com.official.memento.schedule.domain.entity; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.time.LocalDateTime; + +@AllArgsConstructor +@Getter +public class ScheduleAlarm { + + private final Long scheduleId; + private final Long memberId; + private final String description; + private final LocalDateTime startDate; + private final LocalDateTime endDate; + private final int timeZoneOffset; + + public static ScheduleAlarm of( + final Long scheduleId, + final Long memberId, + final String description, + final LocalDateTime startDate, + final LocalDateTime endDate, + final int timeZoneOffset + ) { + return new ScheduleAlarm( + scheduleId, + memberId, + description, + startDate, + endDate, + timeZoneOffset + ); + } +} From 8d70a4aa8414523dcc27e13ffce1b1e9f685399b Mon Sep 17 00:00:00 2001 From: paragon0107 Date: Sat, 5 Apr 2025 10:49:18 +0900 Subject: [PATCH 14/26] =?UTF-8?q?feat:=20ScheduleAlarm=20=EC=8A=A4?= =?UTF-8?q?=EC=BC=80=EC=A4=84=EB=9F=AC=EB=B0=8F=20=ED=81=B4=EB=9D=BC?= =?UTF-8?q?=EC=9A=B0=EB=93=9C=20=EC=96=B4=EB=8C=91=ED=84=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scheduler/scheduleAlarmScheduler.java | 20 +++++++++++++------ .../schedule/service/CloudTaskAdapter.java | 8 +++++--- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java b/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java index e0a4905b..87e83fa4 100644 --- a/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java +++ b/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java @@ -1,8 +1,9 @@ package com.official.memento.schedule.scheduler; -import com.official.memento.schedule.domain.entity.Schedule; +import com.official.memento.schedule.domain.entity.ScheduleAlarm; import com.official.memento.schedule.service.CloudTaskAdapter; -import com.official.memento.schedule.service.usecase.ScheduleGetUseCase; +import com.official.memento.schedule.service.usecase.ScheduleAlarmGetUseCase; + import java.time.LocalDateTime; import java.time.ZoneId; import java.util.List; @@ -16,12 +17,19 @@ public class scheduleAlarmScheduler { private final CloudTaskAdapter cloudTaskAdapter; - private final ScheduleGetUseCase scheduleGetUseCase; + private final ScheduleAlarmGetUseCase scheduleAlarmGetUseCase; - @Scheduled(cron = "0 30 0 * * *", zone = "UTC") // 매일 UTC 기준 0시 30분 + @Scheduled(cron = "0 15 0 * * *", zone = "UTC") // 매일 UTC 기준 0시 30분 public void setScheduleAlarm() { - LocalDateTime now = LocalDateTime.now(ZoneId.of("UTC")); + LocalDateTime now = LocalDateTime.now(ZoneId.of("UTC")).plusMinutes(30); LocalDateTime tomorrow = now.plusDays(1); - List schedules = scheduleGetUseCase.getSchedulesBetween(now, tomorrow); + List schedules = scheduleAlarmGetUseCase.getSchedulesBetween(now, tomorrow); + try{ + for (ScheduleAlarm schedule : schedules) { + cloudTaskAdapter.createScheduleAlarm(schedule); + } + } catch (Exception e) { + // Handle exception if needed + } } } diff --git a/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java b/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java index 37cdcc02..8b28189b 100644 --- a/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java +++ b/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java @@ -5,6 +5,7 @@ import com.google.cloud.tasks.v2.*; import com.google.protobuf.ByteString; import com.google.protobuf.Timestamp; +import com.official.memento.schedule.domain.entity.ScheduleAlarm; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -34,13 +35,14 @@ public class CloudTaskAdapter { @Value("${gcp.service-account-key-path}") private String serviceAccountKeyPath; - public void createTask(String scheduleId) throws IOException { - ZonedDateTime executeTime = ZonedDateTime.now(ZoneOffset.UTC).plusMinutes(10); + public void createScheduleAlarm(final ScheduleAlarm scheduleAlarm) throws IOException { GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(serviceAccountKeyPath)); CloudTasksSettings settings = CloudTasksSettings.newBuilder() .setCredentialsProvider(FixedCredentialsProvider.create(credentials)) .build(); + ZonedDateTime executeTime = ZonedDateTime.now(ZoneOffset.UTC).plusMinutes(10); + try (CloudTasksClient client = CloudTasksClient.create(settings)) { String queuePath = QueueName.of(projectId, locationId, queueId).toString(); @@ -50,7 +52,7 @@ public void createTask(String scheduleId) throws IOException { .setNanos(instant.getNano()) .build(); - String payload = "{\"scheduleId\":\"" + scheduleId + "\"}"; + String payload = "{\"scheduleId\":\"" + scheduleAlarm.getScheduleId() + "\"}"; HttpRequest httpRequest = HttpRequest.newBuilder() .setUrl(targetUrl) From 8aa50c0b91f3b9a387bed65803477e96cfeb82a1 Mon Sep 17 00:00:00 2001 From: smg0725 Date: Sat, 5 Apr 2025 11:15:17 +0900 Subject: [PATCH 15/26] =?UTF-8?q?chore:=20=EC=BB=A8=EB=B2=A4=EC=85=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9f412f32..5b89330a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -82,7 +82,6 @@ dependencies { implementation ("com.google.auth:google-auth-library-oauth2-http:1.20.0") //queryDsl - implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta") annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jakarta") annotationProcessor ("jakarta.annotation:jakarta.annotation-api") From 0e68b63b5a47ceb18fa2d078790ec4f7007906bd Mon Sep 17 00:00:00 2001 From: smg0725 Date: Sat, 5 Apr 2025 11:15:34 +0900 Subject: [PATCH 16/26] =?UTF-8?q?chore:=20=EC=8A=A4=EC=BC=80=EC=A4=84=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../official/memento/schedule/service/CloudTaskAdapter.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java b/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java index 8b28189b..57f09f15 100644 --- a/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java +++ b/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java @@ -6,6 +6,7 @@ import com.google.protobuf.ByteString; import com.google.protobuf.Timestamp; import com.official.memento.schedule.domain.entity.ScheduleAlarm; +import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -41,12 +42,12 @@ public void createScheduleAlarm(final ScheduleAlarm scheduleAlarm) throws IOExce .setCredentialsProvider(FixedCredentialsProvider.create(credentials)) .build(); - ZonedDateTime executeTime = ZonedDateTime.now(ZoneOffset.UTC).plusMinutes(10); + LocalDateTime executeTime = scheduleAlarm.getStartDate().minusMinutes(15); try (CloudTasksClient client = CloudTasksClient.create(settings)) { String queuePath = QueueName.of(projectId, locationId, queueId).toString(); - Instant instant = executeTime.toInstant(); + Instant instant = executeTime.toInstant(ZoneOffset.UTC); Timestamp timestamp = Timestamp.newBuilder() .setSeconds(instant.getEpochSecond()) .setNanos(instant.getNano()) From 8278cce988f25264bbbf72bcbb9cb1b26cd7b2b8 Mon Sep 17 00:00:00 2001 From: smg0725 Date: Sat, 5 Apr 2025 11:15:53 +0900 Subject: [PATCH 17/26] =?UTF-8?q?chore:=20=EC=BB=A8=EB=B2=A4=EC=85=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/ScheduleAlarmCustomRepository.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleAlarmCustomRepository.java b/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleAlarmCustomRepository.java index 12aa1f09..f8450795 100644 --- a/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleAlarmCustomRepository.java +++ b/src/main/java/com/official/memento/schedule/infrastructure/persistence/ScheduleAlarmCustomRepository.java @@ -1,18 +1,14 @@ package com.official.memento.schedule.infrastructure.persistence; -import com.official.memento.member.domain.MemberPersonalInfo; -import com.official.memento.member.infrastructure.persistence.entity.MemberPersonalInfoEntity; import com.official.memento.member.infrastructure.persistence.entity.QMemberPersonalInfoEntity; import com.official.memento.schedule.infrastructure.persistence.projection.ScheduleAlarmProjection; import com.querydsl.core.Tuple; import com.querydsl.jpa.impl.JPAQueryFactory; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - import java.time.LocalDateTime; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; @Repository @RequiredArgsConstructor From c6ff1dec6d6eb1a83b43c80650c68c28853b3619 Mon Sep 17 00:00:00 2001 From: smg0725 Date: Sat, 5 Apr 2025 11:16:18 +0900 Subject: [PATCH 18/26] =?UTF-8?q?chore:=20scheduleAlarmRepository=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/ScheduleAlarmRepository.java | 9 ++++++ .../schedule/domain/ScheduleRepository.java | 2 -- .../ScheduleAlarmRepositoryAdapter.java | 32 +++++++++++++++++++ .../ScheduleRepositoryAdapter.java | 14 -------- 4 files changed, 41 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/official/memento/schedule/domain/ScheduleAlarmRepository.java create mode 100644 src/main/java/com/official/memento/schedule/infrastructure/ScheduleAlarmRepositoryAdapter.java diff --git a/src/main/java/com/official/memento/schedule/domain/ScheduleAlarmRepository.java b/src/main/java/com/official/memento/schedule/domain/ScheduleAlarmRepository.java new file mode 100644 index 00000000..5c91e316 --- /dev/null +++ b/src/main/java/com/official/memento/schedule/domain/ScheduleAlarmRepository.java @@ -0,0 +1,9 @@ +package com.official.memento.schedule.domain; + +import com.official.memento.schedule.domain.entity.ScheduleAlarm; +import java.time.LocalDateTime; +import java.util.List; + +public interface ScheduleAlarmRepository { + List findSchedulesWithMemberInfoBetween(final LocalDateTime startTime, final LocalDateTime endTime); +} diff --git a/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java b/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java index 0ca7f24b..e7ed2d5d 100644 --- a/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java +++ b/src/main/java/com/official/memento/schedule/domain/ScheduleRepository.java @@ -34,6 +34,4 @@ public interface ScheduleRepository { List findAllByStartDateAndMemberId(final LocalDate startDate, final long memberId); List findAllAppleByMemberId(final long memberId); - - List findSchedulesWithMemberInfoBetween(final LocalDateTime startTime, final LocalDateTime endTime); } diff --git a/src/main/java/com/official/memento/schedule/infrastructure/ScheduleAlarmRepositoryAdapter.java b/src/main/java/com/official/memento/schedule/infrastructure/ScheduleAlarmRepositoryAdapter.java new file mode 100644 index 00000000..678092d2 --- /dev/null +++ b/src/main/java/com/official/memento/schedule/infrastructure/ScheduleAlarmRepositoryAdapter.java @@ -0,0 +1,32 @@ +package com.official.memento.schedule.infrastructure; + +import com.official.memento.global.stereotype.Adapter; +import com.official.memento.schedule.domain.ScheduleAlarmRepository; +import com.official.memento.schedule.domain.entity.ScheduleAlarm; +import com.official.memento.schedule.infrastructure.persistence.ScheduleAlarmCustomRepository; +import com.official.memento.schedule.infrastructure.persistence.projection.ScheduleAlarmProjection; +import java.time.LocalDateTime; +import java.util.List; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class ScheduleAlarmRepositoryAdapter implements ScheduleAlarmRepository { + + private final ScheduleAlarmCustomRepository scheduleAlarmCustomRepository; + + @Override + public List findSchedulesWithMemberInfoBetween(final LocalDateTime startTime, + final LocalDateTime endTime) { + List scheduleAlarmProjections = scheduleAlarmCustomRepository.findSchedulesWithMemberInfoBetween( + startTime, endTime); + return scheduleAlarmProjections.stream().map(scheduleEntity -> ScheduleAlarm.of( + scheduleEntity.scheduleId(), + scheduleEntity.memberId(), + scheduleEntity.description(), + scheduleEntity.startDate(), + scheduleEntity.endDate(), + scheduleEntity.timeZoneOffset() + )).toList(); + } +} diff --git a/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java b/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java index 9a809f73..839292bd 100644 --- a/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java +++ b/src/main/java/com/official/memento/schedule/infrastructure/ScheduleRepositoryAdapter.java @@ -24,7 +24,6 @@ public class ScheduleRepositoryAdapter implements ScheduleRepository { private final ScheduleEntityJpaRepository scheduleEntityJpaRepository; - private final ScheduleAlarmCustomRepository scheduleAlarmCustomRepository; @Override public Schedule save(final Schedule schedule) { @@ -224,19 +223,6 @@ public List findAllByScheduleGroupIdAndStartDateGreaterThanEqual(Strin )).toList(); } - @Override - public List findSchedulesWithMemberInfoBetween(final LocalDateTime startTime, final LocalDateTime endTime) { - List scheduleAlarmProjections = scheduleAlarmCustomRepository.findSchedulesWithMemberInfoBetween(startTime, endTime); - return scheduleAlarmProjections.stream().map(scheduleEntity -> ScheduleAlarm.of( - scheduleEntity.scheduleId(), - scheduleEntity.memberId(), - scheduleEntity.description(), - scheduleEntity.startDate(), - scheduleEntity.endDate(), - scheduleEntity.timeZoneOffset() - )).toList(); - } - @Override public void updateTagForSchedules(final long oldTagId, final long newTagId){ scheduleEntityJpaRepository.updateTagForSchedules(oldTagId, newTagId); From b24530e02e2f29511d033a1eece0173e56f83acd Mon Sep 17 00:00:00 2001 From: smg0725 Date: Sat, 5 Apr 2025 11:16:35 +0900 Subject: [PATCH 19/26] =?UTF-8?q?chore:=20scheduleAlarmService=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memento/schedule/service/ScheduleAlarmService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/official/memento/schedule/service/ScheduleAlarmService.java b/src/main/java/com/official/memento/schedule/service/ScheduleAlarmService.java index d29db7c2..7c935740 100644 --- a/src/main/java/com/official/memento/schedule/service/ScheduleAlarmService.java +++ b/src/main/java/com/official/memento/schedule/service/ScheduleAlarmService.java @@ -1,5 +1,6 @@ package com.official.memento.schedule.service; +import com.official.memento.schedule.domain.ScheduleAlarmRepository; import com.official.memento.schedule.domain.ScheduleRepository; import com.official.memento.schedule.domain.entity.ScheduleAlarm; import com.official.memento.schedule.service.usecase.ScheduleAlarmGetUseCase; @@ -13,10 +14,9 @@ @RequiredArgsConstructor public class ScheduleAlarmService implements ScheduleAlarmGetUseCase { - private final ScheduleRepository scheduleRepository; - + private final ScheduleAlarmRepository scheduleAlarmRepository; @Override public List getSchedulesBetween(final LocalDateTime startDateTime, final LocalDateTime endDateTime) { - return scheduleRepository.findSchedulesWithMemberInfoBetween(startDateTime, endDateTime); + return scheduleAlarmRepository.findSchedulesWithMemberInfoBetween(startDateTime, endDateTime); } } From 22d1f36c871dcb05782f541afa52e7ad0d43c687 Mon Sep 17 00:00:00 2001 From: smg0725 Date: Sun, 6 Apr 2025 15:32:29 +0900 Subject: [PATCH 20/26] =?UTF-8?q?feat:=20cloudTask=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yml | 9 ++++++++- src/main/resources/application-local.yml | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index dba66c13..75c4bbe3 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -36,4 +36,11 @@ discord: google: client: id: ${GOOGLE.CLIENT_ID} - secret: ${GOOGLE.CLIENT_SECRET} \ No newline at end of file + secret: ${GOOGLE.CLIENT_SECRET} + +gcp: + project-id: ${GCP.PROJECT_ID} + location-id: ${GCP.LOCATION-ID} + queue-id: ${GCP.QUEUE-ID} + service-account-key-path: ${GCP.SERVICE-ACCOUNT-KEY-PATH} } + target-url: ${GCP.TARGET-URL} \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index a0b98ee3..8067d8c5 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -40,4 +40,11 @@ discord: google: client: id: ${GOOGLE.CLIENT_ID} - secret: ${GOOGLE.CLIENT_SECRET} \ No newline at end of file + secret: ${GOOGLE.CLIENT_SECRET} + +gcp: + project-id: ${GCP.PROJECT_ID} + location-id: ${GCP.LOCATION-ID} + queue-id: ${GCP.QUEUE-ID} + service-account-key-path: ${GCP.SERVICE-ACCOUNT-KEY-PATH} } + target-url: ${GCP.TARGET-URL} \ No newline at end of file From d69152d6e697560e1bf2dbe66cbc4abaa8533183 Mon Sep 17 00:00:00 2001 From: smg0725 Date: Sun, 6 Apr 2025 16:52:54 +0900 Subject: [PATCH 21/26] =?UTF-8?q?chore:=20=EC=9E=84=EC=8B=9C=20pr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ScheduleApiController.java | 26 +++++++++++ .../schedule/service/CloudTaskAdapter.java | 46 +++++++++++-------- src/main/resources/application-dev.yml | 7 --- src/main/resources/application-local.yml | 7 --- 4 files changed, 54 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/official/memento/schedule/controller/ScheduleApiController.java b/src/main/java/com/official/memento/schedule/controller/ScheduleApiController.java index ae599b59..58828be9 100644 --- a/src/main/java/com/official/memento/schedule/controller/ScheduleApiController.java +++ b/src/main/java/com/official/memento/schedule/controller/ScheduleApiController.java @@ -9,8 +9,12 @@ import com.official.memento.schedule.controller.dto.response.ScheduleAllGetResponse; import com.official.memento.schedule.controller.dto.response.ScheduleDetailResponse; import com.official.memento.schedule.domain.entity.Schedule; +import com.official.memento.schedule.domain.entity.ScheduleAlarm; +import com.official.memento.schedule.service.CloudTaskAdapter; import com.official.memento.schedule.service.command.*; import com.official.memento.schedule.service.usecase.*; +import java.io.IOException; +import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -31,6 +35,7 @@ public class ScheduleApiController implements ScheduleApiDocs { private final ScheduleGroupDeleteUseCase scheduleGroupDeleteUseCase; private final ScheduleGroupUpdateUseCase scheduleGroupUpdateUseCase; private final ScheduleGroupCreateUseCase scheduleGroupCreateUseCase; + private final CloudTaskAdapter cloudTaskAdapter; @PostMapping @Override @@ -289,4 +294,25 @@ public ResponseEntity> getDetailSchedule ScheduleDetailResponse.of(schedule) ); } + + @GetMapping("/test") + public ResponseEntity> test( + @Authorization final AuthorizationUser authorizationUser + ) throws IOException { + cloudTaskAdapter.createScheduleAlarm( + ScheduleAlarm.of( + 1L, // scheduleId + 1L, // memberId + "회의 알림", // description + LocalDateTime.of(2025, 4, 6, 7, 56), // startDate (UTC 기준) + LocalDateTime.of(2025, 4, 6, 7, 59), // endDate (예시로 +1시간 후) + 9 // timeZoneOffset (KST 기준으로 +9) + ) + ); + return SuccessResponse.of( + HttpStatus.OK, + "스케줄 조회 성공", + "test" + ); + } } \ No newline at end of file diff --git a/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java b/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java index 57f09f15..5d61dce2 100644 --- a/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java +++ b/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java @@ -2,42 +2,48 @@ import com.google.api.gax.core.FixedCredentialsProvider; import com.google.auth.oauth2.GoogleCredentials; -import com.google.cloud.tasks.v2.*; +import com.google.cloud.tasks.v2.CloudTasksClient; +import com.google.cloud.tasks.v2.CloudTasksSettings; +import com.google.cloud.tasks.v2.HttpMethod; +import com.google.cloud.tasks.v2.HttpRequest; +import com.google.cloud.tasks.v2.QueueName; +import com.google.cloud.tasks.v2.Task; import com.google.protobuf.ByteString; import com.google.protobuf.Timestamp; import com.official.memento.schedule.domain.entity.ScheduleAlarm; -import java.time.LocalDateTime; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - import java.io.FileInputStream; import java.io.IOException; import java.time.Instant; +import java.time.LocalDateTime; import java.time.ZoneOffset; -import java.time.ZonedDateTime; -@Service -@RequiredArgsConstructor +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Component public class CloudTaskAdapter { - @Value("${gcp.project-id}") + @Value("${GCP.PROJECT_ID}") private String projectId; - @Value("${gcp.location-id}") + @Value("${GCP.LOCATION_ID}") private String locationId; - @Value("${gcp.queue-id}") + @Value("${GCP.QUEUE_ID}") private String queueId; - @Value("${gcp.target-url}") + @Value("${GCP.TARGET_URL}") private String targetUrl; - @Value("${gcp.service-account-key-path}") - private String serviceAccountKeyPath; + @Value("${ADMIN.TOKEN_PREFIX}") + private String AUTHORIZATION_HEADER_ADMIN_PREFIX; + public void createScheduleAlarm(final ScheduleAlarm scheduleAlarm) throws IOException { - GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(serviceAccountKeyPath)); + System.out.println(System.getenv("GOOGLE_APPLICATION_CREDENTIALS")); + GoogleCredentials credentials = GoogleCredentials.fromStream( + new FileInputStream(System.getenv("GOOGLE_APPLICATION_CREDENTIALS") + )); CloudTasksSettings settings = CloudTasksSettings.newBuilder() .setCredentialsProvider(FixedCredentialsProvider.create(credentials)) .build(); @@ -45,6 +51,7 @@ public void createScheduleAlarm(final ScheduleAlarm scheduleAlarm) throws IOExce LocalDateTime executeTime = scheduleAlarm.getStartDate().minusMinutes(15); try (CloudTasksClient client = CloudTasksClient.create(settings)) { + System.out.println(projectId + locationId + queueId +AUTHORIZATION_HEADER_ADMIN_PREFIX); String queuePath = QueueName.of(projectId, locationId, queueId).toString(); Instant instant = executeTime.toInstant(ZoneOffset.UTC); @@ -53,11 +60,14 @@ public void createScheduleAlarm(final ScheduleAlarm scheduleAlarm) throws IOExce .setNanos(instant.getNano()) .build(); - String payload = "{\"scheduleId\":\"" + scheduleAlarm.getScheduleId() + "\"}"; + String payload = "{" + + "\"description\":\"" + scheduleAlarm.getDescription() + "\"," + + "\"memberId\":" + scheduleAlarm.getMemberId() + + "}"; HttpRequest httpRequest = HttpRequest.newBuilder() .setUrl(targetUrl) - .setHttpMethod(HttpMethod.POST) + .setHttpMethod(HttpMethod.GET) .putHeaders("Content-Type", "application/json") .setBody(ByteString.copyFromUtf8(payload)) .build(); diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 75c4bbe3..9da5eeec 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -37,10 +37,3 @@ google: client: id: ${GOOGLE.CLIENT_ID} secret: ${GOOGLE.CLIENT_SECRET} - -gcp: - project-id: ${GCP.PROJECT_ID} - location-id: ${GCP.LOCATION-ID} - queue-id: ${GCP.QUEUE-ID} - service-account-key-path: ${GCP.SERVICE-ACCOUNT-KEY-PATH} } - target-url: ${GCP.TARGET-URL} \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 8067d8c5..9f5b45eb 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -41,10 +41,3 @@ google: client: id: ${GOOGLE.CLIENT_ID} secret: ${GOOGLE.CLIENT_SECRET} - -gcp: - project-id: ${GCP.PROJECT_ID} - location-id: ${GCP.LOCATION-ID} - queue-id: ${GCP.QUEUE-ID} - service-account-key-path: ${GCP.SERVICE-ACCOUNT-KEY-PATH} } - target-url: ${GCP.TARGET-URL} \ No newline at end of file From 0827fcbd6acca3f0257802030e0b0b7c956640a5 Mon Sep 17 00:00:00 2001 From: smg0725 Date: Mon, 7 Apr 2025 01:17:46 +0900 Subject: [PATCH 22/26] =?UTF-8?q?chore:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=9A=A9=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ScheduleApiController.java | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/src/main/java/com/official/memento/schedule/controller/ScheduleApiController.java b/src/main/java/com/official/memento/schedule/controller/ScheduleApiController.java index 58828be9..98af07dc 100644 --- a/src/main/java/com/official/memento/schedule/controller/ScheduleApiController.java +++ b/src/main/java/com/official/memento/schedule/controller/ScheduleApiController.java @@ -294,25 +294,4 @@ public ResponseEntity> getDetailSchedule ScheduleDetailResponse.of(schedule) ); } - - @GetMapping("/test") - public ResponseEntity> test( - @Authorization final AuthorizationUser authorizationUser - ) throws IOException { - cloudTaskAdapter.createScheduleAlarm( - ScheduleAlarm.of( - 1L, // scheduleId - 1L, // memberId - "회의 알림", // description - LocalDateTime.of(2025, 4, 6, 7, 56), // startDate (UTC 기준) - LocalDateTime.of(2025, 4, 6, 7, 59), // endDate (예시로 +1시간 후) - 9 // timeZoneOffset (KST 기준으로 +9) - ) - ); - return SuccessResponse.of( - HttpStatus.OK, - "스케줄 조회 성공", - "test" - ); - } } \ No newline at end of file From 9bc0c4878f8e34bfd7565345411135c0fd923990 Mon Sep 17 00:00:00 2001 From: smg0725 Date: Mon, 7 Apr 2025 01:18:14 +0900 Subject: [PATCH 23/26] =?UTF-8?q?chore:=20=ED=81=B4=EB=9D=BC=EC=9A=B0?= =?UTF-8?q?=EB=93=9C=20=ED=83=9C=EC=8A=A4=ED=81=AC=20=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memento/schedule/service/CloudTaskAdapter.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java b/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java index 5d61dce2..5f8c2df9 100644 --- a/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java +++ b/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java @@ -10,6 +10,8 @@ import com.google.cloud.tasks.v2.Task; import com.google.protobuf.ByteString; import com.google.protobuf.Timestamp; +import com.official.memento.global.exception.ErrorCode; +import com.official.memento.global.exception.MementoException; import com.official.memento.schedule.domain.entity.ScheduleAlarm; import java.io.FileInputStream; import java.io.IOException; @@ -40,7 +42,6 @@ public class CloudTaskAdapter { public void createScheduleAlarm(final ScheduleAlarm scheduleAlarm) throws IOException { - System.out.println(System.getenv("GOOGLE_APPLICATION_CREDENTIALS")); GoogleCredentials credentials = GoogleCredentials.fromStream( new FileInputStream(System.getenv("GOOGLE_APPLICATION_CREDENTIALS") )); @@ -51,7 +52,6 @@ public void createScheduleAlarm(final ScheduleAlarm scheduleAlarm) throws IOExce LocalDateTime executeTime = scheduleAlarm.getStartDate().minusMinutes(15); try (CloudTasksClient client = CloudTasksClient.create(settings)) { - System.out.println(projectId + locationId + queueId +AUTHORIZATION_HEADER_ADMIN_PREFIX); String queuePath = QueueName.of(projectId, locationId, queueId).toString(); Instant instant = executeTime.toInstant(ZoneOffset.UTC); @@ -67,8 +67,9 @@ public void createScheduleAlarm(final ScheduleAlarm scheduleAlarm) throws IOExce HttpRequest httpRequest = HttpRequest.newBuilder() .setUrl(targetUrl) - .setHttpMethod(HttpMethod.GET) + .setHttpMethod(HttpMethod.POST) .putHeaders("Content-Type", "application/json") + .putHeaders("Authorization","Bearer " + AUTHORIZATION_HEADER_ADMIN_PREFIX + scheduleAlarm.getMemberId()) .setBody(ByteString.copyFromUtf8(payload)) .build(); @@ -78,6 +79,8 @@ public void createScheduleAlarm(final ScheduleAlarm scheduleAlarm) throws IOExce .build(); client.createTask(queuePath, task); + }catch (Exception e) { + throw new MementoException(ErrorCode.INTERNAL_SERVER_ERROR); } } } \ No newline at end of file From 8e46197dc56715b31f76d50e0008e78d2cf11618 Mon Sep 17 00:00:00 2001 From: smg0725 Date: Mon, 7 Apr 2025 01:18:30 +0900 Subject: [PATCH 24/26] =?UTF-8?q?feat:=20=ED=8C=8C=EC=9D=BC=20read=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memento/schedule/scheduler/scheduleAlarmScheduler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java b/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java index 87e83fa4..dd8e89f2 100644 --- a/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java +++ b/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java @@ -1,5 +1,7 @@ package com.official.memento.schedule.scheduler; +import com.official.memento.global.exception.ErrorCode; +import com.official.memento.global.exception.MementoException; import com.official.memento.schedule.domain.entity.ScheduleAlarm; import com.official.memento.schedule.service.CloudTaskAdapter; import com.official.memento.schedule.service.usecase.ScheduleAlarmGetUseCase; @@ -29,7 +31,7 @@ public void setScheduleAlarm() { cloudTaskAdapter.createScheduleAlarm(schedule); } } catch (Exception e) { - // Handle exception if needed + throw new MementoException(ErrorCode.INTERNAL_SERVER_ERROR); } } } From d0515ef199a719ca864ed8dbdf71fff8eef14439 Mon Sep 17 00:00:00 2001 From: smg0725 Date: Mon, 7 Apr 2025 01:22:39 +0900 Subject: [PATCH 25/26] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memento/schedule/scheduler/scheduleAlarmScheduler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java b/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java index dd8e89f2..029d7369 100644 --- a/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java +++ b/src/main/java/com/official/memento/schedule/scheduler/scheduleAlarmScheduler.java @@ -21,7 +21,7 @@ public class scheduleAlarmScheduler { private final ScheduleAlarmGetUseCase scheduleAlarmGetUseCase; - @Scheduled(cron = "0 15 0 * * *", zone = "UTC") // 매일 UTC 기준 0시 30분 + @Scheduled(cron = "0 15 0 * * *", zone = "UTC") // 매일 UTC 기준 0시 15분 public void setScheduleAlarm() { LocalDateTime now = LocalDateTime.now(ZoneId.of("UTC")).plusMinutes(30); LocalDateTime tomorrow = now.plusDays(1); From 113c09588a81d19f6bbbf28e2dc37bd2ea759dd7 Mon Sep 17 00:00:00 2001 From: smg0725 Date: Mon, 7 Apr 2025 01:33:21 +0900 Subject: [PATCH 26/26] =?UTF-8?q?chore:=20=EB=B0=94=EB=94=94=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=EC=97=90=20=EC=8B=9C=EA=B0=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/official/memento/schedule/service/CloudTaskAdapter.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java b/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java index 5f8c2df9..fcd42bcd 100644 --- a/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java +++ b/src/main/java/com/official/memento/schedule/service/CloudTaskAdapter.java @@ -63,6 +63,8 @@ public void createScheduleAlarm(final ScheduleAlarm scheduleAlarm) throws IOExce String payload = "{" + "\"description\":\"" + scheduleAlarm.getDescription() + "\"," + "\"memberId\":" + scheduleAlarm.getMemberId() + + "\"startTime\":" + scheduleAlarm.getStartDate().toLocalTime() + + "\"endTime\":" + scheduleAlarm.getEndDate().toLocalTime() + "}"; HttpRequest httpRequest = HttpRequest.newBuilder()