Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
Expand Down
14 changes: 14 additions & 0 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -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:
27 changes: 27 additions & 0 deletions src/main/java/org/javaspringcourse/controller/TodoController.java
Original file line number Diff line number Diff line change
@@ -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<TodoDto> getAllTodo() {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TaskDto используется как для ответа, так и для запроса. В данном случае не принципиально, но лучше для ответа и запроса (даже если в разных методах используется) создавать свои ДТО

return todoService.findAll();
}

@PostMapping("/create")
@ResponseStatus(HttpStatus.CREATED)
public void createTodo(@RequestBody TodoDto todoDto) {
todoService.save(todoDto);
}
}
5 changes: 5 additions & 0 deletions src/main/java/org/javaspringcourse/dto/TodoDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.javaspringcourse.dto;

import java.util.List;

public record TodoDto(String name, List<String> events) {}
32 changes: 32 additions & 0 deletions src/main/java/org/javaspringcourse/model/TodoEntity.java
Original file line number Diff line number Diff line change
@@ -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 {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

У всех entity необходимо переопределять hashCode и equalse методы

@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<String> events = new HashSet<String>();

public TodoEntity(String name, Set<String> events) {
this.name = name;
this.events = events;
}
}
Original file line number Diff line number Diff line change
@@ -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<TodoEntity, Long> {}
34 changes: 34 additions & 0 deletions src/main/java/org/javaspringcourse/service/TodoService.java
Original file line number Diff line number Diff line change
@@ -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<TodoDto> findAll() {
return todoEntityRepository.findAll().stream()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Получим проблему n+1, на каждый Task будет выполнен запрос на поиск events, хотя все это можно загрузить за один запрос

.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);
}
}
1 change: 0 additions & 1 deletion src/main/resources/application.properties

This file was deleted.

8 changes: 8 additions & 0 deletions src/main/resources/application.yaml
Original file line number Diff line number Diff line change
@@ -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