Skip to content

Commit

Permalink
Chore : 회원가입 및 프로필 성정 로직 수정 (#17)
Browse files Browse the repository at this point in the history
  • Loading branch information
MinsFuture authored Jun 12, 2024
1 parent befcbbb commit 7dce582
Show file tree
Hide file tree
Showing 13 changed files with 141 additions and 76 deletions.
Original file line number Diff line number Diff line change
@@ -1,27 +1,22 @@
package com.gdsc.petwalk.auth.itself.controller;

import com.gdsc.petwalk.auth.itself.dto.request.LoginRequestDto;
import com.gdsc.petwalk.auth.itself.dto.request.ProfileRequestDto;
import com.gdsc.petwalk.auth.itself.dto.request.SignUpRequestDto;
import com.gdsc.petwalk.auth.itself.dto.response.AuthResultDto;
import com.gdsc.petwalk.auth.itself.dto.response.TokenResponseDto;
import com.gdsc.petwalk.domain.member.service.MemberService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
Expand All @@ -35,44 +30,45 @@ public class AuthController {

private final MemberService memberService;

@GetMapping("/check-duplicate")
@Operation(summary = "중복 이메일 체크 로직", description = "중복 이메일 체크 로직")
@ApiResponse(responseCode = "200", description = "회원가입 전에 이메일 체크. 이미 가입 된 이메일이 존재하면 true, 존재하지 않으면 false")
public ResponseEntity<AuthResultDto<Boolean>> checkDuplicate(
@RequestParam String email
) {
boolean isExists = memberService.checkDuplicateEmail(email);

return ResponseEntity.ok().body(AuthResultDto.<Boolean>builder()
.status(true)
.code(200)
.message("이미 가입 된 이메일이 존재하면 true, 존재하지 않으면 false")
.data(isExists)
.build()
);
}

@PostMapping("/sign-up")
@Operation(summary = "회원가입 로직", description = "회원가입 로직")
@ApiResponse(responseCode = "200", description = "signUpRequestDto는 application/json 형식, uploadPhoto는 multipart/form-data 형식으로, 두 개를 한꺼번에 form-data 형식으로 보내주면 됨")
public ResponseEntity<AuthResultDto<?>> signUp(
@Operation(summary = "회원가입 로직", description = "signUpRequestDto는 application/json 형식, uploadPhoto는 multipart/form-data 형식으로, 두 개를 한꺼번에 form-data 형식으로 보내주면 됨")
@ApiResponse(responseCode = "200", description = "token 반환")
public ResponseEntity<AuthResultDto<TokenResponseDto>> signUp(
@RequestPart("signUpRequestDto") @Valid SignUpRequestDto request,
@RequestPart("uploadPhoto") MultipartFile multipartFile) {

String savedEmail = memberService.signUp(request, multipartFile);
TokenResponseDto tokenResponseDto = memberService.signUp(request, multipartFile);
log.info("회원가입 성공 email = {}", request.email());

return ResponseEntity.ok().body(AuthResultDto.builder()
return ResponseEntity.ok().body(AuthResultDto.<TokenResponseDto>builder()
.status(true)
.code(200)
.message("회원가입에 성공하였습니다")
.build());
}

@PostMapping("/profile")
@Operation(summary = "회원가입 후 프로필 설정", description = "profileRequestDto는 application/json 형식, uploadPhoto는 multipart/form-data 형식으로, 두 개를 한꺼번에 form-data 형식으로 보내주면 됨")
@ApiResponse(responseCode = "200")
public ResponseEntity<AuthResultDto<?>> setProfile(
@RequestPart("profileRequestDto") ProfileRequestDto profileRequestDto,
@RequestPart("uploadPhoto") MultipartFile file
) {
memberService.setMemberProfile(profileRequestDto, file);

return ResponseEntity.ok().body(AuthResultDto.builder()
.status(true)
.code(200)
.message("프로필 설정에 성공하였습니다")
.data(tokenResponseDto)
.build());
}

@PostMapping("/login")
@Operation(summary = "로그인 로직",
description = "body에 Authorization은 accesstoken, Authorization-refresh는 refreshtoken",
responses = {@ApiResponse(responseCode = "200", description = "로그인 성공 시 토큰 반환", content = @Content(schema = @Schema(implementation = TokenResponseDto.class)))})
public ResponseEntity<TokenResponseDto> login(
@Operation(summary = "로그인 로직", description = "로그인 로직")
@ApiResponse(responseCode = "200", description = "로그인 성공 시 token 반환")
public ResponseEntity<AuthResultDto<TokenResponseDto>> login(
@RequestBody LoginRequestDto loginRequestDto) {

log.info("테스트 용 login. 실제로 거치지 않음");
Expand All @@ -82,6 +78,11 @@ public ResponseEntity<TokenResponseDto> login(
.refreshToken("리프레시 토큰")
.build();

return ResponseEntity.ok().body(tokenResponseDto);
return ResponseEntity.ok().body(AuthResultDto.<TokenResponseDto>builder()
.status(true)
.code(200)
.message("로그인 성공 !")
.data(tokenResponseDto)
.build());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ protected boolean shouldNotFilter(HttpServletRequest request) throws ServletExce
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {

String accesstoken = request.getHeader("Authorization");
String accesstoken = request.getHeader("Authorization").substring(7);

if (jwtService.validateToken(accesstoken)) {
//JWT 토큰을 파싱해서 member 정보를 가져옴
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@

public interface MemberRepository extends JpaRepository<Member, Long> {
Optional<Member> findByEmail(String email);
boolean existsByEmail(String email);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.gdsc.petwalk.auth.itself.dto.request.ProfileRequestDto;
import com.gdsc.petwalk.auth.itself.dto.request.SignUpRequestDto;
import com.gdsc.petwalk.auth.itself.dto.response.TokenResponseDto;
import com.gdsc.petwalk.auth.jwt.service.JwtService;
import com.gdsc.petwalk.domain.member.entity.Member;
import com.gdsc.petwalk.domain.member.entity.Role;
import com.gdsc.petwalk.domain.member.repository.MemberRepository;
Expand All @@ -17,11 +19,14 @@

import java.util.Optional;

import static com.gdsc.petwalk.domain.member.entity.Role.ROLE_USER;

@Service
@Transactional
@RequiredArgsConstructor
public class MemberService {

private final JwtService jwtService;
private final MemberRepository memberRepository;
private final PhotoService photoService;
private final PasswordEncoder passwordEncoder;
Expand All @@ -39,7 +44,7 @@ public Member saveOrUpdate(Member member) {
}
}

public String signUp(SignUpRequestDto signUpRequest, MultipartFile multipartFile) {
public TokenResponseDto signUp(SignUpRequestDto signUpRequest, MultipartFile multipartFile) {

Optional<Member> optionalExistingMember = memberRepository.findByEmail(signUpRequest.email());

Expand All @@ -51,17 +56,24 @@ public String signUp(SignUpRequestDto signUpRequest, MultipartFile multipartFile
Member member = Member.builder()
.nickName(signUpRequest.nickName())
.email(signUpRequest.email())
.role(Role.ROLE_USER)
.role(ROLE_USER)
.password(passwordEncoder.encode(signUpRequest.password()))
.longitude(signUpRequest.longitude())
.latitude(signUpRequest.latitude())
.photoUrl(photoService.uploadAndGetUrl(multipartFile))
.build();

return memberRepository.save(member).getEmail();
memberRepository.save(member);

TokenResponseDto tokenResponseDto = TokenResponseDto.builder()
.accessToken(jwtService.createAccessToken(member.getEmail(), ROLE_USER.name()))
.refreshToken(jwtService.createRefreshToken())
.build();

return tokenResponseDto;
}

public void setMemberProfile(ProfileRequestDto profileRequestDto, MultipartFile file){
public void setMemberProfile(ProfileRequestDto profileRequestDto, MultipartFile file) {
Member member = memberRepository.findByEmail(profileRequestDto.email())
.orElseThrow(() -> new UsernameNotFoundException("해당 Email에 해당하는 유저가 없습니다"));

Expand All @@ -71,15 +83,15 @@ public void setMemberProfile(ProfileRequestDto profileRequestDto, MultipartFile
}


public Member findMemberByEmail(String email) throws UsernameNotFoundException{
public Member findMemberByEmail(String email) throws UsernameNotFoundException {
// 예외처리 해야함
Member member = memberRepository.findByEmail(email)
.orElseThrow(() -> new UsernameNotFoundException("해당 Email에 해당하는 유저가 없습니다"));

return member;
}

public String saveRefresh(String email, String refreshToken){
public String saveRefresh(String email, String refreshToken) {
Member member = memberRepository.findByEmail(email)
.orElseThrow();

Expand All @@ -90,4 +102,7 @@ public String saveRefresh(String email, String refreshToken){
return member.getRefresh();
}

public boolean checkDuplicateEmail(String email) {
return memberRepository.existsByEmail(email);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@
import com.gdsc.petwalk.domain.pet.dto.request.PetCreateRequestDto;
import com.gdsc.petwalk.domain.pet.dto.request.PetUpdateRequestDto;
import com.gdsc.petwalk.domain.pet.dto.response.PetResponseDto;
import com.gdsc.petwalk.domain.pet.dto.response.PetResultDto;
import com.gdsc.petwalk.domain.pet.entity.Pet;
import com.gdsc.petwalk.domain.pet.service.PetService;
import com.gdsc.petwalk.global.principal.PrincipalDetails;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
Expand All @@ -19,63 +22,73 @@
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/api/members")
@RequestMapping("/api/pets")
@RequiredArgsConstructor
@Slf4j
public class PetController {

private final PetService petService;

@PostMapping("/pets")
@PostMapping
@PreAuthorize("isAuthenticated()")
public ResponseEntity<Long> createPet(
@RequestBody PetCreateRequestDto petCreateRequestDto,
@AuthenticationPrincipal PrincipalDetails principalDetails){

Long savedId = petService.addPetToMember(petCreateRequestDto, principalDetails);

return ResponseEntity.ok(savedId);
@Operation(summary = "회원가입 후 펫 생성 로직", description = "회원가입 후 펫 생성 로직")
@ApiResponse(responseCode = "200", description = "회원가입 후 펫 생성, 성공 시 등록 펫 id 값 반환")
public ResponseEntity<PetResultDto<Long>> createPet(
@RequestPart("petCreateRequestDto") PetCreateRequestDto petCreateRequestDto,
@RequestPart("uploadPhoto") MultipartFile file,
@AuthenticationPrincipal PrincipalDetails principalDetails) {

Long savedId = petService.addPetToMember(petCreateRequestDto, file, principalDetails);

return ResponseEntity.ok().body(PetResultDto.<Long>builder()
.status(true)
.code(200)
.message("펫 등록 성공!")
.data(savedId)
.build());
}

@GetMapping("pets/{petId}")
@GetMapping("/{petId}")
@PreAuthorize("isAuthenticated()")
public ResponseEntity<PetResponseDto> readPet(
@AuthenticationPrincipal PrincipalDetails principalDetails,
@PathVariable("petId") Long id
){
) {
PetResponseDto myPet = petService.findMyPet(principalDetails, id);

return ResponseEntity.ok(myPet);
}

@GetMapping("/pets")
@GetMapping()
@PreAuthorize("isAuthenticated()")
public ResponseEntity<List<PetResponseDto>> myPets(
@AuthenticationPrincipal PrincipalDetails principalDetails){
@AuthenticationPrincipal PrincipalDetails principalDetails) {

List<PetResponseDto> allPets = petService.findAllPets(principalDetails);

return ResponseEntity.ok(allPets);
}

@DeleteMapping("/pets/{petId}")
@DeleteMapping("/{petId}")
@PreAuthorize("isAuthenticated()")
public ResponseEntity<String> deletePet(
@AuthenticationPrincipal PrincipalDetails principalDetails,
@PathVariable("petId") Long id
){
@AuthenticationPrincipal PrincipalDetails principalDetails,
@PathVariable("petId") Long id
) {
petService.deletePet(principalDetails, id);

return ResponseEntity.ok().body("펫 삭제에 성공하였습니다");
}

@PutMapping("/pets/{petId}")
@PutMapping("/{petId}")
@PreAuthorize("isAuthenticated()")
public ResponseEntity<String> updatePet(
@RequestBody PetUpdateRequestDto petUpdateRequestDto,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.gdsc.petwalk.domain.pet.dto.request;

public record PetCreateRequestDto(String nickname, String gender, Integer age, String photoUrl,
public record PetCreateRequestDto(String nickname, String gender, Integer age,
String description, String dogType) {

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public static List<PetResponseDto> makeFrom(List<Pet> pets){
.nickname(pet.getNickname())
.gender(pet.getGender())
.age(pet.getAge())
.photoUrl(pet.getPhotoUrl())
.photoUrl(pet.getPhotos().get(0).getPhotoUrl())
.description(pet.getDescription())
.dogType(pet.getDogType())
.build();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.gdsc.petwalk.domain.pet.dto.response;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
@AllArgsConstructor
public class PetResultDto<T> {
private Boolean status;
private int code;
private String message;
private T data;
}
Loading

0 comments on commit 7dce582

Please sign in to comment.