diff --git a/pom.xml b/pom.xml index 32332ab..8b06a01 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ taskloom-backend 0.0.1-SNAPSHOT taskloom - Test-Driven Backend with Spring Boot + Less chaos, more completion - a human friendly task tracker diff --git a/src/main/java/com/taskloom/config/JpaAuditingConfig.java b/src/main/java/com/taskloom/config/JpaAuditingConfig.java new file mode 100644 index 0000000..966fc7c --- /dev/null +++ b/src/main/java/com/taskloom/config/JpaAuditingConfig.java @@ -0,0 +1,9 @@ +package com.taskloom.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@Configuration +@EnableJpaAuditing +public class JpaAuditingConfig { +} diff --git a/src/main/java/com/taskloom/controller/TaskController.java b/src/main/java/com/taskloom/controller/TaskController.java index 69b943d..752536e 100644 --- a/src/main/java/com/taskloom/controller/TaskController.java +++ b/src/main/java/com/taskloom/controller/TaskController.java @@ -42,7 +42,7 @@ public ResponseEntity updateTask(@PathVariable Integer id, @Reques @DeleteMapping("/{id}") public ResponseEntity deleteTaskById(@PathVariable Integer id) { taskService.deleteTaskById(id); - return ResponseEntity.status(201).body(id + " was deleted"); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @PatchMapping("/{id}/status") diff --git a/src/main/java/com/taskloom/entity/TaskEntity.java b/src/main/java/com/taskloom/entity/TaskEntity.java index dfc9a71..a8a272e 100644 --- a/src/main/java/com/taskloom/entity/TaskEntity.java +++ b/src/main/java/com/taskloom/entity/TaskEntity.java @@ -3,6 +3,11 @@ import com.taskloom.model.TaskStatus; import jakarta.persistence.*; import lombok.*; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.Instant; @Getter @Setter @@ -10,6 +15,7 @@ @NoArgsConstructor @AllArgsConstructor @Builder +@EntityListeners(AuditingEntityListener.class) public class TaskEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -19,4 +25,12 @@ public class TaskEntity { @Enumerated(EnumType.STRING) private TaskStatus status = TaskStatus.TODO; + + @CreatedDate + @Column(nullable = false, updatable = false) + private Instant createdAt; + + @LastModifiedDate + @Column(nullable = false) + private Instant updatedAt; } \ No newline at end of file diff --git a/src/main/java/com/taskloom/model/response/TaskResponse.java b/src/main/java/com/taskloom/model/response/TaskResponse.java index 310347e..49a5553 100644 --- a/src/main/java/com/taskloom/model/response/TaskResponse.java +++ b/src/main/java/com/taskloom/model/response/TaskResponse.java @@ -6,6 +6,8 @@ import lombok.NoArgsConstructor; import lombok.Setter; +import java.time.Instant; + @Getter @Setter @AllArgsConstructor @@ -15,4 +17,6 @@ public class TaskResponse { private String title; private String description; private TaskStatus status; + private Instant createdAt; + private Instant updatedAt; } diff --git a/src/main/java/com/taskloom/service/TaskService.java b/src/main/java/com/taskloom/service/TaskService.java index 435d71a..ef4f274 100644 --- a/src/main/java/com/taskloom/service/TaskService.java +++ b/src/main/java/com/taskloom/service/TaskService.java @@ -19,6 +19,9 @@ public class TaskService { private final TaskRepository taskRepository; + private TaskResponse toResponse(TaskEntity e){ + return new TaskResponse(e.getId(), e.getTitle(), e.getDescription(), e.getStatus(), e.getCreatedAt(), e.getUpdatedAt()); + } public List findAll() { List taskEntities = taskRepository.findAll(); @@ -27,46 +30,25 @@ public List findAll() { } return taskEntities.stream() - .map(taskEntity -> new TaskResponse( - taskEntity.getId(), - taskEntity.getTitle(), - taskEntity.getDescription(), - taskEntity.getStatus() - )).toList(); + .map(this::toResponse) + .toList(); } public TaskResponse findById(Integer id) { TaskEntity taskEntity = taskRepository.findById(id) .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Task not found")); - return new TaskResponse( - taskEntity.getId(), - taskEntity.getTitle(), - taskEntity.getDescription(), - taskEntity.getStatus() - ); + return toResponse(taskEntity); } public TaskResponse createTask(TaskCreateRequest taskCreateRequest) { TaskEntity taskEntity = TaskEntity.builder() .title(taskCreateRequest.getTitle()) .description(taskCreateRequest.getDescription()) + .status(taskCreateRequest.getStatus() != null ? taskCreateRequest.getStatus() : TaskStatus.TODO) .build(); - if(taskCreateRequest.getStatus() != null){ - taskEntity.setStatus(taskCreateRequest.getStatus()); - } - else{ - taskEntity.setStatus(TaskStatus.TODO); - } - - TaskEntity savedTask = taskRepository.save(taskEntity); - return new TaskResponse( - savedTask.getId(), - savedTask.getTitle(), - savedTask.getDescription(), - savedTask.getStatus() - ); + return toResponse(taskRepository.save(taskEntity)); } public TaskResponse updateTask(Integer id, TaskUpdateRequest taskUpdateRequest) { @@ -75,18 +57,13 @@ public TaskResponse updateTask(Integer id, TaskUpdateRequest taskUpdateRequest) taskEntity.setTitle(taskUpdateRequest.getTitle()); taskEntity.setDescription(taskUpdateRequest.getDescription()); - taskEntity.setStatus(taskUpdateRequest.getStatus()); - TaskEntity updatedTask = taskRepository.save(taskEntity); + taskEntity.setStatus(taskUpdateRequest.getStatus() != null ? taskUpdateRequest.getStatus() : TaskStatus.TODO); - return new TaskResponse( - updatedTask.getId(), - updatedTask.getTitle(), - updatedTask.getDescription(), - updatedTask.getStatus() - ); + return toResponse(taskRepository.save(taskEntity)); } public void deleteTaskById(Integer id) { + if(!taskRepository.existsById(id)) throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Task not found"); taskRepository.deleteById(id); } @@ -94,13 +71,6 @@ public TaskResponse updateTaskStatusById(Integer id, TaskStatusUpdate status) { TaskEntity taskEntity = taskRepository.findById(id) .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Task not found")); taskEntity.setStatus(status.getTaskStatus()); - TaskEntity updatedTask = taskRepository.save(taskEntity); - - return new TaskResponse( - updatedTask.getId(), - updatedTask.getTitle(), - updatedTask.getDescription(), - updatedTask.getStatus() - ); + return toResponse(taskRepository.save(taskEntity)); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e4bb758..3d80096 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -8,4 +8,8 @@ spring.h2.console.enabled=true debug=true spring.jpa.hibernate.ddl-auto=update -spring.jpa.show-sql=true \ No newline at end of file +spring.jpa.show-sql=true + +# Hibernate JDBC oturum saat dilimi (DB'ye UTC g�nder/DB'den UTC al) +spring.jpa.properties.hibernate.jdbc.time_zone=UTC +spring.jackson.time-zone=UTC