Skip to content

Commit 9061945

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents 8886f90 + 5fdfe18 commit 9061945

72 files changed

Lines changed: 3459 additions & 394 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ jobs:
5454
run: chmod +x ./gradlew
5555

5656
- name: Build and Test with Gradle
57-
run: ./gradlew bootJar -Pprofile=dev
57+
run: ./gradlew bootJar -Pprofile=dev --info
5858

5959

6060

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ dependencies {
8989
implementation 'org.opensearch.client:spring-data-opensearch:1.3.0'
9090
implementation 'org.opensearch.client:opensearch-java:2.9.1'
9191

92+
// mybatis
93+
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.4'
94+
9295
compileOnly 'org.projectlombok:lombok'
9396
runtimeOnly 'com.h2database:h2'
9497
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
[[Comment-Get]]
2+
== 내가 썼어요 댓글/답글 조회 API(GET: /devdevdev/api/v1/mypage/comments)
3+
4+
* 회원이 작성한 댓글/답글을 조회한다.
5+
* 최초 요청시 pickCommentId, techCommentId 는 가장 큰 숫자 값을 요청해야 합니다.
6+
7+
=== 정상 요청/응답
8+
9+
==== HTTP Request
10+
11+
include::{snippets}/mypage-comments/http-request.adoc[]
12+
13+
==== HTTP Request Header Fields
14+
15+
include::{snippets}/mypage-comments/request-headers.adoc[]
16+
17+
==== HTTP Request Query Parameters Fields
18+
19+
include::{snippets}/mypage-comments/query-parameters.adoc[]
20+
21+
==== HTTP Response
22+
23+
include::{snippets}/mypage-comments/http-response.adoc[]
24+
25+
==== HTTP Response Fields
26+
27+
include::{snippets}/mypage-comments/response-fields.adoc[]
28+
29+
=== 예외
30+
31+
==== HTTP Response
32+
33+
* `익명 회원은 사용할 수 없는 기능 입니다.`: 익명 회원인 경우
34+
* `회원을 찾을 수 없습니다.`: 회원이 존재하지 않는 경우
35+
* `유효하지 않은 회원 입니다.`: 회원이 유효하지 않은 경우
36+
37+
include::{snippets}/mypage-comments-member-exception/response-body.adoc[]

src/docs/asciidoc/api/mypage/mypage.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ include::mypick-main.adoc[]
55
include::exit-member.adoc[]
66
include::exit-survey.adoc[]
77
include::record-exit-survey.adoc[]
8+
include::comment-get.adoc[]
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
[[TechArticleRecommend]]
2+
== 기술블로그 추천 API(POST: /devdevdev/api/v1/articles/{techArticleId}/recommend)
3+
* 회원과 익명회원은 기술블로그를 추천하거나 추천 취소할 수 있다.
4+
5+
=== 정상 요청/응답
6+
==== HTTP Request
7+
include::{snippets}/tech-article-recommend/http-request.adoc[]
8+
==== HTTP Request Header Fields
9+
include::{snippets}/tech-article-recommend/request-headers.adoc[]
10+
==== HTTP Request Path Parameters Fields
11+
include::{snippets}/tech-article-recommend/path-parameters.adoc[]
12+
13+
==== HTTP Response
14+
include::{snippets}/tech-article-recommend/http-response.adoc[]
15+
==== HTTP Response Fields
16+
include::{snippets}/tech-article-recommend/response-fields.adoc[]
17+
18+
19+
=== 예외
20+
==== HTTP Response
21+
include::{snippets}/not-found-tech-article-exception/response-body.adoc[]
22+
include::{snippets}/not-found-member-exception/response-body.adoc[]

src/docs/asciidoc/api/tech-article/tech-article.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ include::main.adoc[]
44
include::detail.adoc[]
55
include::bookmark.adoc[]
66
include::keyword.adoc[]
7+
include::recommend.adoc[]

src/main/java/com/dreamypatisiel/devdevdev/LocalInitData.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import com.dreamypatisiel.devdevdev.domain.entity.enums.WordType;
2424
import com.dreamypatisiel.devdevdev.domain.policy.PickPopularScorePolicy;
2525
import com.dreamypatisiel.devdevdev.domain.repository.BlameTypeRepository;
26-
import com.dreamypatisiel.devdevdev.domain.repository.BookmarkRepository;
26+
import com.dreamypatisiel.devdevdev.domain.repository.techArticle.BookmarkRepository;
2727
import com.dreamypatisiel.devdevdev.domain.repository.CompanyRepository;
2828
import com.dreamypatisiel.devdevdev.domain.repository.member.MemberRepository;
2929
import com.dreamypatisiel.devdevdev.domain.repository.member.memberNicknameDictionary.MemberNicknameDictionaryRepository;

src/main/java/com/dreamypatisiel/devdevdev/domain/entity/Pick.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public class Pick extends BasicTime {
8888
private List<String> embeddings;
8989

9090
@ManyToOne(fetch = FetchType.LAZY)
91-
@JoinColumn(name = "member_id")
91+
@JoinColumn(name = "member_id", nullable = false)
9292
private Member member;
9393

9494
@OneToMany(mappedBy = "pick")
@@ -125,12 +125,13 @@ public static Pick create(Title title, String author, Member member) {
125125
pick.popularScore = Count.defaultCount();
126126
pick.blameTotalCount = Count.defaultCount();
127127
pick.author = author;
128-
pick.contentStatus = getDefaultContentStatusByMemberRole(member);
128+
pick.contentStatus = ContentStatus.APPROVAL;
129129
pick.member = member;
130130

131131
return pick;
132132
}
133133

134+
@Deprecated // 신고 기능 추가로 인한 삭제
134135
private static ContentStatus getDefaultContentStatusByMemberRole(Member member) {
135136
if (member.isAdmin()) {
136137
return ContentStatus.APPROVAL;

src/main/java/com/dreamypatisiel/devdevdev/domain/entity/TechArticle.java

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.dreamypatisiel.devdevdev.domain.entity;
22

33
import com.dreamypatisiel.devdevdev.domain.entity.embedded.Count;
4+
import com.dreamypatisiel.devdevdev.domain.entity.embedded.Title;
45
import com.dreamypatisiel.devdevdev.domain.entity.embedded.Url;
56
import com.dreamypatisiel.devdevdev.domain.policy.TechArticlePopularScorePolicy;
67
import com.dreamypatisiel.devdevdev.elastic.domain.document.ElasticTechArticle;
@@ -35,6 +36,8 @@ public class TechArticle extends BasicTime {
3536
@GeneratedValue(strategy = GenerationType.IDENTITY)
3637
private Long id;
3738

39+
private Title title;
40+
3841
@Embedded
3942
@AttributeOverride(name = "count",
4043
column = @Column(name = "view_total_count")
@@ -75,9 +78,14 @@ public class TechArticle extends BasicTime {
7578
@OneToMany(mappedBy = "techArticle")
7679
private List<Bookmark> bookmarks = new ArrayList<>();
7780

81+
@OneToMany(mappedBy = "techArticle")
82+
private List<TechArticleRecommend> recommends = new ArrayList<>();
83+
7884
@Builder
79-
private TechArticle(Count viewTotalCount, Count recommendTotalCount, Count commentTotalCount, Count popularScore,
85+
private TechArticle(Title title, Count viewTotalCount, Count recommendTotalCount, Count commentTotalCount,
86+
Count popularScore,
8087
Url techArticleUrl, Company company, String elasticId) {
88+
this.title = title;
8189
this.techArticleUrl = techArticleUrl;
8290
this.viewTotalCount = viewTotalCount;
8391
this.recommendTotalCount = recommendTotalCount;
@@ -89,6 +97,7 @@ private TechArticle(Count viewTotalCount, Count recommendTotalCount, Count comme
8997

9098
public static TechArticle createTechArticle(ElasticTechArticle elasticTechArticle, Company company) {
9199
TechArticle techArticle = TechArticle.builder()
100+
.title(new Title(elasticTechArticle.getTitle()))
92101
.techArticleUrl(new Url(elasticTechArticle.getTechArticleUrl()))
93102
.viewTotalCount(new Count(elasticTechArticle.getViewTotalCount()))
94103
.recommendTotalCount(new Count(elasticTechArticle.getRecommendTotalCount()))
@@ -102,10 +111,11 @@ public static TechArticle createTechArticle(ElasticTechArticle elasticTechArticl
102111
return techArticle;
103112
}
104113

105-
public static TechArticle createTechArticle(Url techArticleUrl, Count viewTotalCount, Count recommendTotalCount,
106-
Count commentTotalCount,
107-
Count popularScore, String elasticId, Company company) {
114+
public static TechArticle createTechArticle(Title title, Url techArticleUrl, Count viewTotalCount,
115+
Count recommendTotalCount, Count commentTotalCount, Count popularScore,
116+
String elasticId, Company company) {
108117
return TechArticle.builder()
118+
.title(title)
109119
.techArticleUrl(techArticleUrl)
110120
.viewTotalCount(viewTotalCount)
111121
.recommendTotalCount(recommendTotalCount)
@@ -127,6 +137,10 @@ public void changePopularScore(TechArticlePopularScorePolicy policy) {
127137
this.popularScore = this.calculatePopularScore(policy);
128138
}
129139

140+
private Count calculatePopularScore(TechArticlePopularScorePolicy policy) {
141+
return policy.calculatePopularScore(this);
142+
}
143+
130144
public void changeCompany(Company company) {
131145
company.getTechArticles().add(this);
132146
this.company = company;
@@ -136,15 +150,20 @@ public void incrementViewTotalCount() {
136150
this.viewTotalCount = Count.plusOne(this.viewTotalCount);
137151
}
138152

139-
private Count calculatePopularScore(TechArticlePopularScorePolicy policy) {
140-
return policy.calculatePopularScore(this);
141-
}
142-
143153
public void incrementCommentCount() {
144154
this.commentTotalCount = Count.plusOne(this.commentTotalCount);
145155
}
146156

147157
public void decrementCommentCount() {
148158
this.commentTotalCount = Count.minusOne(this.commentTotalCount);
149159
}
160+
161+
162+
public void incrementRecommendTotalCount() {
163+
this.recommendTotalCount = Count.plusOne(this.recommendTotalCount);
164+
}
165+
166+
public void decrementRecommendTotalCount() {
167+
this.recommendTotalCount = Count.minusOne(this.recommendTotalCount);
168+
}
150169
}
Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,81 @@
11
package com.dreamypatisiel.devdevdev.domain.entity;
22

3-
import jakarta.persistence.Entity;
4-
import jakarta.persistence.FetchType;
5-
import jakarta.persistence.GeneratedValue;
6-
import jakarta.persistence.GenerationType;
7-
import jakarta.persistence.Id;
8-
import jakarta.persistence.JoinColumn;
9-
import jakarta.persistence.ManyToOne;
3+
import jakarta.persistence.*;
104
import lombok.AccessLevel;
5+
import lombok.Builder;
6+
import lombok.Getter;
117
import lombok.NoArgsConstructor;
128

9+
@Getter
1310
@Entity
1411
@NoArgsConstructor(access = AccessLevel.PROTECTED)
1512
public class TechArticleRecommend extends BasicTime {
1613
@Id
1714
@GeneratedValue(strategy = GenerationType.IDENTITY)
1815
private Long id;
1916

17+
@Column(nullable = false)
18+
private boolean status;
19+
2020
@ManyToOne(fetch = FetchType.LAZY)
21-
@JoinColumn(name = "member_id", nullable = false)
21+
@JoinColumn(name = "member_id")
2222
private Member member;
2323

24+
@ManyToOne(fetch = FetchType.LAZY)
25+
@JoinColumn(name = "anonymous_member_id")
26+
private AnonymousMember anonymousMember;
27+
2428
@ManyToOne(fetch = FetchType.LAZY)
2529
@JoinColumn(name = "tech_article_id", nullable = false)
2630
private TechArticle techArticle;
31+
32+
@Builder
33+
private TechArticleRecommend(boolean status, Member member, AnonymousMember anonymousMember, TechArticle techArticle) {
34+
this.status = status;
35+
this.member = member;
36+
this.anonymousMember = anonymousMember;
37+
this.techArticle = techArticle;
38+
}
39+
40+
41+
public static TechArticleRecommend create(Member member, TechArticle techArticle) {
42+
return TechArticleRecommend.builder()
43+
.member(member)
44+
.techArticle(techArticle)
45+
.status(true)
46+
.build();
47+
}
48+
49+
public static TechArticleRecommend create(AnonymousMember anonymousMember, TechArticle techArticle) {
50+
return TechArticleRecommend.builder()
51+
.anonymousMember(anonymousMember)
52+
.techArticle(techArticle)
53+
.status(true)
54+
.build();
55+
}
56+
57+
public void changeTechArticle(TechArticle techArticle) {
58+
this.techArticle = techArticle;
59+
techArticle.getRecommends().add(this);
60+
}
61+
62+
public void cancelRecommend() {
63+
this.status = false;
64+
}
65+
66+
public void registerRecommend() {
67+
this.status = true;
68+
}
69+
70+
public boolean isRecommended() {
71+
return this.status;
72+
}
73+
74+
public boolean isAnonymousMemberNotNull() {
75+
return this.anonymousMember != null;
76+
}
77+
public boolean isMemberNotNull() {
78+
return this.member != null;
79+
}
80+
2781
}

0 commit comments

Comments
 (0)