Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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') {
Expand Down
82 changes: 82 additions & 0 deletions src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,32 @@

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;
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;
Expand All @@ -28,6 +39,7 @@ public class Dog extends BaseEntity {
private String name;

@Comment("성별")
@Enumerated(EnumType.STRING)
private Gender gender;

@Comment("출생년도")
Expand All @@ -40,6 +52,7 @@ public class Dog extends BaseEntity {
private String breed;

@Comment("사이즈")
@Enumerated(EnumType.STRING)
private DogSize dogSize;

@Comment("프로필 url")
Expand Down Expand Up @@ -74,4 +87,73 @@ public class Dog extends BaseEntity {
@Comment("추가 안내 사항")
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; // 나이 계산

return DogProfileResponseDto.builder()
.dogId(this.dogId)
.dogName(this.name)
.dogSize(this.dogSize)
.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)
.adultYn(this.adultYn)
.walkRequest(this.walkRequest)
.walkNote(this.walkNote)
.additionalRequest(this.additionalRequest)
.build();
}

@Builder
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) {
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();
this.walkRequest = dogProfileDto.getWalkRequest();
this.walkNote = dogProfileDto.getWalkNote();
this.additionalRequest = dogProfileDto.getAdditionalRequest();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
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;
private String walkRequest;
private String walkNote;
private String additionalRequest;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.jullaene.walkmong_back.api.dog.dto.res;

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
@Builder
public class DogProfileResponseDto {
private Long dogId;
private String dogName;
private DogSize dogSize;
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;
private String adultYn;
private String walkRequest;
private String walkNote;
private String additionalRequest;
}
Original file line number Diff line number Diff line change
@@ -1,9 +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;

@Repository
public interface DogRepository extends JpaRepository<Dog, Long> {
Optional<Dog> findByDogIdAndDelYn(Long id, String delYn);

Boolean existsByNameAndDelYn(String name, String delYn);

List<Dog> findByMemberIdAndDelYn(Long memberId, String delYn);
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,43 @@
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;
import org.jullaene.walkmong_back.api.dog.service.DogService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.jullaene.walkmong_back.common.BasicResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/dog")
public class DogController {
private final DogService dogService;

@GetMapping("/profile/{dogId}")
public ResponseEntity<BasicResponse<DogProfileResponseDto>> getDogProfile(@PathVariable Long dogId) {
DogProfileResponseDto dogProfile = dogService.getDogProfile(dogId);
return ResponseEntity.ok(BasicResponse.ofSuccess(dogProfile));
}

@PostMapping("/register")
public ResponseEntity<BasicResponse<Long>> registerDogProfile(@Valid @RequestBody DogProfileReqDto dogProfileReqDto) {
return ResponseEntity.ok(BasicResponse.ofSuccess(dogService.registerDogProfile(dogProfileReqDto)));
}

@PatchMapping("/profile/update/{dogId}")
public ResponseEntity<BasicResponse<DogProfileResponseDto>> updateDogProfile(
@PathVariable Long dogId,
@RequestBody DogProfileReqDto dogProfileReqDto) {
DogProfileResponseDto updatedProfile = dogService.updateDogProfile(dogId, dogProfileReqDto);
return ResponseEntity.ok(BasicResponse.ofSuccess(updatedProfile));
}

@GetMapping("/list")
public ResponseEntity<BasicResponse<List<DogProfileResponseDto>>> getDogProfiles() {
List<DogProfileResponseDto> dogProfileList = dogService.getDogProfileList();
return ResponseEntity.ok(BasicResponse.ofSuccess(dogProfileList));
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,77 @@
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;
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;
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) {

Member member = memberService.getMemberFromUserDetail();

//이미 등록된 강아지 프로필이라면 예외처리
if (dogRepository.existsByNameAndDelYn(dogProfileReqDto.getName(),"N")){
throw new CustomException(HttpStatus.FORBIDDEN,ErrorType.CANNOT_DUPLICATED_DOG_PROFILE);
}

Dog dog=Dog.builder()
.memberId(member.getMemberId())
.dogProfileReqDto(dogProfileReqDto)
.build();

return dogRepository.save(dog).getDogId();
}

public DogProfileResponseDto updateDogProfile(Long dogId, DogProfileReqDto dogProfileReqDto) {

Member member = memberService.getMemberFromUserDetail();

List<Dog> 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();
}

public List<DogProfileResponseDto> getDogProfileList() {
Member member = memberService.getMemberFromUserDetail();
List<Dog> dogs = dogRepository.findByMemberIdAndDelYn(member.getMemberId(), "N");

return dogs.stream()
.map(Dog::toDogProfileResponseDto)
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -80,4 +81,11 @@ public Member (Long memberId, String email, String password, String nickname,
this.dogWalkingExperienceYn = dogWalkingExperienceYn;
this.availabilityWithSize = availabilityWithSize;
}

public void addWalkingExperience(WalkExperienceReq walkExperienceReq) {
this.dogOwnership=walkExperienceReq.getDogOwnershipYn();
this.dogWalkingExperienceYn=walkExperienceReq.getDogWalkingExperienceYn();
this.availabilityWithSize=walkExperienceReq.getAvailabilityWithSize();
this.introduce=walkExperienceReq.getIntroduction();
}
}
Original file line number Diff line number Diff line change
@@ -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;
private String introduction;
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ public interface MemberRepository extends JpaRepository<Member, Long> {
Optional<Member> findByEmail(String email);

Boolean existsByEmail(String email);

Boolean existsByNickname(String nickname);
}
Loading