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
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,21 @@
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
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.apply.domain.enums.MatchingStatus;
import org.jullaene.walkmong_back.api.apply.dto.req.ApplyRequestDto;
import org.jullaene.walkmong_back.common.BaseEntity;

@Table(name = "apply")
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder
@DynamicUpdate
public class Apply extends BaseEntity {
@Id
@Getter
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "apply_id")
private Long applyId;
Expand Down Expand Up @@ -55,7 +56,7 @@ public class Apply extends BaseEntity {

@Comment("입마개 필요 여부")
@Column(columnDefinition = "VARCHAR(1) default 'Y'")
private String nuzzleYn;
private String muzzleYn;

@Comment("리드줄 필요 여부")
@Column(columnDefinition = "VARCHAR(1) default 'Y'")
Expand All @@ -67,4 +68,23 @@ public class Apply extends BaseEntity {

@Comment("반려인에게 전달할 메시지")
private String memoToOwner;

@Builder
public Apply (Long memberId, Long boardId, ApplyRequestDto applyRequestDto) {
this.memberId = memberId;
this.boardId = boardId;
matchingStatus = MatchingStatus.PENDING;
dongAddress = applyRequestDto.getDongAddress();
roadAddress = applyRequestDto.getRoadAddress();
latitude = applyRequestDto.getLatitude();
longitude = applyRequestDto.getLongitude();
addressDetail = applyRequestDto.getAddressDetail();
addressMemo = applyRequestDto.getAddressMemo();
poopBagYn = applyRequestDto.getPoopBagYn();
muzzleYn = applyRequestDto.getMuzzleYn();
dogCollarYn = applyRequestDto.getDogCollarYn();
preMeetingYn = applyRequestDto.getPreMeetingYn();
memoToOwner = applyRequestDto.getMessageToOwner();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
public enum MatchingStatus {
PENDING, // 매칭 대기 중
CONFIRMED, // 매칭 확정
REJECTED // 매칭 거절
REJECTED // 매칭 거절
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.jullaene.walkmong_back.api.apply.dto.req;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class ApplyRequestDto {
private String dongAddress;
private String roadAddress;
private Double latitude;
private Double longitude;
private String addressDetail;
private String addressMemo;
private String poopBagYn;
private String muzzleYn;
private String dogCollarYn;
private String preMeetingYn;
private String messageToOwner;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.jullaene.walkmong_back.api.apply.dto.res;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize;
import org.jullaene.walkmong_back.common.enums.Gender;

import java.time.LocalDateTime;

@Getter
@RequiredArgsConstructor
@AllArgsConstructor
public class ApplyInfoDto {
private String dogName;
private Gender dogGender;
private String breed;
private DogSize dogSize;
private String ownerName;
private String memberProfile;
private Gender memberGender;
private String dongAddress;
private String addressDetail;
private String muzzleYn;
private String poopBagYn;
private String preMeetingYn;
private String memoToOwner;
private LocalDateTime startTime;
private LocalDateTime endTime;
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package org.jullaene.walkmong_back.api.apply.repository;

import org.jullaene.walkmong_back.api.apply.domain.Apply;
import org.jullaene.walkmong_back.api.apply.domain.enums.MatchingStatus;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ApplyRepository extends JpaRepository<Apply, Long> {
public interface ApplyRepository extends JpaRepository<Apply, Long> ,ApplyRepositoryCustom{
boolean existsByBoardIdAndMemberIdAndDelYn(Long boardId, Long memberId, String delYn);
boolean existsByBoardIdAndMemberIdAndMatchingStatusAndDelYn(Long boardId, Long memberId, MatchingStatus matchingStatus, String delYn);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.jullaene.walkmong_back.api.apply.repository;
import org.jullaene.walkmong_back.api.apply.dto.res.ApplyInfoDto;
import java.util.Optional;

public interface ApplyRepositoryCustom {
Optional<ApplyInfoDto> getApplyInfoResponse(Long boardId, Long memberId, String delYn);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package org.jullaene.walkmong_back.api.apply.repository.impl;

import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jullaene.walkmong_back.api.apply.domain.QApply;
import org.jullaene.walkmong_back.api.apply.dto.res.ApplyInfoDto;
import org.jullaene.walkmong_back.api.apply.repository.ApplyRepository;
import org.jullaene.walkmong_back.api.apply.repository.ApplyRepositoryCustom;
import org.jullaene.walkmong_back.api.board.domain.QBoard;
import org.jullaene.walkmong_back.api.dog.domain.QDog;
import org.jullaene.walkmong_back.api.member.domain.QMember;

import java.util.Optional;

@RequiredArgsConstructor
@Slf4j
public class ApplyRepositoryImpl implements ApplyRepositoryCustom {
private final JPAQueryFactory queryFactory;

//산책 지원 최종 내역 확인하기
@Override
public Optional<ApplyInfoDto> getApplyInfoResponse(Long boardId, Long memberId, String delYn) {
QDog dog= QDog.dog;
QMember member=QMember.member;
QBoard board=QBoard.board;
QApply apply= QApply.apply;

Optional<ApplyInfoDto> applyInfoDto=
Optional.ofNullable(queryFactory.selectDistinct(
Projections.constructor(ApplyInfoDto.class,
dog.name.as("dogName"),
dog.gender.as("dogGender"),
dog.breed.as("breed"),
dog.dogSize.as("dogSize"),
member.name.as("ownerName"),
member.profile.as("memberProfile"),
member.gender.as("memberGender"),
apply.dongAddress.as("dongAddress"),
apply.addressDetail.as("addressDetail"),
apply.muzzleYn.as("muzzleYn"),
apply.poopBagYn.as("poopBagYn"),
apply.preMeetingYn.as("preMeetingYn"),
apply.memoToOwner.as("memoToOwner"),
board.startTime.as("startTime"),
board.endTime.as("endTime")
))
.from(board)
.leftJoin(dog).on(dog.dogId.eq(board.dogId))
.leftJoin(member).on(dog.memberId.eq(member.memberId))
.leftJoin(apply).on(apply.boardId.eq(boardId))
.where(board.boardId.eq(boardId)
.and(board.delYn.eq(delYn)))
.fetchOne());

return applyInfoDto;
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,31 @@
package org.jullaene.walkmong_back.api.apply.rest;

import lombok.RequiredArgsConstructor;
import org.jullaene.walkmong_back.api.apply.dto.req.ApplyRequestDto;
import org.jullaene.walkmong_back.api.apply.dto.res.ApplyInfoDto;
import org.jullaene.walkmong_back.api.apply.service.ApplyService;
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/apply")
@RequestMapping("/api/v1/walking/apply")
public class ApplyController {
private final ApplyService applyService;

@PostMapping("/{boardId}")
public ResponseEntity<BasicResponse<Long>> saveApply(
@PathVariable("boardId") Long boardId,
@RequestBody ApplyRequestDto applyRequestDto){
return ResponseEntity.ok(BasicResponse.ofCreateSuccess(applyService.saveApply(boardId, applyRequestDto)));
}

@GetMapping("/{boardId}")
public ResponseEntity<BasicResponse<ApplyInfoDto>> getApplyInfo(
@PathVariable("boardId") Long boardId
){
ApplyInfoDto applyInfoDto=applyService.getApplyInfo(boardId);
return ResponseEntity.ok(BasicResponse.ofSuccess(applyInfoDto));
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,65 @@
package org.jullaene.walkmong_back.api.apply.service;

import lombok.RequiredArgsConstructor;
import org.jullaene.walkmong_back.api.apply.domain.Apply;
import org.jullaene.walkmong_back.api.apply.domain.enums.MatchingStatus;
import org.jullaene.walkmong_back.api.apply.dto.req.ApplyRequestDto;
import org.jullaene.walkmong_back.api.apply.dto.res.ApplyInfoDto;
import org.jullaene.walkmong_back.api.apply.repository.ApplyRepository;
import org.jullaene.walkmong_back.api.board.domain.Board;
import org.jullaene.walkmong_back.api.board.repository.BoardRepository;
import org.jullaene.walkmong_back.api.dog.domain.Dog;
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;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class ApplyService {
private final ApplyRepository applyRepository;
private final BoardRepository boardRepository;
private final DogRepository dogRepository;
private final MemberService memberService;

@Transactional
public Long saveApply(Long boardId, ApplyRequestDto applyRequestDto) {
Member member = memberService.getMemberFromUserDetail();

// 본인이 쓴 게시글에는 지원 불가
if (boardRepository.existsByBoardIdAndMemberIdAndDelYn(boardId, member.getMemberId(), "N")) {
throw new CustomException(HttpStatus.FORBIDDEN, ErrorType.CANNOT_SELF_APPLY);
}

// 한 게시글에 여러 번 지원 불가
if (applyRepository.existsByBoardIdAndMemberIdAndDelYn(boardId, member.getMemberId(), "N")) {
throw new CustomException(HttpStatus.FORBIDDEN, ErrorType.CANNOT_DUPLICATED_APPLY);
}

Apply apply = Apply.builder()
.memberId(member.getMemberId())
.boardId(boardId)
.applyRequestDto(applyRequestDto)
.build();

return applyRepository.save(apply).getApplyId();
}

@Transactional(readOnly = true)
public void isValidWalkerByBoardIdAndMatchingStatus(Long memberId, Long boardId, MatchingStatus matchingStatus) {
if (!applyRepository.existsByBoardIdAndMemberIdAndMatchingStatusAndDelYn(boardId, memberId, matchingStatus, "N")) {
throw new CustomException(HttpStatus.UNAUTHORIZED, ErrorType.ACCESS_DENIED);
}
}

@Transactional
public ApplyInfoDto getApplyInfo(Long boardId) {
Member member = memberService.getMemberFromUserDetail();
return applyRepository.getApplyInfoResponse(boardId,member.getMemberId(),"N")
.orElseThrow(()->new CustomException(HttpStatus.BAD_REQUEST,ErrorType.INVALID_ADDRESS));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@
import org.springframework.stereotype.Repository;

@Repository
public interface BoardRepository extends JpaRepository<Board, Long> {
public interface BoardRepository extends JpaRepository<Board, Long>, BoardRepositoryCustom {
boolean existsByOwnerIdAndBoardIdAndDelYn(Long ownerId, Long boardId, String delYn);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.jullaene.walkmong_back.api.board.repository;

import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto;
import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize;
import org.jullaene.walkmong_back.api.member.domain.Address;
import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange;

import java.time.LocalDate;
import java.util.List;

public interface BoardRepositoryCustom {
List<BoardResponseDto> getBoardsWithFilters(LocalDate date, Address walkerAddress, DistanceRange distance, DogSize dogSize, String matchingYn);
boolean existsByBoardIdAndMemberIdAndDelYn(Long boardId, Long memberId, String delYn);
}
Loading