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
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,12 @@ public Object resolveArgument(
) {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();

// JwtFilter 에서 set 한 userId, email, userRole 값을 가져옴
// JwtFilter 에서 set 한 userId, email, userRole, nickname 값을 가져옴
Long userId = (Long) request.getAttribute("userId");
String email = (String) request.getAttribute("email");
UserRole userRole = UserRole.of((String) request.getAttribute("userRole"));
String nickname = (String) request.getAttribute("nickname");

return new AuthUser(userId, email, userRole);
return new AuthUser(userId, email, userRole, nickname);
}
}
1 change: 1 addition & 0 deletions src/main/java/org/example/expert/config/JwtFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -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"));

if (url.startsWith("/admin")) {
// 관리자 권한이 없는 경우 403을 반환합니다.
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/org/example/expert/config/JwtUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,15 @@ 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 +
Jwts.builder()
.setSubject(String.valueOf(userId))
.claim("email", email)
.claim("userRole", userRole)
.claim("nickname", nickname)
.setExpiration(new Date(date.getTime() + TOKEN_TIME))
.setIssuedAt(date) // 발급일
.signWith(key, signatureAlgorithm) // 암호화 알고리즘
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,6 @@ public class SignupRequest {
private String password;
@NotBlank
private String userRole;
@NotBlank
private String nickname;
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,12 @@ public SignupResponse signup(SignupRequest signupRequest) {
User newUser = new User(
signupRequest.getEmail(),
encodedPassword,
userRole
userRole,
signupRequest.getNickname()
);
User savedUser = userRepository.save(newUser);

String bearerToken = jwtUtil.createToken(savedUser.getId(), savedUser.getEmail(), userRole);
String bearerToken = jwtUtil.createToken(savedUser.getId(), savedUser.getEmail(), userRole, savedUser.getNickname());

return new SignupResponse(bearerToken);
}
Expand All @@ -56,7 +57,7 @@ public SigninResponse signin(SigninRequest signinRequest) {
throw new AuthException("잘못된 비밀번호입니다.");
}

String bearerToken = jwtUtil.createToken(user.getId(), user.getEmail(), user.getUserRole());
String bearerToken = jwtUtil.createToken(user.getId(), user.getEmail(), user.getUserRole(),user.getNickname());

return new SigninResponse(bearerToken);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public CommentSaveResponse saveComment(AuthUser authUser, long todoId, CommentSa
return new CommentSaveResponse(
savedComment.getId(),
savedComment.getContents(),
new UserResponse(user.getId(), user.getEmail())
new UserResponse(user.getId(), user.getEmail(), user.getNickname())
);
}

Expand All @@ -56,7 +56,7 @@ public List<CommentResponse> getComments(long todoId) {
CommentResponse dto = new CommentResponse(
comment.getId(),
comment.getContents(),
new UserResponse(user.getId(), user.getEmail())
new UserResponse(user.getId(), user.getEmail(), user.getNickname())
);
dtoList.add(dto);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@ public class AuthUser {
private final Long id;
private final String email;
private final UserRole userRole;
private final String nickname;

public AuthUser(Long id, String email, UserRole userRole) {
public AuthUser(Long id, String email, UserRole userRole, String nickname) {
this.id = id;
this.email = email;
this.userRole = userRole;
this.nickname = nickname;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public ManagerSaveResponse saveManager(AuthUser authUser, long todoId, ManagerSa

return new ManagerSaveResponse(
savedManagerUser.getId(),
new UserResponse(managerUser.getId(), managerUser.getEmail())
new UserResponse(managerUser.getId(), managerUser.getEmail(), managerUser.getNickname())
);
}

Expand All @@ -67,7 +67,7 @@ public List<ManagerResponse> getManagers(long todoId) {
User user = manager.getUser();
dtoList.add(new ManagerResponse(
manager.getId(),
new UserResponse(user.getId(), user.getEmail())
new UserResponse(user.getId(), user.getEmail(), user.getNickname())
));
}
return dtoList;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,12 @@ public ResponseEntity<TodoSaveResponse> saveTodo(
@GetMapping("/todos")
public ResponseEntity<Page<TodoResponse>> getTodos(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size
@RequestParam(defaultValue = "10") int size,
@RequestParam(required = false) String weather,
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate
) {
return ResponseEntity.ok(todoService.getTodos(page, size));
return ResponseEntity.ok(todoService.getTodos(page, size, weather, startDate, endDate));
}

@GetMapping("/todos/{todoId}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,25 @@
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.time.LocalDateTime;
import java.util.Optional;

public interface TodoRepository extends JpaRepository<Todo, Long> {

@Query("SELECT t FROM Todo t LEFT JOIN FETCH t.user u ORDER BY t.modifiedAt DESC")
Page<Todo> findAllByOrderByModifiedAtDesc(Pageable pageable);

@Query("SELECT t FROM Todo t " +
"LEFT JOIN t.user " +
"WHERE t.id = :todoId")
Optional<Todo> findByIdWithUser(@Param("todoId") Long todoId);

// 날씨가 없을경우
// 날짜없는 경우
// @Param 메소드와 연결을 위함
@Query("select t from Todo t " +
"WHERE (:weather IS NULL OR t.weather = :weather) " +
"AND (:startDate IS NULL OR t.modifiedAt >= :startDate) " +
"AND (:endDate IS NULL OR t.modifiedAt <= :endDate)")
Page<Todo> findTodosByConditions(Pageable pageable,
@Param("weather") String weather,
@Param("startDate") LocalDateTime startDate,
@Param("endDate") LocalDateTime endDate);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.format.DateTimeFormatter;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

@Service
@RequiredArgsConstructor
Expand All @@ -24,7 +29,10 @@ public class TodoService {

private final TodoRepository todoRepository;
private final WeatherClient weatherClient;
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");


@Transactional
public TodoSaveResponse saveTodo(AuthUser authUser, TodoSaveRequest todoSaveRequest) {
User user = User.fromAuthUser(authUser);

Expand All @@ -43,21 +51,46 @@ public TodoSaveResponse saveTodo(AuthUser authUser, TodoSaveRequest todoSaveRequ
savedTodo.getTitle(),
savedTodo.getContents(),
weather,
new UserResponse(user.getId(), user.getEmail())
new UserResponse(user.getId(), user.getEmail(), user.getNickname())
);
}

public Page<TodoResponse> getTodos(int page, int size) {
public Page<TodoResponse> getTodos(int page, int size, String weather, String startDateStr, String endDateStr) {
Pageable pageable = PageRequest.of(page - 1, size);

Page<Todo> todos = todoRepository.findAllByOrderByModifiedAtDesc(pageable);
LocalDate startDate = null;
if (startDateStr != null && !startDateStr.isEmpty()) {
startDate = LocalDate.parse(startDateStr, DATE_FORMATTER);
}

LocalDate endDate = null;
if (endDateStr != null && !endDateStr.isEmpty()) {
endDate = LocalDate.parse(endDateStr, DATE_FORMATTER);
}

LocalDateTime startDateTime = null;
if (startDate != null) {
startDateTime = startDate.atStartOfDay();
}

LocalDateTime endDateTime = null;
if (endDate != null) {
endDateTime = endDate.atTime(LocalTime.MAX);
}

Page<Todo> todos = todoRepository.findTodosByConditions(
pageable,
weather,
startDateTime,
endDateTime
);

return todos.map(todo -> new TodoResponse(
todo.getId(),
todo.getTitle(),
todo.getContents(),
todo.getWeather(),
new UserResponse(todo.getUser().getId(), todo.getUser().getEmail()),
new UserResponse(todo.getUser().getId(), todo.getUser().getEmail(), todo.getUser().getNickname()),
todo.getCreatedAt(),
todo.getModifiedAt()
));
Expand All @@ -74,7 +107,7 @@ public TodoResponse getTodo(long todoId) {
todo.getTitle(),
todo.getContents(),
todo.getWeather(),
new UserResponse(user.getId(), user.getEmail()),
new UserResponse(user.getId(), user.getEmail(), user.getNickname()),
todo.getCreatedAt(),
todo.getModifiedAt()
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ public class UserResponse {

private final Long id;
private final String email;
private final String nickname;

public UserResponse(Long id, String email) {
public UserResponse(Long id, String email, String nickname) {
this.id = id;
this.email = email;
this.nickname = nickname;
}
}
11 changes: 8 additions & 3 deletions src/main/java/org/example/expert/domain/user/entity/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,25 @@ public class User extends Timestamped {
@Enumerated(EnumType.STRING)
private UserRole userRole;

public User(String email, String password, UserRole userRole) {
@Column(nullable = true)
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) {
private User(Long id, String email, UserRole userRole, String nickname) {
this.id = id;
this.email = email;
this.userRole = userRole;
this.nickname = nickname;
}

public static User fromAuthUser(AuthUser authUser) {
return new User(authUser.getId(), authUser.getEmail(), authUser.getUserRole());
return new User(authUser.getId(), authUser.getEmail(), authUser.getUserRole(), authUser.getNickname());
}

public void changePassword(String password) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class UserService {

public UserResponse getUser(long userId) {
User user = userRepository.findById(userId).orElseThrow(() -> new InvalidRequestException("User not found"));
return new UserResponse(user.getId(), user.getEmail());
return new UserResponse(user.getId(), user.getEmail(), user.getNickname());
}

@Transactional
Expand Down
19 changes: 19 additions & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
jwt:
secret:
key: afd456af34s435s62dfa46ads5f425as4562asfd2564fads5462asdf4562afds2456

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/spring_plus
username: root
password: 6745
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
show_sql: true
format_sql: true
use_sql_comments: true
dialect: org.hibernate.dialect.MySQLDialect
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ class TodoControllerTest {
// given
long todoId = 1L;
String title = "title";
AuthUser authUser = new AuthUser(1L, "email", UserRole.USER);
AuthUser authUser = new AuthUser(1L, "email", UserRole.USER, "하룻강아지");
User user = User.fromAuthUser(authUser);
UserResponse userResponse = new UserResponse(user.getId(), user.getEmail());
UserResponse userResponse = new UserResponse(user.getId(), user.getEmail(), authUser.getNickname());
TodoResponse response = new TodoResponse(
todoId,
title,
Expand All @@ -61,17 +61,17 @@ class TodoControllerTest {
@Test
void todo_단건_조회_시_todo가_존재하지_않아_예외가_발생한다() throws Exception {
// given
long todoId = 1L;
long todoId = 5L;

// when
when(todoService.getTodo(todoId))
.thenThrow(new InvalidRequestException("Todo not found"));

// then
mockMvc.perform(get("/todos/{todoId}", todoId))
.andExpect(status().isOk())
.andExpect(jsonPath("$.status").value(HttpStatus.OK.name()))
.andExpect(jsonPath("$.code").value(HttpStatus.OK.value()))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.status").value(HttpStatus.BAD_REQUEST.name()))
.andExpect(jsonPath("$.code").value(HttpStatus.BAD_REQUEST.value()))
.andExpect(jsonPath("$.message").value("Todo not found"));
}
}