From 69ce59f491169c827d8d8e95f21540d66f1bd27d Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Wed, 10 Dec 2025 16:32:07 -0300 Subject: [PATCH 01/19] finish: implementation of the endpoint responsible for enable or disable senders email --- pom.xml | 2 +- .../controller/ReminderController.java | 13 ++++++++++ .../reminderapi/reminder/entity/Reminder.java | 22 ++++++++++------ .../reminder/service/ReminderService.java | 26 +++++++++++++++++++ .../schedule/job/reminder/ReminderJob.java | 4 ++- 5 files changed, 57 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 9eac736..89b0954 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ com.h2database h2 - test + runtime diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java index 3529253..f42f4c6 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java @@ -3,6 +3,7 @@ import br.com.springnoobs.reminderapi.reminder.dto.request.CreateReminderRequestDTO; import br.com.springnoobs.reminderapi.reminder.dto.request.UpdateReminderRequestDTO; import br.com.springnoobs.reminderapi.reminder.dto.response.ReminderResponseDTO; +import br.com.springnoobs.reminderapi.reminder.entity.Reminder; import br.com.springnoobs.reminderapi.reminder.service.ReminderService; import jakarta.validation.Valid; import org.springframework.data.domain.Page; @@ -12,6 +13,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.Optional; + @RestController @RequestMapping("/reminders") public class ReminderController { @@ -51,4 +54,14 @@ public ResponseEntity delete(@PathVariable Long id) { reminderService.delete(id); return ResponseEntity.noContent().build(); } + + @PatchMapping("/{id}/disable-email") + public ResponseEntity disableEmail (@PathVariable("id") Long id){ + return ResponseEntity.ok(reminderService.disableEmail(id)); + } + + @PatchMapping("/{id}/enable-email") + public ResponseEntity enableEmail (@PathVariable("id") Long id){ + return ResponseEntity.ok(reminderService.enableEmail(id)); + } } diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java index 4d4b2f6..8566969 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java @@ -30,20 +30,17 @@ public class Reminder { private boolean sent = false; + private Boolean emailEnabled = true; // por padrao, o envio por email é true + @ManyToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; public Reminder() {} - public Reminder( - Long id, - String title, - String description, - Instant remindAt, - Instant dueDate, - Instant executedAt, - boolean sent) { + public Reminder(Long id, String title, String description, Instant remindAt, + Instant dueDate, Instant executedAt, boolean sent, Boolean emailEnabled) + { this.id = id; this.title = title; this.description = description; @@ -51,6 +48,7 @@ public Reminder( this.dueDate = dueDate; this.executedAt = executedAt; this.sent = sent; + this.emailEnabled = emailEnabled; } public Long getId() { @@ -116,4 +114,12 @@ public User getUser() { public void setUser(User user) { this.user = user; } + + public Boolean getEmailEnabled() { + return emailEnabled; + } + + public void setEmailEnabled(Boolean emailEnabled) { + this.emailEnabled = emailEnabled; + } } diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java index aebe6f3..b449d4c 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java @@ -13,6 +13,8 @@ import br.com.springnoobs.reminderapi.user.entity.User; import br.com.springnoobs.reminderapi.user.service.UserService; import java.time.Instant; +import java.util.Optional; + import org.quartz.SchedulerException; import org.springframework.beans.BeanUtils; import org.springframework.data.domain.Page; @@ -115,4 +117,28 @@ public void registerReminderExecution(Reminder reminder) { repository.save(reminder); } + + public ReminderResponseDTO disableEmail(Long id){ + + var reminder = repository. + findById(id) + .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") + ); + + reminder.setEmailEnabled(false); + + return ReminderMapper.toResponse(repository.save(reminder)); + } + + public ReminderResponseDTO enableEmail(Long id){ + + var reminder = repository. + findById(id) + .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") + ); + + reminder.setEmailEnabled(true); + return ReminderMapper.toResponse(repository.save(reminder)); + } + } diff --git a/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java b/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java index 79628c7..1c170f6 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java +++ b/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java @@ -32,7 +32,9 @@ protected void executeInternal(JobExecutionContext context) { long reminderId = context.getMergedJobDataMap().getLong("reminder-id"); reminderRepository.findByIdWithAssociations(reminderId).ifPresent(reminder -> { - emailService.send(reminder); + if(Boolean.TRUE.equals(reminder.getEmailEnabled())) { + emailService.send(reminder); + } reminderService.registerReminderExecution(reminder); From 3fbc8b8d57aba717c9694aad0281a7f293ff2f36 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Wed, 10 Dec 2025 18:14:24 -0300 Subject: [PATCH 02/19] =?UTF-8?q?feat:=20Implementa=C3=A7=C3=A3o=20do=20en?= =?UTF-8?q?dpoint=20respons=C3=A1vel=20por=20habilitar=20ou=20desabilitar?= =?UTF-8?q?=20o=20envio=20de=20e-mail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../controller/ReminderController.java | 11 ++------- .../reminderapi/reminder/entity/Reminder.java | 13 +--------- .../reminder/service/ReminderService.java | 24 +------------------ 4 files changed, 5 insertions(+), 45 deletions(-) diff --git a/pom.xml b/pom.xml index 89b0954..9eac736 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ com.h2database h2 - runtime + test diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java index f42f4c6..029ffe1 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java @@ -3,7 +3,6 @@ import br.com.springnoobs.reminderapi.reminder.dto.request.CreateReminderRequestDTO; import br.com.springnoobs.reminderapi.reminder.dto.request.UpdateReminderRequestDTO; import br.com.springnoobs.reminderapi.reminder.dto.response.ReminderResponseDTO; -import br.com.springnoobs.reminderapi.reminder.entity.Reminder; import br.com.springnoobs.reminderapi.reminder.service.ReminderService; import jakarta.validation.Valid; import org.springframework.data.domain.Page; @@ -13,8 +12,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.Optional; - @RestController @RequestMapping("/reminders") public class ReminderController { @@ -57,11 +54,7 @@ public ResponseEntity delete(@PathVariable Long id) { @PatchMapping("/{id}/disable-email") public ResponseEntity disableEmail (@PathVariable("id") Long id){ - return ResponseEntity.ok(reminderService.disableEmail(id)); - } - - @PatchMapping("/{id}/enable-email") - public ResponseEntity enableEmail (@PathVariable("id") Long id){ - return ResponseEntity.ok(reminderService.enableEmail(id)); + // TODO: Implementar lógica para desabilitar envio de e-mail no service + return ResponseEntity.ok(reminderService.findById(id)); } } diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java index 8566969..6cd44b2 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java @@ -30,8 +30,6 @@ public class Reminder { private boolean sent = false; - private Boolean emailEnabled = true; // por padrao, o envio por email é true - @ManyToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; @@ -39,7 +37,7 @@ public class Reminder { public Reminder() {} public Reminder(Long id, String title, String description, Instant remindAt, - Instant dueDate, Instant executedAt, boolean sent, Boolean emailEnabled) + Instant dueDate, Instant executedAt, boolean sent) { this.id = id; this.title = title; @@ -48,7 +46,6 @@ public Reminder(Long id, String title, String description, Instant remindAt, this.dueDate = dueDate; this.executedAt = executedAt; this.sent = sent; - this.emailEnabled = emailEnabled; } public Long getId() { @@ -114,12 +111,4 @@ public User getUser() { public void setUser(User user) { this.user = user; } - - public Boolean getEmailEnabled() { - return emailEnabled; - } - - public void setEmailEnabled(Boolean emailEnabled) { - this.emailEnabled = emailEnabled; - } } diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java index b449d4c..3d901e6 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java @@ -13,7 +13,6 @@ import br.com.springnoobs.reminderapi.user.entity.User; import br.com.springnoobs.reminderapi.user.service.UserService; import java.time.Instant; -import java.util.Optional; import org.quartz.SchedulerException; import org.springframework.beans.BeanUtils; @@ -118,27 +117,6 @@ public void registerReminderExecution(Reminder reminder) { repository.save(reminder); } - public ReminderResponseDTO disableEmail(Long id){ - - var reminder = repository. - findById(id) - .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") - ); - - reminder.setEmailEnabled(false); - - return ReminderMapper.toResponse(repository.save(reminder)); - } - - public ReminderResponseDTO enableEmail(Long id){ - - var reminder = repository. - findById(id) - .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") - ); - - reminder.setEmailEnabled(true); - return ReminderMapper.toResponse(repository.save(reminder)); - } + // Todo: Implementar a logica para desabilitar/habilitar o envio de email } From c74ff65e4b95d7ca99f6b32473ec0f604183e695 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Wed, 10 Dec 2025 18:17:25 -0300 Subject: [PATCH 03/19] =?UTF-8?q?fix:=20Reverte=20verifica=C3=A7=C3=A3o=20?= =?UTF-8?q?de=20emailEnabled=20no=20ReminderJob?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reminderapi/schedule/job/reminder/ReminderJob.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java b/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java index 1c170f6..79628c7 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java +++ b/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java @@ -32,9 +32,7 @@ protected void executeInternal(JobExecutionContext context) { long reminderId = context.getMergedJobDataMap().getLong("reminder-id"); reminderRepository.findByIdWithAssociations(reminderId).ifPresent(reminder -> { - if(Boolean.TRUE.equals(reminder.getEmailEnabled())) { - emailService.send(reminder); - } + emailService.send(reminder); reminderService.registerReminderExecution(reminder); From b8fd0441aae4e5ca6b0f218f6f5d382b4f340a26 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Thu, 11 Dec 2025 22:29:03 -0300 Subject: [PATCH 04/19] creation of the endpoints responsible for enable or disabling email sending --- .../reminder/controller/ReminderController.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java index 029ffe1..5ab30fe 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java @@ -54,7 +54,11 @@ public ResponseEntity delete(@PathVariable Long id) { @PatchMapping("/{id}/disable-email") public ResponseEntity disableEmail (@PathVariable("id") Long id){ - // TODO: Implementar lógica para desabilitar envio de e-mail no service - return ResponseEntity.ok(reminderService.findById(id)); + return ResponseEntity.ok(reminderService.disableEmail(id)); + } + + @PatchMapping("/{id}/disable-email") + public ResponseEntity enableEmail (@PathVariable("id") Long id){ + return ResponseEntity.ok(reminderService.enableEmail(id)); } } From 613f9204d7009c38c81aed93bfa256591be81709 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Thu, 11 Dec 2025 22:36:02 -0300 Subject: [PATCH 05/19] feat: add enable/disable email methods in ReminderService Related to #76 --- .../reminder/service/ReminderService.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java index 3d901e6..63c4bdd 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java @@ -13,6 +13,7 @@ import br.com.springnoobs.reminderapi.user.entity.User; import br.com.springnoobs.reminderapi.user.service.UserService; import java.time.Instant; +import java.util.Optional; import org.quartz.SchedulerException; import org.springframework.beans.BeanUtils; @@ -117,6 +118,39 @@ public void registerReminderExecution(Reminder reminder) { repository.save(reminder); } - // Todo: Implementar a logica para desabilitar/habilitar o envio de email + @Transactional + public ReminderResponseDTO disableEmail(Long id){ + + try { + + var reminder = repository. + findById(id) + .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") + ); + + jobService.unscheduleJobTriggers(id); + return ReminderMapper.toResponse(reminder); + + } catch (SchedulerException e){ + throw new ReminderSchedulerException(e.getMessage()); + } + } + + @Transactional + public ReminderResponseDTO enableEmail(Long id){ + + try { + var reminder = repository. + findById(id) + .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") + ); + + jobService.scheduleJob(reminder); + return ReminderMapper.toResponse(reminder); + + } catch (SchedulerException e){ + throw new ReminderSchedulerException(e.getMessage()); + } + } } From d07e31c7376987185d7547985b431608237eb1b8 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Thu, 11 Dec 2025 22:38:57 -0300 Subject: [PATCH 06/19] feat(job-service): add methods to manage job triggers --- .../schedule/service/JobService.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java b/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java index 0602854..0ea3370 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java @@ -7,7 +7,11 @@ import java.time.Duration; import java.time.Instant; import java.util.Date; +import java.util.Optional; + import org.quartz.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @Service @@ -23,6 +27,9 @@ public class JobService { private final Scheduler scheduler; + Logger logger = LoggerFactory.getLogger(JobService.class); + + public JobService(Scheduler scheduler) { this.scheduler = scheduler; } @@ -102,4 +109,47 @@ public void scheduleRetryEmailJob() throws SchedulerException { scheduler.scheduleJob(trigger); } + + public Optional findJobById(Long reminderId){ + + try { + JobKey jobKey = new JobKey(JOB_NAME + "-" + reminderId, JOB_GROUP); + + if (scheduler.checkExists(jobKey)){ + return Optional.of(jobKey); + } + } + catch (SchedulerException e){ + + logger.error("Error finding job key for reminder {}: {}", reminderId, e.getMessage()); + return Optional.empty(); + } + return Optional.empty(); + + } + + public void unscheduleJobTriggers(Long reminderId) throws SchedulerException { + + Optional optionalJobkey = findJobById(reminderId); + + if (optionalJobkey.isEmpty()){ + logger.warn("Job not found for reminder: {}", reminderId); + return; + } + + JobKey jobKey = optionalJobkey.get(); + + scheduler.getTriggersOfJob(jobKey).forEach(trigger -> { + try { + scheduler.unscheduleJob(trigger.getKey()); + logger.info("Unscheduled trigger: {} for reminder: {}", trigger.getKey(), reminderId); + } + + catch (SchedulerException e){ + logger.error("Error unscheduling trigger {}: {}", trigger.getKey(), e.getMessage()); + } + }); + + } + } From 9754060c9e33863f4b9245fa28b6b629cd535fea Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Fri, 12 Dec 2025 21:20:38 -0300 Subject: [PATCH 07/19] feat: creating one endpoint responsible for disabling email sending --- .../controller/ReminderController.java | 7 +-- .../reminder/service/ReminderService.java | 36 ---------------- .../schedule/service/JobService.java | 43 ------------------- 3 files changed, 2 insertions(+), 84 deletions(-) diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java index 5ab30fe..bc69646 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java @@ -54,11 +54,8 @@ public ResponseEntity delete(@PathVariable Long id) { @PatchMapping("/{id}/disable-email") public ResponseEntity disableEmail (@PathVariable("id") Long id){ - return ResponseEntity.ok(reminderService.disableEmail(id)); + // TODO: Implementar lógica para desabilitar envio de e-mail no ReminderService + return ResponseEntity.ok(reminderService.findById(id)); } - @PatchMapping("/{id}/disable-email") - public ResponseEntity enableEmail (@PathVariable("id") Long id){ - return ResponseEntity.ok(reminderService.enableEmail(id)); - } } diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java index 63c4bdd..aad452a 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java @@ -117,40 +117,4 @@ public void registerReminderExecution(Reminder reminder) { repository.save(reminder); } - - @Transactional - public ReminderResponseDTO disableEmail(Long id){ - - try { - - var reminder = repository. - findById(id) - .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") - ); - - jobService.unscheduleJobTriggers(id); - return ReminderMapper.toResponse(reminder); - - } catch (SchedulerException e){ - throw new ReminderSchedulerException(e.getMessage()); - } - } - - @Transactional - public ReminderResponseDTO enableEmail(Long id){ - - try { - var reminder = repository. - findById(id) - .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") - ); - - jobService.scheduleJob(reminder); - return ReminderMapper.toResponse(reminder); - - } catch (SchedulerException e){ - throw new ReminderSchedulerException(e.getMessage()); - } - } - } diff --git a/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java b/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java index 0ea3370..126d380 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java @@ -109,47 +109,4 @@ public void scheduleRetryEmailJob() throws SchedulerException { scheduler.scheduleJob(trigger); } - - public Optional findJobById(Long reminderId){ - - try { - JobKey jobKey = new JobKey(JOB_NAME + "-" + reminderId, JOB_GROUP); - - if (scheduler.checkExists(jobKey)){ - return Optional.of(jobKey); - } - } - catch (SchedulerException e){ - - logger.error("Error finding job key for reminder {}: {}", reminderId, e.getMessage()); - return Optional.empty(); - } - return Optional.empty(); - - } - - public void unscheduleJobTriggers(Long reminderId) throws SchedulerException { - - Optional optionalJobkey = findJobById(reminderId); - - if (optionalJobkey.isEmpty()){ - logger.warn("Job not found for reminder: {}", reminderId); - return; - } - - JobKey jobKey = optionalJobkey.get(); - - scheduler.getTriggersOfJob(jobKey).forEach(trigger -> { - try { - scheduler.unscheduleJob(trigger.getKey()); - logger.info("Unscheduled trigger: {} for reminder: {}", trigger.getKey(), reminderId); - } - - catch (SchedulerException e){ - logger.error("Error unscheduling trigger {}: {}", trigger.getKey(), e.getMessage()); - } - }); - - } - } From b539b103aeb379b9771d54cdf5eb48db572f1bf3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 13 Dec 2025 00:31:52 +0000 Subject: [PATCH 08/19] =?UTF-8?q?Aplica=20formata=C3=A7=C3=A3o=20do=20spot?= =?UTF-8?q?less?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reminder/controller/ReminderController.java | 3 +-- .../reminderapi/reminder/entity/Reminder.java | 11 ++++++++--- .../reminderapi/reminder/service/ReminderService.java | 2 -- .../reminderapi/schedule/service/JobService.java | 3 --- .../com/springnoobs/reminderapi/user/entity/User.java | 1 - 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java index bc69646..939bc25 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java @@ -53,9 +53,8 @@ public ResponseEntity delete(@PathVariable Long id) { } @PatchMapping("/{id}/disable-email") - public ResponseEntity disableEmail (@PathVariable("id") Long id){ + public ResponseEntity disableEmail(@PathVariable("id") Long id) { // TODO: Implementar lógica para desabilitar envio de e-mail no ReminderService return ResponseEntity.ok(reminderService.findById(id)); } - } diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java index 6cd44b2..4d4b2f6 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java @@ -36,9 +36,14 @@ public class Reminder { public Reminder() {} - public Reminder(Long id, String title, String description, Instant remindAt, - Instant dueDate, Instant executedAt, boolean sent) - { + public Reminder( + Long id, + String title, + String description, + Instant remindAt, + Instant dueDate, + Instant executedAt, + boolean sent) { this.id = id; this.title = title; this.description = description; diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java index aad452a..aebe6f3 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java @@ -13,8 +13,6 @@ import br.com.springnoobs.reminderapi.user.entity.User; import br.com.springnoobs.reminderapi.user.service.UserService; import java.time.Instant; -import java.util.Optional; - import org.quartz.SchedulerException; import org.springframework.beans.BeanUtils; import org.springframework.data.domain.Page; diff --git a/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java b/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java index 126d380..7d3d659 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java @@ -7,8 +7,6 @@ import java.time.Duration; import java.time.Instant; import java.util.Date; -import java.util.Optional; - import org.quartz.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,7 +27,6 @@ public class JobService { Logger logger = LoggerFactory.getLogger(JobService.class); - public JobService(Scheduler scheduler) { this.scheduler = scheduler; } diff --git a/src/main/java/br/com/springnoobs/reminderapi/user/entity/User.java b/src/main/java/br/com/springnoobs/reminderapi/user/entity/User.java index e197cd1..db91604 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/user/entity/User.java +++ b/src/main/java/br/com/springnoobs/reminderapi/user/entity/User.java @@ -2,7 +2,6 @@ import br.com.springnoobs.reminderapi.reminder.entity.Reminder; import jakarta.persistence.*; - import java.util.ArrayList; import java.util.List; From 46c125f054a4ef2f2b8c94fbe8dbff6de6a5d478 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Wed, 10 Dec 2025 16:32:07 -0300 Subject: [PATCH 09/19] finish: implementation of the endpoint responsible for enable or disable senders email --- pom.xml | 2 +- .../controller/ReminderController.java | 13 ++++++++++ .../reminderapi/reminder/entity/Reminder.java | 22 ++++++++++------ .../reminder/service/ReminderService.java | 26 +++++++++++++++++++ .../schedule/job/reminder/ReminderJob.java | 4 ++- 5 files changed, 57 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 9eac736..89b0954 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ com.h2database h2 - test + runtime diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java index 3529253..f42f4c6 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java @@ -3,6 +3,7 @@ import br.com.springnoobs.reminderapi.reminder.dto.request.CreateReminderRequestDTO; import br.com.springnoobs.reminderapi.reminder.dto.request.UpdateReminderRequestDTO; import br.com.springnoobs.reminderapi.reminder.dto.response.ReminderResponseDTO; +import br.com.springnoobs.reminderapi.reminder.entity.Reminder; import br.com.springnoobs.reminderapi.reminder.service.ReminderService; import jakarta.validation.Valid; import org.springframework.data.domain.Page; @@ -12,6 +13,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.Optional; + @RestController @RequestMapping("/reminders") public class ReminderController { @@ -51,4 +54,14 @@ public ResponseEntity delete(@PathVariable Long id) { reminderService.delete(id); return ResponseEntity.noContent().build(); } + + @PatchMapping("/{id}/disable-email") + public ResponseEntity disableEmail (@PathVariable("id") Long id){ + return ResponseEntity.ok(reminderService.disableEmail(id)); + } + + @PatchMapping("/{id}/enable-email") + public ResponseEntity enableEmail (@PathVariable("id") Long id){ + return ResponseEntity.ok(reminderService.enableEmail(id)); + } } diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java index 4d4b2f6..8566969 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java @@ -30,20 +30,17 @@ public class Reminder { private boolean sent = false; + private Boolean emailEnabled = true; // por padrao, o envio por email é true + @ManyToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; public Reminder() {} - public Reminder( - Long id, - String title, - String description, - Instant remindAt, - Instant dueDate, - Instant executedAt, - boolean sent) { + public Reminder(Long id, String title, String description, Instant remindAt, + Instant dueDate, Instant executedAt, boolean sent, Boolean emailEnabled) + { this.id = id; this.title = title; this.description = description; @@ -51,6 +48,7 @@ public Reminder( this.dueDate = dueDate; this.executedAt = executedAt; this.sent = sent; + this.emailEnabled = emailEnabled; } public Long getId() { @@ -116,4 +114,12 @@ public User getUser() { public void setUser(User user) { this.user = user; } + + public Boolean getEmailEnabled() { + return emailEnabled; + } + + public void setEmailEnabled(Boolean emailEnabled) { + this.emailEnabled = emailEnabled; + } } diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java index d9c7e58..f5d84b9 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java @@ -12,6 +12,8 @@ import br.com.springnoobs.reminderapi.user.entity.User; import br.com.springnoobs.reminderapi.user.service.UserService; import java.time.Instant; +import java.util.Optional; + import org.quartz.SchedulerException; import org.springframework.beans.BeanUtils; import org.springframework.data.domain.Page; @@ -106,4 +108,28 @@ public void registerReminderExecution(Reminder reminder) { repository.save(reminder); } + + public ReminderResponseDTO disableEmail(Long id){ + + var reminder = repository. + findById(id) + .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") + ); + + reminder.setEmailEnabled(false); + + return ReminderMapper.toResponse(repository.save(reminder)); + } + + public ReminderResponseDTO enableEmail(Long id){ + + var reminder = repository. + findById(id) + .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") + ); + + reminder.setEmailEnabled(true); + return ReminderMapper.toResponse(repository.save(reminder)); + } + } diff --git a/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java b/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java index 79628c7..1c170f6 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java +++ b/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java @@ -32,7 +32,9 @@ protected void executeInternal(JobExecutionContext context) { long reminderId = context.getMergedJobDataMap().getLong("reminder-id"); reminderRepository.findByIdWithAssociations(reminderId).ifPresent(reminder -> { - emailService.send(reminder); + if(Boolean.TRUE.equals(reminder.getEmailEnabled())) { + emailService.send(reminder); + } reminderService.registerReminderExecution(reminder); From 576bfea0eade90279d29f3066af5278342c141d2 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Wed, 10 Dec 2025 18:14:24 -0300 Subject: [PATCH 10/19] =?UTF-8?q?feat:=20Implementa=C3=A7=C3=A3o=20do=20en?= =?UTF-8?q?dpoint=20respons=C3=A1vel=20por=20habilitar=20ou=20desabilitar?= =?UTF-8?q?=20o=20envio=20de=20e-mail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../controller/ReminderController.java | 11 ++------- .../reminderapi/reminder/entity/Reminder.java | 13 +--------- .../reminder/service/ReminderService.java | 24 +------------------ 4 files changed, 5 insertions(+), 45 deletions(-) diff --git a/pom.xml b/pom.xml index 89b0954..9eac736 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ com.h2database h2 - runtime + test diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java index f42f4c6..029ffe1 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java @@ -3,7 +3,6 @@ import br.com.springnoobs.reminderapi.reminder.dto.request.CreateReminderRequestDTO; import br.com.springnoobs.reminderapi.reminder.dto.request.UpdateReminderRequestDTO; import br.com.springnoobs.reminderapi.reminder.dto.response.ReminderResponseDTO; -import br.com.springnoobs.reminderapi.reminder.entity.Reminder; import br.com.springnoobs.reminderapi.reminder.service.ReminderService; import jakarta.validation.Valid; import org.springframework.data.domain.Page; @@ -13,8 +12,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.Optional; - @RestController @RequestMapping("/reminders") public class ReminderController { @@ -57,11 +54,7 @@ public ResponseEntity delete(@PathVariable Long id) { @PatchMapping("/{id}/disable-email") public ResponseEntity disableEmail (@PathVariable("id") Long id){ - return ResponseEntity.ok(reminderService.disableEmail(id)); - } - - @PatchMapping("/{id}/enable-email") - public ResponseEntity enableEmail (@PathVariable("id") Long id){ - return ResponseEntity.ok(reminderService.enableEmail(id)); + // TODO: Implementar lógica para desabilitar envio de e-mail no service + return ResponseEntity.ok(reminderService.findById(id)); } } diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java index 8566969..6cd44b2 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java @@ -30,8 +30,6 @@ public class Reminder { private boolean sent = false; - private Boolean emailEnabled = true; // por padrao, o envio por email é true - @ManyToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; @@ -39,7 +37,7 @@ public class Reminder { public Reminder() {} public Reminder(Long id, String title, String description, Instant remindAt, - Instant dueDate, Instant executedAt, boolean sent, Boolean emailEnabled) + Instant dueDate, Instant executedAt, boolean sent) { this.id = id; this.title = title; @@ -48,7 +46,6 @@ public Reminder(Long id, String title, String description, Instant remindAt, this.dueDate = dueDate; this.executedAt = executedAt; this.sent = sent; - this.emailEnabled = emailEnabled; } public Long getId() { @@ -114,12 +111,4 @@ public User getUser() { public void setUser(User user) { this.user = user; } - - public Boolean getEmailEnabled() { - return emailEnabled; - } - - public void setEmailEnabled(Boolean emailEnabled) { - this.emailEnabled = emailEnabled; - } } diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java index f5d84b9..d78f12e 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java @@ -12,7 +12,6 @@ import br.com.springnoobs.reminderapi.user.entity.User; import br.com.springnoobs.reminderapi.user.service.UserService; import java.time.Instant; -import java.util.Optional; import org.quartz.SchedulerException; import org.springframework.beans.BeanUtils; @@ -109,27 +108,6 @@ public void registerReminderExecution(Reminder reminder) { repository.save(reminder); } - public ReminderResponseDTO disableEmail(Long id){ - - var reminder = repository. - findById(id) - .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") - ); - - reminder.setEmailEnabled(false); - - return ReminderMapper.toResponse(repository.save(reminder)); - } - - public ReminderResponseDTO enableEmail(Long id){ - - var reminder = repository. - findById(id) - .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") - ); - - reminder.setEmailEnabled(true); - return ReminderMapper.toResponse(repository.save(reminder)); - } + // Todo: Implementar a logica para desabilitar/habilitar o envio de email } From 9f42a2b9d682afa3c849dd7c67cc08ce45aadd84 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Wed, 10 Dec 2025 18:17:25 -0300 Subject: [PATCH 11/19] =?UTF-8?q?fix:=20Reverte=20verifica=C3=A7=C3=A3o=20?= =?UTF-8?q?de=20emailEnabled=20no=20ReminderJob?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reminderapi/schedule/job/reminder/ReminderJob.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java b/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java index 1c170f6..79628c7 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java +++ b/src/main/java/br/com/springnoobs/reminderapi/schedule/job/reminder/ReminderJob.java @@ -32,9 +32,7 @@ protected void executeInternal(JobExecutionContext context) { long reminderId = context.getMergedJobDataMap().getLong("reminder-id"); reminderRepository.findByIdWithAssociations(reminderId).ifPresent(reminder -> { - if(Boolean.TRUE.equals(reminder.getEmailEnabled())) { - emailService.send(reminder); - } + emailService.send(reminder); reminderService.registerReminderExecution(reminder); From 7aa80ba3c873bc7adb42f58a4c4cd6e0aa495cfd Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Thu, 11 Dec 2025 22:29:03 -0300 Subject: [PATCH 12/19] creation of the endpoints responsible for enable or disabling email sending --- .../reminder/controller/ReminderController.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java index 029ffe1..5ab30fe 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java @@ -54,7 +54,11 @@ public ResponseEntity delete(@PathVariable Long id) { @PatchMapping("/{id}/disable-email") public ResponseEntity disableEmail (@PathVariable("id") Long id){ - // TODO: Implementar lógica para desabilitar envio de e-mail no service - return ResponseEntity.ok(reminderService.findById(id)); + return ResponseEntity.ok(reminderService.disableEmail(id)); + } + + @PatchMapping("/{id}/disable-email") + public ResponseEntity enableEmail (@PathVariable("id") Long id){ + return ResponseEntity.ok(reminderService.enableEmail(id)); } } From 8b5be8558844c585ab256850ab885def41a32157 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Thu, 11 Dec 2025 22:36:02 -0300 Subject: [PATCH 13/19] feat: add enable/disable email methods in ReminderService Related to #76 --- .../reminder/service/ReminderService.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java index d78f12e..b259c2b 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java @@ -12,6 +12,7 @@ import br.com.springnoobs.reminderapi.user.entity.User; import br.com.springnoobs.reminderapi.user.service.UserService; import java.time.Instant; +import java.util.Optional; import org.quartz.SchedulerException; import org.springframework.beans.BeanUtils; @@ -108,6 +109,39 @@ public void registerReminderExecution(Reminder reminder) { repository.save(reminder); } - // Todo: Implementar a logica para desabilitar/habilitar o envio de email + @Transactional + public ReminderResponseDTO disableEmail(Long id){ + + try { + + var reminder = repository. + findById(id) + .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") + ); + + jobService.unscheduleJobTriggers(id); + return ReminderMapper.toResponse(reminder); + + } catch (SchedulerException e){ + throw new ReminderSchedulerException(e.getMessage()); + } + } + + @Transactional + public ReminderResponseDTO enableEmail(Long id){ + + try { + var reminder = repository. + findById(id) + .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") + ); + + jobService.scheduleJob(reminder); + return ReminderMapper.toResponse(reminder); + + } catch (SchedulerException e){ + throw new ReminderSchedulerException(e.getMessage()); + } + } } From 3e74c65a908d0459fc2d2044ad864ffaa5e23762 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Thu, 11 Dec 2025 22:38:57 -0300 Subject: [PATCH 14/19] feat(job-service): add methods to manage job triggers --- .../schedule/service/JobService.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java b/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java index 0602854..0ea3370 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java @@ -7,7 +7,11 @@ import java.time.Duration; import java.time.Instant; import java.util.Date; +import java.util.Optional; + import org.quartz.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @Service @@ -23,6 +27,9 @@ public class JobService { private final Scheduler scheduler; + Logger logger = LoggerFactory.getLogger(JobService.class); + + public JobService(Scheduler scheduler) { this.scheduler = scheduler; } @@ -102,4 +109,47 @@ public void scheduleRetryEmailJob() throws SchedulerException { scheduler.scheduleJob(trigger); } + + public Optional findJobById(Long reminderId){ + + try { + JobKey jobKey = new JobKey(JOB_NAME + "-" + reminderId, JOB_GROUP); + + if (scheduler.checkExists(jobKey)){ + return Optional.of(jobKey); + } + } + catch (SchedulerException e){ + + logger.error("Error finding job key for reminder {}: {}", reminderId, e.getMessage()); + return Optional.empty(); + } + return Optional.empty(); + + } + + public void unscheduleJobTriggers(Long reminderId) throws SchedulerException { + + Optional optionalJobkey = findJobById(reminderId); + + if (optionalJobkey.isEmpty()){ + logger.warn("Job not found for reminder: {}", reminderId); + return; + } + + JobKey jobKey = optionalJobkey.get(); + + scheduler.getTriggersOfJob(jobKey).forEach(trigger -> { + try { + scheduler.unscheduleJob(trigger.getKey()); + logger.info("Unscheduled trigger: {} for reminder: {}", trigger.getKey(), reminderId); + } + + catch (SchedulerException e){ + logger.error("Error unscheduling trigger {}: {}", trigger.getKey(), e.getMessage()); + } + }); + + } + } From 1bba1bfaaec23ef9768ab895ac879ff23fe3c6d9 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Fri, 12 Dec 2025 21:20:38 -0300 Subject: [PATCH 15/19] feat: creating one endpoint responsible for disabling email sending --- .../controller/ReminderController.java | 7 +-- .../reminder/service/ReminderService.java | 36 ---------------- .../schedule/service/JobService.java | 43 ------------------- 3 files changed, 2 insertions(+), 84 deletions(-) diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java index 5ab30fe..bc69646 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java @@ -54,11 +54,8 @@ public ResponseEntity delete(@PathVariable Long id) { @PatchMapping("/{id}/disable-email") public ResponseEntity disableEmail (@PathVariable("id") Long id){ - return ResponseEntity.ok(reminderService.disableEmail(id)); + // TODO: Implementar lógica para desabilitar envio de e-mail no ReminderService + return ResponseEntity.ok(reminderService.findById(id)); } - @PatchMapping("/{id}/disable-email") - public ResponseEntity enableEmail (@PathVariable("id") Long id){ - return ResponseEntity.ok(reminderService.enableEmail(id)); - } } diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java index b259c2b..c279a23 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java @@ -108,40 +108,4 @@ public void registerReminderExecution(Reminder reminder) { repository.save(reminder); } - - @Transactional - public ReminderResponseDTO disableEmail(Long id){ - - try { - - var reminder = repository. - findById(id) - .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") - ); - - jobService.unscheduleJobTriggers(id); - return ReminderMapper.toResponse(reminder); - - } catch (SchedulerException e){ - throw new ReminderSchedulerException(e.getMessage()); - } - } - - @Transactional - public ReminderResponseDTO enableEmail(Long id){ - - try { - var reminder = repository. - findById(id) - .orElseThrow(() -> new NotFoundException("Reminder with ID: " + id + " not found") - ); - - jobService.scheduleJob(reminder); - return ReminderMapper.toResponse(reminder); - - } catch (SchedulerException e){ - throw new ReminderSchedulerException(e.getMessage()); - } - } - } diff --git a/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java b/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java index 0ea3370..126d380 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/schedule/service/JobService.java @@ -109,47 +109,4 @@ public void scheduleRetryEmailJob() throws SchedulerException { scheduler.scheduleJob(trigger); } - - public Optional findJobById(Long reminderId){ - - try { - JobKey jobKey = new JobKey(JOB_NAME + "-" + reminderId, JOB_GROUP); - - if (scheduler.checkExists(jobKey)){ - return Optional.of(jobKey); - } - } - catch (SchedulerException e){ - - logger.error("Error finding job key for reminder {}: {}", reminderId, e.getMessage()); - return Optional.empty(); - } - return Optional.empty(); - - } - - public void unscheduleJobTriggers(Long reminderId) throws SchedulerException { - - Optional optionalJobkey = findJobById(reminderId); - - if (optionalJobkey.isEmpty()){ - logger.warn("Job not found for reminder: {}", reminderId); - return; - } - - JobKey jobKey = optionalJobkey.get(); - - scheduler.getTriggersOfJob(jobKey).forEach(trigger -> { - try { - scheduler.unscheduleJob(trigger.getKey()); - logger.info("Unscheduled trigger: {} for reminder: {}", trigger.getKey(), reminderId); - } - - catch (SchedulerException e){ - logger.error("Error unscheduling trigger {}: {}", trigger.getKey(), e.getMessage()); - } - }); - - } - } From fe71d54c66dfb32e45ec50ec2357f1072d4b2b64 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Fri, 12 Dec 2025 22:19:46 -0300 Subject: [PATCH 16/19] feat(controller): add disable email endpoint (commented) Closes #76 --- .../reminder/controller/ReminderController.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java index bc69646..7731ceb 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java @@ -52,10 +52,20 @@ public ResponseEntity delete(@PathVariable Long id) { return ResponseEntity.noContent().build(); } + /* + * Desabilita notificações por email de um reminder. + * Remove todos os triggers agendados no Quartz. + * + * ToDo: Descomentar quando PR #96 (disableReminderNotifications) for mergeado + * Depende de: ReminderService. disableReminderNotifications() + */ + + /* @PatchMapping("/{id}/disable-email") - public ResponseEntity disableEmail (@PathVariable("id") Long id){ - // TODO: Implementar lógica para desabilitar envio de e-mail no ReminderService - return ResponseEntity.ok(reminderService.findById(id)); + public ResponseEntity disableEmail(@PathVariable Long id) throws SchedulerException { + reminderService.disableReminderNotifications(id); + return ResponseEntity.noContent().build(); } + */ } From c49efff1a7ba017b3cdbce81334410fc55fb8514 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Tue, 16 Dec 2025 19:04:57 -0300 Subject: [PATCH 17/19] revert: restore Reminder and ReminderService from master Service layer merged in PR #96 --- .../reminderapi/reminder/entity/Reminder.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java index 6cd44b2..4d4b2f6 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/entity/Reminder.java @@ -36,9 +36,14 @@ public class Reminder { public Reminder() {} - public Reminder(Long id, String title, String description, Instant remindAt, - Instant dueDate, Instant executedAt, boolean sent) - { + public Reminder( + Long id, + String title, + String description, + Instant remindAt, + Instant dueDate, + Instant executedAt, + boolean sent) { this.id = id; this.title = title; this.description = description; From 9c23aaf8170c1e6cd99f9568c2a8d5e74f005c22 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Tue, 16 Dec 2025 19:15:10 -0300 Subject: [PATCH 18/19] revert: restore ReminderService from master --- .../reminderapi/reminder/service/ReminderService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java index b584457..ff4d94c 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/service/ReminderService.java @@ -12,8 +12,6 @@ import br.com.springnoobs.reminderapi.user.entity.User; import br.com.springnoobs.reminderapi.user.service.UserService; import java.time.Instant; -import java.util.Optional; - import org.quartz.SchedulerException; import org.springframework.beans.BeanUtils; import org.springframework.data.domain.Page; From db9eac51163c337f77a7272504dc497ea6ae75f5 Mon Sep 17 00:00:00 2001 From: vitinh0z Date: Tue, 16 Dec 2025 19:20:02 -0300 Subject: [PATCH 19/19] feat: uncomment/update endpoint after PR #96 merge --- .../reminder/controller/ReminderController.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java index 7731ceb..5a508f8 100644 --- a/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java +++ b/src/main/java/br/com/springnoobs/reminderapi/reminder/controller/ReminderController.java @@ -5,6 +5,7 @@ import br.com.springnoobs.reminderapi.reminder.dto.response.ReminderResponseDTO; import br.com.springnoobs.reminderapi.reminder.service.ReminderService; import jakarta.validation.Valid; +import org.quartz.SchedulerException; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -52,20 +53,10 @@ public ResponseEntity delete(@PathVariable Long id) { return ResponseEntity.noContent().build(); } - /* - * Desabilita notificações por email de um reminder. - * Remove todos os triggers agendados no Quartz. - * - * ToDo: Descomentar quando PR #96 (disableReminderNotifications) for mergeado - * Depende de: ReminderService. disableReminderNotifications() - */ - - /* @PatchMapping("/{id}/disable-email") public ResponseEntity disableEmail(@PathVariable Long id) throws SchedulerException { reminderService.disableReminderNotifications(id); return ResponseEntity.noContent().build(); - } - */ + } }