Skip to content

Commit

Permalink
feat: #107 합주실 매물 생성 api 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
tinon1004 committed Apr 26, 2024
1 parent b20980d commit fb16ee5
Show file tree
Hide file tree
Showing 22 changed files with 940 additions and 153 deletions.
20 changes: 20 additions & 0 deletions src/main/java/com/ajou/hertz/common/dto/CoordinateDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.ajou.hertz.common.dto;

import com.ajou.hertz.common.entity.Coordinate;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
public class CoordinateDto {

private String lat;
private String lng;

public static CoordinateDto from(Coordinate coordinate) {
return new CoordinateDto(coordinate.getLat(), coordinate.getLng());
}
}
29 changes: 29 additions & 0 deletions src/main/java/com/ajou/hertz/common/dto/FullAddressDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.ajou.hertz.common.dto;

import com.ajou.hertz.common.entity.FullAddress;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
public class FullAddressDto {

private String sido;
private String sgg;
private String lotNumberAddress;
private String roadAddress;
private String detailAddress;

public static FullAddressDto from(FullAddress fullAddress) {
return new FullAddressDto(
fullAddress.getSido(),
fullAddress.getSgg(),
fullAddress.getLotNumberAddress(),
fullAddress.getRoadAddress(),
fullAddress.getDetailAddress()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.ajou.hertz.common.dto.request;

import com.ajou.hertz.common.entity.Coordinate;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.*;

@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Setter
@Getter
public class CoordinateRequest {

@Schema(description = "위도", example = "37.123456")
@NotBlank
private String lat;

@Schema(description = "경도", example = "127.123456")
@NotBlank
private String lng;


public Coordinate toEntity() {
return new Coordinate(lat, lng);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.ajou.hertz.common.dto.request;

import com.ajou.hertz.common.entity.FullAddress;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.*;

@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Setter
@Getter
public class FullAddressRequest {

@Schema(description = "전체 주소", example = "서울특별시 강남구 역삼동 123-45")
@NotBlank
private String fullAddress;

@Schema(description = "상세주소", example = "아주 빌딩 2층")
@NotBlank
private String detailAddress;

public FullAddress toEntity() {
return FullAddress.of(fullAddress, detailAddress);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.ajou.hertz.common.dto.response;

import com.ajou.hertz.common.dto.CoordinateDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
public class CoordinateResponse {

@Schema(description = "위도", example = "37.123456")
private String lat;

@Schema(description = "경도", example = "127.123456")
private String lng;

public static CoordinateResponse from(CoordinateDto coordinateDto) {
return new CoordinateResponse(coordinateDto.getLat(), coordinateDto.getLng());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.ajou.hertz.common.dto.response;

import com.ajou.hertz.common.dto.FullAddressDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
public class FullAddressResponse {


@Schema(description = "시/도", example = "서울특별시")
private String sido;

@Schema(description = "시/군/구", example = "강남구")
private String sgg;

@Schema(description = "지번주소", example = "수원시 팔달구 권선로11")
private String lotNumberAddress;

@Schema(description = "도로명 주소", example = "서울특별시 강남구 역삼동 123-45번지")
private String roadAddress;

@Schema(description = "상세주소", example = "아주 빌딩 2층")
private String detailAddress;

public static FullAddressResponse from(FullAddressDto fullAddressDto) {
return new FullAddressResponse(
fullAddressDto.getSido(),
fullAddressDto.getSgg(),
fullAddressDto.getLotNumberAddress(),
fullAddressDto.getRoadAddress(),
fullAddressDto.getDetailAddress()
);
}
}
11 changes: 5 additions & 6 deletions src/main/java/com/ajou/hertz/common/entity/Coordinate.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,14 @@
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Embeddable
public class Coordinate {

@Column(nullable = false)
private String lat;

@Column(nullable = false)
private String lng;
@Column(nullable = false)
private String lat;

@Column(nullable = false)
private String lng;
}
74 changes: 36 additions & 38 deletions src/main/java/com/ajou/hertz/common/entity/FullAddress.java
Original file line number Diff line number Diff line change
@@ -1,68 +1,66 @@
package com.ajou.hertz.common.entity;

import java.util.Arrays;

import com.ajou.hertz.common.exception.InvalidAddressFormatException;

import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.Arrays;

@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Embeddable
public class FullAddress {

@Column(nullable = false)
private String sido;

@Column(nullable = false)
private String sgg;
@Column(nullable = false)
private String sido;

private String lotNumberAddress;
@Column(nullable = false)
private String sgg;

private String roadAddress;
private String lotNumberAddress;

@Column(nullable = false)
private String detailAddress;
private String roadAddress;

public static FullAddress of(String fullAddress, String detailAddress) {
@Column(nullable = false)
private String detailAddress;

String[] parsedAddress = fullAddress.split(" ");
public static FullAddress of(String fullAddress, String detailAddress) {

if (parsedAddress.length < 2) {
throw new InvalidAddressFormatException(fullAddress);
String[] parsedAddress = fullAddress.split(" ");

}
if (parsedAddress.length < 2) {
throw new InvalidAddressFormatException(fullAddress);

String sido = parsedAddress[0];
StringBuilder sggBuilder = new StringBuilder();
String lotNumberAddress = null;
String roadAddress = null;
}

int num;
for (num = 1; num < parsedAddress.length; num++) {
if (parsedAddress[num].matches(".*[동면읍소로길]$")) {
break;
}
sggBuilder.append(parsedAddress[num]).append(" ");
}
String sido = parsedAddress[0];
StringBuilder sggBuilder = new StringBuilder();
String lotNumberAddress = null;
String roadAddress = null;

String sgg = sggBuilder.toString().trim();
int num;
for (num = 1; num < parsedAddress.length; num++) {
if (parsedAddress[num].matches(".*[동면읍소로길]$")) {
break;
}
sggBuilder.append(parsedAddress[num]).append(" ");
}

if (parsedAddress.length > num) {
if (fullAddress.matches(".+[로길].+")) {
roadAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, num, parsedAddress.length));
} else {
lotNumberAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, num, parsedAddress.length));
}
}
String sgg = sggBuilder.toString().trim();

return new FullAddress(sido, sgg, lotNumberAddress, roadAddress, detailAddress);
}
if (parsedAddress.length > num) {
if (fullAddress.matches(".+[로길].+")) {
roadAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, num, parsedAddress.length));
} else {
lotNumberAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, num, parsedAddress.length));
}
}

return new FullAddress(sido, sgg, lotNumberAddress, roadAddress, detailAddress);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,52 +13,58 @@
* <li>2200 ~ 2399: 유저 관련 예외</li>
* <li>2400 ~ 2599: 주소 관련 예외</li>
* <li>2600 ~ 2799: 악기 관련 예외</li>
* <li>2800 ~ 2999: 악기 관련 예외</li>
* </ul>
*/
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
public enum CustomExceptionType {

MULTIPART_FILE_NOT_READABLE(1000, "파일을 읽을 수 없습니다. 올바른 파일인지 다시 확인 후 요청해주세요."),
IO_PROCESSING(1001, "입출력 처리 중 오류가 발생했습니다."),
SEND_MESSAGE(1002, "문자 발송 과정에서 알 수 없는 에러가 발생했습니다."),
MULTIPART_FILE_NOT_READABLE(1000, "파일을 읽을 수 없습니다. 올바른 파일인지 다시 확인 후 요청해주세요."),
IO_PROCESSING(1001, "입출력 처리 중 오류가 발생했습니다."),
SEND_MESSAGE(1002, "문자 발송 과정에서 알 수 없는 에러가 발생했습니다."),

/**
* 로그인, 인증 관련 예외
*/
ACCESS_DENIED(2000, "접근이 거부되었습니다."),
UNAUTHORIZED(2001, "유효하지 않은 인증 정보로 인해 인증 과정에서 문제가 발생하였습니다."),
TOKEN_VALIDATE(2002, "유효하지 않은 token입니다. Token 값이 잘못되었거나 만료되어 유효하지 않은 경우로 token 갱신이 필요합니다."),
PASSWORD_MISMATCH(2003, "비밀번호가 일치하지 않습니다."),
USER_AUTH_CODE_NOT_FOUND(2004, "본인 인증 코드 발행 이력을 찾을 수 없습니다. 인증 코드가 만료되었거나 잘못된 코드가 전송되었을 수 있습니다. 다시 시도해주세요."),
INVALID_AUTH_CODE(2005, "유효하지 않은 인증 코드 또는 전화번호입니다. 인증 코드가 만료되었거나 잘못된 정보가 전송되었을 수 있습니다. 다시 시도해주세요."),
/**
* 로그인, 인증 관련 예외
*/
ACCESS_DENIED(2000, "접근이 거부되었습니다."),
UNAUTHORIZED(2001, "유효하지 않은 인증 정보로 인해 인증 과정에서 문제가 발생하였습니다."),
TOKEN_VALIDATE(2002, "유효하지 않은 token입니다. Token 값이 잘못되었거나 만료되어 유효하지 않은 경우로 token 갱신이 필요합니다."),
PASSWORD_MISMATCH(2003, "비밀번호가 일치하지 않습니다."),
USER_AUTH_CODE_NOT_FOUND(2004, "본인 인증 코드 발행 이력을 찾을 수 없습니다. 인증 코드가 만료되었거나 잘못된 코드가 전송되었을 수 있습니다. 다시 시도해주세요."),
INVALID_AUTH_CODE(2005, "유효하지 않은 인증 코드 또는 전화번호입니다. 인증 코드가 만료되었거나 잘못된 정보가 전송되었을 수 있습니다. 다시 시도해주세요."),

/**
* 유저 관련 예외
*/
USER_EMAIL_DUPLICATION(2200, "이미 사용 중인 이메일입니다."),
USER_NOT_FOUND_BY_ID(2201, "일치하는 회원을 찾을 수 없습니다."),
USER_NOT_FOUND_BY_EMAIL(2202, "일치하는 회원을 찾을 수 없습니다."),
USER_PHONE_DUPLICATION(2203, "이미 사용 중인 전화번호입니다."),
USER_KAKAO_UID_DUPLICATION(2204, "이미 가입한 계정입니다."),
USER_NOT_FOUND_BY_KAKAO_UID(2205, "일치하는 회원을 찾을 수 없습니다."),
USER_NOT_FOUND_BY_PHONE(2206, "일치하는 회원을 찾을 수 없습니다."),
/**
* 유저 관련 예외
*/
USER_EMAIL_DUPLICATION(2200, "이미 사용 중인 이메일입니다."),
USER_NOT_FOUND_BY_ID(2201, "일치하는 회원을 찾을 수 없습니다."),
USER_NOT_FOUND_BY_EMAIL(2202, "일치하는 회원을 찾을 수 없습니다."),
USER_PHONE_DUPLICATION(2203, "이미 사용 중인 전화번호입니다."),
USER_KAKAO_UID_DUPLICATION(2204, "이미 가입한 계정입니다."),
USER_NOT_FOUND_BY_KAKAO_UID(2205, "일치하는 회원을 찾을 수 없습니다."),
USER_NOT_FOUND_BY_PHONE(2206, "일치하는 회원을 찾을 수 없습니다."),

KAKAO_CLIENT(10000, "카카오 서버와의 통신 중 오류가 발생했습니다."),
KAKAO_CLIENT(10000, "카카오 서버와의 통신 중 오류가 발생했습니다."),

/**
* 주소 관련 예외
*/
INVALID_ADDRESS_FORMAT(2400, "주소 형식이 올바르지 않습니다."),
/**
* 주소 관련 예외
*/
INVALID_ADDRESS_FORMAT(2400, "주소 형식이 올바르지 않습니다."),

/**
* 악기 관련 예외
*/
INSTRUMENT_NOT_FOUND_BY_ID(2600, "일치하는 매물 정보를 찾을 수 없습니다."),
INSTRUMENT_DELETE_PERMISSION_DENIED(2601, "악기 매물을 삭제할 권한이 없습니다. 매물은 판매자 본인만 삭제할 수 있습니다."),
INSTRUMENT_UPDATE_PERMISSION_DENIED(2602, "악기 매물 정보를 수정할 권한이 없습니다. 매물 정보는 판매자 본인만 수정할 수 있습니다."),
UNEXPECTED_LINK_IN_INSTRUMENT_DESCRIPTION(2603, "악기 설명에는 링크(URL)를 첨부할 수 없습니다. 링크 정보를 제거한 후 다시 시도하세요.");
/**
* 악기 관련 예외
*/
INSTRUMENT_NOT_FOUND_BY_ID(2600, "일치하는 매물 정보를 찾을 수 없습니다."),
INSTRUMENT_DELETE_PERMISSION_DENIED(2601, "악기 매물을 삭제할 권한이 없습니다. 매물은 판매자 본인만 삭제할 수 있습니다."),
INSTRUMENT_UPDATE_PERMISSION_DENIED(2602, "악기 매물 정보를 수정할 권한이 없습니다. 매물 정보는 판매자 본인만 수정할 수 있습니다."),
UNEXPECTED_LINK_IN_INSTRUMENT_DESCRIPTION(2603, "악기 설명에는 링크(URL)를 첨부할 수 없습니다. 링크 정보를 제거한 후 다시 시도하세요."),

private final Integer code;
private final String message;
/**
* 합주실 관련 예외
*/
UNEXPECTED_LINK_IN_PRACTICEROOM_DESCRIPTION(2800, "합주실 관련 설명에는 링크(URL)를 첨부할 수 없습니다. 링크 정보를 제거한 후 다시 시도하세요.");

private final Integer code;
private final String message;
}
Loading

0 comments on commit fb16ee5

Please sign in to comment.