feat: favorite, unfavorite Article Function add

This commit is contained in:
minseokkang
2022-11-30 13:22:44 +09:00
parent eaa50e298b
commit 5f4bdf13ea
4 changed files with 58 additions and 16 deletions

View File

@@ -3,6 +3,8 @@ package com.io.realworld.domain.aggregate.article.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.io.realworld.config.WithAuthUser;
import com.io.realworld.domain.aggregate.article.dto.*;
import com.io.realworld.domain.aggregate.article.entity.Article;
import com.io.realworld.domain.aggregate.article.repository.ArticleRepository;
import com.io.realworld.domain.aggregate.article.service.ArticleService;
import com.io.realworld.domain.aggregate.article.service.CommentService;
import com.io.realworld.domain.aggregate.user.dto.UserAuth;
@@ -56,9 +58,10 @@ class ArticleControllerTest {
private String slug;
@BeforeEach
void setup(){
String title = "create title";
slug = title.toLowerCase().replace(' ','-');
articleResponse = ArticleResponse.builder()

View File

@@ -86,7 +86,6 @@ class ProfileRepositoryTest {
@MethodSource("getFolloweeAndFollower")
@ParameterizedTest(name = "repo:피드 테스트")
void feedArticle(User followee, User follower){
UserAuth userAuth = UserAuth.builder().id(1L).username("username").bio("bio").email("email").build();
User follower2 = User.builder()
.bio("follower bio")
.email("follower2@email.com")
@@ -98,14 +97,15 @@ class ProfileRepositoryTest {
userRepository.save(follower);
userRepository.save(follower2);
System.out.println(followee.getId() + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
UserAuth userAuth = UserAuth.builder().id(followee.getId()).username("username").bio("bio").email("email").build();
Follow follow = Follow.builder().followee(followee).follower(follower).build();
Follow follow2 = Follow.builder().followee(followee).follower(follower2).build();
profileRepository.save(follow);
profileRepository.save(follow2);
List<Follow> follows = profileRepository.findByFolloweeId(followee.getId());
List<Follow> follows = profileRepository.findByFolloweeId(userAuth.getId());
assertThat(follows.get(0).getFollowee().getUsername()).isEqualTo(followee.getUsername());
assertThat(follows.get(0).getFollower().getUsername()).isEqualTo(follower.getUsername());

View File

@@ -1,5 +1,7 @@
package com.io.realworld.domain.aggregate.user.repository;
import com.io.realworld.domain.aggregate.article.entity.Article;
import com.io.realworld.domain.aggregate.article.repository.ArticleRepository;
import com.io.realworld.domain.aggregate.user.entity.User;
import com.io.realworld.domain.aggregate.user.repository.UserRepository;
import org.hibernate.annotations.Filter;

View File

@@ -11,7 +11,7 @@
<a href="javascript:void(0)" class="author" @click="viewProfile">{{ articleDetail.article.author.username }}</a>
<span class="date">{{convertDate(articleDetail.article.createdAt)}}</span>
</div>
<button class="btn btn-sm btn-outline-secondary" @click="stateUpdate(articleDetail.article.author.following)">
<button class="btn btn-sm btn-outline-secondary" @click="followUpdate(articleDetail.article.author.following)">
<div v-if="articleDetail.article.author.following">
<i class="ion-minus-round"></i>
unFollow {{articleDetail.article.author.username}}
@@ -22,10 +22,15 @@
</div>
</button>
&nbsp;&nbsp;
<button class="btn btn-sm btn-outline-primary">
<i class="ion-heart"></i>
&nbsp;
Favorite Post (<span class="counter">{{articleDetail.article.favoritesCount}}</span>)
<button class="btn btn-sm btn-outline-primary" @click="favoriteUpdate()">
<div v-if="articleDetail.article.favorited">
<i class="ion-heart"></i>
unFavorite Article (<span class="counter">{{articleDetail.article.favoritesCount}}</span>)
</div>
<div v-else>
<i class="ion-heart"></i>
Favorite Article (<span class="counter">{{articleDetail.article.favoritesCount}}</span>)
</div>
</button>
</div>
@@ -50,7 +55,7 @@
<span class="date">{{convertDate(articleDetail.article.createdAt)}}</span>
</div>
<button class="btn btn-sm btn-outline-secondary" @click="stateUpdate(articleDetail.article.author.following)">
<button class="btn btn-sm btn-outline-secondary" @click="followUpdate(articleDetail.article.author.following)">
<div v-if="articleDetail.article.author.following">
<i class="ion-minus-round"></i>
unFollow {{articleDetail.article.author.username}}
@@ -61,10 +66,15 @@
</div>
</button>
&nbsp;
<button class="btn btn-sm btn-outline-primary">
<i class="ion-heart"></i>
&nbsp;
Favorite Post (<span class="counter">{{articleDetail.article.favoritesCount}}</span>)
<button class="btn btn-sm btn-outline-primary" @click="favoriteUpdate()">
<div v-if="articleDetail.article.favorited">
<i class="ion-heart"></i>
unFavorite Article (<span class="counter">{{articleDetail.article.favoritesCount}}</span>)
</div>
&nbsp;<div v-else>
<i class="ion-heart"></i>
Favorite Article (<span class="counter">{{articleDetail.article.favoritesCount}}</span>)
</div>
</button>
</div>
</div>
@@ -169,7 +179,7 @@ export default defineComponent({
params: {username: articleDetail.article.author.username}})
}
const stateUpdate = (followState : boolean) => {
const followUpdate = (followState : boolean) => {
if(token == ''){
router.push({name:"Login"});
}
@@ -192,7 +202,34 @@ export default defineComponent({
articleDetail.article.author.following = response.data.profile.following;
})
}
}
const favoriteUpdate = () => {
if(token == ''){
router.push({name:"Login"});
}
const favoriteState: boolean = articleDetail.article.favorited;
if(favoriteState){
axios.delete(url + "/api/articles/" + articleDetail.article.slug + "/favorite",{
headers:{
Authorization : "TOKEN " + token,
"Content-Type": `application/json`,
}
}).then(response => {
articleDetail.article.favorited = response.data.article.favorited;
articleDetail.article.favoritesCount = response.data.article.favoritesCount;
})
}else{
axios.post(url + "/api/articles/" + articleDetail.article.slug + "/favorite",{},{
headers:{
Authorization : "TOKEN " + token,
"Content-Type": `application/json`,
}
}).then(response => {
articleDetail.article.favorited = response.data.article.favorited;
articleDetail.article.favoritesCount = response.data.article.favoritesCount;
})
}
}
@@ -203,7 +240,7 @@ export default defineComponent({
})
})
return { articleDetail, convertDate, viewProfile, stateUpdate, }
return { articleDetail, convertDate, viewProfile, followUpdate, favoriteUpdate }
}
})
</script>