From adeadbb0cfc3f3d9c2162ba2f035601fed33be66 Mon Sep 17 00:00:00 2001 From: Rodrigo Moreira da Silva Date: Mon, 5 Jun 2023 22:39:52 -0300 Subject: [PATCH 1/7] :bricks: ci: Adds Kafka to docker-compose --- docker-compose.yml | 16 ++++++++++ pom.xml | 13 ++++++-- .../rm/mynotes/utils/config/KafkaConfig.java | 32 +++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/rm/mynotes/utils/config/KafkaConfig.java diff --git a/docker-compose.yml b/docker-compose.yml index 7a56b2a..1d1687c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,6 +8,21 @@ services: - MYSQL_PASSWORD=${DB_PASSWORD} ports: - "3302:3306" + + kafka: + image: wurstmeister/kafka + ports: + - "9092:9092" + environment: + - KAFKA_ADVERTISED_HOST_NAME=kafka + - KAFKA_ADVERTISED_PORT=9092 + - KAFKA_CREATE_TOPICS=topic1:1:1 + + zookeeper: + image: wurstmeister/zookeeper + ports: + - "2181:2181" + app: build: context: . @@ -30,4 +45,5 @@ services: ports: - "8080:8080" depends_on: + - kafka - mysql diff --git a/pom.xml b/pom.xml index ee6261f..1cc2f4e 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot @@ -74,6 +74,15 @@ firebase-admin 9.1.1 + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.kafka + spring-kafka + @@ -113,4 +122,4 @@ - + \ No newline at end of file diff --git a/src/main/java/com/rm/mynotes/utils/config/KafkaConfig.java b/src/main/java/com/rm/mynotes/utils/config/KafkaConfig.java new file mode 100644 index 0000000..9c8d322 --- /dev/null +++ b/src/main/java/com/rm/mynotes/utils/config/KafkaConfig.java @@ -0,0 +1,32 @@ +package com.rm.mynotes.utils.config; + +import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.core.DefaultKafkaProducerFactory; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; + +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class KafkaConfig { + @Value("${spring.kafka.bootstrap-servers}") + private String bootstrapServers; + + @Bean + public ProducerFactory producerFactory() { + Map configProps = new HashMap<>(); + configProps.put(org.apache.kafka.clients.producer.ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + configProps.put(org.apache.kafka.clients.producer.ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + configProps.put(org.apache.kafka.clients.producer.ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + return new DefaultKafkaProducerFactory<>(configProps); + } + + @Bean + public KafkaTemplate kafkaTemplate() { + return new KafkaTemplate<>(producerFactory()); + } +} From a16c050bbfef1fa85cec30f5e665a9c2b21eb34e Mon Sep 17 00:00:00 2001 From: Rodrigo Moreira da Silva Date: Mon, 5 Jun 2023 23:02:37 -0300 Subject: [PATCH 2/7] :wrench: ci: Set kafka server host to application.yml --- src/main/resources/application.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a466188..b3af907 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -12,6 +12,8 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver username: ${DB_USERNAME} password: ${DB_PASSWORD} + kafka: + bootstrap-servers: ${KAFKA_SERVERS} jpa: hibernate: ddl-auto: create-drop From 7c22d29780a4bd2873cb218baa964665a3ed4741 Mon Sep 17 00:00:00 2001 From: Rodrigo Moreira da Silva Date: Mon, 5 Jun 2023 23:41:38 -0300 Subject: [PATCH 3/7] :construction: feat: creates basic structure of notification logic --- .../mynotes/resource/WebSocketResource.java | 20 ++++++++++++++++ .../utils/config/KafkaConsumerConfig.java | 24 +++++++++++++++++++ ...kaConfig.java => KafkaProducerConfig.java} | 2 +- .../mynotes/utils/config/WebSocketConfig.java | 22 +++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/rm/mynotes/resource/WebSocketResource.java create mode 100644 src/main/java/com/rm/mynotes/utils/config/KafkaConsumerConfig.java rename src/main/java/com/rm/mynotes/utils/config/{KafkaConfig.java => KafkaProducerConfig.java} (97%) create mode 100644 src/main/java/com/rm/mynotes/utils/config/WebSocketConfig.java diff --git a/src/main/java/com/rm/mynotes/resource/WebSocketResource.java b/src/main/java/com/rm/mynotes/resource/WebSocketResource.java new file mode 100644 index 0000000..cd619a8 --- /dev/null +++ b/src/main/java/com/rm/mynotes/resource/WebSocketResource.java @@ -0,0 +1,20 @@ +package com.rm.mynotes.resource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.SendTo; +import org.springframework.stereotype.Controller; + +@Controller +public class WebSocketResource { + @Autowired + private KafkaTemplate kafkaTemplate; + + @MessageMapping("/createReminder") + @SendTo("/topic/reminders") + public Object createEvent(Object reminder) { + kafkaTemplate.send("remindersTopic", reminder.toString()); + return reminder; + } +} diff --git a/src/main/java/com/rm/mynotes/utils/config/KafkaConsumerConfig.java b/src/main/java/com/rm/mynotes/utils/config/KafkaConsumerConfig.java new file mode 100644 index 0000000..94209f3 --- /dev/null +++ b/src/main/java/com/rm/mynotes/utils/config/KafkaConsumerConfig.java @@ -0,0 +1,24 @@ +package com.rm.mynotes.utils.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.annotation.EnableKafka; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.messaging.simp.SimpMessagingTemplate; + +@Configuration +@EnableKafka +public class KafkaConsumerConfig { + @Autowired + private SimpMessagingTemplate messagingTemplate; + + @KafkaListener(topics = "remindersTopic", groupId = "group1") + public void listen(String message) { + Object reminder = parseReminder(message); + messagingTemplate.convertAndSend("/app/topic/notifications", notification); + } + + private Object parseReminder(String message) { + return new Object(); + } +} diff --git a/src/main/java/com/rm/mynotes/utils/config/KafkaConfig.java b/src/main/java/com/rm/mynotes/utils/config/KafkaProducerConfig.java similarity index 97% rename from src/main/java/com/rm/mynotes/utils/config/KafkaConfig.java rename to src/main/java/com/rm/mynotes/utils/config/KafkaProducerConfig.java index 9c8d322..67d6e59 100644 --- a/src/main/java/com/rm/mynotes/utils/config/KafkaConfig.java +++ b/src/main/java/com/rm/mynotes/utils/config/KafkaProducerConfig.java @@ -12,7 +12,7 @@ import java.util.Map; @Configuration -public class KafkaConfig { +public class KafkaProducerConfig { @Value("${spring.kafka.bootstrap-servers}") private String bootstrapServers; diff --git a/src/main/java/com/rm/mynotes/utils/config/WebSocketConfig.java b/src/main/java/com/rm/mynotes/utils/config/WebSocketConfig.java new file mode 100644 index 0000000..cbbb086 --- /dev/null +++ b/src/main/java/com/rm/mynotes/utils/config/WebSocketConfig.java @@ -0,0 +1,22 @@ +package com.rm.mynotes.utils.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +@Configuration +@EnableWebSocketMessageBroker +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + @Override + public void configureMessageBroker(MessageBrokerRegistry config) { + config.enableSimpleBroker("/topic"); + config.setApplicationDestinationPrefixes("/app"); + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/websocket").withSockJS(); + } +} From 8a11443ae38789db88e430d65a9e78668f6194d2 Mon Sep 17 00:00:00 2001 From: Rodrigo Moreira da Silva Date: Mon, 5 Jun 2023 23:56:44 -0300 Subject: [PATCH 4/7] :construction: feat: Creates Notification and Reminder models --- .../com/rm/mynotes/model/Notification.java | 33 ++++++++++++++++++ .../java/com/rm/mynotes/model/Reminder.java | 34 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/main/java/com/rm/mynotes/model/Notification.java create mode 100644 src/main/java/com/rm/mynotes/model/Reminder.java diff --git a/src/main/java/com/rm/mynotes/model/Notification.java b/src/main/java/com/rm/mynotes/model/Notification.java new file mode 100644 index 0000000..b10179c --- /dev/null +++ b/src/main/java/com/rm/mynotes/model/Notification.java @@ -0,0 +1,33 @@ +package com.rm.mynotes.model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; +import java.time.OffsetDateTime; +import java.util.List; + +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Entity +public class Notification { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + private OffsetDateTime createdAt; + + private Boolean wasRead = false; + + private List content; + + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) + @JoinTable(name = "notification_reminder", joinColumns = @JoinColumn(name = "notification_id", referencedColumnName = "id"), + inverseJoinColumns = @JoinColumn(name = "reminder_id", referencedColumnName = "id") + ) + private Reminder reminder; +} diff --git a/src/main/java/com/rm/mynotes/model/Reminder.java b/src/main/java/com/rm/mynotes/model/Reminder.java new file mode 100644 index 0000000..0ca41e2 --- /dev/null +++ b/src/main/java/com/rm/mynotes/model/Reminder.java @@ -0,0 +1,34 @@ +package com.rm.mynotes.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; +import java.time.OffsetDateTime; + +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Entity +public class Reminder { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + private String title; + + @NotNull + private OffsetDateTime createdAt; + + @NotNull + private OffsetDateTime lastUpdate; + + @NotNull + private OffsetDateTime reminderDate; +} From 1f713887bd21b06a698deb3cac6325558c3b343c Mon Sep 17 00:00:00 2001 From: Rodrigo Moreira da Silva Date: Tue, 6 Jun 2023 00:04:12 -0300 Subject: [PATCH 5/7] :construction: feat: Adds Reminder and Notification model to kafka config classess --- src/main/java/com/rm/mynotes/model/Notification.java | 5 +++-- src/main/java/com/rm/mynotes/model/Reminder.java | 9 +++++---- .../java/com/rm/mynotes/resource/WebSocketResource.java | 3 ++- .../com/rm/mynotes/utils/config/KafkaConsumerConfig.java | 9 ++++++--- .../java/com/rm/mynotes/utils/constants/StatusTypes.java | 5 +++++ 5 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/rm/mynotes/utils/constants/StatusTypes.java diff --git a/src/main/java/com/rm/mynotes/model/Notification.java b/src/main/java/com/rm/mynotes/model/Notification.java index b10179c..e3e9610 100644 --- a/src/main/java/com/rm/mynotes/model/Notification.java +++ b/src/main/java/com/rm/mynotes/model/Notification.java @@ -1,5 +1,6 @@ package com.rm.mynotes.model; +import com.rm.mynotes.utils.constants.StatusTypes; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; @@ -7,7 +8,7 @@ import javax.validation.constraints.NotNull; import java.time.OffsetDateTime; -import java.util.List; +import java.util.Set; @Builder @NoArgsConstructor @@ -23,7 +24,7 @@ public class Notification { private Boolean wasRead = false; - private List content; + private Set content; @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) @JoinTable(name = "notification_reminder", joinColumns = @JoinColumn(name = "notification_id", referencedColumnName = "id"), diff --git a/src/main/java/com/rm/mynotes/model/Reminder.java b/src/main/java/com/rm/mynotes/model/Reminder.java index 0ca41e2..5337600 100644 --- a/src/main/java/com/rm/mynotes/model/Reminder.java +++ b/src/main/java/com/rm/mynotes/model/Reminder.java @@ -1,9 +1,7 @@ package com.rm.mynotes.model; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import com.rm.mynotes.utils.constants.StatusTypes; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.NoArgsConstructor; @@ -31,4 +29,7 @@ public class Reminder { @NotNull private OffsetDateTime reminderDate; + + @Enumerated(EnumType.STRING) + private StatusTypes status; } diff --git a/src/main/java/com/rm/mynotes/resource/WebSocketResource.java b/src/main/java/com/rm/mynotes/resource/WebSocketResource.java index cd619a8..50866bb 100644 --- a/src/main/java/com/rm/mynotes/resource/WebSocketResource.java +++ b/src/main/java/com/rm/mynotes/resource/WebSocketResource.java @@ -1,5 +1,6 @@ package com.rm.mynotes.resource; +import com.rm.mynotes.model.Reminder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.messaging.handler.annotation.MessageMapping; @@ -13,7 +14,7 @@ public class WebSocketResource { @MessageMapping("/createReminder") @SendTo("/topic/reminders") - public Object createEvent(Object reminder) { + public Reminder createEvent(Reminder reminder) { kafkaTemplate.send("remindersTopic", reminder.toString()); return reminder; } diff --git a/src/main/java/com/rm/mynotes/utils/config/KafkaConsumerConfig.java b/src/main/java/com/rm/mynotes/utils/config/KafkaConsumerConfig.java index 94209f3..a334301 100644 --- a/src/main/java/com/rm/mynotes/utils/config/KafkaConsumerConfig.java +++ b/src/main/java/com/rm/mynotes/utils/config/KafkaConsumerConfig.java @@ -1,5 +1,7 @@ package com.rm.mynotes.utils.config; +import com.rm.mynotes.model.Notification; +import com.rm.mynotes.model.Reminder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.kafka.annotation.EnableKafka; @@ -14,11 +16,12 @@ public class KafkaConsumerConfig { @KafkaListener(topics = "remindersTopic", groupId = "group1") public void listen(String message) { - Object reminder = parseReminder(message); + Reminder reminder = parseReminder(message); + Notification notification = new Notification(); messagingTemplate.convertAndSend("/app/topic/notifications", notification); } - private Object parseReminder(String message) { - return new Object(); + private Reminder parseReminder(String message) { + return new Reminder(); } } diff --git a/src/main/java/com/rm/mynotes/utils/constants/StatusTypes.java b/src/main/java/com/rm/mynotes/utils/constants/StatusTypes.java new file mode 100644 index 0000000..de0771c --- /dev/null +++ b/src/main/java/com/rm/mynotes/utils/constants/StatusTypes.java @@ -0,0 +1,5 @@ +package com.rm.mynotes.utils.constants; + +public enum StatusTypes { + PENDING, LATE, DONE, DONELATE +} From 87fd18f890688cb8094983693e38bd5a5572c8c3 Mon Sep 17 00:00:00 2001 From: Rodrigo Moreira da Silva Date: Tue, 6 Jun 2023 21:42:54 -0300 Subject: [PATCH 6/7] :construction: feat: Develops service and controller of reminders creation --- src/main/java/com/rm/mynotes/model/Note.java | 5 ++ .../repository/NotificationRepository.java | 9 +++ .../repository/ReminderRepository.java | 9 +++ .../rm/mynotes/resource/ReminderResource.java | 28 ++++++++ .../impl/ReminderServiceImplementation.java | 71 +++++++++++++++++++ .../mynotes/service/mold/ReminderService.java | 10 +++ .../mynotes/utils/constants/RoutePaths.java | 1 + .../utils/dto/requests/ReminderDTO.java | 16 +++++ 8 files changed, 149 insertions(+) create mode 100644 src/main/java/com/rm/mynotes/repository/NotificationRepository.java create mode 100644 src/main/java/com/rm/mynotes/repository/ReminderRepository.java create mode 100644 src/main/java/com/rm/mynotes/resource/ReminderResource.java create mode 100644 src/main/java/com/rm/mynotes/service/impl/ReminderServiceImplementation.java create mode 100644 src/main/java/com/rm/mynotes/service/mold/ReminderService.java create mode 100644 src/main/java/com/rm/mynotes/utils/dto/requests/ReminderDTO.java diff --git a/src/main/java/com/rm/mynotes/model/Note.java b/src/main/java/com/rm/mynotes/model/Note.java index 259b2a9..463f74f 100644 --- a/src/main/java/com/rm/mynotes/model/Note.java +++ b/src/main/java/com/rm/mynotes/model/Note.java @@ -12,6 +12,8 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.List; @Data @Builder @@ -40,6 +42,8 @@ public class Note { @NotNull private OffsetDateTime lastUpdate; + private List reminders = new ArrayList<>(); + @NotNull private OffsetDateTime createdAt; @@ -53,5 +57,6 @@ public Note(NoteDTO noteDTO) { this.description = noteDTO.getDescription(); this.createdAt = CommonFunctions.getCurrentDatetime(); this.lastUpdate = CommonFunctions.getCurrentDatetime(); + this.reminders = new ArrayList<>(); } } diff --git a/src/main/java/com/rm/mynotes/repository/NotificationRepository.java b/src/main/java/com/rm/mynotes/repository/NotificationRepository.java new file mode 100644 index 0000000..5b666ae --- /dev/null +++ b/src/main/java/com/rm/mynotes/repository/NotificationRepository.java @@ -0,0 +1,9 @@ +package com.rm.mynotes.repository; + +import com.rm.mynotes.model.Notification; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface NotificationRepository extends JpaRepository { +} diff --git a/src/main/java/com/rm/mynotes/repository/ReminderRepository.java b/src/main/java/com/rm/mynotes/repository/ReminderRepository.java new file mode 100644 index 0000000..29e537f --- /dev/null +++ b/src/main/java/com/rm/mynotes/repository/ReminderRepository.java @@ -0,0 +1,9 @@ +package com.rm.mynotes.repository; + +import com.rm.mynotes.model.Reminder; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ReminderRepository extends JpaRepository { +} diff --git a/src/main/java/com/rm/mynotes/resource/ReminderResource.java b/src/main/java/com/rm/mynotes/resource/ReminderResource.java new file mode 100644 index 0000000..1e72c7d --- /dev/null +++ b/src/main/java/com/rm/mynotes/resource/ReminderResource.java @@ -0,0 +1,28 @@ +package com.rm.mynotes.resource; + +import com.rm.mynotes.model.Reminder; +import com.rm.mynotes.service.mold.ReminderService; +import com.rm.mynotes.utils.dto.requests.ReminderDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping +public class ReminderResource { + @Autowired + private ReminderService reminderService; + + @GetMapping("/app/reminder/1") + public String test() { + return "você fez uma requisição!"; + } + + @PostMapping("/app/reminder/{noteId}") + public ResponseEntity createReminder(Authentication authentication, @RequestBody ReminderDTO reminderDTO, @RequestParam(required = true, name = "noteId") Long noteId) { + return reminderService.createReminder(authentication, reminderDTO, noteId); + } +} diff --git a/src/main/java/com/rm/mynotes/service/impl/ReminderServiceImplementation.java b/src/main/java/com/rm/mynotes/service/impl/ReminderServiceImplementation.java new file mode 100644 index 0000000..50e3397 --- /dev/null +++ b/src/main/java/com/rm/mynotes/service/impl/ReminderServiceImplementation.java @@ -0,0 +1,71 @@ +package com.rm.mynotes.service.impl; + +import com.rm.mynotes.model.Note; +import com.rm.mynotes.model.Reminder; +import com.rm.mynotes.model.UserEntity; +import com.rm.mynotes.repository.NoteRepository; +import com.rm.mynotes.repository.ReminderRepository; +import com.rm.mynotes.repository.UserRepository; +import com.rm.mynotes.service.mold.ReminderService; +import com.rm.mynotes.utils.constants.RoutePaths; +import com.rm.mynotes.utils.constants.StatusTypes; +import com.rm.mynotes.utils.dto.payloads.ResponseDTO; +import com.rm.mynotes.utils.dto.requests.ReminderDTO; +import com.rm.mynotes.utils.functions.CommonFunctions; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import java.net.URI; +import java.util.List; +import java.util.Objects; + +@Service +@RequiredArgsConstructor +public class ReminderServiceImplementation implements ReminderService { + @Autowired + private UserRepository userRepository; + + @Autowired + private NoteRepository noteRepository; + + @Autowired + private ReminderRepository reminderRepository; + + @Autowired + private CommonFunctions commonFunctions; + + @Override + public ResponseEntity createReminder(Authentication authentication, ReminderDTO reqReminder, Long noteId) { + UserEntity user = commonFunctions.getCurrentUser(authentication); + Note note = user.getNotes().stream().filter(userNote -> Objects.equals(userNote.getId(), noteId)) + .findFirst().orElseThrow(() -> new BadCredentialsException("A anotação informada não existe.")); + + Reminder reminder = Reminder.builder() + .reminderDate(reqReminder.getReminderDate()) + .createdAt(CommonFunctions.getCurrentDatetime()) + .lastUpdate(CommonFunctions.getCurrentDatetime()) + .status(StatusTypes.PENDING) + .build(); + + List reminders = note.getReminders(); + reminders.add(reminderRepository.save(reminder)); + + note.setReminders(reminders); + noteRepository.save(note); + + URI uri = URI.create(ServletUriComponentsBuilder.fromCurrentContextPath().path(RoutePaths.REMINDER).toUriString()); + + return ResponseEntity.created(uri).body(reminder); + } + + @ExceptionHandler(Exception.class) + public ResponseEntity handleException(Exception exception) { + return CommonFunctions.errorHandling(exception); + } +} diff --git a/src/main/java/com/rm/mynotes/service/mold/ReminderService.java b/src/main/java/com/rm/mynotes/service/mold/ReminderService.java new file mode 100644 index 0000000..ca14e27 --- /dev/null +++ b/src/main/java/com/rm/mynotes/service/mold/ReminderService.java @@ -0,0 +1,10 @@ +package com.rm.mynotes.service.mold; + +import com.rm.mynotes.model.Reminder; +import com.rm.mynotes.utils.dto.requests.ReminderDTO; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; + +public interface ReminderService { + ResponseEntity createReminder(Authentication authentication, ReminderDTO reqReminder, Long noteId); +} diff --git a/src/main/java/com/rm/mynotes/utils/constants/RoutePaths.java b/src/main/java/com/rm/mynotes/utils/constants/RoutePaths.java index d03e7bc..788d6e3 100644 --- a/src/main/java/com/rm/mynotes/utils/constants/RoutePaths.java +++ b/src/main/java/com/rm/mynotes/utils/constants/RoutePaths.java @@ -1,6 +1,7 @@ package com.rm.mynotes.utils.constants; public class RoutePaths { + public static final String REMINDER = "/app/reminder"; public static final String LOGIN = "/api/auth/login"; public static final String SIGNUP = "/api/auth/signup"; public static final String GET_NOTE = "/api/note/{id}"; diff --git a/src/main/java/com/rm/mynotes/utils/dto/requests/ReminderDTO.java b/src/main/java/com/rm/mynotes/utils/dto/requests/ReminderDTO.java new file mode 100644 index 0000000..9810c90 --- /dev/null +++ b/src/main/java/com/rm/mynotes/utils/dto/requests/ReminderDTO.java @@ -0,0 +1,16 @@ +package com.rm.mynotes.utils.dto.requests; + +import com.rm.mynotes.utils.constants.StatusTypes; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.time.OffsetDateTime; + +@Data +public class ReminderDTO { + @NotNull(message = "O título não pode está vázio") + private String title; + + @NotNull(message = "Deve haver ao menos uma data") + private OffsetDateTime reminderDate; +} From 6bc66e58615e061ecb71e6a45706ccbb080075de Mon Sep 17 00:00:00 2001 From: Rodrigo Moreira da Silva Date: Tue, 6 Jun 2023 21:43:46 -0300 Subject: [PATCH 7/7] :bricks: ci: Adds KAFKA ZOOKEPER CONNECT --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 1d1687c..f9b75e8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,6 +17,7 @@ services: - KAFKA_ADVERTISED_HOST_NAME=kafka - KAFKA_ADVERTISED_PORT=9092 - KAFKA_CREATE_TOPICS=topic1:1:1 + - KAFKA_ZOOKEEPER_CONNECT=${KAFKA_ZOOKEEPER_CONNECT} zookeeper: image: wurstmeister/zookeeper