xiongzhu 4 年之前
父節點
當前提交
c07810f71d

+ 3 - 0
src/main/java/com/izouma/nineth/repo/FollowRepo.java

@@ -7,10 +7,13 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.jpa.repository.Query;
 
 
 import javax.transaction.Transactional;
 import javax.transaction.Transactional;
+import java.util.List;
 
 
 public interface FollowRepo extends JpaRepository<Follow, Long>, JpaSpecificationExecutor<Follow> {
 public interface FollowRepo extends JpaRepository<Follow, Long>, JpaSpecificationExecutor<Follow> {
     @Query("update Follow t set t.del = true where t.id = ?1")
     @Query("update Follow t set t.del = true where t.id = ?1")
     @Modifying
     @Modifying
     @Transactional
     @Transactional
     void softDelete(Long id);
     void softDelete(Long id);
+
+    List<Follow> findByUserIdAndFollowUserId(Long userId, Long to);
 }
 }

+ 5 - 0
src/main/java/com/izouma/nineth/repo/UserRepo.java

@@ -26,4 +26,9 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
     Optional<User> findByPhoneAndDelFalse(String phone);
     Optional<User> findByPhoneAndDelFalse(String phone);
 
 
     Optional<User> findByIdAndDelFalse(Long userId);
     Optional<User> findByIdAndDelFalse(Long userId);
+
+    @Transactional
+    @Modifying
+    @Query("update User u set u.followers = u.followers + ?1 where u.id = ?1")
+    void addFollow(Long userId, int num);
 }
 }

+ 23 - 0
src/main/java/com/izouma/nineth/service/FollowService.java

@@ -3,18 +3,41 @@ package com.izouma.nineth.service;
 import com.izouma.nineth.domain.Follow;
 import com.izouma.nineth.domain.Follow;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.repo.FollowRepo;
 import com.izouma.nineth.repo.FollowRepo;
+import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.JpaUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
+import org.springframework.security.core.parameters.P;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.util.List;
+
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
 public class FollowService {
 public class FollowService {
 
 
     private FollowRepo followRepo;
     private FollowRepo followRepo;
+    private UserRepo   userRepo;
 
 
     public Page<Follow> all(PageQuery pageQuery) {
     public Page<Follow> all(PageQuery pageQuery) {
         return followRepo.findAll(JpaUtils.toSpecification(pageQuery, Follow.class), JpaUtils.toPageRequest(pageQuery));
         return followRepo.findAll(JpaUtils.toSpecification(pageQuery, Follow.class), JpaUtils.toPageRequest(pageQuery));
     }
     }
+
+    public void follow(Long userId, Long to) {
+        List<Follow> list = followRepo.findByUserIdAndFollowUserId(userId, to);
+        if (!list.isEmpty()) return;
+        followRepo.save(Follow.builder()
+                .userId(userId)
+                .followUserId(to)
+                .build());
+        userRepo.addFollow(to, 1);
+    }
+
+    public void unfollow(Long userId, Long to) {
+        List<Follow> list = followRepo.findByUserIdAndFollowUserId(userId, to);
+        if (!list.isEmpty()) {
+            followRepo.deleteAll(list);
+            userRepo.addFollow(to, -list.size());
+        }
+    }
 }
 }

+ 1 - 0
src/main/java/com/izouma/nineth/service/UserService.java

@@ -252,4 +252,5 @@ public class UserService {
         user.setPhone(phone);
         user.setPhone(phone);
         userRepo.save(user);
         userRepo.save(user);
     }
     }
+
 }
 }

+ 15 - 0
src/main/java/com/izouma/nineth/web/UserController.java

@@ -9,6 +9,7 @@ import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.security.Authority;
 import com.izouma.nineth.security.Authority;
 import com.izouma.nineth.security.JwtTokenUtil;
 import com.izouma.nineth.security.JwtTokenUtil;
 import com.izouma.nineth.security.JwtUserFactory;
 import com.izouma.nineth.security.JwtUserFactory;
+import com.izouma.nineth.service.FollowService;
 import com.izouma.nineth.service.UserService;
 import com.izouma.nineth.service.UserService;
 import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.SecurityUtils;
 import com.izouma.nineth.utils.SecurityUtils;
@@ -32,6 +33,7 @@ public class UserController extends BaseController {
     private UserRepo     userRepo;
     private UserRepo     userRepo;
     private UserService  userService;
     private UserService  userService;
     private JwtTokenUtil jwtTokenUtil;
     private JwtTokenUtil jwtTokenUtil;
+    private FollowService followService;
 
 
     @PostMapping("/register")
     @PostMapping("/register")
     public User register(@RequestParam String username,
     public User register(@RequestParam String username,
@@ -132,4 +134,17 @@ public class UserController extends BaseController {
     public void bindPhone(@RequestParam String phone) {
     public void bindPhone(@RequestParam String phone) {
         userService.bindPhone(SecurityUtils.getAuthenticatedUser().getId(), phone);
         userService.bindPhone(SecurityUtils.getAuthenticatedUser().getId(), phone);
     }
     }
+
+    @GetMapping("/{id}/follow")
+    public void follow(@PathVariable Long id) {
+        followService.follow(SecurityUtils.getAuthenticatedUser().getId(), id);
+    }
+
+    @GetMapping("/{id}/unfollow")
+    public void unfollow(@PathVariable Long id) {
+        followService.unfollow(SecurityUtils.getAuthenticatedUser().getId(), id);
+    }
+
 }
 }
+
+