Skip to content

Commit

Permalink
[Feature] 카마스터의 상담신청 목록 조회 기능 구현 (#422)
Browse files Browse the repository at this point in the history
* feat: 상담신청 내역 조회 관련 dto 구현

* feat: 상담신청 내역 조회 관련 jpa 메소드 구현

* feat: 상담신청 내역 조회 관련 port, adaptor 구현

* feat: 메일, 전화번호에 해당하는 카마스터가 존재하지 않는 경우 예외처리를 위한 클래스 추가

* feat: 카마스터 메일, 전화번호로 상담신청 내역 조회 기능 구현

* feat: consultController에 상담신청 내역 조회 API 추가

* test: 상담신청 내역 조회 TC 추가

* chore: 린트 관련 수정

* chore: url에 beta 추가
  • Loading branch information
SeoSiun committed Aug 27, 2023
1 parent 2fc94fe commit 3b5392f
Show file tree
Hide file tree
Showing 14 changed files with 917 additions and 130 deletions.
468 changes: 468 additions & 0 deletions BE-MyCarMaster/logs/my.log

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,19 @@

import javax.validation.Valid;

import org.springdoc.api.annotations.ParameterObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import softeer.be_my_car_master.application.consult.dto.request.ApplyConsultingRequest;
import softeer.be_my_car_master.application.consult.dto.request.GetConsultingsRequest;
import softeer.be_my_car_master.application.consult.dto.response.GetConsultingsResponse;
import softeer.be_my_car_master.application.consult.usecase.apply_consulting.ApplyConsultingUseCase;
import softeer.be_my_car_master.application.consult.usecase.get_consultings.GetConsultingsUseCase;
import softeer.be_my_car_master.global.response.Response;

@RestController
Expand All @@ -20,6 +25,7 @@
public class ConsultController {

private final ApplyConsultingUseCase applyConsultingUseCase;
private final GetConsultingsUseCase getConsultingsUseCase;

@PostMapping("/consultings")
public Response applyConsulting(@RequestBody @Valid ApplyConsultingRequest request) {
Expand All @@ -33,4 +39,12 @@ public Response applyConsulting(@RequestBody @Valid ApplyConsultingRequest reque

return Response.createSuccessResponse();
}

@GetMapping("/consultings")
public Response getConsultings(@ParameterObject @Valid GetConsultingsRequest request) {
String carMasterEmail = request.getEmail();
String carMasterPhone = request.getPhone();
GetConsultingsResponse response = getConsultingsUseCase.execute(carMasterEmail, carMasterPhone);
return Response.createSuccessResponse(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package softeer.be_my_car_master.application.consult.dto.request;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class GetConsultingsRequest {

@Schema(description = "카마스터 이메일", example = "[email protected]")
@Size(min = 5, max = 255, message = "이메일은 최대 길이는 255입니다.")
@Pattern(regexp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$", message = "잘못된 이메일 형식입니다.")
@NotEmpty(message = "email은 빈 값일 수 없습니다.")
private String email;

@Schema(description = "카마스터 전화번호", example = "010-0000-0000")
@Pattern(regexp = "^01(?:0|1|[6-9])-(?:\\d{3}|\\d{4})-\\d{4}$", message = "잘못된 번호 형식입니다.")
@NotEmpty(message = "phone은 빈 값일 수 없습니다.")
private String phone;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package softeer.be_my_car_master.application.consult.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import softeer.be_my_car_master.domain.consulting.Consulting;

@Getter
@Setter
@Builder
@AllArgsConstructor
public class ClientResponseDto {

@Schema(description = "고객 성함", example = "Hyundai")
private String name;

@Schema(description = "고객 이메일", example = "[email protected]")
private String email;

@Schema(description = "고객 번호", example = "010-0000-0000")
private String phone;

public static ClientResponseDto from(Consulting consulting) {
return ClientResponseDto.builder()
.name(consulting.getClientName())
.email(consulting.getClientEmail())
.phone(consulting.getClientPhone())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package softeer.be_my_car_master.application.consult.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import softeer.be_my_car_master.domain.consulting.Consulting;

@Getter
@Setter
@Builder
@AllArgsConstructor
public class ConsultingDto {

@Schema(description = "견적서 url", example = "https://my-car-master.shop/estimates/uuid")
private String estimateUrl;

private ClientResponseDto client;

public static ConsultingDto from(Consulting consulting) {
final String urlPrefix = "https://beta.my-car-master.shop/estimates/";
return ConsultingDto.builder()
.estimateUrl(urlPrefix + consulting.getUuid())
.client(ClientResponseDto.from(consulting))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package softeer.be_my_car_master.application.consult.dto.response;

import java.util.List;
import java.util.stream.Collectors;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import softeer.be_my_car_master.domain.consulting.Consulting;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class GetConsultingsResponse {

private List<ConsultingDto> consultings;

public static GetConsultingsResponse from(List<Consulting> consultings) {
List<ConsultingDto> consultingDtos = consultings.stream()
.map(ConsultingDto::from)
.collect(Collectors.toList());
return new GetConsultingsResponse(consultingDtos);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package softeer.be_my_car_master.application.consult.exception;

import softeer.be_my_car_master.global.exception.MyCarMasterException;
import softeer.be_my_car_master.global.response.ResponseStatus;

public class CarMasterNotFoundException extends MyCarMasterException {

public static final MyCarMasterException EXCEPTION = new CarMasterNotFoundException();

private CarMasterNotFoundException() {
super(ResponseStatus.CAR_MASTER_NOT_FOUND);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package softeer.be_my_car_master.application.consult.usecase.get_consultings;

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

import lombok.RequiredArgsConstructor;
import softeer.be_my_car_master.domain.consulting.Consulting;
import softeer.be_my_car_master.global.annotation.Adaptor;
import softeer.be_my_car_master.infrastructure.jpa.car_master.repository.CarMasterJpaRepository;
import softeer.be_my_car_master.infrastructure.jpa.car_master.repository.ConsultingJpaRepository;

@Adaptor
@RequiredArgsConstructor
public class GetConsultingsAdaptor implements GetConsultingsPort {


private final CarMasterJpaRepository carMasterJpaRepository;
private final ConsultingJpaRepository consultingJpaRepository;

@Override
public Optional<Long> findCarMasterIdByForm(String email, String phone) {
return carMasterJpaRepository.findIdByForm(email, phone);
}

@Override
public List<Consulting> findConsultingsByCarMaster(Long carMasterId) {
return consultingJpaRepository.findAllByCarMaster(carMasterId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package softeer.be_my_car_master.application.consult.usecase.get_consultings;

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

import softeer.be_my_car_master.domain.consulting.Consulting;
import softeer.be_my_car_master.global.annotation.Port;

@Port
public interface GetConsultingsPort {

Optional<Long> findCarMasterIdByForm(String email, String phone);

List<Consulting> findConsultingsByCarMaster(Long carMasterId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package softeer.be_my_car_master.application.consult.usecase.get_consultings;

import java.util.List;

import lombok.RequiredArgsConstructor;
import softeer.be_my_car_master.application.consult.dto.response.GetConsultingsResponse;
import softeer.be_my_car_master.application.consult.exception.CarMasterNotFoundException;
import softeer.be_my_car_master.domain.consulting.Consulting;
import softeer.be_my_car_master.global.annotation.UseCase;

@UseCase
@RequiredArgsConstructor
public class GetConsultingsUseCase {

private final GetConsultingsPort port;

public GetConsultingsResponse execute(String email, String phone) {
Long carMasterId = port.findCarMasterIdByForm(email, phone)
.orElseThrow(() -> CarMasterNotFoundException.EXCEPTION);
List<Consulting> consultings = port.findConsultingsByCarMaster(carMasterId);
return GetConsultingsResponse.from(consultings);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public enum ResponseStatus {
INVALID_ESTIMATE(4200, "잘못된 견적서입니다. 견적서 내용을 다시 확인해주세요."),
INVALID_ESTIMATE_ID(4201, "해당 ID와 일치하는 견적서가 존재하지 않습니다."),

CAR_MASTER_NOT_FOUND(4300, "존재하지 않는 카마스터입니다."),

INTERNAL_SERVER_ERROR(5000, "서버 내부에서 문제가 발생했습니다.");

private final int code;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package softeer.be_my_car_master.infrastructure.jpa.car_master.repository;

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

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
Expand All @@ -22,4 +23,10 @@ public interface CarMasterJpaRepository extends JpaRepository<CarMasterEntity, L
+ "WHERE a.id IN :agencyIds "
+ "ORDER BY cm.sales DESC, cm.name ASC")
List<CarMaster> findAllByAgencyIdsOrderBySales(List<Long> agencyIds);

@Query(value = "SELECT cm.id "
+ "FROM CarMasterEntity cm "
+ "WHERE cm.email= :email "
+ "AND cm.phone = :phone")
Optional<Long> findIdByForm(String email, String phone);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import softeer.be_my_car_master.domain.consulting.Consulting;
import softeer.be_my_car_master.infrastructure.jpa.car_master.entity.ConsultingEntity;

public interface ConsultingJpaRepository extends JpaRepository<ConsultingEntity, Long> {
Expand All @@ -14,4 +15,10 @@ public interface ConsultingJpaRepository extends JpaRepository<ConsultingEntity,
+ "JOIN FETCH c.estimate "
+ "WHERE c.isSent = :isSent")
List<ConsultingEntity> findAllByIsSent(boolean isSent);

@Query(value = "SELECT c "
+ "FROM ConsultingEntity c "
+ "JOIN FETCH c.estimate "
+ "WHERE c.carMaster.id = :carMasterId")
List<Consulting> findAllByCarMaster(Long carMasterId);
}
Loading

0 comments on commit 3b5392f

Please sign in to comment.