Skip to content

Commit

Permalink
[Feat] url 수정 & 기능 오류 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
jiyunio committed Jun 15, 2024
1 parent 84cca8d commit eee163b
Show file tree
Hide file tree
Showing 16 changed files with 95 additions and 112 deletions.
14 changes: 4 additions & 10 deletions src/main/java/com/jiyunio/todolist/category/Category.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
package com.jiyunio.todolist.category;

import com.jiyunio.todolist.member.Member;
import com.jiyunio.todolist.todo.Todo;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
Expand All @@ -19,19 +15,17 @@ public class Category {
@Column(name = "categoryId")
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "memberId")
private Member member;

private String content;

private String color;

private String userId;

@Builder
protected Category(Member member, String content, String color) {
this.member = member;
protected Category(String content, String color, String userId) {
this.content = content;
this.color = color;
this.userId = userId;
}

protected void updateCategory(CategoryDTO categoryDTO) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.jiyunio.todolist.category;

import com.jiyunio.todolist.customError.ErrorDTO;
import com.jiyunio.todolist.jwt.CustomUserDetails;
import com.jiyunio.todolist.responseDTO.ResponseCategoryDTO;
import com.jiyunio.todolist.responseDTO.ResponseDTO;
import com.jiyunio.todolist.responseDTO.ResponseMemberDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
Expand All @@ -13,6 +13,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

Expand All @@ -26,22 +27,22 @@
public class CategoryController {
private final CategoryService categoryService;

@PostMapping("/{memberId}")
@PostMapping("")
@Operation(summary = "카테고리 생성")
@ApiResponse(responseCode = "200", description = "카테고리 생성 성공", content = @Content(schema = @Schema(implementation = ResponseCategoryDTO.class)))
@ApiResponse(responseCode = "400", description = "빈칸", content = @Content(schema = @Schema(implementation = ErrorDTO.class)))
@ApiResponse(responseCode = "404", description = "회원 X", content = @Content(schema = @Schema(implementation = ErrorDTO.class)))
public ResponseEntity<ResponseCategoryDTO> createCategory(@Parameter(description = "member의 id") @PathVariable Long memberId, @RequestBody CategoryDTO categoryDTO) {
return new ResponseEntity<>(categoryService.createCategory(memberId, categoryDTO), HttpStatus.CREATED);
public ResponseEntity<ResponseCategoryDTO> createCategory(@AuthenticationPrincipal CustomUserDetails user, @RequestBody CategoryDTO categoryDTO) {
return new ResponseEntity<>(categoryService.createCategory(user.getUsername(), categoryDTO), HttpStatus.CREATED);
}

@GetMapping("/categories/{memberId}")
@GetMapping("/categories")
@Operation(summary = "카테고리 전체 조회")
@ApiResponse(responseCode = "200", description = "카테고리 전체 조회 성공", content = @Content(schema = @Schema(implementation = ResponseCategoryDTO.class)))
@ApiResponse(responseCode = "400", description = "빈칸", content = @Content(schema = @Schema(implementation = ErrorDTO.class)))
@ApiResponse(responseCode = "404", description = "회원 X", content = @Content(schema = @Schema(implementation = ErrorDTO.class)))
public List<ResponseCategoryDTO> getCategories(@Parameter(description = "member의 id") @PathVariable Long memberId) {
return categoryService.getCategories(memberId);
public List<ResponseCategoryDTO> getCategories(@AuthenticationPrincipal CustomUserDetails user) {
return categoryService.getCategories(user.getUsername());
}

@PutMapping("/{categoryId}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,5 @@
public interface CategoryRepository extends JpaRepository<Category, Long> {
Optional<Category> findById(Long categoryId);

List<Category> findByMemberId(Long memberId);


List<Category> findByUserId(String userId);
}
26 changes: 13 additions & 13 deletions src/main/java/com/jiyunio/todolist/category/CategoryService.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
import com.jiyunio.todolist.member.Member;
import com.jiyunio.todolist.member.MemberRepository;
import com.jiyunio.todolist.responseDTO.ResponseCategoryDTO;
import com.jiyunio.todolist.todo.TodoRepository;
import com.jiyunio.todolist.todo.TodoService;
import com.jiyunio.todolist.todo.dto.CreateTodoDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
Expand All @@ -24,17 +22,12 @@ public class CategoryService {
private final MemberRepository memberRepository;
private final TodoService todoService;

public ResponseCategoryDTO createCategory(Long memberId, CategoryDTO categoryDTO) {
Member member = memberRepository.findById(memberId).orElseThrow(
// 회원 존재 안함
() -> new CustomException(HttpStatus.NOT_FOUND, ErrorCode.NOT_EXIST_MEMBER)
);


public ResponseCategoryDTO createCategory(String userId, CategoryDTO categoryDTO) {
Member member = memberRepository.findByUserId(userId).get();
Category category = Category.builder()
.member(member)
.content(categoryDTO.getContent())
.color(categoryDTO.getColor())
.userId(member.getUserId())
.build();
categoryRepository.save(category);

Expand All @@ -45,9 +38,9 @@ public ResponseCategoryDTO createCategory(Long memberId, CategoryDTO categoryDTO
.build();
}

public List<ResponseCategoryDTO> getCategories(Long memberId) {
List<Category> categories = categoryRepository.findByMemberId(memberId);
if(categories == null){
public List<ResponseCategoryDTO> getCategories(String userId) {
List<Category> categories = categoryRepository.findByUserId(userId);
if (categories == null) {
throw new CustomException(HttpStatus.NOT_FOUND, ErrorCode.NOT_EXIST_MEMBER);
}
List<ResponseCategoryDTO> getCategoryDTO = new ArrayList<>();
Expand Down Expand Up @@ -86,4 +79,11 @@ public void deleteCategory(Long categoryId) {
categoryRepository.deleteById(categoryId);
}
}

public void deleteCategories(String userId) {
List<ResponseCategoryDTO> categoryList = getCategories(userId);
for (ResponseCategoryDTO category : categoryList) {
categoryRepository.deleteById(category.getCategoryId());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

Expand All @@ -23,10 +22,10 @@ public class CustomAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String userId = authentication.getName();
String userPw = (String)authentication.getCredentials();
String userPw = (String) authentication.getCredentials();
UserDetails userDetails = userDetailsService.loadUserByUsername(userId);
if(userDetails == null || !passwordEncoder.matches(userPw, userDetails.getPassword())){
throw new CustomException(HttpStatus.NOT_FOUND, ErrorCode.NOT_EXIST_MEMBER);
if (userDetails == null || !passwordEncoder.matches(userPw, userDetails.getPassword())) {
throw new CustomException(HttpStatus.BAD_REQUEST, ErrorCode.WRONG_USERID_PASSWORD);
}
//인증 완료
return new UsernamePasswordAuthenticationToken(userId, "", userDetails.getAuthorities());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.jiyunio.todolist.member.Member;
import lombok.Builder;
import lombok.Getter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,17 @@
import org.springframework.http.HttpStatus;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {
private final MemberRepository memberRepository;

@Override
public UserDetails loadUserByUsername(String username) throws CustomException {
Member member = memberRepository.findByUserId(username).orElseThrow(
()->new CustomException(HttpStatus.NOT_FOUND, ErrorCode.NOT_EXIST_MEMBER));
() -> new CustomException(HttpStatus.NOT_FOUND, ErrorCode.NOT_EXIST_MEMBER));
return new CustomUserDetails(member);
}
}
7 changes: 4 additions & 3 deletions src/main/java/com/jiyunio/todolist/jwt/JwtDTO.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
@Getter
@Setter
public class JwtDTO {
private String accessToken;
protected JwtDTO(String accessToken){
this.accessToken = accessToken;
private String token;

protected JwtDTO(String token) {
this.token = token;
}
}
17 changes: 8 additions & 9 deletions src/main/java/com/jiyunio/todolist/member/MemberController.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package com.jiyunio.todolist.member;

import com.jiyunio.todolist.customError.CustomException;
import com.jiyunio.todolist.customError.ErrorDTO;
import com.jiyunio.todolist.jwt.CustomUserDetails;
import com.jiyunio.todolist.jwt.JwtDTO;
import com.jiyunio.todolist.member.dto.ChangeUserPwDTO;
import com.jiyunio.todolist.member.dto.SignInDTO;
import com.jiyunio.todolist.member.dto.SignUpDTO;
import com.jiyunio.todolist.responseDTO.ResponseDTO;
import com.jiyunio.todolist.responseDTO.ResponseMemberDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
Expand All @@ -18,9 +17,9 @@
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.lang.annotation.Target;
import java.util.List;

@RestController
Expand Down Expand Up @@ -55,21 +54,21 @@ public List<ResponseMemberDTO> getMember() {
return memberService.getMembers();
}

@PutMapping("/{memberId}")
@PutMapping("")
@Operation(summary = "회원 비밀번호 수정", description = "비밀번호, 수정 비밀번호 이용")
@ApiResponse(responseCode = "200", description = "비밀번호 업데이터 성공", content = @Content(schema = @Schema(implementation = ResponseMemberDTO.class)))
@ApiResponse(responseCode = "400", description = "빈칸", content = @Content(schema = @Schema(implementation = ErrorDTO.class)))
@ApiResponse(responseCode = "404", description = "회원 및 비밀번호 불일치 / 변경 비밀번호 불일치", content = @Content(schema = @Schema(implementation = ErrorDTO.class)))
public ResponseEntity<ResponseMemberDTO> updateUserPw(@Parameter(description = "member의 id") @PathVariable Long memberId, @Valid @RequestBody ChangeUserPwDTO changeUserPwDto) {
return ResponseEntity.ok(memberService.updateUserPw(memberId, changeUserPwDto));
public ResponseEntity<ResponseMemberDTO> updateUserPw(@AuthenticationPrincipal CustomUserDetails user, @Valid @RequestBody ChangeUserPwDTO changeUserPwDto) {
return ResponseEntity.ok(memberService.updateUserPw(user.getUsername(), changeUserPwDto));
}

@DeleteMapping("/{memberId}")
@DeleteMapping("")
@Operation(summary = "회원 탈퇴", description = "비밀번호 이용")
@ApiResponse(responseCode = "200", description = "회원 탈퇴 성공", content = @Content(schema = @Schema(implementation = ResponseDTO.class)))
@ApiResponse(responseCode = "404", description = "회원 비밀번호 불일치", content = @Content(schema = @Schema(implementation = ErrorDTO.class)))
public ResponseEntity<ResponseDTO> deleteMember(@Parameter(description = "member의 id") @PathVariable Long memberId, @RequestParam String userPw) {
memberService.deleteMember(memberId, userPw);
public ResponseEntity<ResponseDTO> deleteMember(@AuthenticationPrincipal CustomUserDetails user, @RequestParam String userPw) {
memberService.deleteMember(user.getUsername(), userPw);
return ResponseEntity.ok(ResponseDTO.builder()
.msg("회원 탈퇴 성공")
.build());
Expand Down
45 changes: 19 additions & 26 deletions src/main/java/com/jiyunio/todolist/member/MemberService.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.jiyunio.todolist.member.dto.SignInDTO;
import com.jiyunio.todolist.member.dto.SignUpDTO;
import com.jiyunio.todolist.responseDTO.ResponseMemberDTO;
import com.jiyunio.todolist.todo.TodoService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
Expand All @@ -26,6 +27,7 @@
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
private final TodoService todoService;
private final CategoryService categoryService;
private final BCryptPasswordEncoder passwordEncoder;
private final CustomAuthenticationProvider authenticationProvider;
Expand All @@ -39,7 +41,6 @@ public ResponseMemberDTO signUp(@Valid SignUpDTO signUpDto) {

if (signUpDto.getUserPw().equals(signUpDto.getConfirmUserPw())) {
// 회원가입 성공

Member member = Member.builder()
.userId(signUpDto.getUserId())
.userPw(passwordEncoder.encode(signUpDto.getUserPw()))
Expand All @@ -48,7 +49,7 @@ public ResponseMemberDTO signUp(@Valid SignUpDTO signUpDto) {
memberRepository.save(member);

//기본 카테고리 동시에 생성
categoryService.createCategory(member.getId(), CategoryDTO.builder()
categoryService.createCategory(member.getUserId(), CategoryDTO.builder()
.content("기본")
.color("FFFFFF").build());

Expand All @@ -62,28 +63,15 @@ public ResponseMemberDTO signUp(@Valid SignUpDTO signUpDto) {
}

public JwtDTO signIn(@Valid SignInDTO signInDto) {
// if (memberRepository.existsByUserId(signInDto.getUserId())) {
// Member member = memberRepository.findByUserId(signInDto.getUserId()).get();
// if (passwordEncoder.matches(signInDto.getUserPw(), member.getUserPw())) {
// // 로그인 성공
// return ResponseMemberDTO.builder()
// .memberId(member.getId())
// .userId(member.getUserId())
// .build();
// }
// }
// // 아이디 및 회원 비밀번호 불일치
// throw new CustomException(HttpStatus.NOT_FOUND, ErrorCode.WRONG_USERID_PASSWORD);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(signInDto.getUserId(), signInDto.getUserPw());
Authentication authentication = authenticationProvider.authenticate(authenticationToken);
JwtDTO jwtDTO = jwtProvider.createToken(authentication);
return jwtDTO;
return jwtProvider.createToken(authentication);
}

public List<ResponseMemberDTO> getMembers() {
List<Member> members = memberRepository.findAll();
List<ResponseMemberDTO> getMembers = new ArrayList<>();
for (Member member: members) {
for (Member member : members) {
getMembers.add(ResponseMemberDTO.builder()
.memberId(member.getId())
.userId(member.getUserId())
Expand All @@ -92,12 +80,14 @@ public List<ResponseMemberDTO> getMembers() {
return getMembers;
}

public ResponseMemberDTO updateUserPw(Long id, @Valid ChangeUserPwDTO changeUserPwDto) {
Member member = memberRepository.findById(id).get();
if (member.getUserPw().equals(changeUserPwDto.getUserPw())) { // 회원 비밀번호 확인
public ResponseMemberDTO updateUserPw(String userId, @Valid ChangeUserPwDTO changeUserPwDto) {
Member member = memberRepository.findByUserId(userId).orElseThrow(
() -> new CustomException(HttpStatus.NOT_FOUND, ErrorCode.NOT_EXIST_MEMBER)
);
if (passwordEncoder.matches(changeUserPwDto.getUserPw(), member.getUserPw())) { // 회원 비밀번호 확인
if (changeUserPwDto.getChangePw().equals(changeUserPwDto.getConfirmChangePw())) {
// 비밀번호 업데이트 성공
member.updateUserPw(changeUserPwDto.getChangePw());
member.updateUserPw(passwordEncoder.encode(changeUserPwDto.getChangePw()));
memberRepository.save(member);

return ResponseMemberDTO.builder()
Expand All @@ -114,11 +104,14 @@ public ResponseMemberDTO updateUserPw(Long id, @Valid ChangeUserPwDTO changeUser
}
}

public void deleteMember(Long id, String userPw) {
Member member = memberRepository.findById(id).get();
if (member.getUserPw().equals(userPw)) {
// 회원 탈퇴 성공
memberRepository.deleteById(id);
public void deleteMember(String userId, String userPw) {
Member member = memberRepository.findByUserId(userId).orElseThrow(
() -> new CustomException(HttpStatus.NOT_FOUND, ErrorCode.NOT_EXIST_MEMBER)
);
if (passwordEncoder.matches(userPw, member.getUserPw())) { // 회원 탈퇴 성공
todoService.deleteTodos(userId);
categoryService.deleteCategories(userId);
memberRepository.deleteById(member.getId());
} else {
// 비밀번호 불일치
throw new CustomException(HttpStatus.NOT_FOUND, ErrorCode.WRONG_USERID_PASSWORD);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public class ResponseCategoryDTO {
private String color;

@Builder
protected ResponseCategoryDTO(Long categoryId, String content, String color){
protected ResponseCategoryDTO(Long categoryId, String content, String color) {
this.categoryId = categoryId;
this.content = content;
this.color = color;
Expand Down
Loading

0 comments on commit eee163b

Please sign in to comment.