Skip to content

Commit c3e113c

Browse files
authored
[FEAT] 모임과 태그 엔티티 구성
[FEAT] 모임과 태그 엔티티 구성
2 parents 555652a + c7f8719 commit c3e113c

File tree

9 files changed

+337
-0
lines changed

9 files changed

+337
-0
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package team.wego.wegobackend.group.domain;
2+
3+
import jakarta.persistence.CascadeType;
4+
import jakarta.persistence.Column;
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.FetchType;
7+
import jakarta.persistence.GeneratedValue;
8+
import jakarta.persistence.GenerationType;
9+
import jakarta.persistence.Id;
10+
import jakarta.persistence.JoinColumn;
11+
import jakarta.persistence.ManyToOne;
12+
import jakarta.persistence.OneToMany;
13+
import jakarta.persistence.Table;
14+
import java.time.LocalDateTime;
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
import lombok.AccessLevel;
18+
import lombok.Getter;
19+
import lombok.NoArgsConstructor;
20+
import team.wego.wegobackend.common.entity.BaseTimeEntity;
21+
import team.wego.wegobackend.user.domain.User;
22+
23+
@Getter(AccessLevel.PUBLIC)
24+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
25+
@Table(name = "v1_groups")
26+
@Entity
27+
public class Group extends BaseTimeEntity {
28+
29+
@Id
30+
@GeneratedValue(strategy = GenerationType.IDENTITY)
31+
@Column(name = "group_id", nullable = false, unique = true)
32+
private Long id;
33+
34+
@Column(name = "title", nullable = false, length = 100)
35+
private String title;
36+
37+
@Column(name = "location", nullable = false, length = 100)
38+
private String location;
39+
40+
@Column(name = "location_detail", length = 255)
41+
private String locationDetail;
42+
43+
@Column(name = "start_time", nullable = false)
44+
private LocalDateTime startTime;
45+
46+
@Column(name = "end_time", nullable = false)
47+
private LocalDateTime endTime;
48+
49+
@Column(name = "description", nullable = false, length = 1000)
50+
private String description;
51+
52+
@Column(name = "max_participants", nullable = false)
53+
private Integer maxParticipants;
54+
55+
@ManyToOne(fetch = FetchType.LAZY)
56+
@JoinColumn(name = "host_id", nullable = false)
57+
private User host;
58+
59+
@Column(name = "deleted_at")
60+
private LocalDateTime deletedAt;
61+
62+
@OneToMany(mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true)
63+
private List<GroupImage> images = new ArrayList<>();
64+
65+
@OneToMany(mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true)
66+
private List<GroupTag> groupTags = new ArrayList<>();
67+
68+
@OneToMany(mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true)
69+
private List<GroupUser> users = new ArrayList<>();
70+
71+
public static Group create(
72+
String title,
73+
String location,
74+
String locationDetail,
75+
LocalDateTime startTime,
76+
LocalDateTime endTime,
77+
String description,
78+
Integer maxParticipants,
79+
User host
80+
) {
81+
Group group = new Group();
82+
group.title = title;
83+
group.location = location;
84+
group.locationDetail = locationDetail;
85+
group.startTime = startTime;
86+
group.endTime = endTime;
87+
group.description = description;
88+
group.maxParticipants = maxParticipants;
89+
group.host = host;
90+
return group;
91+
}
92+
93+
// 연관관계 편의 메서드들
94+
public void addImage(GroupImage image) {
95+
this.images.add(image);
96+
}
97+
98+
public void addUser(GroupUser groupUser) {
99+
this.users.add(groupUser);
100+
}
101+
102+
public void addTag(GroupTag groupTag) {
103+
this.groupTags.add(groupTag);
104+
}
105+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package team.wego.wegobackend.group.domain;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.FetchType;
6+
import jakarta.persistence.GeneratedValue;
7+
import jakarta.persistence.GenerationType;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.JoinColumn;
10+
import jakarta.persistence.ManyToOne;
11+
import jakarta.persistence.Table;
12+
import lombok.AccessLevel;
13+
import lombok.Getter;
14+
import lombok.NoArgsConstructor;
15+
16+
@Getter(AccessLevel.PUBLIC)
17+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
18+
@Table(name = "v1_group_images")
19+
@Entity
20+
public class GroupImage {
21+
22+
@Id
23+
@GeneratedValue(strategy = GenerationType.IDENTITY)
24+
@Column(name = "group_image_id", nullable = false, updatable = false)
25+
private Long id;
26+
27+
@Column(name = "image_url", nullable = false, length = 255)
28+
private String imageUrl;
29+
30+
@Column(name = "sort_order", nullable = false)
31+
private Integer sortOrder;
32+
33+
@ManyToOne(fetch = FetchType.LAZY)
34+
@JoinColumn(name = "group_id", nullable = false)
35+
private Group group;
36+
37+
public static GroupImage create(Group group, String imageUrl, int sortOrder) {
38+
GroupImage image = new GroupImage();
39+
image.group = group;
40+
image.imageUrl = imageUrl;
41+
image.sortOrder = sortOrder;
42+
group.addImage(image);
43+
return image;
44+
}
45+
}
46+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package team.wego.wegobackend.group.domain;
2+
3+
public enum GroupRole {
4+
HOST,
5+
MEMBER
6+
}
7+
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package team.wego.wegobackend.group.domain;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.FetchType;
6+
import jakarta.persistence.GeneratedValue;
7+
import jakarta.persistence.GenerationType;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.JoinColumn;
10+
import jakarta.persistence.ManyToOne;
11+
import jakarta.persistence.Table;
12+
import lombok.AccessLevel;
13+
import lombok.Getter;
14+
import lombok.NoArgsConstructor;
15+
import team.wego.wegobackend.common.entity.BaseTimeEntity;
16+
import team.wego.wegobackend.tag.domain.entity.Tag;
17+
18+
@Getter(AccessLevel.PUBLIC)
19+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
20+
@Table(name = "v1_group_tags")
21+
@Entity
22+
public class GroupTag extends BaseTimeEntity {
23+
24+
@Id
25+
@GeneratedValue(strategy = GenerationType.IDENTITY)
26+
@Column(name = "group_tag_id", nullable = false, updatable = false)
27+
private Long id;
28+
29+
@ManyToOne(fetch = FetchType.LAZY)
30+
@JoinColumn(name = "group_id", nullable = false)
31+
private Group group;
32+
33+
@ManyToOne(fetch = FetchType.LAZY)
34+
@JoinColumn(name = "tag_id", nullable = false)
35+
private Tag tag;
36+
37+
public static GroupTag create(Group group, Tag tag) {
38+
GroupTag groupTag = new GroupTag();
39+
groupTag.group = group;
40+
groupTag.tag = tag;
41+
group.addTag(groupTag);
42+
return groupTag;
43+
}
44+
}
45+
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package team.wego.wegobackend.group.domain;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.EnumType;
6+
import jakarta.persistence.Enumerated;
7+
import jakarta.persistence.FetchType;
8+
import jakarta.persistence.GeneratedValue;
9+
import jakarta.persistence.GenerationType;
10+
import jakarta.persistence.Id;
11+
import jakarta.persistence.JoinColumn;
12+
import jakarta.persistence.ManyToOne;
13+
import jakarta.persistence.Table;
14+
import java.time.LocalDateTime;
15+
import lombok.AccessLevel;
16+
import lombok.Getter;
17+
import lombok.NoArgsConstructor;
18+
import team.wego.wegobackend.common.entity.BaseTimeEntity;
19+
import team.wego.wegobackend.user.domain.User;
20+
21+
@Getter(AccessLevel.PUBLIC)
22+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
23+
@Table(name = "v1_group_users")
24+
@Entity
25+
public class GroupUser extends BaseTimeEntity {
26+
27+
@Id
28+
@GeneratedValue(strategy = GenerationType.IDENTITY)
29+
private Long id;
30+
31+
@ManyToOne(fetch = FetchType.LAZY)
32+
@JoinColumn(name = "group_id", nullable = false)
33+
private Group group;
34+
35+
@ManyToOne(fetch = FetchType.LAZY)
36+
@JoinColumn(name = "user_id", nullable = false)
37+
private User user;
38+
39+
@Enumerated(EnumType.STRING)
40+
@Column(name = "group_role", nullable = false, length = 20)
41+
private GroupRole groupRole;
42+
43+
@Column(name = "joined_at", nullable = false)
44+
private LocalDateTime joinedAt;
45+
46+
@Column(name = "left_at")
47+
private LocalDateTime leftAt;
48+
49+
public static GroupUser create(Group group, User user, GroupRole role) {
50+
GroupUser groupUser = new GroupUser();
51+
groupUser.group = group;
52+
groupUser.user = user;
53+
groupUser.groupRole = role;
54+
groupUser.joinedAt = LocalDateTime.now();
55+
group.addUser(groupUser);
56+
return groupUser;
57+
}
58+
}
59+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package team.wego.wegobackend.tag.application.service;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.stereotype.Service;
5+
import team.wego.wegobackend.tag.domain.repository.TagRepository;
6+
7+
@RequiredArgsConstructor
8+
@Service
9+
public class TagService {
10+
11+
private final TagRepository tagRepository;
12+
13+
14+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package team.wego.wegobackend.tag.domain.entity;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.GenerationType;
7+
import jakarta.persistence.Id;
8+
import jakarta.persistence.Table;
9+
import jakarta.persistence.UniqueConstraint;
10+
import lombok.AccessLevel;
11+
import lombok.Getter;
12+
import lombok.NoArgsConstructor;
13+
import team.wego.wegobackend.common.entity.BaseTimeEntity;
14+
15+
@Getter(AccessLevel.PUBLIC)
16+
@NoArgsConstructor
17+
@Table(name = "v1_tags",
18+
uniqueConstraints = {
19+
@UniqueConstraint(name = "uk_tags_name", columnNames = {"name"})
20+
})
21+
@Entity
22+
public class Tag extends BaseTimeEntity {
23+
24+
@Id
25+
@GeneratedValue(strategy = GenerationType.IDENTITY)
26+
@Column(name = "tag_id", nullable = false, updatable = false)
27+
private Long id;
28+
29+
@Column(name = "name", nullable = false, unique = true, length = 50)
30+
private String name;
31+
32+
public static Tag create(String name) {
33+
Tag tag = new Tag();
34+
tag.name = name;
35+
return tag;
36+
}
37+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package team.wego.wegobackend.tag.domain.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import team.wego.wegobackend.tag.domain.entity.Tag;
5+
6+
public interface TagRepository extends JpaRepository<Tag, Long> {
7+
8+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package team.wego.wegobackend.tag.presentation;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.web.bind.annotation.RequestMapping;
5+
import org.springframework.web.bind.annotation.RestController;
6+
import team.wego.wegobackend.tag.application.service.TagService;
7+
8+
@RequiredArgsConstructor
9+
@RequestMapping("/api/v1/tags")
10+
@RestController
11+
public class TagController {
12+
13+
private final TagService tagService;
14+
15+
16+
}

0 commit comments

Comments
 (0)