Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

공연장 entity 구현 #65

Merged
merged 18 commits into from
Mar 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
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
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ jacocoTestReport {
includes: [
'**/service/**',
'**/controller/**',
'**/common/entity/FullAddress*',
'**/repository/**'
])
}))
Expand Down Expand Up @@ -147,6 +148,7 @@ jacocoTestCoverageVerification {
includes = [
'*service.*Service*',
'*controller.*Controller*',
'*common.entity.FullAddress*',
'*repository.*Repository*'
]
}
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/com/ajou/hertz/common/entity/Coordinate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.ajou.hertz.common.entity;

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

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

@Column(nullable = false)
private String lat;

@Column(nullable = false)
private String lng;

}
68 changes: 68 additions & 0 deletions src/main/java/com/ajou/hertz/common/entity/FullAddress.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
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;

@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;

private String lotNumberAddress;

private String roadAddress;

@Column(nullable = false)
private String detailAddress;

public static FullAddress of(String fullAddress, String detailAddress) {

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 sgg = sggBuilder.toString().trim();

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
@@ -0,0 +1,9 @@
package com.ajou.hertz.common.exception;

import com.ajou.hertz.common.exception.constant.CustomExceptionType;

public class InvalidAddressFormatException extends BadRequestException {
public InvalidAddressFormatException(String address) {
super(CustomExceptionType.INVALID_ADDRESS_FORMAT, "address=" + address);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
* <li>1001 ~ 1999: 일반 예외. 아래 항목에 해당하지 않는 대부분의 예외가 여기에 해당한다.</li>
* <li>2000 ~ 2199: 인증 관련 예외</li>
* <li>2200 ~ 2399: 유저 관련 예외</li>
* <li>2400 ~ 2599: 주소 관련 예외</li>
* </ul>
*/
@AllArgsConstructor(access = AccessLevel.PRIVATE)
Expand Down Expand Up @@ -40,6 +41,11 @@ public enum CustomExceptionType {
USER_NOT_FOUND_BY_PHONE(2206, "일치하는 회원을 찾을 수 없습니다."),

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

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

private final Integer code;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.ajou.hertz.domain.concert_hall.constant;

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
public enum ConcertHallProgressStatus {

SELLING("판매중"),
RESERVED("예약중"),
SOLD_OUT("판매 완료");

private final String description;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.ajou.hertz.domain.concert_hall.dto;

import com.ajou.hertz.domain.concert_hall.entity.ConcertHallImage;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
public class ConcertHallImageDto {
private Long id;
private String name;
private String url;

public static ConcertHallImageDto from(ConcertHallImage concertHallImage) {
return new ConcertHallImageDto(
concertHallImage.getId(),
concertHallImage.getOriginalName(),
concertHallImage.getUrl()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package com.ajou.hertz.domain.concert_hall.entity;

import com.ajou.hertz.common.entity.Coordinate;
import com.ajou.hertz.common.entity.FullAddress;
import com.ajou.hertz.common.entity.TimeTrackedBaseEntity;
import com.ajou.hertz.domain.concert_hall.constant.ConcertHallProgressStatus;
import com.ajou.hertz.domain.user.entity.User;

import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class ConcertHall extends TimeTrackedBaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "concert_hall_id", nullable = false)
private Long id;

@JoinColumn(name = "seller_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
private User seller;

@Column(nullable = false)
private String title;

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private ConcertHallProgressStatus progressStatus;

@Column(nullable = false)
@Embedded
private FullAddress fullAddress;

@Column(nullable = false)
private Boolean hasSoundEquipment;

@Column(nullable = false)
private Boolean hasStaff;

@Column(nullable = false)
private Boolean hasAdditionalSpace;

@Column(nullable = false)
private Integer pricePerDay;

@Column(nullable = false)
private Integer pricePerHour;

@Column(nullable = false)
private Short capacity;

@Column(nullable = false)
private String size;

@Column(nullable = false)
private Boolean hasParkingLot;

@Column(length = 1000, nullable = false)
private String description;

@Embedded
private Coordinate coordinate;

@Embedded
private ConcertHallImages images = new ConcertHallImages();

@Embedded
private ConcertHallHashtags hashtags = new ConcertHallHashtags();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.ajou.hertz.domain.concert_hall.entity;

import com.ajou.hertz.common.entity.BaseEntity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class ConcertHallHashtag extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "concert_hall_hashtag_id", nullable = false)
private Long id;

@JoinColumn(name = "concert_hall_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
private ConcertHall concertHall;

@Column(length = 10, nullable = false)
private String content;

public static ConcertHallHashtag create(ConcertHall concertHall, String content) {
return new ConcertHallHashtag(null, concertHall, content);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.ajou.hertz.domain.concert_hall.entity;

import java.util.LinkedList;
import java.util.List;

import jakarta.persistence.Embeddable;
import jakarta.persistence.OneToMany;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

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

@OneToMany(mappedBy = "concertHall")
private List<ConcertHallHashtag> content = new LinkedList<>();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.ajou.hertz.domain.concert_hall.entity;

import com.ajou.hertz.common.entity.FileEntity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class ConcertHallImage extends FileEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "concert_hall_image_id", nullable = false)
private Long id;

@JoinColumn(name = "concert_hall", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
private ConcertHall concertHall;

private ConcertHallImage(Long id, ConcertHall concertHall, String originalName, String storedName, String url) {
super(originalName, storedName, url);
this.id = id;
this.concertHall = concertHall;
}

public static ConcertHallImage create(ConcertHall concertHall, String originalName, String storedName, String url) {
return new ConcertHallImage(
null,
concertHall,
originalName,
storedName,
url
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.ajou.hertz.domain.concert_hall.entity;

import java.util.LinkedList;
import java.util.List;

import jakarta.persistence.Embeddable;
import jakarta.persistence.OneToMany;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Embeddable
public class ConcertHallImages {
@OneToMany(mappedBy = "concertHall")
private List<ConcertHallImage> content = new LinkedList<>();

}
Loading
Loading