diff --git a/src/main/java/org/example/expert/config/JwtFilter.java b/src/main/java/org/example/expert/config/JwtFilter.java index 03908abe1..f039993a8 100644 --- a/src/main/java/org/example/expert/config/JwtFilter.java +++ b/src/main/java/org/example/expert/config/JwtFilter.java @@ -60,6 +60,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha httpRequest.setAttribute("userId", Long.parseLong(claims.getSubject())); httpRequest.setAttribute("email", claims.get("email")); httpRequest.setAttribute("userRole", claims.get("userRole")); + httpRequest.setAttribute("nickName", claims.get("nickName")); // 닉네임을 사용하기 위해 request에 담기 if (url.startsWith("/admin")) { // 관리자 권한이 없는 경우 403을 반환합니다. diff --git a/src/main/java/org/example/expert/config/JwtUtil.java b/src/main/java/org/example/expert/config/JwtUtil.java index 07e0a2c7c..ee6161603 100644 --- a/src/main/java/org/example/expert/config/JwtUtil.java +++ b/src/main/java/org/example/expert/config/JwtUtil.java @@ -34,7 +34,7 @@ public void init() { key = Keys.hmacShaKeyFor(bytes); } - public String createToken(Long userId, String email, UserRole userRole) { + public String createToken(Long userId, String email, UserRole userRole, String nickName) { Date date = new Date(); return BEARER_PREFIX + @@ -42,6 +42,7 @@ public String createToken(Long userId, String email, UserRole userRole) { .setSubject(String.valueOf(userId)) .claim("email", email) .claim("userRole", userRole) + .claim("nickName", nickName) //JWT에서 닉네임을 보여주기 위해 닉네임을 넣음 .setExpiration(new Date(date.getTime() + TOKEN_TIME)) .setIssuedAt(date) // 발급일 .signWith(key, signatureAlgorithm) // 암호화 알고리즘 diff --git a/src/main/java/org/example/expert/domain/todo/controller/TodoController.java b/src/main/java/org/example/expert/domain/todo/controller/TodoController.java index eed1a1b46..a510a7b7d 100644 --- a/src/main/java/org/example/expert/domain/todo/controller/TodoController.java +++ b/src/main/java/org/example/expert/domain/todo/controller/TodoController.java @@ -12,6 +12,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; + @RestController @RequiredArgsConstructor public class TodoController { @@ -29,9 +31,12 @@ public ResponseEntity saveTodo( @GetMapping("/todos") public ResponseEntity> getTodos( @RequestParam(defaultValue = "1") int page, - @RequestParam(defaultValue = "10") int size + @RequestParam(defaultValue = "10") int size, + @RequestParam(required = false) String weather, + @RequestParam LocalDate startDate, + @RequestParam LocalDate endDate ) { - return ResponseEntity.ok(todoService.getTodos(page, size)); + return ResponseEntity.ok(todoService.getTodos(page, size, weather, startDate, endDate)); } @GetMapping("/todos/{todoId}") diff --git a/src/main/java/org/example/expert/domain/todo/dto/request/TodoSaveRequest.java b/src/main/java/org/example/expert/domain/todo/dto/request/TodoSaveRequest.java index 9a186024e..9d05bd44a 100644 --- a/src/main/java/org/example/expert/domain/todo/dto/request/TodoSaveRequest.java +++ b/src/main/java/org/example/expert/domain/todo/dto/request/TodoSaveRequest.java @@ -14,4 +14,6 @@ public class TodoSaveRequest { private String title; @NotBlank private String contents; + @NotBlank + private String nickName; } diff --git a/src/main/java/org/example/expert/domain/todo/dto/response/TodoResponse.java b/src/main/java/org/example/expert/domain/todo/dto/response/TodoResponse.java index 3ec935e4b..92836de4a 100644 --- a/src/main/java/org/example/expert/domain/todo/dto/response/TodoResponse.java +++ b/src/main/java/org/example/expert/domain/todo/dto/response/TodoResponse.java @@ -11,15 +11,17 @@ public class TodoResponse { private final Long id; private final String title; private final String contents; + private String nickName; private final String weather; private final UserResponse user; private final LocalDateTime createdAt; private final LocalDateTime modifiedAt; - public TodoResponse(Long id, String title, String contents, String weather, UserResponse user, LocalDateTime createdAt, LocalDateTime modifiedAt) { + public TodoResponse(Long id, String title, String contents,String nickName, String weather, UserResponse user, LocalDateTime createdAt, LocalDateTime modifiedAt) { this.id = id; this.title = title; this.contents = contents; + this.nickName = nickName; this.weather = weather; this.user = user; this.createdAt = createdAt; diff --git a/src/main/java/org/example/expert/domain/todo/entity/Todo.java b/src/main/java/org/example/expert/domain/todo/entity/Todo.java index b4efcced1..3a777f0c6 100644 --- a/src/main/java/org/example/expert/domain/todo/entity/Todo.java +++ b/src/main/java/org/example/expert/domain/todo/entity/Todo.java @@ -22,6 +22,7 @@ public class Todo extends Timestamped { private String title; private String contents; private String weather; + private String nickName; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false) diff --git a/src/main/java/org/example/expert/domain/todo/repository/TodoRepository.java b/src/main/java/org/example/expert/domain/todo/repository/TodoRepository.java index a3e4e0749..73519f21d 100644 --- a/src/main/java/org/example/expert/domain/todo/repository/TodoRepository.java +++ b/src/main/java/org/example/expert/domain/todo/repository/TodoRepository.java @@ -7,15 +7,27 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.time.LocalDate; import java.util.Optional; public interface TodoRepository extends JpaRepository { - @Query("SELECT t FROM Todo t LEFT JOIN FETCH t.user u ORDER BY t.modifiedAt DESC") - Page findAllByOrderByModifiedAtDesc(Pageable pageable); + @Query("SELECT t FROM Todo t LEFT JOIN FETCH t.user u" + + "WHERE(:weather IS NULL OR t.weather = :weather) " + + "AND (:startDate IS NULL OR t.modifiedAt >= :startDate)" + + "AND (:endDate IS NULL OR t.modifiedAt <= :endDate)" + + "ORDER BY t.modifiedAt DESC") + Page findAllByOrderByModifiedAtDesc( + @Param("weather") String weather, + @Param("startDate") LocalDate startDate, + @Param("endDate") LocalDate endDate, + Pageable pageable + ); @Query("SELECT t FROM Todo t " + "LEFT JOIN t.user " + "WHERE t.id = :todoId") Optional findByIdWithUser(@Param("todoId") Long todoId); + + } diff --git a/src/main/java/org/example/expert/domain/todo/service/TodoService.java b/src/main/java/org/example/expert/domain/todo/service/TodoService.java index 922991ce7..4be734f8d 100644 --- a/src/main/java/org/example/expert/domain/todo/service/TodoService.java +++ b/src/main/java/org/example/expert/domain/todo/service/TodoService.java @@ -19,7 +19,7 @@ @Service @RequiredArgsConstructor -@Transactional(readOnly = true) + public class TodoService { private final TodoRepository todoRepository; @@ -47,7 +47,7 @@ public TodoSaveResponse saveTodo(AuthUser authUser, TodoSaveRequest todoSaveRequ ); } - public Page getTodos(int page, int size) { + public Page getTodos(int page, int size, String weather, String startDate, String endDate) { Pageable pageable = PageRequest.of(page - 1, size); Page todos = todoRepository.findAllByOrderByModifiedAtDesc(pageable); @@ -57,6 +57,7 @@ public Page getTodos(int page, int size) { todo.getTitle(), todo.getContents(), todo.getWeather(), + todo.getUser().getNickName(), new UserResponse(todo.getUser().getId(), todo.getUser().getEmail()), todo.getCreatedAt(), todo.getModifiedAt() @@ -74,6 +75,7 @@ public TodoResponse getTodo(long todoId) { todo.getTitle(), todo.getContents(), todo.getWeather(), + todo.getUser().getNickName(), new UserResponse(user.getId(), user.getEmail()), todo.getCreatedAt(), todo.getModifiedAt() diff --git a/src/main/java/org/example/expert/domain/user/entity/User.java b/src/main/java/org/example/expert/domain/user/entity/User.java index 30a0cc54f..ca304a5fa 100644 --- a/src/main/java/org/example/expert/domain/user/entity/User.java +++ b/src/main/java/org/example/expert/domain/user/entity/User.java @@ -1,6 +1,7 @@ package org.example.expert.domain.user.entity; import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; import lombok.Getter; import lombok.NoArgsConstructor; import org.example.expert.domain.common.dto.AuthUser; @@ -21,10 +22,16 @@ public class User extends Timestamped { @Enumerated(EnumType.STRING) private UserRole userRole; - public User(String email, String password, UserRole userRole) { + @NotBlank + @Column(unique = false) + private String nickName; + + + public User(String email, String password, UserRole userRole, String nickName) { this.email = email; this.password = password; this.userRole = userRole; + this.nickName = nickName; } private User(Long id, String email, UserRole userRole) {