feat: favorite, unfavorite Article Function add
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
<button class="btn btn-sm btn-outline-primary">
|
||||
<i class="ion-heart"></i>
|
||||
|
||||
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>
|
||||
|
||||
<button class="btn btn-sm btn-outline-primary">
|
||||
<i class="ion-heart"></i>
|
||||
|
||||
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>
|
||||
</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>
|
||||
|
||||
Reference in New Issue
Block a user