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
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ dependencies {
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

runtimeOnly 'com.h2database:h2'
// bcrypt
implementation 'at.favre.lib:bcrypt:0.10.2'

Expand Down
146 changes: 146 additions & 0 deletions src/main/java/org/example/expert/InitData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
package org.example.expert;

import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.example.expert.client.WeatherClient;
import org.example.expert.config.PasswordEncoder;
import org.example.expert.domain.comment.entity.Comment;
import org.example.expert.domain.comment.repository.CommentRepository;
import org.example.expert.domain.todo.entity.Todo;
import org.example.expert.domain.todo.repository.TodoRepository;
import org.example.expert.domain.user.entity.User;
import org.example.expert.domain.user.enums.UserRole;
import org.example.expert.domain.user.repository.UserRepository;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class InitData {

private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
private final TodoRepository todoRepository;
private final WeatherClient weatherClient;
private final CommentRepository commentRepository;

@PostConstruct
public void init() {

String encodedPassword = passwordEncoder.encode("TestTest1");

UserRole userRole1 = UserRole.of("ADMIN");
UserRole userRole2 = UserRole.of("USER");

User newUser = new User(
"lee@seo.jun",
encodedPassword,
userRole1
);

User newUser1 = new User(
"lee@jun.beum",
encodedPassword,
userRole2
);

User savedUser = userRepository.save(newUser);
User savedUser1 = userRepository.save(newUser1);


String weather = weatherClient.getTodayWeather();

Todo newTodo = new Todo(
"TODO 테스트",
"TODO 내용인가요",
weather,
savedUser
);

Todo newTodo2 = new Todo(
"TODO 테스트",
"TODO 내용인가요",
weather,
savedUser
);

Todo newTodo3 = new Todo(
"TODO 테스트",
"TODO 내용인가요",
weather,
savedUser1
);
Todo newTodo4 = new Todo(
"TODO 테스트",
"TODO 내용인가요",
weather,
savedUser1
);
Todo newTodo5 = new Todo(
"TODO 테스트",
"TODO 내용인가요",
weather,
savedUser
);

Todo savedTodo = todoRepository.save(newTodo);
Todo savedTodo1 = todoRepository.save(newTodo2);
Todo savedTodo2 = todoRepository.save(newTodo3);
Todo savedTodo3 = todoRepository.save(newTodo4);
Todo savedTodo4 = todoRepository.save(newTodo5);

Comment newComment = new Comment(
"댓글 내용입니다.",
newUser,
savedTodo
);
Comment newComment1 = new Comment(
"댓글 내용입니다.",
newUser1,
savedTodo
);Comment newComment2 = new Comment(
"댓글 내용입니다.",
newUser1,
savedTodo
);Comment newComment3 = new Comment(
"댓글 내용입니다.",
newUser,
savedTodo2
);Comment newComment4 = new Comment(
"댓글 내용입니다.",
newUser,
savedTodo3
);Comment newComment5 = new Comment(
"댓글 내용입니다.",
newUser,
savedTodo4
);Comment newComment6 = new Comment(
"댓글 내용입니다.",
newUser,
savedTodo1
);Comment newComment7 = new Comment(
"댓글 내용입니다.",
newUser,
savedTodo
);Comment newComment8 = new Comment(
"댓글 내용입니다.",
newUser,
savedTodo
);Comment newComment9 = new Comment(
"댓글 내용입니다.",
newUser,
savedTodo
);

Comment savedComment = commentRepository.save(newComment);
Comment savedComment1 = commentRepository.save(newComment1);
Comment savedComment2 = commentRepository.save(newComment2);
Comment savedComment3 = commentRepository.save(newComment3);
Comment savedComment4 = commentRepository.save(newComment4);
Comment savedComment5 = commentRepository.save(newComment5);
Comment savedComment6 = commentRepository.save(newComment6);
Comment savedComment7 = commentRepository.save(newComment7);
Comment savedComment8 = commentRepository.save(newComment8);
Comment savedComment9 = commentRepository.save(newComment9);

}
}
8 changes: 4 additions & 4 deletions src/main/java/org/example/expert/client/WeatherClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ public String getTodayWeather() {
WeatherDto[] weatherArray = responseEntity.getBody();
if (!HttpStatus.OK.equals(responseEntity.getStatusCode())) {
throw new ServerException("날씨 데이터를 가져오는데 실패했습니다. 상태 코드: " + responseEntity.getStatusCode());
} else {
if (weatherArray == null || weatherArray.length == 0) {
throw new ServerException("날씨 데이터가 없습니다.");
}
}

if (weatherArray == null || weatherArray.length == 0) {
throw new ServerException("날씨 데이터가 없습니다.");
}

String today = getCurrentDate();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
package org.example.expert.config;

import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.example.expert.domain.auth.exception.AuthException;
import org.example.expert.domain.common.annotation.Auth;
import org.example.expert.domain.common.dto.AuthUser;
import org.example.expert.domain.user.enums.UserRole;
import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

@Component
public class AuthUserArgumentResolver implements HandlerMethodArgumentResolver {

@Override
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/org/example/expert/config/WebConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.example.expert.config;

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {

private final AuthUserArgumentResolver authUserArgumentResolver;

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(authUserArgumentResolver);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ public class AuthService {
@Transactional
public SignupResponse signup(SignupRequest signupRequest) {

String encodedPassword = passwordEncoder.encode(signupRequest.getPassword());

UserRole userRole = UserRole.of(signupRequest.getUserRole());

if (userRepository.existsByEmail(signupRequest.getEmail())) {
throw new InvalidRequestException("이미 존재하는 이메일입니다.");
}

String encodedPassword = passwordEncoder.encode(signupRequest.getPassword());

UserRole userRole = UserRole.of(signupRequest.getUserRole());

User newUser = new User(
signupRequest.getEmail(),
encodedPassword,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.example.expert.domain.comment.repository.CommentRepository;
import org.example.expert.domain.common.dto.AuthUser;
import org.example.expert.domain.common.exception.InvalidRequestException;
import org.example.expert.domain.common.exception.ServerException;
import org.example.expert.domain.todo.entity.Todo;
import org.example.expert.domain.todo.repository.TodoRepository;
import org.example.expert.domain.user.dto.response.UserResponse;
Expand All @@ -29,7 +30,7 @@ public class CommentService {
public CommentSaveResponse saveComment(AuthUser authUser, long todoId, CommentSaveRequest commentSaveRequest) {
User user = User.fromAuthUser(authUser);
Todo todo = todoRepository.findById(todoId).orElseThrow(() ->
new InvalidRequestException("Todo not found"));
new ServerException("Todo not found"));

Comment newComment = new Comment(
commentSaveRequest.getContents(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ public ManagerSaveResponse saveManager(AuthUser authUser, long todoId, ManagerSa
Todo todo = todoRepository.findById(todoId)
.orElseThrow(() -> new InvalidRequestException("Todo not found"));

if (!ObjectUtils.nullSafeEquals(user.getId(), todo.getUser().getId())) {
User todoCreateUser = todo.getUser();
if (todoCreateUser == null || !ObjectUtils.nullSafeEquals(user.getId(), todo.getUser().getId())) {
throw new InvalidRequestException("일정을 생성한 유저만 담당자를 지정할 수 있습니다.");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.example.expert.domain.todo.entity.Todo;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
Expand All @@ -11,7 +12,8 @@

public interface TodoRepository extends JpaRepository<Todo, Long> {

@Query("SELECT t FROM Todo t LEFT JOIN FETCH t.user u ORDER BY t.modifiedAt DESC")

@EntityGraph(attributePaths = "user")
Page<Todo> findAllByOrderByModifiedAtDesc(Pageable pageable);

@Query("SELECT t FROM Todo t " +
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.example.expert.domain.user.controller;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.example.expert.domain.common.annotation.Auth;
import org.example.expert.domain.common.dto.AuthUser;
Expand All @@ -21,7 +22,7 @@ public ResponseEntity<UserResponse> getUser(@PathVariable long userId) {
}

@PutMapping("/users")
public void changePassword(@Auth AuthUser authUser, @RequestBody UserChangePasswordRequest userChangePasswordRequest) {
public void changePassword(@Auth AuthUser authUser, @Valid @RequestBody UserChangePasswordRequest userChangePasswordRequest) {
userService.changePassword(authUser.getId(), userChangePasswordRequest);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package org.example.expert.domain.user.dto.request;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.example.expert.domain.common.exception.InvalidRequestException;

@Getter
@NoArgsConstructor
Expand All @@ -13,5 +15,10 @@ public class UserChangePasswordRequest {
@NotBlank
private String oldPassword;
@NotBlank
@Pattern(regexp = "^(?=.*[A-Z])(?=.*\\d).{8,}$",
message = "새 비밀번호는 8자 이상이어야 하고, 숫자와 대문자를 포함해야 합니다."
)
private String newPassword;


}
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,6 @@ public UserResponse getUser(long userId) {

@Transactional
public void changePassword(long userId, UserChangePasswordRequest userChangePasswordRequest) {
if (userChangePasswordRequest.getNewPassword().length() < 8 ||
!userChangePasswordRequest.getNewPassword().matches(".*\\d.*") ||
!userChangePasswordRequest.getNewPassword().matches(".*[A-Z].*")) {
throw new InvalidRequestException("새 비밀번호는 8자 이상이어야 하고, 숫자와 대문자를 포함해야 합니다.");
}

User user = userRepository.findById(userId)
.orElseThrow(() -> new InvalidRequestException("User not found"));
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/resources/application.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
url: jdbc:mysql://localhost:3306/expert
password: '12345678'
jpa:
open-in-view: false
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect
format_sql: 'true'
hibernate:
ddl-auto: create
show-sql: 'true'
application:
name: expert
jwt:
secret: ${jwt.secret.key}
expirationMs: 86400000
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class PasswordEncoderTest {
String encodedPassword = passwordEncoder.encode(rawPassword);

// when
boolean matches = passwordEncoder.matches(encodedPassword, rawPassword);
boolean matches = passwordEncoder.matches(rawPassword, encodedPassword);

// then
assertTrue(matches);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ class ManagerServiceTest {
private ManagerService managerService;

@Test
public void manager_목록_조회_시_Todo가_없다면_NPE_에러를_던진다() {
public void manager_목록_조회_시_Todo가_없다면_IRE_에러를_던진다() {
// given
long todoId = 1L;
given(todoRepository.findById(todoId)).willReturn(Optional.empty());

// when & then
InvalidRequestException exception = assertThrows(InvalidRequestException.class, () -> managerService.getManagers(todoId));
assertEquals("Manager not found", exception.getMessage());
assertEquals("Todo not found", exception.getMessage());
}

@Test
Expand Down