From f820b725c3a3507c9aafce20efac347815db81a6 Mon Sep 17 00:00:00 2001 From: Kama-Pushka Date: Sun, 20 Apr 2025 03:33:42 +0500 Subject: [PATCH] todo-service --- build.gradle.kts | 5 +++ docker-compose.yaml | 14 ++++++++ .../controller/TodoController.java | 27 +++++++++++++++ .../org/javaspringcourse/dto/TodoDto.java | 5 +++ .../javaspringcourse/model/TodoEntity.java | 32 +++++++++++++++++ .../repository/TodoEntityRepository.java | 8 +++++ .../javaspringcourse/service/TodoService.java | 34 +++++++++++++++++++ src/main/resources/application.properties | 1 - src/main/resources/application.yaml | 8 +++++ 9 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 docker-compose.yaml create mode 100644 src/main/java/org/javaspringcourse/controller/TodoController.java create mode 100644 src/main/java/org/javaspringcourse/dto/TodoDto.java create mode 100644 src/main/java/org/javaspringcourse/model/TodoEntity.java create mode 100644 src/main/java/org/javaspringcourse/repository/TodoEntityRepository.java create mode 100644 src/main/java/org/javaspringcourse/service/TodoService.java delete mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/application.yaml diff --git a/build.gradle.kts b/build.gradle.kts index fc5abdc..ac29ab8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,6 +19,11 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter") + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + runtimeOnly("org.postgresql:postgresql") + compileOnly("org.projectlombok:lombok") + annotationProcessor("org.projectlombok:lombok") testImplementation("org.springframework.boot:spring-boot-starter-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..d10d15f --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,14 @@ +services: + todo: + image: postgres:latest + environment: + - POSTGRES_USER=admin + - POSTGRES_PASSWORD=maozedong + - POSTGRES_DB=todo + ports: + - "5432:5432" + volumes: + - todo_data:/var/lib/postgresql/data + +volumes: + todo_data: \ No newline at end of file diff --git a/src/main/java/org/javaspringcourse/controller/TodoController.java b/src/main/java/org/javaspringcourse/controller/TodoController.java new file mode 100644 index 0000000..1bc1d30 --- /dev/null +++ b/src/main/java/org/javaspringcourse/controller/TodoController.java @@ -0,0 +1,27 @@ +package org.javaspringcourse.controller; + +import lombok.RequiredArgsConstructor; +import org.javaspringcourse.dto.TodoDto; +import org.javaspringcourse.service.TodoService; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/todo") +@RequiredArgsConstructor +public class TodoController { + private final TodoService todoService; + + @GetMapping("/get") + public List getAllTodo() { + return todoService.findAll(); + } + + @PostMapping("/create") + @ResponseStatus(HttpStatus.CREATED) + public void createTodo(@RequestBody TodoDto todoDto) { + todoService.save(todoDto); + } +} diff --git a/src/main/java/org/javaspringcourse/dto/TodoDto.java b/src/main/java/org/javaspringcourse/dto/TodoDto.java new file mode 100644 index 0000000..7354cff --- /dev/null +++ b/src/main/java/org/javaspringcourse/dto/TodoDto.java @@ -0,0 +1,5 @@ +package org.javaspringcourse.dto; + +import java.util.List; + +public record TodoDto(String name, List events) {} \ No newline at end of file diff --git a/src/main/java/org/javaspringcourse/model/TodoEntity.java b/src/main/java/org/javaspringcourse/model/TodoEntity.java new file mode 100644 index 0000000..4058752 --- /dev/null +++ b/src/main/java/org/javaspringcourse/model/TodoEntity.java @@ -0,0 +1,32 @@ +package org.javaspringcourse.model; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.HashSet; +import java.util.Set; + +@Getter +@Setter +@NoArgsConstructor +@Entity +@Table(name = "todo") +public class TodoEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(nullable = false) + private String name; + + @ElementCollection + @CollectionTable(name = "events", joinColumns = @JoinColumn(name = "todo_id")) + private Set events = new HashSet(); + + public TodoEntity(String name, Set events) { + this.name = name; + this.events = events; + } +} diff --git a/src/main/java/org/javaspringcourse/repository/TodoEntityRepository.java b/src/main/java/org/javaspringcourse/repository/TodoEntityRepository.java new file mode 100644 index 0000000..56a555f --- /dev/null +++ b/src/main/java/org/javaspringcourse/repository/TodoEntityRepository.java @@ -0,0 +1,8 @@ +package org.javaspringcourse.repository; + +import org.javaspringcourse.model.TodoEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface TodoEntityRepository extends JpaRepository {} \ No newline at end of file diff --git a/src/main/java/org/javaspringcourse/service/TodoService.java b/src/main/java/org/javaspringcourse/service/TodoService.java new file mode 100644 index 0000000..6d156e1 --- /dev/null +++ b/src/main/java/org/javaspringcourse/service/TodoService.java @@ -0,0 +1,34 @@ +package org.javaspringcourse.service; + +import lombok.RequiredArgsConstructor; +import org.javaspringcourse.dto.TodoDto; +import org.javaspringcourse.model.TodoEntity; +import org.javaspringcourse.repository.TodoEntityRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashSet; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class TodoService { + private final TodoEntityRepository todoEntityRepository; + + @Transactional(readOnly = true) + public List findAll() { + return todoEntityRepository.findAll().stream() + .map(this::toDto) + .toList(); + } + + private TodoDto toDto(TodoEntity todo) { + return new TodoDto(todo.getName(), todo.getEvents().stream().toList()); + } + + @Transactional + public void save(TodoDto todoDto) { + var todoEntity = new TodoEntity(todoDto.name(), new HashSet<>(todoDto.events())); + todoEntityRepository.save(todoEntity); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 61bae71..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=java-spring-course diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 0000000..f78aaf6 --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,8 @@ +spring: + datasource: + url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:todo} + username: ${POSTGRES_USER:admin} + password: ${POSTGRES_PASSWORD:maozedong} + jpa: + hibernate: + ddl-auto: create-drop \ No newline at end of file