Skip to content

Commit 5bc1ffe

Browse files
authored
feat: 번쩍 개설 기능 구현 (#531)
* chore: redis 호스트 수정 * feat: 모임 일시 열거형 필드 추가 * chore: 패키지 이동 * chore: 패키지 이동 * feat: WelcomeMessageType 열거형 생성 및 Tag 엔티티에 필드로 추가 * chore: 코드 포맷터 적용 * feat: 모임 생성 기수 필드 추가 * refactor: 기획 의도에 의한 필드 삭제 및 칼럼 네이밍 변경 * refactor: 생성자 생성 및 activityStartDate 자료형 변경 - activityStartDate의 자료형을 LocalDate에서 LocalDateTime으로 변경 * fix: 오타 수정 * feat: 번쩍 생성 API 관련 컨트롤러 구현 * feat: 번쩍 생성 시 환영 메시지 필드를 제외한 request DTO 생성 - 분리한 이유는 welcomeMessageTypes의 경우 Tag 엔티티에 저장이 되어야 하기 때문 * feat: 번쩍 생성 requestDTO 생성 * feat: 번쩍 생성 responseDTO 생성 * feat: 번쩍 생성 서비스 로직 구현 - Tag, Lightning 엔티티에 정보를 저장하는 플로우 * feat: LightningRepository 구현 * feat: 태그 생성 서비스 로직 구현 - createLightningMeetingTag를 이용하면 meetingId가 null인 Tag객체가 생성됨 * feat: WelcomeTypeConverter 생성 - List<WelcomeMessageType> 타입을 데이터베이스에 저장할 수 있는 String 타입으로 변환하는 convertToDatabaseColumn 메서드 오버라이딩 - String 값을 List<WelcomeMessageType> 객체로 변환하는 convertToEntityAttribute 메서드 오버라이딩 * feat: 정적 팩토리 메서드 구현 및 WelcomeTypeConverter 적용 * refactor: 문자열 필드 추가 - DB에 저장될 데이터는 value * feat: 문자열/enum 변환 관련 컨버터 추가 * feat: 컨버터 적용 및 NotNull 어노테이 추가 - DB에 저장되는 데이터는 String 데이터 * feat: Tag 생성 응답DTO 생성 - 클라이언트에 반환해 줄 응답이 아니라, DTO를 사용해야 할지 아니면 void 타입으로 해야할 지 판단해야함 * feat: LightningMapper 구현 * feat: TagRepository 생성 * fix: 메서드 변경 * refactor: 한글 네이밍으로 요청을 받을 수 있도록 리팩토링 * refactor: 한글로 요청 받은 필드를 내부 Enum으로 매핑하도록 변경해서 DB에 저장하도록 변경 * fix: dev 환경에 맞게 host 네이밍 변경 * refactor: 기획 의도에 맞게 welcomeMessageTypes를 null로 request 및 저장할 수 있도록 변경 * refactor: Integer 자료형 int로 변경
1 parent 1472d43 commit 5bc1ffe

26 files changed

+621
-46
lines changed

main/src/main/java/org/sopt/makers/crew/main/entity/lightning/Lightning.java

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,28 @@
11
package org.sopt.makers.crew.main.entity.lightning;
22

3-
import java.time.LocalDate;
43
import java.time.LocalDateTime;
54
import java.util.List;
65

76
import org.hibernate.annotations.Type;
87
import org.sopt.makers.crew.main.entity.common.BaseTimeEntity;
8+
import org.sopt.makers.crew.main.entity.lightning.converter.LightningPlaceTypeConverter;
9+
import org.sopt.makers.crew.main.entity.lightning.converter.LightningTimingTypeConverter;
10+
import org.sopt.makers.crew.main.entity.lightning.enums.LightningPlaceType;
11+
import org.sopt.makers.crew.main.entity.lightning.enums.LightningTimingType;
912
import org.sopt.makers.crew.main.entity.meeting.vo.ImageUrlVO;
1013

1114
import io.hypersistence.utils.hibernate.type.json.JsonBinaryType;
1215
import jakarta.persistence.Column;
16+
import jakarta.persistence.Convert;
1317
import jakarta.persistence.Entity;
14-
import jakarta.persistence.EnumType;
15-
import jakarta.persistence.Enumerated;
1618
import jakarta.persistence.GeneratedValue;
1719
import jakarta.persistence.GenerationType;
1820
import jakarta.persistence.Id;
1921
import jakarta.persistence.Table;
2022
import jakarta.validation.constraints.NotNull;
2123
import jakarta.validation.constraints.Size;
2224
import lombok.AccessLevel;
25+
import lombok.Builder;
2326
import lombok.Getter;
2427
import lombok.NoArgsConstructor;
2528

@@ -44,34 +47,60 @@ public class Lightning extends BaseTimeEntity {
4447
@Column(name = "desc", columnDefinition = "TEXT")
4548
private String desc;
4649

50+
@Column(name = "lightningTimingType")
51+
@NotNull
52+
@Convert(converter = LightningTimingTypeConverter.class)
53+
private LightningTimingType lightningTimingType;
54+
4755
@Column(name = "activityStartDate")
4856
@NotNull
49-
private LocalDate activityStartDate;
57+
private LocalDateTime activityStartDate;
5058

5159
@Column(name = "activityEndDate")
5260
@NotNull
5361
private LocalDateTime activityEndDate;
5462

55-
@Column(name = "lightningTime")
56-
private LocalDateTime lightningTime;
57-
5863
@Column(name = "lightningPlaceType")
5964
@NotNull
60-
@Enumerated(EnumType.STRING)
65+
@Convert(converter = LightningPlaceTypeConverter.class)
6166
private LightningPlaceType lightningPlaceType;
6267

6368
@Column(name = "lightningPlace")
6469
@NotNull
6570
private String lightningPlace;
6671

6772
@Column(name = "minimumCapacity")
73+
@NotNull
6874
private int minimumCapacity;
6975

7076
@Column(name = "maximumCapacity")
77+
@NotNull
7178
private int maximumCapacity;
7279

80+
@Column(name = "createdGeneration")
81+
@NotNull
82+
private int createdGeneration;
83+
7384
@Column(name = "imageURL", columnDefinition = "jsonb")
7485
@Type(JsonBinaryType.class)
7586
private List<ImageUrlVO> imageURL;
7687

88+
@Builder
89+
public Lightning(Integer leaderUserId, String title, String desc, LightningTimingType lightningTimingType,
90+
LocalDateTime activityStartDate, LocalDateTime activityEndDate, LightningPlaceType lightningPlaceType,
91+
String lightningPlace, int minimumCapacity, int maximumCapacity, Integer createdGeneration,
92+
List<ImageUrlVO> imageURL) {
93+
this.leaderUserId = leaderUserId;
94+
this.title = title;
95+
this.desc = desc;
96+
this.lightningTimingType = lightningTimingType;
97+
this.activityStartDate = activityStartDate;
98+
this.activityEndDate = activityEndDate;
99+
this.lightningPlaceType = lightningPlaceType;
100+
this.lightningPlace = lightningPlace;
101+
this.minimumCapacity = minimumCapacity;
102+
this.maximumCapacity = maximumCapacity;
103+
this.createdGeneration = createdGeneration;
104+
this.imageURL = imageURL;
105+
}
77106
}

main/src/main/java/org/sopt/makers/crew/main/entity/lightning/LightningPlaceType.java

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package org.sopt.makers.crew.main.entity.lightning;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
public interface LightningRepository extends JpaRepository<Lightning, Integer> {
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.sopt.makers.crew.main.entity.lightning.converter;
2+
3+
import org.sopt.makers.crew.main.entity.lightning.enums.LightningPlaceType;
4+
5+
import jakarta.persistence.AttributeConverter;
6+
import jakarta.persistence.Converter;
7+
8+
@Converter
9+
public class LightningPlaceTypeConverter implements AttributeConverter<LightningPlaceType, String> {
10+
11+
@Override
12+
public String convertToDatabaseColumn(LightningPlaceType lightningPlaceType) {
13+
return lightningPlaceType.getValue(); // LightningPlaceType의 값을 반환
14+
}
15+
16+
@Override
17+
public LightningPlaceType convertToEntityAttribute(String dbData) {
18+
return LightningPlaceType.ofValue(dbData); // dbData에 해당하는 LightningPlaceType 객체를 반환
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.sopt.makers.crew.main.entity.lightning.converter;
2+
3+
import org.sopt.makers.crew.main.entity.lightning.enums.LightningTimingType;
4+
5+
import jakarta.persistence.AttributeConverter;
6+
import jakarta.persistence.Converter;
7+
8+
@Converter
9+
public class LightningTimingTypeConverter implements AttributeConverter<LightningTimingType, String> {
10+
11+
@Override
12+
public String convertToDatabaseColumn(LightningTimingType lightningTimingType) {
13+
return lightningTimingType.getValue(); // LightningTimingType의 값을 반환
14+
}
15+
16+
@Override
17+
public LightningTimingType convertToEntityAttribute(String dbData) {
18+
return LightningTimingType.ofValue(dbData); // dbData에 해당하는 LightningTimingType 객체를 반환
19+
}
20+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.sopt.makers.crew.main.entity.lightning.enums;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public enum LightningPlaceType {
7+
OFFLINE("오프라인"),
8+
ONLINE("온라인"),
9+
AFTER_DISCUSSION("협의 후 결정");
10+
11+
private final String value;
12+
13+
LightningPlaceType(String value) {
14+
this.value = value;
15+
}
16+
17+
public static LightningPlaceType ofValue(String dbData) {
18+
for (LightningPlaceType place : LightningPlaceType.values()) {
19+
if (place.getValue().equals(dbData)) {
20+
return place;
21+
}
22+
}
23+
throw new IllegalArgumentException("Invalid LightningPlaceType value: " + dbData);
24+
}
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.sopt.makers.crew.main.entity.lightning.enums;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public enum LightningTimingType {
7+
IMMEDIATE("당일"),
8+
DURATION("기간"),
9+
AFTER_DISCUSSION("협의 후 결정");
10+
11+
private final String value;
12+
13+
LightningTimingType(String value) {
14+
this.value = value;
15+
}
16+
17+
public static LightningTimingType ofValue(String dbData) {
18+
for (LightningTimingType timing : LightningTimingType.values()) {
19+
if (timing.getValue().equals(dbData)) {
20+
return timing;
21+
}
22+
}
23+
throw new IllegalArgumentException("Invalid LightningTimingType value: " + dbData);
24+
}
25+
}

main/src/main/java/org/sopt/makers/crew/main/entity/meeting/Meeting.java

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,40 @@
22

33
import static org.sopt.makers.crew.main.global.exception.ErrorStatus.*;
44

5+
import java.time.LocalDateTime;
6+
import java.util.List;
7+
8+
import org.hibernate.annotations.Parameter;
9+
import org.hibernate.annotations.Type;
10+
import org.sopt.makers.crew.main.entity.common.BaseTimeEntity;
11+
import org.sopt.makers.crew.main.entity.meeting.converter.MeetingCategoryConverter;
12+
import org.sopt.makers.crew.main.entity.meeting.enums.EnMeetingStatus;
13+
import org.sopt.makers.crew.main.entity.meeting.enums.MeetingCategory;
14+
import org.sopt.makers.crew.main.entity.meeting.enums.MeetingJoinablePart;
15+
import org.sopt.makers.crew.main.entity.meeting.vo.ImageUrlVO;
16+
import org.sopt.makers.crew.main.entity.user.User;
17+
import org.sopt.makers.crew.main.global.exception.BadRequestException;
18+
import org.sopt.makers.crew.main.global.exception.ForbiddenException;
19+
520
import io.hypersistence.utils.hibernate.type.array.EnumArrayType;
621
import io.hypersistence.utils.hibernate.type.array.internal.AbstractArrayType;
722
import io.hypersistence.utils.hibernate.type.json.JsonBinaryType;
823
import jakarta.persistence.Column;
924
import jakarta.persistence.Convert;
1025
import jakarta.persistence.Entity;
11-
import jakarta.persistence.EntityListeners;
1226
import jakarta.persistence.FetchType;
1327
import jakarta.persistence.GeneratedValue;
1428
import jakarta.persistence.GenerationType;
1529
import jakarta.persistence.Id;
1630
import jakarta.persistence.JoinColumn;
1731
import jakarta.persistence.ManyToOne;
1832
import jakarta.persistence.Table;
19-
20-
import java.time.LocalDateTime;
21-
import java.util.List;
22-
2333
import jakarta.validation.constraints.Size;
2434
import lombok.AccessLevel;
2535
import lombok.Builder;
2636
import lombok.Getter;
2737
import lombok.NoArgsConstructor;
2838

29-
import org.hibernate.annotations.Parameter;
30-
import org.hibernate.annotations.Type;
31-
import org.sopt.makers.crew.main.entity.common.BaseTimeEntity;
32-
import org.sopt.makers.crew.main.global.exception.BadRequestException;
33-
import org.sopt.makers.crew.main.global.exception.ForbiddenException;
34-
import org.sopt.makers.crew.main.entity.meeting.converter.MeetingCategoryConverter;
35-
import org.sopt.makers.crew.main.entity.meeting.enums.EnMeetingStatus;
36-
import org.sopt.makers.crew.main.entity.meeting.enums.MeetingCategory;
37-
import org.sopt.makers.crew.main.entity.meeting.enums.MeetingJoinablePart;
38-
import org.sopt.makers.crew.main.entity.meeting.vo.ImageUrlVO;
39-
import org.sopt.makers.crew.main.entity.user.User;
40-
4139
@Entity
4240
@Getter
4341
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@@ -152,7 +150,7 @@ public class Meeting extends BaseTimeEntity {
152150
* 모임 기수
153151
*/
154152
@Column(name = "createdGeneration", nullable = false)
155-
private Integer createdGeneration;
153+
private int createdGeneration;
156154

157155
/**
158156
* 대상 활동 기수
@@ -266,5 +264,4 @@ public LocalDateTime getmEndDate() {
266264
return mEndDate;
267265
}
268266

269-
270-
}
267+
}

main/src/main/java/org/sopt/makers/crew/main/entity/tag/Tag.java

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
11
package org.sopt.makers.crew.main.entity.tag;
22

3+
import java.util.List;
4+
5+
import org.hibernate.annotations.Type;
36
import org.sopt.makers.crew.main.entity.common.BaseTimeEntity;
7+
import org.sopt.makers.crew.main.entity.tag.enums.TagType;
8+
import org.sopt.makers.crew.main.entity.tag.enums.WelcomeMessageType;
9+
import org.sopt.makers.crew.main.entity.tag.enums.WelcomeTypeConverter;
410

11+
import io.hypersistence.utils.hibernate.type.json.JsonBinaryType;
512
import jakarta.persistence.Column;
13+
import jakarta.persistence.Convert;
614
import jakarta.persistence.Entity;
715
import jakarta.persistence.EnumType;
816
import jakarta.persistence.Enumerated;
@@ -12,6 +20,7 @@
1220
import jakarta.persistence.Table;
1321
import jakarta.validation.constraints.NotNull;
1422
import lombok.AccessLevel;
23+
import lombok.Builder;
1524
import lombok.Getter;
1625
import lombok.NoArgsConstructor;
1726

@@ -41,7 +50,36 @@ public class Tag extends BaseTimeEntity {
4150
@Column(name = "lightningId")
4251
private Integer lightningId;
4352

44-
@NotNull
45-
private String content;
53+
@Column(name = "welcomeMessageTypes", columnDefinition = "jsonb")
54+
@Convert(converter = WelcomeTypeConverter.class)
55+
@Type(JsonBinaryType.class)
56+
private List<WelcomeMessageType> welcomeMessageTypes;
57+
58+
@Builder
59+
private Tag(TagType tagType, Integer meetingId, Integer lightningId, List<WelcomeMessageType> welcomeMessageTypes) {
60+
this.tagType = tagType;
61+
this.meetingId = meetingId;
62+
this.lightningId = lightningId;
63+
this.welcomeMessageTypes = welcomeMessageTypes;
64+
}
65+
66+
public static Tag createGeneralMeetingTag(TagType tagType, Integer meetingId,
67+
List<WelcomeMessageType> welcomeMessageTypes) {
68+
return Tag.builder()
69+
.tagType(tagType)
70+
.meetingId(meetingId)
71+
.lightningId(null)
72+
.welcomeMessageTypes(welcomeMessageTypes)
73+
.build();
74+
}
4675

76+
public static Tag createLightningMeetingTag(TagType tagType, Integer lightningId,
77+
List<WelcomeMessageType> welcomeMessageTypes) {
78+
return Tag.builder()
79+
.tagType(tagType)
80+
.meetingId(null)
81+
.lightningId(lightningId)
82+
.welcomeMessageTypes(welcomeMessageTypes)
83+
.build();
84+
}
4785
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.sopt.makers.crew.main.entity.tag;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
public interface TagRepository extends JpaRepository<Tag, Integer> {
6+
7+
}

0 commit comments

Comments
 (0)