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