diff --git a/src/main/java/com/jiyunio/todolist/category/Category.java b/src/main/java/com/jiyunio/todolist/category/Category.java index b6a2d05..29a5434 100644 --- a/src/main/java/com/jiyunio/todolist/category/Category.java +++ b/src/main/java/com/jiyunio/todolist/category/Category.java @@ -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 @@ -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) { diff --git a/src/main/java/com/jiyunio/todolist/category/CategoryController.java b/src/main/java/com/jiyunio/todolist/category/CategoryController.java index f651c78..cfe20a5 100644 --- a/src/main/java/com/jiyunio/todolist/category/CategoryController.java +++ b/src/main/java/com/jiyunio/todolist/category/CategoryController.java @@ -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; @@ -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.*; @@ -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 createCategory(@Parameter(description = "member의 id") @PathVariable Long memberId, @RequestBody CategoryDTO categoryDTO) { - return new ResponseEntity<>(categoryService.createCategory(memberId, categoryDTO), HttpStatus.CREATED); + public ResponseEntity 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 getCategories(@Parameter(description = "member의 id") @PathVariable Long memberId) { - return categoryService.getCategories(memberId); + public List getCategories(@AuthenticationPrincipal CustomUserDetails user) { + return categoryService.getCategories(user.getUsername()); } @PutMapping("/{categoryId}") diff --git a/src/main/java/com/jiyunio/todolist/category/CategoryRepository.java b/src/main/java/com/jiyunio/todolist/category/CategoryRepository.java index 0e3d7a0..c8884e6 100644 --- a/src/main/java/com/jiyunio/todolist/category/CategoryRepository.java +++ b/src/main/java/com/jiyunio/todolist/category/CategoryRepository.java @@ -8,7 +8,5 @@ public interface CategoryRepository extends JpaRepository { Optional findById(Long categoryId); - List findByMemberId(Long memberId); - - + List findByUserId(String userId); } diff --git a/src/main/java/com/jiyunio/todolist/category/CategoryService.java b/src/main/java/com/jiyunio/todolist/category/CategoryService.java index 4b74b99..b7cead4 100644 --- a/src/main/java/com/jiyunio/todolist/category/CategoryService.java +++ b/src/main/java/com/jiyunio/todolist/category/CategoryService.java @@ -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; @@ -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); @@ -45,9 +38,9 @@ public ResponseCategoryDTO createCategory(Long memberId, CategoryDTO categoryDTO .build(); } - public List getCategories(Long memberId) { - List categories = categoryRepository.findByMemberId(memberId); - if(categories == null){ + public List getCategories(String userId) { + List categories = categoryRepository.findByUserId(userId); + if (categories == null) { throw new CustomException(HttpStatus.NOT_FOUND, ErrorCode.NOT_EXIST_MEMBER); } List getCategoryDTO = new ArrayList<>(); @@ -86,4 +79,11 @@ public void deleteCategory(Long categoryId) { categoryRepository.deleteById(categoryId); } } + + public void deleteCategories(String userId) { + List categoryList = getCategories(userId); + for (ResponseCategoryDTO category : categoryList) { + categoryRepository.deleteById(category.getCategoryId()); + } + } } diff --git a/src/main/java/com/jiyunio/todolist/jwt/CustomAuthenticationProvider.java b/src/main/java/com/jiyunio/todolist/jwt/CustomAuthenticationProvider.java index 5102a85..b6a4b9e 100644 --- a/src/main/java/com/jiyunio/todolist/jwt/CustomAuthenticationProvider.java +++ b/src/main/java/com/jiyunio/todolist/jwt/CustomAuthenticationProvider.java @@ -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; @@ -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()); diff --git a/src/main/java/com/jiyunio/todolist/jwt/CustomUserDetails.java b/src/main/java/com/jiyunio/todolist/jwt/CustomUserDetails.java index b381a1f..bdf4382 100644 --- a/src/main/java/com/jiyunio/todolist/jwt/CustomUserDetails.java +++ b/src/main/java/com/jiyunio/todolist/jwt/CustomUserDetails.java @@ -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; diff --git a/src/main/java/com/jiyunio/todolist/jwt/CustomUserDetailsService.java b/src/main/java/com/jiyunio/todolist/jwt/CustomUserDetailsService.java index 847a014..8cd2369 100644 --- a/src/main/java/com/jiyunio/todolist/jwt/CustomUserDetailsService.java +++ b/src/main/java/com/jiyunio/todolist/jwt/CustomUserDetailsService.java @@ -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); } } diff --git a/src/main/java/com/jiyunio/todolist/jwt/JwtDTO.java b/src/main/java/com/jiyunio/todolist/jwt/JwtDTO.java index 6476173..94b480e 100644 --- a/src/main/java/com/jiyunio/todolist/jwt/JwtDTO.java +++ b/src/main/java/com/jiyunio/todolist/jwt/JwtDTO.java @@ -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; } } diff --git a/src/main/java/com/jiyunio/todolist/member/MemberController.java b/src/main/java/com/jiyunio/todolist/member/MemberController.java index a800cde..b5c6283 100644 --- a/src/main/java/com/jiyunio/todolist/member/MemberController.java +++ b/src/main/java/com/jiyunio/todolist/member/MemberController.java @@ -1,7 +1,7 @@ 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; @@ -9,7 +9,6 @@ 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; @@ -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 @@ -55,21 +54,21 @@ public List 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 updateUserPw(@Parameter(description = "member의 id") @PathVariable Long memberId, @Valid @RequestBody ChangeUserPwDTO changeUserPwDto) { - return ResponseEntity.ok(memberService.updateUserPw(memberId, changeUserPwDto)); + public ResponseEntity 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 deleteMember(@Parameter(description = "member의 id") @PathVariable Long memberId, @RequestParam String userPw) { - memberService.deleteMember(memberId, userPw); + public ResponseEntity deleteMember(@AuthenticationPrincipal CustomUserDetails user, @RequestParam String userPw) { + memberService.deleteMember(user.getUsername(), userPw); return ResponseEntity.ok(ResponseDTO.builder() .msg("회원 탈퇴 성공") .build()); diff --git a/src/main/java/com/jiyunio/todolist/member/MemberService.java b/src/main/java/com/jiyunio/todolist/member/MemberService.java index f70df88..36a9081 100644 --- a/src/main/java/com/jiyunio/todolist/member/MemberService.java +++ b/src/main/java/com/jiyunio/todolist/member/MemberService.java @@ -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; @@ -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; @@ -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())) @@ -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()); @@ -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 getMembers() { List members = memberRepository.findAll(); List getMembers = new ArrayList<>(); - for (Member member: members) { + for (Member member : members) { getMembers.add(ResponseMemberDTO.builder() .memberId(member.getId()) .userId(member.getUserId()) @@ -92,12 +80,14 @@ public List 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() @@ -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); diff --git a/src/main/java/com/jiyunio/todolist/responseDTO/ResponseCategoryDTO.java b/src/main/java/com/jiyunio/todolist/responseDTO/ResponseCategoryDTO.java index fa6b501..d0d495c 100644 --- a/src/main/java/com/jiyunio/todolist/responseDTO/ResponseCategoryDTO.java +++ b/src/main/java/com/jiyunio/todolist/responseDTO/ResponseCategoryDTO.java @@ -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; diff --git a/src/main/java/com/jiyunio/todolist/responseDTO/ResponseTodoDTO.java b/src/main/java/com/jiyunio/todolist/responseDTO/ResponseTodoDTO.java index d6d4fb1..3543b80 100644 --- a/src/main/java/com/jiyunio/todolist/responseDTO/ResponseTodoDTO.java +++ b/src/main/java/com/jiyunio/todolist/responseDTO/ResponseTodoDTO.java @@ -1,14 +1,11 @@ package com.jiyunio.todolist.responseDTO; -import com.jiyunio.todolist.category.Category; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Builder; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; -import org.springframework.cglib.core.Local; import java.time.LocalDate; @@ -26,10 +23,6 @@ public class ResponseTodoDTO { @Schema(description = "todo check (first default = false)", example = "false") private boolean checked; - @NotNull - @Schema(description = "todo 작성 날짜", example = "YYYY-MM-DD") - private LocalDate writeDate; - @NotNull @Schema(description = "todo 설정 날짜", example = "YYYY-MM-DD") private LocalDate setDate; @@ -39,12 +32,10 @@ public class ResponseTodoDTO { private ResponseCategoryDTO category; @Builder - protected ResponseTodoDTO(Long todoId, String content, boolean checked, - LocalDate writeDate, LocalDate setDate, ResponseCategoryDTO category){ + protected ResponseTodoDTO(Long todoId, String content, boolean checked, LocalDate setDate, ResponseCategoryDTO category) { this.todoId = todoId; this.content = content; this.checked = checked; - this.writeDate = writeDate; this.setDate = setDate; this.category = category; } diff --git a/src/main/java/com/jiyunio/todolist/todo/Todo.java b/src/main/java/com/jiyunio/todolist/todo/Todo.java index 495a765..0500948 100644 --- a/src/main/java/com/jiyunio/todolist/todo/Todo.java +++ b/src/main/java/com/jiyunio/todolist/todo/Todo.java @@ -1,7 +1,6 @@ package com.jiyunio.todolist.todo; import com.jiyunio.todolist.category.CategoryDTO; -import com.jiyunio.todolist.member.Member; import com.jiyunio.todolist.todo.dto.UpdateTodoDTO; import jakarta.persistence.*; import lombok.AccessLevel; @@ -20,9 +19,7 @@ public class Todo { @Column(name = "todoId") private Long id; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "memberId") - private Member member; + private String userId; @Lob // 길이 제한 X private String content; @@ -39,9 +36,9 @@ public class Todo { @Builder - protected Todo(Member member, String content, Boolean checked, LocalDate setDate, + protected Todo(String userId, String content, Boolean checked, LocalDate setDate, Long categoryId, String categoryContent, String categoryColor) { - this.member = member; + this.userId = userId; this.content = content; this.checked = checked; this.setDate = setDate; diff --git a/src/main/java/com/jiyunio/todolist/todo/TodoController.java b/src/main/java/com/jiyunio/todolist/todo/TodoController.java index 64051ca..2ae4782 100644 --- a/src/main/java/com/jiyunio/todolist/todo/TodoController.java +++ b/src/main/java/com/jiyunio/todolist/todo/TodoController.java @@ -1,7 +1,7 @@ package com.jiyunio.todolist.todo; import com.jiyunio.todolist.customError.ErrorDTO; -import com.jiyunio.todolist.responseDTO.ResponseCategoryDTO; +import com.jiyunio.todolist.jwt.CustomUserDetails; import com.jiyunio.todolist.responseDTO.ResponseDTO; import com.jiyunio.todolist.responseDTO.ResponseTodoDTO; import com.jiyunio.todolist.todo.dto.CreateTodoDTO; @@ -16,6 +16,7 @@ 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.util.List; @@ -27,22 +28,22 @@ public class TodoController { private final TodoService todoService; - @PostMapping("/{memberId}") + @PostMapping("") @Operation(summary = "todo 생성") @ApiResponse(responseCode = "200", description = "todo 생성 성공", content = @Content(schema = @Schema(implementation = ResponseTodoDTO.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 createTodo(@Parameter(description = "member의 id") @PathVariable Long memberId, @Valid @RequestBody CreateTodoDTO createTodo) { - return new ResponseEntity<>(todoService.createTodo(memberId, createTodo), HttpStatus.CREATED); + public ResponseEntity createTodo(@AuthenticationPrincipal CustomUserDetails user, @Valid @RequestBody CreateTodoDTO createTodo) { + return new ResponseEntity<>(todoService.createTodo(user.getUsername(), createTodo), HttpStatus.CREATED); } - @GetMapping("/{memberId}") + @GetMapping("/todos") @Operation(summary = "todo 조회") @ApiResponse(responseCode = "200", description = "todo 조회 성공", content = @Content(schema = @Schema(implementation = ResponseTodoDTO.class))) @ApiResponse(responseCode = "400", description = "빈칸", content = @Content(schema = @Schema(implementation = ErrorDTO.class))) @ApiResponse(responseCode = "404", description = "회원 X (memberId 없음)", content = @Content(schema = @Schema(implementation = ErrorDTO.class))) - public List getTodo(@Parameter(description = "member의 id") @PathVariable Long memberId) { - return todoService.getTodo(memberId); + public List getTodo(@AuthenticationPrincipal CustomUserDetails user) { + return todoService.getTodo(user.getUsername()); } @PutMapping("/{todoId}") diff --git a/src/main/java/com/jiyunio/todolist/todo/TodoRepository.java b/src/main/java/com/jiyunio/todolist/todo/TodoRepository.java index d7e1c84..c3d0b5d 100644 --- a/src/main/java/com/jiyunio/todolist/todo/TodoRepository.java +++ b/src/main/java/com/jiyunio/todolist/todo/TodoRepository.java @@ -1,13 +1,12 @@ package com.jiyunio.todolist.todo; -import com.jiyunio.todolist.category.Category; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; import java.util.Optional; public interface TodoRepository extends JpaRepository { - List findByMemberId(Long memberId); + List findByUserId(String userId); Optional findById(Long todoId); diff --git a/src/main/java/com/jiyunio/todolist/todo/TodoService.java b/src/main/java/com/jiyunio/todolist/todo/TodoService.java index e8c8abc..7df527a 100644 --- a/src/main/java/com/jiyunio/todolist/todo/TodoService.java +++ b/src/main/java/com/jiyunio/todolist/todo/TodoService.java @@ -22,14 +22,14 @@ public class TodoService { private final MemberRepository memberRepository; private final TodoRepository todoRepository; - public ResponseTodoDTO createTodo(Long memberId, CreateTodoDTO createTodo) { - Member member = memberRepository.findById(memberId).orElseThrow( + public ResponseTodoDTO createTodo(String userId, CreateTodoDTO createTodo) { + Member member = memberRepository.findByUserId(userId).orElseThrow( // 회원 존재 안함 () -> new CustomException(HttpStatus.NOT_FOUND, ErrorCode.NOT_EXIST_MEMBER) ); Todo todo = Todo.builder() - .member(member) + .userId(member.getUserId()) .content(createTodo.getContent()) .setDate(createTodo.getSetDate()) .checked(false) @@ -53,8 +53,8 @@ public ResponseTodoDTO createTodo(Long memberId, CreateTodoDTO createTodo) { .build(); } - public List getTodo(Long memberId) { - List todoList = todoRepository.findByMemberId(memberId); + public List getTodo(String userId) { + List todoList = todoRepository.findByUserId(userId); if (todoList == null) { throw new CustomException(HttpStatus.NOT_FOUND, ErrorCode.NOT_EXIST_MEMBER); } @@ -97,13 +97,24 @@ public ResponseTodoDTO updateTodo(Long todoId, UpdateTodoDTO updateTodo) { public void updateCategory(Long categoryId, CategoryDTO categoryDTO) { List todoList = todoRepository.findByCategoryId(categoryId); - for (Todo todo : todoList) { - todo.updateCategory(categoryDTO); - todoRepository.save(todo); + if (todoList.isEmpty()) { + return; + } else { + for (Todo todo : todoList) { + todo.updateCategory(categoryDTO); + todoRepository.save(todo); + } } } public void deleteTodo(Long todoId) { todoRepository.deleteById(todoId); } + + public void deleteTodos(String userId) { + List todoList = getTodo(userId); + for (ResponseTodoDTO todo : todoList) { + todoRepository.deleteById(todo.getTodoId()); + } + } }