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 @@ -6,6 +6,7 @@
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
Expand All @@ -18,7 +19,7 @@ public class AdminAccessLoggingAspect {

private final HttpServletRequest request;

@After("execution(* org.example.expert.domain.user.controller.UserController.getUser(..))")
@Before("execution(* org.example.expert.domain.user.controller.UserAdminController.changeUserRole(..))")
public void logAfterChangeUserRole(JoinPoint joinPoint) {
String userId = String.valueOf(request.getAttribute("userId"));
String requestUrl = request.getRequestURI();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@ public Object resolveArgument(
// JwtFilter 에서 set 한 userId, email, userRole 값을 가져옴
Long userId = (Long) request.getAttribute("userId");
String email = (String) request.getAttribute("email");
String nickname = (String) request.getAttribute("nickname");
UserRole userRole = UserRole.of((String) request.getAttribute("userRole"));

return new AuthUser(userId, email, userRole);
return new AuthUser(userId, email, nickname, userRole);
}
}
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 @@ -59,6 +59,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha

httpRequest.setAttribute("userId", Long.parseLong(claims.getSubject()));
httpRequest.setAttribute("email", claims.get("email"));
httpRequest.setAttribute("nickname", claims.get("nickname", String.class));
httpRequest.setAttribute("userRole", claims.get("userRole"));

if (url.startsWith("/admin")) {
Expand Down
5 changes: 4 additions & 1 deletion src/main/java/org/example/expert/config/JwtUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import jakarta.annotation.PostConstruct;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.example.expert.domain.common.exception.ServerException;
import org.example.expert.domain.user.enums.UserRole;
Expand All @@ -18,6 +19,7 @@

@Slf4j(topic = "JwtUtil")
@Component
@Getter
public class JwtUtil {

private static final String BEARER_PREFIX = "Bearer ";
Expand All @@ -34,13 +36,14 @@ public void init() {
key = Keys.hmacShaKeyFor(bytes);
}

public String createToken(Long userId, String email, UserRole userRole) {
public String createToken(Long userId, String email, String nickname, UserRole userRole) {
Date date = new Date();

return BEARER_PREFIX +
Jwts.builder()
.setSubject(String.valueOf(userId))
.claim("email", email)
.claim("nickname", nickname)
.claim("userRole", userRole)
.setExpiration(new Date(date.getTime() + TOKEN_TIME))
.setIssuedAt(date) // 발급일
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,8 @@ public class SignupRequest {
@NotBlank
private String password;
@NotBlank
private String nickname;
@NotBlank
private String userRole;

}
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,
signupRequest.getNickname(),
userRole
);
User savedUser = userRepository.save(newUser);

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

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.getNickname(), user.getUserRole());

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 @@ -8,11 +8,13 @@ public class AuthUser {

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

public AuthUser(Long id, String email, UserRole userRole) {
public AuthUser(Long id, String email, String nickname, UserRole userRole) {
this.id = id;
this.email = email;
this.nickname = nickname;
this.userRole = userRole;
}
}
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 @@ -9,9 +9,12 @@
import org.example.expert.domain.todo.dto.response.TodoSaveResponse;
import org.example.expert.domain.todo.service.TodoService;
import org.springframework.data.domain.Page;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;

@RestController
@RequiredArgsConstructor
public class TodoController {
Expand All @@ -38,4 +41,16 @@ public ResponseEntity<Page<TodoResponse>> getTodos(
public ResponseEntity<TodoResponse> getTodo(@PathVariable long todoId) {
return ResponseEntity.ok(todoService.getTodo(todoId));
}

@GetMapping("/todos/search")
public Page<TodoResponse> searchTodos(
@RequestParam(required = false) String weather,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)LocalDateTime startDate,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)LocalDateTime endDate,
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size
) {
return todoService.searchTodos(weather, startDate, endDate, page, size);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
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> {
Expand All @@ -18,4 +19,20 @@ public interface TodoRepository extends JpaRepository<Todo, Long> {
"LEFT JOIN t.user " +
"WHERE t.id = :todoId")
Optional<Todo> findByIdWithUser(@Param("todoId") Long todoId);

@Query(" SELECT t FROM Todo t " +
" LEFT JOIN FETCH t.user " +
" 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<Todo> findAllByWeatherAndDateRange(
@Param("weather") String weather,
@Param("startDate")LocalDateTime startDate,
@Param("endDate") LocalDateTime endDate,
Pageable pageable
);


}
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,18 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class TodoService {

private final TodoRepository todoRepository;
private final WeatherClient weatherClient;

@Transactional
public TodoSaveResponse saveTodo(AuthUser authUser, TodoSaveRequest todoSaveRequest) {

User user = User.fromAuthUser(authUser);

String weather = weatherClient.getTodayWeather();
Expand All @@ -43,10 +46,11 @@ 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())
);
}

@Transactional(readOnly = true)
public Page<TodoResponse> getTodos(int page, int size) {
Pageable pageable = PageRequest.of(page - 1, size);

Expand All @@ -57,12 +61,37 @@ public Page<TodoResponse> getTodos(int page, int size) {
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()
));
}

@Transactional(readOnly = true)
public Page<TodoResponse> searchTodos(String weather, LocalDateTime startDate, LocalDateTime endDate, int page, int size) {
Pageable pageable = PageRequest.of(page - 1, size);

if (startDate == null) {
startDate = LocalDateTime.of(1000, 1, 1, 0, 0);
}
if (endDate == null) {
endDate = LocalDateTime.of(9999, 12, 31, 23, 59);
}

Page<Todo> todos = todoRepository.findAllByWeatherAndDateRange(weather, startDate, endDate, pageable);

return todos.map(todo -> new TodoResponse(
todo.getId(),
todo.getTitle(),
todo.getContents(),
todo.getWeather(),
new UserResponse(todo.getUser().getId(), todo.getUser().getEmail(), todo.getUser().getNickname()),
todo.getCreatedAt(),
todo.getModifiedAt()
));
}

@Transactional(readOnly = true)
public TodoResponse getTodo(long todoId) {
Todo todo = todoRepository.findByIdWithUser(todoId)
.orElseThrow(() -> new InvalidRequestException("Todo not found"));
Expand All @@ -74,7 +103,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;
}
}
9 changes: 6 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 @@ -18,23 +18,26 @@ public class User extends Timestamped {
@Column(unique = true)
private String email;
private String password;
private String nickname;
@Enumerated(EnumType.STRING)
private UserRole userRole;

public User(String email, String password, UserRole userRole) {
public User(String email, String password, String nickname, UserRole userRole) {
this.email = email;
this.password = password;
this.nickname = nickname;
this.userRole = userRole;
}

private User(Long id, String email, UserRole userRole) {
private User(Long id, String email, String nickname,UserRole userRole) {
this.id = id;
this.email = email;
this.nickname = nickname;
this.userRole = userRole;
}

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

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
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", "nickname",UserRole.USER);
User user = User.fromAuthUser(authUser);
UserResponse userResponse = new UserResponse(user.getId(), user.getEmail());
UserResponse userResponse = new UserResponse(user.getId(), user.getEmail(), user.getNickname());
TodoResponse response = new TodoResponse(
todoId,
title,
Expand Down Expand Up @@ -69,9 +69,9 @@ class TodoControllerTest {

// 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"));
}
}