From 1acc7486c4ab7bf37b5bb8e4a24d02297a761b89 Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Sat, 30 Nov 2024 19:04:56 +0900 Subject: [PATCH 01/15] =?UTF-8?q?feat:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=ED=99=95=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20[#21]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/member/rest/AuthController.java | 13 +++++++++---- .../api/member/service/AuthService.java | 18 +++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/rest/AuthController.java b/src/main/java/org/jullaene/walkmong_back/api/member/rest/AuthController.java index 22a7a1c..0ab15a0 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/rest/AuthController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/rest/AuthController.java @@ -4,15 +4,13 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.antlr.v4.runtime.BailErrorStrategy; import org.jullaene.walkmong_back.api.member.dto.req.LoginReq; import org.jullaene.walkmong_back.api.member.dto.req.MemberCreateReq; import org.jullaene.walkmong_back.api.member.service.AuthService; import org.jullaene.walkmong_back.common.BasicResponse; import org.springframework.http.ResponseEntity; -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.RestController; +import org.springframework.web.bind.annotation.*; @Tag(name = "Auth", description = "인증 관련 api 입니다.") @RestController @@ -33,4 +31,11 @@ public ResponseEntity> login(@Valid @RequestBody LoginReq return ResponseEntity.ok(BasicResponse.ofSuccess(authService.login(loginReq))); } + @Operation(summary = "이메일 중복 확인", description = "이메일 중복 확인") + @PostMapping("/email/duplicate") + public ResponseEntity> emailDuplicate (@RequestParam(name = "email") String email) { + return ResponseEntity.ok(BasicResponse.ofSuccess(authService.duplicateEmail(email))); + } + + } \ No newline at end of file diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/service/AuthService.java b/src/main/java/org/jullaene/walkmong_back/api/member/service/AuthService.java index b6daed1..7bea484 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/service/AuthService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/service/AuthService.java @@ -37,11 +37,6 @@ public String login(LoginReq loginReq) { */ @Transactional public Long createAccount(MemberCreateReq memberCreateReq) { - - if (memberRepository.existsByEmail(memberCreateReq.getEmail())) { - throw new CustomException(HttpStatus.CONFLICT, ErrorType.ALREADY_EXIST_USER); - } - Member member = Member.builder() .email(memberCreateReq.getEmail()) .nickname(memberCreateReq.getNickname()) @@ -51,6 +46,17 @@ public Long createAccount(MemberCreateReq memberCreateReq) { return memberRepository.save(member).getMemberId(); } + /** + * 이메일 중복 확인 + * */ + @Transactional(readOnly = true) + public String duplicateEmail (String email) { + if (memberRepository.existsByEmail(email)) { + throw new CustomException(HttpStatus.CONFLICT, ErrorType.ALREADY_EXIST_USER); + } + return "사용 가능한 이메일입니다."; + } + /** * 이메일을 이용하여 Account 정보를 찾는 API */ @@ -61,4 +67,6 @@ private Member findByAccountEmail(String email){ () -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_USER)); } + + } From 9423d283535ed2b62fdf587985feb9ad1a8d1272 Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Sat, 30 Nov 2024 19:09:36 +0900 Subject: [PATCH 02/15] =?UTF-8?q?feat:=20=EB=8B=89=EB=84=A4=EC=9E=84=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EC=B2=B4=ED=81=AC=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20[#21]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/member/repository/MemberRepository.java | 2 ++ .../api/member/rest/AuthController.java | 6 +++++- .../api/member/service/AuthService.java | 14 +++++++++++--- .../walkmong_back/common/exception/ErrorType.java | 1 + 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/repository/MemberRepository.java b/src/main/java/org/jullaene/walkmong_back/api/member/repository/MemberRepository.java index a40196b..52b1f31 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/repository/MemberRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/repository/MemberRepository.java @@ -10,4 +10,6 @@ public interface MemberRepository extends JpaRepository { Optional findByEmail(String email); Boolean existsByEmail(String email); + + Boolean existsByNickname(String nickname); } diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/rest/AuthController.java b/src/main/java/org/jullaene/walkmong_back/api/member/rest/AuthController.java index 0ab15a0..3d2db89 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/rest/AuthController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/rest/AuthController.java @@ -37,5 +37,9 @@ public ResponseEntity> emailDuplicate (@RequestParam(name return ResponseEntity.ok(BasicResponse.ofSuccess(authService.duplicateEmail(email))); } - + @Operation(summary = "닉네임 중복 확인", description = "닉네임 중복 확인") + @PostMapping("/nickname/duplicate") + public ResponseEntity> nicknameDuplicate (@RequestParam(name = "nickname") String nickname) { + return ResponseEntity.ok(BasicResponse.ofSuccess(authService.duplicateNickname(nickname))); + } } \ No newline at end of file diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/service/AuthService.java b/src/main/java/org/jullaene/walkmong_back/api/member/service/AuthService.java index 7bea484..35fa147 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/service/AuthService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/service/AuthService.java @@ -57,6 +57,17 @@ public String duplicateEmail (String email) { return "사용 가능한 이메일입니다."; } + /** + * 닉네임 중복 확인 + * */ + @Transactional(readOnly = true) + public String duplicateNickname(String nickname) { + if (memberRepository.existsByNickname(nickname)) { + throw new CustomException(HttpStatus.CONFLICT, ErrorType.ALREADY_EXIST_NICKNAME); + } + return "사용 가능한 닉네임입니다."; + } + /** * 이메일을 이용하여 Account 정보를 찾는 API */ @@ -66,7 +77,4 @@ private Member findByAccountEmail(String email){ .orElseThrow( () -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_USER)); } - - - } diff --git a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java index 3a81491..59c9219 100644 --- a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java +++ b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java @@ -12,6 +12,7 @@ public enum ErrorType { LOGIN_REQUIRED("로그인 해주세요."), EXPIRED_TOKEN("만료된 요청입니다."), ALREADY_EXIST_USER("이미 존재하는 유저입니다."), + ALREADY_EXIST_NICKNAME("이미 존재하는 닉네임입니다."), ALREADY_LOGIN("로그인 상태입니다"), WRONG_PASSWORD("잘못된 비밀번호 입니다."), REQUEST_VALIDATION_ERROR("유효성 검사가 실패하였습니다."), From ce2e020c6e8eadddc3203ee4da74fb7c22c69603 Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Sat, 30 Nov 2024 20:10:55 +0900 Subject: [PATCH 03/15] =?UTF-8?q?feat:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 ++ .../api/member/rest/AuthController.java | 26 +++++- .../api/member/service/AuthService.java | 28 ++++++ .../api/member/service/EmailService.java | 87 +++++++++++++++++++ .../common/exception/ErrorType.java | 1 + .../walkmong_back/config/SMTPConfig.java | 42 +++++++++ 6 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/jullaene/walkmong_back/api/member/service/EmailService.java create mode 100644 src/main/java/org/jullaene/walkmong_back/config/SMTPConfig.java diff --git a/build.gradle b/build.gradle index d1b4241..318a7ef 100644 --- a/build.gradle +++ b/build.gradle @@ -50,6 +50,12 @@ dependencies { annotationProcessor "jakarta.persistence:jakarta.persistence-api" + // Redis + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + + //smtp + implementation 'org.springframework.boot:spring-boot-starter-mail' + } tasks.named('test') { diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/rest/AuthController.java b/src/main/java/org/jullaene/walkmong_back/api/member/rest/AuthController.java index 3d2db89..4dc4128 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/rest/AuthController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/rest/AuthController.java @@ -4,11 +4,13 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.antlr.v4.runtime.BailErrorStrategy; import org.jullaene.walkmong_back.api.member.dto.req.LoginReq; import org.jullaene.walkmong_back.api.member.dto.req.MemberCreateReq; import org.jullaene.walkmong_back.api.member.service.AuthService; import org.jullaene.walkmong_back.common.BasicResponse; +import org.jullaene.walkmong_back.common.exception.CustomException; +import org.jullaene.walkmong_back.common.exception.ErrorType; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -42,4 +44,26 @@ public ResponseEntity> emailDuplicate (@RequestParam(name public ResponseEntity> nicknameDuplicate (@RequestParam(name = "nickname") String nickname) { return ResponseEntity.ok(BasicResponse.ofSuccess(authService.duplicateNickname(nickname))); } + + @Operation(summary = "이메일 인증 요청", description = "이메일 인증 요청") + @PostMapping("/email/code/request") + public ResponseEntity> requestVerification(@RequestParam(name = "email") String email) { + try { + return ResponseEntity.ok(BasicResponse.ofSuccess(authService.requestEmailVerification(email))); + } catch (Exception e) { + throw new CustomException(HttpStatus.INTERNAL_SERVER_ERROR, ErrorType.INTERNAL_SERVER); + } + } + + @PostMapping("/email/code/verify") + public ResponseEntity> verifyCode(@RequestParam(name = "email") String email, + @RequestParam(name = "code") String code) { + boolean isVerified = authService.verifyCode(email, code); + + if (isVerified) { + return ResponseEntity.ok(BasicResponse.ofSuccess("인증에 성공했습니다.")); + } else { + throw new CustomException(HttpStatus.BAD_REQUEST, ErrorType.INVALID_VERIFICATION_CODE); + } + } } \ No newline at end of file diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/service/AuthService.java b/src/main/java/org/jullaene/walkmong_back/api/member/service/AuthService.java index 35fa147..f3a093e 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/service/AuthService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/service/AuthService.java @@ -8,17 +8,29 @@ import org.jullaene.walkmong_back.common.exception.CustomException; import org.jullaene.walkmong_back.common.exception.ErrorType; import org.jullaene.walkmong_back.common.utils.JwtTokenUtil; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpStatus; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.security.NoSuchAlgorithmException; +import java.security.Principal; +import java.security.SecureRandom; +import java.util.Objects; +import java.util.Random; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + @RequiredArgsConstructor @Service public class AuthService { private final MemberRepository memberRepository; private final JwtTokenUtil jwtTokenUtil; private final PasswordEncoder passwordEncoder; + private final EmailService emailService; /** * 로그인 @@ -68,6 +80,21 @@ public String duplicateNickname(String nickname) { return "사용 가능한 닉네임입니다."; } + /** + * 이메일 인증 번호 요청 + * */ + public String requestEmailVerification(String email) { + emailService.sendVerificationCode(email); + return "인증 번호 전송 완료"; + } + + /** + * 이메일 인증 번호 확인 + * */ + public boolean verifyCode(String email, String code) { + return emailService.verifyCode(email, code); + } + /** * 이메일을 이용하여 Account 정보를 찾는 API */ @@ -77,4 +104,5 @@ private Member findByAccountEmail(String email){ .orElseThrow( () -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_USER)); } + } diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/service/EmailService.java b/src/main/java/org/jullaene/walkmong_back/api/member/service/EmailService.java new file mode 100644 index 0000000..6335eab --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/member/service/EmailService.java @@ -0,0 +1,87 @@ +package org.jullaene.walkmong_back.api.member.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.time.Duration; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class EmailService { + private final RedisTemplate redisTemplate; + private final JavaMailSender mailSender; + + private static final int CODE_EXPIRATION_MINUTES = 10; + private static final int CODE_LENGTH = 6; + @Value("${smtp.mail.username}") + private String managerName; + + /** + * 인증번호 생성 및 redis에 저장 + * */ + public void sendVerificationCode(String email) { + String redisKey = "email_verification:" + email; + + // 기존 키가 존재하면 삭제 + if (Boolean.TRUE.equals(redisTemplate.hasKey(redisKey))) { + redisTemplate.delete(redisKey); + } + + // 새 인증번호 생성 및 처리 + String verificationCode = generateVerificationCode(); + redisTemplate.opsForValue().set( + redisKey, + verificationCode, + Duration.ofMinutes(CODE_EXPIRATION_MINUTES) + ); + + // 이메일 발송 + sendVerificationEmail(email, verificationCode); + } + + /** + * 인증번호 검증 + * */ + public boolean verifyCode(String email, String userInputCode) { + String redisKey = "email_verification:" + email; + String storedCode = redisTemplate.opsForValue().get(redisKey); + + // 코드 검증 + if (storedCode != null && storedCode.equals(userInputCode)) { + // 인증 성공 시 Redis에서 삭제 + redisTemplate.delete(redisKey); + return true; + } + return false; + } + + /** + * 인증번호 생성 + * */ + private String generateVerificationCode() { + SecureRandom random = new SecureRandom(); + return random.ints(CODE_LENGTH, 0, 10) + .mapToObj(String::valueOf) + .collect(Collectors.joining()); + } + + /** + * 이메일로 인증번호 전송 + * */ + private void sendVerificationEmail(String to, String verificationCode) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setFrom(managerName); + message.setTo(to); + message.setSubject("[WAlKMONG] 이메일 인증 코드"); + message.setText("인증 코드는 [" + verificationCode + "] 입니다. " + + CODE_EXPIRATION_MINUTES + "분 이내에 입력해주세요."); + + mailSender.send(message); + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java index 59c9219..ec97f1b 100644 --- a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java +++ b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java @@ -13,6 +13,7 @@ public enum ErrorType { EXPIRED_TOKEN("만료된 요청입니다."), ALREADY_EXIST_USER("이미 존재하는 유저입니다."), ALREADY_EXIST_NICKNAME("이미 존재하는 닉네임입니다."), + INVALID_VERIFICATION_CODE("인증에 실패했습니다."), ALREADY_LOGIN("로그인 상태입니다"), WRONG_PASSWORD("잘못된 비밀번호 입니다."), REQUEST_VALIDATION_ERROR("유효성 검사가 실패하였습니다."), diff --git a/src/main/java/org/jullaene/walkmong_back/config/SMTPConfig.java b/src/main/java/org/jullaene/walkmong_back/config/SMTPConfig.java new file mode 100644 index 0000000..17a0a67 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/config/SMTPConfig.java @@ -0,0 +1,42 @@ +package org.jullaene.walkmong_back.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.JavaMailSenderImpl; + +import java.util.Properties; + +@Configuration +public class SMTPConfig { + + @Value("${smtp.mail.username}") + private String username; + @Value("${smtp.mail.password}") + private String password; + + @Bean + public JavaMailSender javaMailSender() { + JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl(); + + javaMailSender.setHost("smtp.gmail.com"); + javaMailSender.setUsername(username); + javaMailSender.setPassword(password); + + javaMailSender.setPort(587); + + javaMailSender.setJavaMailProperties(getMailProperties()); + + return javaMailSender; + } + + private Properties getMailProperties() { + Properties properties = new Properties(); + properties.setProperty("mail.transport.protocol", "smtp"); + properties.setProperty("mail.smtp.auth", "true"); + properties.setProperty("mail.smtp.starttls.enable", "true"); + + return properties; + } +} \ No newline at end of file From f76584f8de7837212dfaff22fd1c0872128620ff Mon Sep 17 00:00:00 2001 From: dnwldla Date: Mon, 2 Dec 2024 15:09:02 +0900 Subject: [PATCH 04/15] =?UTF-8?q?feat:=20=EA=B0=95=EC=95=84=EC=A7=80=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=95=84=20=EB=93=B1=EB=A1=9D=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/dog/domain/Dog.java | 54 +++++++++++++++++++ .../api/dog/dto/req/DogProfileReqDto.java | 23 ++++++++ .../api/dog/repository/DogRepository.java | 4 ++ .../api/dog/rest/DogController.java | 18 +++++++ .../api/dog/service/DogService.java | 42 +++++++++++++++ .../common/exception/ErrorType.java | 5 ++ 6 files changed, 146 insertions(+) create mode 100644 src/main/java/org/jullaene/walkmong_back/api/dog/dto/req/DogProfileReqDto.java diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java index 21055b3..954044e 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java @@ -6,17 +6,25 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; +import java.time.LocalDate; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; import org.hibernate.annotations.Comment; import org.hibernate.annotations.DynamicUpdate; import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; import org.jullaene.walkmong_back.common.enums.Gender; import org.jullaene.walkmong_back.common.BaseEntity; @Table(name = "dog") @Entity +@NoArgsConstructor @DynamicUpdate public class Dog extends BaseEntity { @Id + @Getter @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "dog_id") private Long dogId; @@ -28,6 +36,7 @@ public class Dog extends BaseEntity { private String name; @Comment("성별") + @Enumerated(EnumType.STRING) private Gender gender; @Comment("출생년도") @@ -40,6 +49,7 @@ public class Dog extends BaseEntity { private String breed; @Comment("사이즈") + @Enumerated(EnumType.STRING) private DogSize dogSize; @Comment("프로필 url") @@ -74,4 +84,48 @@ public class Dog extends BaseEntity { @Comment("추가 안내 사항") private String additionalRequest; + + public final DogProfileResponseDto toDogProfileResponseDto() { + int currentYear = LocalDate.now().getYear(); + int dogAge = currentYear - this.birthYear + 1; // 나이 계산 + + return DogProfileResponseDto.builder() + .dogId(this.dogId) + .dogName(this.name) + .dogProfile(this.profile) + .dogGender(this.gender) + .dogAge(dogAge) + .breed(this.breed) + .weight(this.weight) + .neuteringYn(this.neuteringYn) + .bite(this.bite) + .friendly(this.friendly) + .barking(this.barking) + .rabiesYn(this.rabiesYn) + .build(); + } + + @Builder + public Dog(Long memberId,String name, + DogSize dogSize, String profile, + Gender gender, Integer birthYear, + String breed, Double weight, + String neuteringYn, String bite, + String friendly, String barking, + String rabiesYn, String adultYn){ + this.name=name; + this.memberId=memberId; + this.dogSize=dogSize; + this.profile=profile; + this.gender=gender; + this.birthYear=birthYear; + this.breed=breed; + this.weight=weight; + this.neuteringYn=neuteringYn; + this.bite = bite; + this.friendly=friendly; + this.barking = barking; + this.rabiesYn=rabiesYn; + this.adultYn=adultYn; + } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/dto/req/DogProfileReqDto.java b/src/main/java/org/jullaene/walkmong_back/api/dog/dto/req/DogProfileReqDto.java new file mode 100644 index 0000000..04aa8cf --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/dto/req/DogProfileReqDto.java @@ -0,0 +1,23 @@ +package org.jullaene.walkmong_back.api.dog.dto.req; + +import lombok.Getter; +import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.common.enums.Gender; + +@Getter +public class DogProfileReqDto { + private Long memberId; + private String name; + private DogSize dogSize; + private String profile; + private Gender gender; + private Integer birthYear; + private String breed; + private Double weight; + private String neuteringYn; + private String bite; + private String friendly; + private String barking; + private String rabiesYn; + private String adultYn; +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java b/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java index 04e7fb4..41e9d70 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java @@ -1,9 +1,13 @@ package org.jullaene.walkmong_back.api.dog.repository; +import java.util.Optional; import org.jullaene.walkmong_back.api.dog.domain.Dog; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface DogRepository extends JpaRepository { + Optional findByDogIdAndDelYn(Long id, String delYn); + + Boolean existsByNameAndDelYn(String name, String delYn); } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java b/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java index 4d11272..bfcc5ff 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java @@ -1,7 +1,13 @@ package org.jullaene.walkmong_back.api.dog.rest; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.dog.dto.req.DogProfileReqDto; +import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; import org.jullaene.walkmong_back.api.dog.service.DogService; +import org.jullaene.walkmong_back.common.BasicResponse; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -10,4 +16,16 @@ @RequestMapping("/api/v1/dog") public class DogController { private final DogService dogService; + + @GetMapping("/profile/{dogId}") + public ResponseEntity> getDogProfile(@PathVariable Long dogId) { + DogProfileResponseDto dogProfile = dogService.getDogProfile(dogId); + return ResponseEntity.ok(BasicResponse.ofSuccess(dogProfile)); + } + + @PostMapping("/register") + public ResponseEntity> registerDogProfile(@Valid @RequestBody DogProfileReqDto dogProfileReqDto) { + return ResponseEntity.ok(BasicResponse.ofSuccess(dogService.registerDogProfile(dogProfileReqDto))); + } + } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java b/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java index ad6078e..9fea246 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java @@ -1,11 +1,53 @@ package org.jullaene.walkmong_back.api.dog.service; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.dog.domain.Dog; +import org.jullaene.walkmong_back.api.dog.dto.req.DogProfileReqDto; +import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; import org.jullaene.walkmong_back.api.dog.repository.DogRepository; +import org.jullaene.walkmong_back.api.member.service.MemberService; +import org.jullaene.walkmong_back.common.exception.CustomException; +import org.jullaene.walkmong_back.common.exception.ErrorType; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @RequiredArgsConstructor @Service public class DogService { private final DogRepository dogRepository; + private final MemberService memberService; + + public DogProfileResponseDto getDogProfile(Long dogId) { + Dog dog = dogRepository.findByDogIdAndDelYn(dogId, "N") + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.DOG_NOT_FOUND)); + + return dog.toDogProfileResponseDto(); + } + + public Long registerDogProfile(DogProfileReqDto dogProfileReqDto) { + + //이미 등록된 강아지 프로필이라면 예외처리 + if (dogRepository.existsByNameAndDelYn(dogProfileReqDto.getName(),"N")){ + throw new CustomException(HttpStatus.FORBIDDEN,ErrorType.CANNOT_DUPLICATED_DOG_PROFILE); + } + + Dog dog=Dog.builder() + .name(dogProfileReqDto.getName()) + .memberId(memberService.getMemberFromUserDetail().getMemberId()) + .dogSize(dogProfileReqDto.getDogSize()) + .profile(dogProfileReqDto.getProfile()) + .gender(dogProfileReqDto.getGender()) + .birthYear(dogProfileReqDto.getBirthYear()) + .breed(dogProfileReqDto.getBreed()) + .weight(dogProfileReqDto.getWeight()) + .neuteringYn(dogProfileReqDto.getNeuteringYn()) + .bite(dogProfileReqDto.getBite()) + .friendly(dogProfileReqDto.getFriendly()) + .barking(dogProfileReqDto.getBarking()) + .rabiesYn(dogProfileReqDto.getRabiesYn()) + .adultYn(dogProfileReqDto.getAdultYn()) + .build(); + + return dogRepository.save(dog).getDogId(); + } } diff --git a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java index ec97f1b..1a9d8e1 100644 --- a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java +++ b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java @@ -20,6 +20,11 @@ public enum ErrorType { INVALID_TOKEN("유효하지 않은 토큰입니다."), INTERNAL_SERVER("서버 오류입니다."), UNAUTHORIZED_UPDATE("수정 권한이 없는 유저입니다."), + DOG_NOT_FOUND("존재하지 않는 강아지입니다."), + INVALID_ADDRESS("유효하지 않은 주소입니다."), + CANNOT_SELF_APPLY("본인의 게시글에는 지원할 수 없습니다."), + CANNOT_DUPLICATED_APPLY("한 게시글에 여러 번 지원할 수 없습니다."), + CANNOT_DUPLICATED_DOG_PROFILE("이미 등록된 강아지입니다") ; private String message; From db0518de9b2b2f63bd08c88f9c82fcf58b6959f8 Mon Sep 17 00:00:00 2001 From: Seung Ik Lee Date: Fri, 15 Nov 2024 15:20:15 +0900 Subject: [PATCH 05/15] =?UTF-8?q?feat:=20#6=20=EB=B0=98=EB=A0=A4=EA=B2=AC?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=83=81=EC=84=B8=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/dog/domain/Dog.java | 52 ++----------------- .../dog/dto/res/DogProfileResponseDto.java | 44 ++++++++++++++++ .../api/dog/rest/DogController.java | 19 +++---- .../api/dog/service/DogService.java | 34 +----------- .../common/exception/ErrorType.java | 6 --- 5 files changed, 55 insertions(+), 100 deletions(-) create mode 100644 src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java index 954044e..f74624d 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java @@ -2,6 +2,8 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @@ -14,17 +16,16 @@ import org.hibernate.annotations.Comment; import org.hibernate.annotations.DynamicUpdate; import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; -import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; import org.jullaene.walkmong_back.common.enums.Gender; import org.jullaene.walkmong_back.common.BaseEntity; @Table(name = "dog") @Entity +@Getter @NoArgsConstructor @DynamicUpdate public class Dog extends BaseEntity { @Id - @Getter @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "dog_id") private Long dogId; @@ -68,9 +69,6 @@ public class Dog extends BaseEntity { @Comment("짖음 여부") private String barking; - @Comment("성견 여부") - private String adultYn; - @Comment("광견병 접종 여부") @Column(columnDefinition = "VARCHAR(1) default 'N'") private String rabiesYn; @@ -84,48 +82,4 @@ public class Dog extends BaseEntity { @Comment("추가 안내 사항") private String additionalRequest; - - public final DogProfileResponseDto toDogProfileResponseDto() { - int currentYear = LocalDate.now().getYear(); - int dogAge = currentYear - this.birthYear + 1; // 나이 계산 - - return DogProfileResponseDto.builder() - .dogId(this.dogId) - .dogName(this.name) - .dogProfile(this.profile) - .dogGender(this.gender) - .dogAge(dogAge) - .breed(this.breed) - .weight(this.weight) - .neuteringYn(this.neuteringYn) - .bite(this.bite) - .friendly(this.friendly) - .barking(this.barking) - .rabiesYn(this.rabiesYn) - .build(); - } - - @Builder - public Dog(Long memberId,String name, - DogSize dogSize, String profile, - Gender gender, Integer birthYear, - String breed, Double weight, - String neuteringYn, String bite, - String friendly, String barking, - String rabiesYn, String adultYn){ - this.name=name; - this.memberId=memberId; - this.dogSize=dogSize; - this.profile=profile; - this.gender=gender; - this.birthYear=birthYear; - this.breed=breed; - this.weight=weight; - this.neuteringYn=neuteringYn; - this.bite = bite; - this.friendly=friendly; - this.barking = barking; - this.rabiesYn=rabiesYn; - this.adultYn=adultYn; - } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java b/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java new file mode 100644 index 0000000..6510e32 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java @@ -0,0 +1,44 @@ +package org.jullaene.walkmong_back.api.dog.dto.res; + +import java.time.LocalDate; +import lombok.Builder; +import lombok.Getter; +import org.jullaene.walkmong_back.api.dog.domain.Dog; +import org.jullaene.walkmong_back.common.enums.Gender; + +@Getter +@Builder +public class DogProfileResponseDto { + private Long dogId; + private String dogName; + private String dogProfile; + private Gender dogGender; + private Integer dogAge; + private String breed; + private Double weight; + private String neuteringYn; + private String bite; + private String friendly; + private String barking; + private String rabiesYn; + + public static DogProfileResponseDto fromDog(Dog dog) { + int currentYear = LocalDate.now().getYear(); + int dogAge = currentYear - dog.getBirthYear() + 1; + + return DogProfileResponseDto.builder() + .dogId(dog.getDogId()) + .dogName(dog.getName()) + .dogProfile(dog.getProfile()) + .dogGender(dog.getGender()) + .dogAge(dogAge) + .breed(dog.getBreed()) + .weight(dog.getWeight()) + .neuteringYn(dog.getNeuteringYn()) + .bite(dog.getBite()) + .friendly(dog.getFriendly()) + .barking(dog.getBarking()) + .rabiesYn(dog.getRabiesYn()) + .build(); + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java b/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java index bfcc5ff..f6f8bcd 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java @@ -1,13 +1,12 @@ package org.jullaene.walkmong_back.api.dog.rest; -import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.jullaene.walkmong_back.api.dog.dto.req.DogProfileReqDto; import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; import org.jullaene.walkmong_back.api.dog.service.DogService; -import org.jullaene.walkmong_back.common.BasicResponse; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.jullaene.walkmong_back.common.exception.ResponseMessage; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -18,14 +17,8 @@ public class DogController { private final DogService dogService; @GetMapping("/profile/{dogId}") - public ResponseEntity> getDogProfile(@PathVariable Long dogId) { + public ResponseMessage getDogProfile(@PathVariable Long dogId) { DogProfileResponseDto dogProfile = dogService.getDogProfile(dogId); - return ResponseEntity.ok(BasicResponse.ofSuccess(dogProfile)); + return ResponseMessage.of(HttpStatus.OK, "Success", dogProfile); } - - @PostMapping("/register") - public ResponseEntity> registerDogProfile(@Valid @RequestBody DogProfileReqDto dogProfileReqDto) { - return ResponseEntity.ok(BasicResponse.ofSuccess(dogService.registerDogProfile(dogProfileReqDto))); - } - } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java b/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java index 9fea246..532a49b 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java @@ -2,10 +2,8 @@ import lombok.RequiredArgsConstructor; import org.jullaene.walkmong_back.api.dog.domain.Dog; -import org.jullaene.walkmong_back.api.dog.dto.req.DogProfileReqDto; import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; import org.jullaene.walkmong_back.api.dog.repository.DogRepository; -import org.jullaene.walkmong_back.api.member.service.MemberService; import org.jullaene.walkmong_back.common.exception.CustomException; import org.jullaene.walkmong_back.common.exception.ErrorType; import org.springframework.http.HttpStatus; @@ -15,39 +13,11 @@ @Service public class DogService { private final DogRepository dogRepository; - private final MemberService memberService; public DogProfileResponseDto getDogProfile(Long dogId) { - Dog dog = dogRepository.findByDogIdAndDelYn(dogId, "N") + Dog dog = dogRepository.findById(dogId) .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.DOG_NOT_FOUND)); - return dog.toDogProfileResponseDto(); - } - - public Long registerDogProfile(DogProfileReqDto dogProfileReqDto) { - - //이미 등록된 강아지 프로필이라면 예외처리 - if (dogRepository.existsByNameAndDelYn(dogProfileReqDto.getName(),"N")){ - throw new CustomException(HttpStatus.FORBIDDEN,ErrorType.CANNOT_DUPLICATED_DOG_PROFILE); - } - - Dog dog=Dog.builder() - .name(dogProfileReqDto.getName()) - .memberId(memberService.getMemberFromUserDetail().getMemberId()) - .dogSize(dogProfileReqDto.getDogSize()) - .profile(dogProfileReqDto.getProfile()) - .gender(dogProfileReqDto.getGender()) - .birthYear(dogProfileReqDto.getBirthYear()) - .breed(dogProfileReqDto.getBreed()) - .weight(dogProfileReqDto.getWeight()) - .neuteringYn(dogProfileReqDto.getNeuteringYn()) - .bite(dogProfileReqDto.getBite()) - .friendly(dogProfileReqDto.getFriendly()) - .barking(dogProfileReqDto.getBarking()) - .rabiesYn(dogProfileReqDto.getRabiesYn()) - .adultYn(dogProfileReqDto.getAdultYn()) - .build(); - - return dogRepository.save(dog).getDogId(); + return DogProfileResponseDto.fromDog(dog); } } diff --git a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java index 1a9d8e1..f3e75c2 100644 --- a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java +++ b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java @@ -12,8 +12,6 @@ public enum ErrorType { LOGIN_REQUIRED("로그인 해주세요."), EXPIRED_TOKEN("만료된 요청입니다."), ALREADY_EXIST_USER("이미 존재하는 유저입니다."), - ALREADY_EXIST_NICKNAME("이미 존재하는 닉네임입니다."), - INVALID_VERIFICATION_CODE("인증에 실패했습니다."), ALREADY_LOGIN("로그인 상태입니다"), WRONG_PASSWORD("잘못된 비밀번호 입니다."), REQUEST_VALIDATION_ERROR("유효성 검사가 실패하였습니다."), @@ -21,10 +19,6 @@ public enum ErrorType { INTERNAL_SERVER("서버 오류입니다."), UNAUTHORIZED_UPDATE("수정 권한이 없는 유저입니다."), DOG_NOT_FOUND("존재하지 않는 강아지입니다."), - INVALID_ADDRESS("유효하지 않은 주소입니다."), - CANNOT_SELF_APPLY("본인의 게시글에는 지원할 수 없습니다."), - CANNOT_DUPLICATED_APPLY("한 게시글에 여러 번 지원할 수 없습니다."), - CANNOT_DUPLICATED_DOG_PROFILE("이미 등록된 강아지입니다") ; private String message; From e5cee1177e48c6d176e1173e07c7d7788b6af67f Mon Sep 17 00:00:00 2001 From: Seung Ik Lee Date: Fri, 15 Nov 2024 23:14:16 +0900 Subject: [PATCH 06/15] =?UTF-8?q?refactor:=20#6=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/dog/domain/Dog.java | 27 ++++++++++++++----- .../dog/dto/res/DogProfileResponseDto.java | 22 --------------- .../api/dog/repository/DogRepository.java | 3 --- .../api/dog/rest/DogController.java | 8 +++--- .../api/dog/service/DogService.java | 4 +-- 5 files changed, 27 insertions(+), 37 deletions(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java index f74624d..52041fc 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java @@ -9,20 +9,15 @@ import jakarta.persistence.Id; import jakarta.persistence.Table; import java.time.LocalDate; - -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; import org.hibernate.annotations.Comment; import org.hibernate.annotations.DynamicUpdate; import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; import org.jullaene.walkmong_back.common.enums.Gender; import org.jullaene.walkmong_back.common.BaseEntity; @Table(name = "dog") @Entity -@Getter -@NoArgsConstructor @DynamicUpdate public class Dog extends BaseEntity { @Id @@ -82,4 +77,24 @@ public class Dog extends BaseEntity { @Comment("추가 안내 사항") private String additionalRequest; + + public final DogProfileResponseDto toDogProfileResponseDto() { + int currentYear = LocalDate.now().getYear(); + int dogAge = currentYear - this.birthYear + 1; // 나이 계산 + + return DogProfileResponseDto.builder() + .dogId(this.dogId) + .dogName(this.name) + .dogProfile(this.profile) + .dogGender(this.gender) + .dogAge(dogAge) + .breed(this.breed) + .weight(this.weight) + .neuteringYn(this.neuteringYn) + .bite(this.bite) + .friendly(this.friendly) + .barking(this.barking) + .rabiesYn(this.rabiesYn) + .build(); + } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java b/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java index 6510e32..2cbd774 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java @@ -1,9 +1,7 @@ package org.jullaene.walkmong_back.api.dog.dto.res; -import java.time.LocalDate; import lombok.Builder; import lombok.Getter; -import org.jullaene.walkmong_back.api.dog.domain.Dog; import org.jullaene.walkmong_back.common.enums.Gender; @Getter @@ -21,24 +19,4 @@ public class DogProfileResponseDto { private String friendly; private String barking; private String rabiesYn; - - public static DogProfileResponseDto fromDog(Dog dog) { - int currentYear = LocalDate.now().getYear(); - int dogAge = currentYear - dog.getBirthYear() + 1; - - return DogProfileResponseDto.builder() - .dogId(dog.getDogId()) - .dogName(dog.getName()) - .dogProfile(dog.getProfile()) - .dogGender(dog.getGender()) - .dogAge(dogAge) - .breed(dog.getBreed()) - .weight(dog.getWeight()) - .neuteringYn(dog.getNeuteringYn()) - .bite(dog.getBite()) - .friendly(dog.getFriendly()) - .barking(dog.getBarking()) - .rabiesYn(dog.getRabiesYn()) - .build(); - } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java b/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java index 41e9d70..82212a3 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java @@ -1,6 +1,5 @@ package org.jullaene.walkmong_back.api.dog.repository; -import java.util.Optional; import org.jullaene.walkmong_back.api.dog.domain.Dog; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -8,6 +7,4 @@ @Repository public interface DogRepository extends JpaRepository { Optional findByDogIdAndDelYn(Long id, String delYn); - - Boolean existsByNameAndDelYn(String name, String delYn); } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java b/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java index f6f8bcd..30d78b2 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java @@ -3,8 +3,8 @@ import lombok.RequiredArgsConstructor; import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; import org.jullaene.walkmong_back.api.dog.service.DogService; -import org.jullaene.walkmong_back.common.exception.ResponseMessage; -import org.springframework.http.HttpStatus; +import org.jullaene.walkmong_back.common.BasicResponse; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -17,8 +17,8 @@ public class DogController { private final DogService dogService; @GetMapping("/profile/{dogId}") - public ResponseMessage getDogProfile(@PathVariable Long dogId) { + public ResponseEntity> getDogProfile(@PathVariable Long dogId) { DogProfileResponseDto dogProfile = dogService.getDogProfile(dogId); - return ResponseMessage.of(HttpStatus.OK, "Success", dogProfile); + return ResponseEntity.ok(BasicResponse.ofSuccess(dogProfile)); } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java b/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java index 532a49b..95a413d 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java @@ -15,9 +15,9 @@ public class DogService { private final DogRepository dogRepository; public DogProfileResponseDto getDogProfile(Long dogId) { - Dog dog = dogRepository.findById(dogId) + Dog dog = dogRepository.findByDogIdAndDelYn(dogId, "N") .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.DOG_NOT_FOUND)); - return DogProfileResponseDto.fromDog(dog); + return dog.toDogProfileResponseDto(); } } From 83669e6a971262aa27ceb940b24d714faded2891 Mon Sep 17 00:00:00 2001 From: dnwldla Date: Sat, 30 Nov 2024 19:21:16 +0900 Subject: [PATCH 07/15] =?UTF-8?q?feat:=20=EC=82=B0=EC=B1=85=20=EA=B2=BD?= =?UTF-8?q?=ED=97=98=20=EA=B4=80=EB=A0=A8=20=EC=B6=94=EA=B0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/member/domain/Member.java | 9 ++++++ .../api/member/dto/req/WalkExperienceReq.java | 12 ++++++++ .../api/member/rest/MemberController.java | 16 ++++++++++ .../api/member/service/MemberService.java | 29 +++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 src/main/java/org/jullaene/walkmong_back/api/member/dto/req/WalkExperienceReq.java diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/domain/Member.java b/src/main/java/org/jullaene/walkmong_back/api/member/domain/Member.java index 4456dbe..ccad1cd 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/domain/Member.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/domain/Member.java @@ -7,6 +7,7 @@ import org.hibernate.annotations.Comment; import org.hibernate.annotations.DynamicUpdate; import org.jullaene.walkmong_back.api.member.domain.enums.Role; +import org.jullaene.walkmong_back.api.member.dto.req.WalkExperienceReq; import org.jullaene.walkmong_back.common.BaseEntity; import org.jullaene.walkmong_back.common.enums.Gender; @@ -80,4 +81,12 @@ public Member (Long memberId, String email, String password, String nickname, this.dogWalkingExperienceYn = dogWalkingExperienceYn; this.availabilityWithSize = availabilityWithSize; } + + public Member addWalkingExperience(WalkExperienceReq walkExperienceReq) { + this.dogOwnership=walkExperienceReq.getDogOwnershipYn(); + this.dogWalkingExperienceYn=walkExperienceReq.getDogWalkingExperienceYn(); + this.availabilityWithSize=walkExperienceReq.getAvailabilityWithSize(); + + return this; + } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/dto/req/WalkExperienceReq.java b/src/main/java/org/jullaene/walkmong_back/api/member/dto/req/WalkExperienceReq.java new file mode 100644 index 0000000..63f6753 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/member/dto/req/WalkExperienceReq.java @@ -0,0 +1,12 @@ +package org.jullaene.walkmong_back.api.member.dto.req; + +import lombok.Getter; + + +@Getter +public class WalkExperienceReq { + + private String dogOwnershipYn; + private String dogWalkingExperienceYn; + private String availabilityWithSize; +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/rest/MemberController.java b/src/main/java/org/jullaene/walkmong_back/api/member/rest/MemberController.java index f0a3538..d97eafd 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/rest/MemberController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/rest/MemberController.java @@ -1,8 +1,16 @@ package org.jullaene.walkmong_back.api.member.rest; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.member.domain.Member; +import org.jullaene.walkmong_back.api.member.dto.req.WalkExperienceReq; import org.jullaene.walkmong_back.api.member.service.MemberService; +import org.jullaene.walkmong_back.common.BasicResponse; +import org.springframework.http.ResponseEntity; +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.RestController; @@ -12,4 +20,12 @@ @RequestMapping("/api/v1/member") public class MemberController { private final MemberService memberService; + + @Operation(summary = "산책추가정보등록", description = "산책추가정보등록") + @PostMapping("/experience") + public ResponseEntity> registerWalkExperienceInfo(@Valid @RequestBody WalkExperienceReq walkExperienceReq){ + return ResponseEntity.ok(BasicResponse.ofSuccess(memberService.registerWalkingExperience(walkExperienceReq))); + + } + } diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/service/MemberService.java b/src/main/java/org/jullaene/walkmong_back/api/member/service/MemberService.java index bf50eab..d8c15be 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/service/MemberService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/service/MemberService.java @@ -1,11 +1,40 @@ package org.jullaene.walkmong_back.api.member.service; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.member.domain.Member; +import org.jullaene.walkmong_back.api.member.dto.req.WalkExperienceReq; import org.jullaene.walkmong_back.api.member.repository.MemberRepository; +import org.jullaene.walkmong_back.common.exception.CustomException; +import org.jullaene.walkmong_back.common.user.CustomUserDetail; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import static org.jullaene.walkmong_back.common.exception.ErrorType.USER_NOT_AUTHENTICATED; + @Service @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; + + /** + * CustomUserDetail에서 member 가져오기 + * */ + public Member getMemberFromUserDetail () { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.getPrincipal() instanceof CustomUserDetail customUserDetail) { + return customUserDetail.getMember(); // member 객체 가져오기 + } + throw new CustomException(HttpStatus.UNAUTHORIZED, USER_NOT_AUTHENTICATED); + } + + public Member registerWalkingExperience(@Valid WalkExperienceReq walkExperienceReq) { + Member member=getMemberFromUserDetail().addWalkingExperience(walkExperienceReq); + memberRepository.save(member); + + return member; + } } From 839b263ebd1420f4f3aab650b3e0ee7723afc768 Mon Sep 17 00:00:00 2001 From: dnwldla Date: Sat, 30 Nov 2024 19:32:56 +0900 Subject: [PATCH 08/15] =?UTF-8?q?feat:=20=EC=82=B0=EC=B1=85=20=EA=B2=BD?= =?UTF-8?q?=ED=97=98=20=EA=B4=80=EB=A0=A8=20=EC=A0=95=EB=B3=B4=EC=97=90=20?= =?UTF-8?q?introduction=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/member/domain/Member.java | 2 +- .../api/member/dto/req/WalkExperienceReq.java | 2 +- .../api/member/rest/MemberController.java | 13 ++++++++----- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/domain/Member.java b/src/main/java/org/jullaene/walkmong_back/api/member/domain/Member.java index ccad1cd..fe56d3e 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/domain/Member.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/domain/Member.java @@ -86,7 +86,7 @@ public Member addWalkingExperience(WalkExperienceReq walkExperienceReq) { this.dogOwnership=walkExperienceReq.getDogOwnershipYn(); this.dogWalkingExperienceYn=walkExperienceReq.getDogWalkingExperienceYn(); this.availabilityWithSize=walkExperienceReq.getAvailabilityWithSize(); - + this.introduce=walkExperienceReq.getIntroduction(); return this; } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/dto/req/WalkExperienceReq.java b/src/main/java/org/jullaene/walkmong_back/api/member/dto/req/WalkExperienceReq.java index 63f6753..a900583 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/dto/req/WalkExperienceReq.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/dto/req/WalkExperienceReq.java @@ -5,8 +5,8 @@ @Getter public class WalkExperienceReq { - private String dogOwnershipYn; private String dogWalkingExperienceYn; private String availabilityWithSize; + private String introduction; } diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/rest/MemberController.java b/src/main/java/org/jullaene/walkmong_back/api/member/rest/MemberController.java index d97eafd..ee0e5e5 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/rest/MemberController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/rest/MemberController.java @@ -9,10 +9,7 @@ import org.jullaene.walkmong_back.api.member.service.MemberService; import org.jullaene.walkmong_back.common.BasicResponse; import org.springframework.http.ResponseEntity; -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.RestController; +import org.springframework.web.bind.annotation.*; @Tag(name = "Member", description = "멤버 정보 관련 api 입니다.") @RestController @@ -23,9 +20,15 @@ public class MemberController { @Operation(summary = "산책추가정보등록", description = "산책추가정보등록") @PostMapping("/experience") - public ResponseEntity> registerWalkExperienceInfo(@Valid @RequestBody WalkExperienceReq walkExperienceReq){ + public ResponseEntity> registerWalkExperienceInfo(@Valid @RequestBody WalkExperienceReq walkExperienceReq) { return ResponseEntity.ok(BasicResponse.ofSuccess(memberService.registerWalkingExperience(walkExperienceReq))); + } + @PatchMapping("/experience") + public ResponseEntity> modifyWalkExperienceInfo(@Valid @RequestBody WalkExperienceReq walkExperienceReq) { + return ResponseEntity.ok(BasicResponse.ofSuccess(memberService.registerWalkingExperience(walkExperienceReq))); } + + } From 7cf26ac1b5de315b83fad2a13a58e1c7888840e2 Mon Sep 17 00:00:00 2001 From: dnwldla Date: Sat, 30 Nov 2024 20:33:04 +0900 Subject: [PATCH 09/15] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/member/domain/Member.java | 3 +-- .../api/member/rest/MemberController.java | 10 +--------- .../api/member/service/MemberService.java | 7 +++---- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/domain/Member.java b/src/main/java/org/jullaene/walkmong_back/api/member/domain/Member.java index fe56d3e..1ddce23 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/domain/Member.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/domain/Member.java @@ -82,11 +82,10 @@ public Member (Long memberId, String email, String password, String nickname, this.availabilityWithSize = availabilityWithSize; } - public Member addWalkingExperience(WalkExperienceReq walkExperienceReq) { + public void addWalkingExperience(WalkExperienceReq walkExperienceReq) { this.dogOwnership=walkExperienceReq.getDogOwnershipYn(); this.dogWalkingExperienceYn=walkExperienceReq.getDogWalkingExperienceYn(); this.availabilityWithSize=walkExperienceReq.getAvailabilityWithSize(); this.introduce=walkExperienceReq.getIntroduction(); - return this; } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/rest/MemberController.java b/src/main/java/org/jullaene/walkmong_back/api/member/rest/MemberController.java index ee0e5e5..3086ea9 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/rest/MemberController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/rest/MemberController.java @@ -20,15 +20,7 @@ public class MemberController { @Operation(summary = "산책추가정보등록", description = "산책추가정보등록") @PostMapping("/experience") - public ResponseEntity> registerWalkExperienceInfo(@Valid @RequestBody WalkExperienceReq walkExperienceReq) { + public ResponseEntity> registerWalkExperienceInfo(@Valid @RequestBody WalkExperienceReq walkExperienceReq) { return ResponseEntity.ok(BasicResponse.ofSuccess(memberService.registerWalkingExperience(walkExperienceReq))); } - - @PatchMapping("/experience") - public ResponseEntity> modifyWalkExperienceInfo(@Valid @RequestBody WalkExperienceReq walkExperienceReq) { - return ResponseEntity.ok(BasicResponse.ofSuccess(memberService.registerWalkingExperience(walkExperienceReq))); - } - - - } diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/service/MemberService.java b/src/main/java/org/jullaene/walkmong_back/api/member/service/MemberService.java index d8c15be..4fd9184 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/service/MemberService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/service/MemberService.java @@ -31,10 +31,9 @@ public Member getMemberFromUserDetail () { throw new CustomException(HttpStatus.UNAUTHORIZED, USER_NOT_AUTHENTICATED); } - public Member registerWalkingExperience(@Valid WalkExperienceReq walkExperienceReq) { - Member member=getMemberFromUserDetail().addWalkingExperience(walkExperienceReq); - memberRepository.save(member); + public Long registerWalkingExperience(@Valid WalkExperienceReq walkExperienceReq) { + getMemberFromUserDetail().addWalkingExperience(walkExperienceReq); - return member; + return getMemberFromUserDetail().getMemberId(); } } From 2418d26d1e80a2559bd8e049571d3d0595dd0cfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=20=EC=9D=80=EC=A0=95?= Date: Sat, 28 Dec 2024 02:59:18 +0900 Subject: [PATCH 10/15] =?UTF-8?q?fix:=20=EC=9E=84=ED=8F=AC=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/dog/repository/DogRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java b/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java index 82212a3..f02b212 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java @@ -4,6 +4,8 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface DogRepository extends JpaRepository { Optional findByDogIdAndDelYn(Long id, String delYn); From 5ff5082e4c6b1355a2e2fadc915146f1962fb541 Mon Sep 17 00:00:00 2001 From: Seung Ik Lee Date: Sat, 21 Dec 2024 17:58:53 +0900 Subject: [PATCH 11/15] =?UTF-8?q?feat:=20#40=20=EB=B0=98=EB=A0=A4=EA=B2=AC?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=88=98=EC=A0=95=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/dog/domain/Dog.java | 54 +++++++++++++++++++ .../api/dog/repository/DogRepository.java | 8 ++- .../api/dog/rest/DogController.java | 21 ++++++-- .../api/dog/service/DogService.java | 54 +++++++++++++++++++ 4 files changed, 131 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java index 52041fc..bc522b9 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java @@ -9,18 +9,25 @@ import jakarta.persistence.Id; import jakarta.persistence.Table; import java.time.LocalDate; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; import org.hibernate.annotations.Comment; import org.hibernate.annotations.DynamicUpdate; import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.api.dog.dto.req.DogProfileReqDto; import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; import org.jullaene.walkmong_back.common.enums.Gender; import org.jullaene.walkmong_back.common.BaseEntity; @Table(name = "dog") @Entity +@NoArgsConstructor @DynamicUpdate public class Dog extends BaseEntity { @Id + @Getter @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "dog_id") private Long dogId; @@ -64,6 +71,9 @@ public class Dog extends BaseEntity { @Comment("짖음 여부") private String barking; + @Comment("성견 여부") + private String adultYn; + @Comment("광견병 접종 여부") @Column(columnDefinition = "VARCHAR(1) default 'N'") private String rabiesYn; @@ -78,6 +88,10 @@ public class Dog extends BaseEntity { private String additionalRequest; + public final String getWalkRequestContent() { + return this.walkRequest; + } + public final DogProfileResponseDto toDogProfileResponseDto() { int currentYear = LocalDate.now().getYear(); int dogAge = currentYear - this.birthYear + 1; // 나이 계산 @@ -97,4 +111,44 @@ public final DogProfileResponseDto toDogProfileResponseDto() { .rabiesYn(this.rabiesYn) .build(); } + + @Builder + public Dog(Long memberId,String name, + DogSize dogSize, String profile, + Gender gender, Integer birthYear, + String breed, Double weight, + String neuteringYn, String bite, + String friendly, String barking, + String rabiesYn, String adultYn){ + this.name=name; + this.memberId=memberId; + this.dogSize=dogSize; + this.profile=profile; + this.gender=gender; + this.birthYear=birthYear; + this.breed=breed; + this.weight=weight; + this.neuteringYn=neuteringYn; + this.bite = bite; + this.friendly=friendly; + this.barking = barking; + this.rabiesYn=rabiesYn; + this.adultYn=adultYn; + } + + public void updateProfile(DogProfileReqDto dogProfileDto) { + this.name = dogProfileDto.getName(); + this.profile = dogProfileDto.getProfile(); + this.gender = dogProfileDto.getGender(); + this.birthYear = dogProfileDto.getBirthYear(); + this.weight = dogProfileDto.getWeight(); + this.breed = dogProfileDto.getBreed(); + this.dogSize = dogProfileDto.getDogSize(); + this.neuteringYn = dogProfileDto.getNeuteringYn(); + this.bite = dogProfileDto.getBite(); + this.friendly = dogProfileDto.getFriendly(); + this.barking = dogProfileDto.getBarking(); + this.rabiesYn = dogProfileDto.getRabiesYn(); + this.adultYn = dogProfileDto.getAdultYn(); + } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java b/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java index f02b212..657fc26 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java @@ -1,12 +1,16 @@ package org.jullaene.walkmong_back.api.dog.repository; +import java.util.List; +import java.util.Optional; import org.jullaene.walkmong_back.api.dog.domain.Dog; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import java.util.Optional; - @Repository public interface DogRepository extends JpaRepository { Optional findByDogIdAndDelYn(Long id, String delYn); + + Boolean existsByNameAndDelYn(String name, String delYn); + + List findByMemberIdAndDelYn(Long memberId, String delYn); } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java b/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java index 30d78b2..5903841 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java @@ -1,14 +1,13 @@ package org.jullaene.walkmong_back.api.dog.rest; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.dog.dto.req.DogProfileReqDto; import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; import org.jullaene.walkmong_back.api.dog.service.DogService; import org.jullaene.walkmong_back.common.BasicResponse; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @@ -21,4 +20,18 @@ public ResponseEntity> getDogProfile(@PathV DogProfileResponseDto dogProfile = dogService.getDogProfile(dogId); return ResponseEntity.ok(BasicResponse.ofSuccess(dogProfile)); } + + @PostMapping("/register") + public ResponseEntity> registerDogProfile(@Valid @RequestBody DogProfileReqDto dogProfileReqDto) { + return ResponseEntity.ok(BasicResponse.ofSuccess(dogService.registerDogProfile(dogProfileReqDto))); + } + + @PatchMapping("/profile/update/{dogId}") + public ResponseEntity> updateDogProfile( + @PathVariable Long dogId, + @RequestBody DogProfileReqDto dogProfileReqDto) { + DogProfileResponseDto updatedProfile = dogService.updateDogProfile(dogId, dogProfileReqDto); + return ResponseEntity.ok(BasicResponse.ofSuccess(updatedProfile)); + } + } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java b/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java index 95a413d..abdd6f2 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java @@ -1,9 +1,13 @@ package org.jullaene.walkmong_back.api.dog.service; +import java.util.List; import lombok.RequiredArgsConstructor; import org.jullaene.walkmong_back.api.dog.domain.Dog; +import org.jullaene.walkmong_back.api.dog.dto.req.DogProfileReqDto; import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; import org.jullaene.walkmong_back.api.dog.repository.DogRepository; +import org.jullaene.walkmong_back.api.member.domain.Member; +import org.jullaene.walkmong_back.api.member.service.MemberService; import org.jullaene.walkmong_back.common.exception.CustomException; import org.jullaene.walkmong_back.common.exception.ErrorType; import org.springframework.http.HttpStatus; @@ -13,6 +17,7 @@ @Service public class DogService { private final DogRepository dogRepository; + private final MemberService memberService; public DogProfileResponseDto getDogProfile(Long dogId) { Dog dog = dogRepository.findByDogIdAndDelYn(dogId, "N") @@ -20,4 +25,53 @@ public DogProfileResponseDto getDogProfile(Long dogId) { return dog.toDogProfileResponseDto(); } + + public Long registerDogProfile(DogProfileReqDto dogProfileReqDto) { + + //이미 등록된 강아지 프로필이라면 예외처리 + if (dogRepository.existsByNameAndDelYn(dogProfileReqDto.getName(),"N")){ + throw new CustomException(HttpStatus.FORBIDDEN,ErrorType.CANNOT_DUPLICATED_DOG_PROFILE); + } + + Dog dog=Dog.builder() + .name(dogProfileReqDto.getName()) + .memberId(memberService.getMemberFromUserDetail().getMemberId()) + .dogSize(dogProfileReqDto.getDogSize()) + .profile(dogProfileReqDto.getProfile()) + .gender(dogProfileReqDto.getGender()) + .birthYear(dogProfileReqDto.getBirthYear()) + .breed(dogProfileReqDto.getBreed()) + .weight(dogProfileReqDto.getWeight()) + .neuteringYn(dogProfileReqDto.getNeuteringYn()) + .bite(dogProfileReqDto.getBite()) + .friendly(dogProfileReqDto.getFriendly()) + .barking(dogProfileReqDto.getBarking()) + .rabiesYn(dogProfileReqDto.getRabiesYn()) + .adultYn(dogProfileReqDto.getAdultYn()) + .build(); + + return dogRepository.save(dog).getDogId(); + } + + public DogProfileResponseDto updateDogProfile(Long dogId, DogProfileReqDto dogProfileReqDto) { + + Member member = memberService.getMemberFromUserDetail(); + + List dogList = dogRepository.findByMemberIdAndDelYn(member.getMemberId(), "N"); + + Dog dog = dogRepository.findById(dogId) + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.DOG_NOT_FOUND)); + + boolean isDogOwnedByMember = dogList.stream() + .anyMatch(memberDog -> memberDog.getDogId().equals(dogId)); + + if (!isDogOwnedByMember) { + throw new CustomException(HttpStatus.FORBIDDEN, ErrorType.ACCESS_DENIED); + } + + dog.updateProfile(dogProfileReqDto); + Dog updatedDog = dogRepository.save(dog); + + return updatedDog.toDogProfileResponseDto(); + } } From 4ac467fedbda9a5a42a222b61c0e5c2ebb9a915d Mon Sep 17 00:00:00 2001 From: Seung Ik Lee Date: Sat, 21 Dec 2024 16:12:54 +0900 Subject: [PATCH 12/15] =?UTF-8?q?feat:=20#35=20=EB=B0=98=EB=A0=A4=EA=B2=AC?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/dog/rest/DogController.java | 7 ++++++- .../walkmong_back/api/dog/service/DogService.java | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java b/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java index 5903841..95c876e 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java @@ -1,6 +1,7 @@ package org.jullaene.walkmong_back.api.dog.rest; import jakarta.validation.Valid; +import java.util.List; import lombok.RequiredArgsConstructor; import org.jullaene.walkmong_back.api.dog.dto.req.DogProfileReqDto; import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; @@ -25,7 +26,6 @@ public ResponseEntity> getDogProfile(@PathV public ResponseEntity> registerDogProfile(@Valid @RequestBody DogProfileReqDto dogProfileReqDto) { return ResponseEntity.ok(BasicResponse.ofSuccess(dogService.registerDogProfile(dogProfileReqDto))); } - @PatchMapping("/profile/update/{dogId}") public ResponseEntity> updateDogProfile( @PathVariable Long dogId, @@ -34,4 +34,9 @@ public ResponseEntity> updateDogProfile( return ResponseEntity.ok(BasicResponse.ofSuccess(updatedProfile)); } + @GetMapping("/list") + public ResponseEntity>> getDogProfiles() { + List dogProfileList = dogService.getDogProfileList(); + return ResponseEntity.ok(BasicResponse.ofSuccess(dogProfileList)); + } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java b/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java index abdd6f2..6e05b3a 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java @@ -1,6 +1,7 @@ package org.jullaene.walkmong_back.api.dog.service; import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.jullaene.walkmong_back.api.dog.domain.Dog; import org.jullaene.walkmong_back.api.dog.dto.req.DogProfileReqDto; @@ -74,4 +75,12 @@ public DogProfileResponseDto updateDogProfile(Long dogId, DogProfileReqDto dogPr return updatedDog.toDogProfileResponseDto(); } + public List getDogProfileList() { + Member member = memberService.getMemberFromUserDetail(); + List dogs = dogRepository.findByMemberIdAndDelYn(member.getMemberId(), "N"); + + return dogs.stream() + .map(Dog::toDogProfileResponseDto) + .collect(Collectors.toList()); + } } From f8f713379a2a5eadcb297fc6acf01a3de30feb00 Mon Sep 17 00:00:00 2001 From: Seung Ik Lee Date: Sat, 21 Dec 2024 21:15:07 +0900 Subject: [PATCH 13/15] =?UTF-8?q?feat:=20#45=20=EB=B0=98=EB=A0=A4=EA=B2=AC?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=95=84=20=EB=93=B1=EB=A1=9D=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20API=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/dog/domain/Dog.java | 46 ++++++++++--------- .../api/dog/dto/req/DogProfileReqDto.java | 3 ++ .../dog/dto/res/DogProfileResponseDto.java | 4 ++ .../api/dog/rest/DogController.java | 1 + .../api/dog/service/DogService.java | 19 ++------ 5 files changed, 38 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java index bc522b9..854e341 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java @@ -109,31 +109,32 @@ public final DogProfileResponseDto toDogProfileResponseDto() { .friendly(this.friendly) .barking(this.barking) .rabiesYn(this.rabiesYn) + .adultYn(this.adultYn) + .walkRequest(this.walkRequest) + .walkNote(this.walkNote) + .additionalRequest(this.additionalRequest) .build(); } @Builder - public Dog(Long memberId,String name, - DogSize dogSize, String profile, - Gender gender, Integer birthYear, - String breed, Double weight, - String neuteringYn, String bite, - String friendly, String barking, - String rabiesYn, String adultYn){ - this.name=name; - this.memberId=memberId; - this.dogSize=dogSize; - this.profile=profile; - this.gender=gender; - this.birthYear=birthYear; - this.breed=breed; - this.weight=weight; - this.neuteringYn=neuteringYn; - this.bite = bite; - this.friendly=friendly; - this.barking = barking; - this.rabiesYn=rabiesYn; - this.adultYn=adultYn; + public Dog(Long memberId, DogProfileReqDto dogProfileReqDto){ + this.name = dogProfileReqDto.getName(); + this.memberId = memberId; + this.dogSize = dogProfileReqDto.getDogSize(); + this.profile = dogProfileReqDto.getProfile(); + this.gender = dogProfileReqDto.getGender(); + this.birthYear = dogProfileReqDto.getBirthYear(); + this.breed = dogProfileReqDto.getBreed(); + this.weight = dogProfileReqDto.getWeight(); + this.neuteringYn = dogProfileReqDto.getNeuteringYn(); + this.bite = dogProfileReqDto.getBite(); + this.friendly = dogProfileReqDto.getFriendly(); + this.barking = dogProfileReqDto.getBarking(); + this.rabiesYn = dogProfileReqDto.getRabiesYn(); + this.adultYn = dogProfileReqDto.getAdultYn(); + this.walkRequest = dogProfileReqDto.getWalkRequest(); + this.walkNote = dogProfileReqDto.getWalkNote(); + this.additionalRequest = dogProfileReqDto.getAdditionalRequest(); } public void updateProfile(DogProfileReqDto dogProfileDto) { @@ -150,5 +151,8 @@ public void updateProfile(DogProfileReqDto dogProfileDto) { this.barking = dogProfileDto.getBarking(); this.rabiesYn = dogProfileDto.getRabiesYn(); this.adultYn = dogProfileDto.getAdultYn(); + this.walkRequest = dogProfileDto.getWalkRequest(); + this.walkNote = dogProfileDto.getWalkNote(); + this.additionalRequest = dogProfileDto.getAdditionalRequest(); } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/dto/req/DogProfileReqDto.java b/src/main/java/org/jullaene/walkmong_back/api/dog/dto/req/DogProfileReqDto.java index 04aa8cf..107456b 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/dto/req/DogProfileReqDto.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/dto/req/DogProfileReqDto.java @@ -20,4 +20,7 @@ public class DogProfileReqDto { private String barking; private String rabiesYn; private String adultYn; + private String walkRequest; + private String walkNote; + private String additionalRequest; } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java b/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java index 2cbd774..1d8d042 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java @@ -19,4 +19,8 @@ public class DogProfileResponseDto { private String friendly; private String barking; private String rabiesYn; + private String adultYn; + private String walkRequest; + private String walkNote; + private String additionalRequest; } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java b/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java index 95c876e..99683e2 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/rest/DogController.java @@ -26,6 +26,7 @@ public ResponseEntity> getDogProfile(@PathV public ResponseEntity> registerDogProfile(@Valid @RequestBody DogProfileReqDto dogProfileReqDto) { return ResponseEntity.ok(BasicResponse.ofSuccess(dogService.registerDogProfile(dogProfileReqDto))); } + @PatchMapping("/profile/update/{dogId}") public ResponseEntity> updateDogProfile( @PathVariable Long dogId, diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java b/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java index 6e05b3a..49593ea 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/service/DogService.java @@ -29,26 +29,16 @@ public DogProfileResponseDto getDogProfile(Long dogId) { public Long registerDogProfile(DogProfileReqDto dogProfileReqDto) { + Member member = memberService.getMemberFromUserDetail(); + //이미 등록된 강아지 프로필이라면 예외처리 if (dogRepository.existsByNameAndDelYn(dogProfileReqDto.getName(),"N")){ throw new CustomException(HttpStatus.FORBIDDEN,ErrorType.CANNOT_DUPLICATED_DOG_PROFILE); } Dog dog=Dog.builder() - .name(dogProfileReqDto.getName()) - .memberId(memberService.getMemberFromUserDetail().getMemberId()) - .dogSize(dogProfileReqDto.getDogSize()) - .profile(dogProfileReqDto.getProfile()) - .gender(dogProfileReqDto.getGender()) - .birthYear(dogProfileReqDto.getBirthYear()) - .breed(dogProfileReqDto.getBreed()) - .weight(dogProfileReqDto.getWeight()) - .neuteringYn(dogProfileReqDto.getNeuteringYn()) - .bite(dogProfileReqDto.getBite()) - .friendly(dogProfileReqDto.getFriendly()) - .barking(dogProfileReqDto.getBarking()) - .rabiesYn(dogProfileReqDto.getRabiesYn()) - .adultYn(dogProfileReqDto.getAdultYn()) + .memberId(member.getMemberId()) + .dogProfileReqDto(dogProfileReqDto) .build(); return dogRepository.save(dog).getDogId(); @@ -75,6 +65,7 @@ public DogProfileResponseDto updateDogProfile(Long dogId, DogProfileReqDto dogPr return updatedDog.toDogProfileResponseDto(); } + public List getDogProfileList() { Member member = memberService.getMemberFromUserDetail(); List dogs = dogRepository.findByMemberIdAndDelYn(member.getMemberId(), "N"); From ba93f8f2cb881c605dfdb83f1193190a209f51d3 Mon Sep 17 00:00:00 2001 From: Seung Ik Lee Date: Tue, 24 Dec 2024 13:42:55 +0900 Subject: [PATCH 14/15] =?UTF-8?q?fix:=20#51=20=EB=B0=98=EB=A0=A4=EA=B2=AC?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20API=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jullaene/walkmong_back/api/dog/domain/Dog.java | 1 + .../walkmong_back/api/dog/dto/res/DogProfileResponseDto.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java index 854e341..bbd97c4 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java @@ -99,6 +99,7 @@ public final DogProfileResponseDto toDogProfileResponseDto() { return DogProfileResponseDto.builder() .dogId(this.dogId) .dogName(this.name) + .dogSize(this.dogSize) .dogProfile(this.profile) .dogGender(this.gender) .dogAge(dogAge) diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java b/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java index 1d8d042..28b940e 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/dto/res/DogProfileResponseDto.java @@ -2,6 +2,7 @@ import lombok.Builder; import lombok.Getter; +import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; import org.jullaene.walkmong_back.common.enums.Gender; @Getter @@ -9,6 +10,7 @@ public class DogProfileResponseDto { private Long dogId; private String dogName; + private DogSize dogSize; private String dogProfile; private Gender dogGender; private Integer dogAge; From 933707b6b817d4ae316fc8fd66f291ce52c312ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=20=EC=9D=80=EC=A0=95?= Date: Sat, 28 Dec 2024 03:02:28 +0900 Subject: [PATCH 15/15] =?UTF-8?q?fix:=20=EC=98=A4=EB=A5=98=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jullaene/walkmong_back/common/exception/ErrorType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java index f3e75c2..d9d6fb0 100644 --- a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java +++ b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java @@ -19,6 +19,7 @@ public enum ErrorType { INTERNAL_SERVER("서버 오류입니다."), UNAUTHORIZED_UPDATE("수정 권한이 없는 유저입니다."), DOG_NOT_FOUND("존재하지 않는 강아지입니다."), + CANNOT_DUPLICATED_DOG_PROFILE("이미 등록된 강아지입니다") ; private String message;