Skip to content

Commit c8b19aa

Browse files
authored
Merge pull request #15 from kusitms-com/feat/#14-tag
feat: (#14) 밋업/기업 프로젝트 별 다중 태그를 추가한다
2 parents 72c6b8f + c692566 commit c8b19aa

8 files changed

Lines changed: 96 additions & 6 deletions

File tree

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.kusitms.website.domain.project;
2+
3+
import com.kusitms.website.domain.project.entity.Tag;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
import java.util.Optional;
7+
8+
public interface TagRepository extends JpaRepository<Tag, Long> {
9+
Optional<Tag> findByName(String name); // Fetch a tag by name
10+
}

src/main/java/com/kusitms/website/domain/project/dto/response/CorporateDetailResponse.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.kusitms.website.domain.project.entity.CorporateProject;
66
import io.swagger.v3.oas.annotations.media.Schema;
77
import lombok.Getter;
8+
import lombok.Setter;
89

910
import java.util.Arrays;
1011
import java.util.List;
@@ -32,6 +33,10 @@ public class CorporateDetailResponse {
3233
@Schema(description = "배너 이미지 URL")
3334
private String bannerUrl;
3435

36+
@Setter
37+
@JsonProperty("tags")
38+
private List<String> tags;
39+
3540
public CorporateDetailResponse(CorporateProject corporate) {
3641
this.corporateId = corporate.getCorporateId();
3742
this.cardinal = corporate.getCardinal();
@@ -56,4 +61,5 @@ public CorporateDetailResponse(TMPCorporateProject corporate) {
5661
private List<String> splitCategory(String categoryString) {
5762
return Arrays.asList(categoryString.split("#"));
5863
}
64+
5965
}

src/main/java/com/kusitms/website/domain/project/dto/response/MeetupDetailResponse.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import com.kusitms.website.domain.project.entity.MeetupProject;
77
import io.swagger.v3.oas.annotations.media.Schema;
88
import lombok.Getter;
9+
import lombok.Setter;
910

1011
import java.time.LocalDate;
12+
import java.util.List;
1113

1214
import static com.kusitms.website.global.util.S3Util.s3Url;
1315

@@ -70,6 +72,11 @@ public class MeetupDetailResponse {
7072
@JsonInclude(JsonInclude.Include.NON_NULL)
7173
private MeetupTeamResponse team;
7274

75+
@Setter
76+
@Schema(description = "프로젝트 관련 태그")
77+
@JsonProperty("tags")
78+
private List<String> tags;
79+
7380
public MeetupDetailResponse(MeetupProject meetup, boolean isDetail) {
7481
this.meetupId = meetup.getMeetupId();
7582
this.cardinal = meetup.getCardinal();
@@ -109,4 +116,5 @@ public MeetupDetailResponse(TMPMeetupProject meetup, boolean isDetail) {
109116
this.team = new MeetupTeamResponse(meetup.getTeamName(), meetup.getTeam());
110117
}
111118
}
119+
112120
}

src/main/java/com/kusitms/website/domain/project/entity/CorporateProject.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import lombok.Getter;
44

55
import javax.persistence.*;
6+
import java.util.HashSet;
7+
import java.util.Set;
68

79
@Entity
810
@Getter
@@ -26,4 +28,12 @@ public class CorporateProject {
2628
private String bannerUrl;
2729

2830
private String category;
31+
32+
@ManyToMany
33+
@JoinTable(
34+
name = "corporate_project_tags",
35+
joinColumns = @JoinColumn(name = "corporate_project_id"),
36+
inverseJoinColumns = @JoinColumn(name = "tag_id")
37+
)
38+
private Set<Tag> tags = new HashSet<>();
2939
}

src/main/java/com/kusitms/website/domain/project/entity/MeetupProject.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import javax.persistence.*;
99
import java.time.LocalDate;
1010
import java.util.ArrayList;
11+
import java.util.HashSet;
1112
import java.util.List;
13+
import java.util.Set;
1214

1315
@Entity
1416
@Getter
@@ -60,6 +62,14 @@ public class MeetupProject {
6062
@OneToMany(mappedBy = "meetupProject", cascade = CascadeType.ALL)
6163
private List<MeetupTeam> team = new ArrayList<>();
6264

65+
@ManyToMany
66+
@JoinTable(
67+
name = "meetup_project_tags",
68+
joinColumns = @JoinColumn(name = "meetup_project_id"),
69+
inverseJoinColumns = @JoinColumn(name = "tag_id")
70+
)
71+
private Set<Tag> tags = new HashSet<>();
72+
6373
@Builder
6474
public MeetupProject(int cardinal, String name, String intro, ProjectType type, String oneLineIntro,
6575
String logoUrl, String posterUrl, String instagramUrl, String githubUrl, String appUrl,
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.kusitms.website.domain.project.entity;
2+
3+
import lombok.Getter;
4+
import lombok.NoArgsConstructor;
5+
6+
import javax.persistence.*;
7+
import java.util.HashSet;
8+
import java.util.Set;
9+
10+
@Entity
11+
@Getter
12+
@NoArgsConstructor
13+
public class Tag {
14+
@Id
15+
@GeneratedValue(strategy = GenerationType.IDENTITY)
16+
private Long tagId;
17+
18+
private String name; // The actual tag name, e.g., "#지도", "#글쓰기"
19+
20+
@ManyToMany(mappedBy = "tags")
21+
private Set<CorporateProject> corporateProjects = new HashSet<>();
22+
23+
@ManyToMany(mappedBy = "tags")
24+
private Set<MeetupProject> meetupProjects = new HashSet<>();
25+
26+
public Tag(String name) {
27+
this.name = name;
28+
}
29+
}

src/main/java/com/kusitms/website/domain/project/service/CorporateService.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.kusitms.website.domain.project.service;
22

3+
import com.kusitms.website.domain.project.TagRepository;
34
import com.kusitms.website.domain.project.entity.CorporateProject;
45
import com.kusitms.website.domain.project.dto.response.CorporateDetailResponse;
56
import com.kusitms.website.domain.project.dto.response.CorporateResponse;
67
import com.kusitms.website.domain.project.CorporateRepository;
8+
import com.kusitms.website.domain.project.entity.Tag;
79
import lombok.RequiredArgsConstructor;
810
import org.springframework.stereotype.Service;
911
import org.springframework.transaction.annotation.Transactional;
@@ -16,6 +18,7 @@
1618
@Transactional(readOnly = true)
1719
public class CorporateService {
1820
private final CorporateRepository corporateRepository;
21+
private final TagRepository tagRepository;
1922

2023
public CorporateResponse getCorporateProjects(String order, Integer cardinal) {
2124
List<CorporateProject> findProjects;
@@ -32,7 +35,14 @@ public CorporateResponse getCorporateProjects(String order, Integer cardinal) {
3235
}
3336

3437
List<CorporateDetailResponse> detailResponses = findProjects.stream()
35-
.map(p -> new CorporateDetailResponse(p))
38+
.map(p -> {
39+
List<String> tags = p.getTags().stream()
40+
.map(tag -> "#" + tag.getName()) // Extract tag names
41+
.collect(Collectors.toList());
42+
CorporateDetailResponse response = new CorporateDetailResponse(p);
43+
response.setTags(tags); // Set tags in response
44+
return response;
45+
})
3646
.collect(Collectors.toList());
3747

3848
return CorporateResponse.builder()

src/main/java/com/kusitms/website/domain/project/service/MeetupService.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.kusitms.website.domain.project.service;
22

3-
import com.kusitms.website.domain.project.entity.MeetupProject;
4-
import com.kusitms.website.domain.project.dto.response.MeetupResponse;
5-
import com.kusitms.website.domain.project.dto.response.MeetupDetailResponse;
3+
import com.kusitms.website.domain.file.S3Service;
64
import com.kusitms.website.domain.project.MeetupRepository;
75
import com.kusitms.website.domain.project.MeetupTeamRepository;
8-
import com.kusitms.website.domain.file.S3Service;
6+
import com.kusitms.website.domain.project.dto.response.MeetupDetailResponse;
7+
import com.kusitms.website.domain.project.dto.response.MeetupResponse;
8+
import com.kusitms.website.domain.project.entity.MeetupProject;
99
import lombok.RequiredArgsConstructor;
1010
import org.springframework.stereotype.Service;
1111
import org.springframework.transaction.annotation.Transactional;
@@ -36,7 +36,14 @@ public MeetupResponse getMeetupProjects(String order, Integer cardinal) {
3636
}
3737

3838
List<MeetupDetailResponse> meetupDetailResponses = findProjects.stream()
39-
.map(p -> new MeetupDetailResponse(p, false))
39+
.map(p -> {
40+
List<String> tags = p.getTags().stream()
41+
.map(tag -> "#" + tag.getName()) // Extract tag names
42+
.collect(Collectors.toList());
43+
MeetupDetailResponse response = new MeetupDetailResponse(p, false);
44+
response.setTags(tags); // Set tags in response
45+
return response;
46+
})
4047
.collect(Collectors.toList());
4148

4249
return MeetupResponse.builder()

0 commit comments

Comments
 (0)