MetaUserFriendService.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package com.izouma.nineth.service;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.izouma.nineth.domain.*;
  4. import com.izouma.nineth.dto.*;
  5. import com.izouma.nineth.enums.MetaUserFriendOperateType;
  6. import com.izouma.nineth.repo.MetaUserFriendApplyRecordRepo;
  7. import com.izouma.nineth.repo.MetaUserFriendOperateRecordRepo;
  8. import com.izouma.nineth.repo.MetaUserFriendRepo;
  9. import com.izouma.nineth.repo.UserRepo;
  10. import com.izouma.nineth.utils.SecurityUtils;
  11. import lombok.AllArgsConstructor;
  12. import org.apache.commons.collections.CollectionUtils;
  13. import org.springframework.stereotype.Service;
  14. import javax.transaction.Transactional;
  15. import java.time.LocalDateTime;
  16. import java.util.ArrayList;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.Objects;
  20. @Service
  21. @AllArgsConstructor
  22. public class MetaUserFriendService {
  23. private MetaUserFriendRepo metaUserFriendRepo;
  24. private UserRepo userRepo;
  25. private MetaUserFriendApplyRecordRepo metaUserFriendApplyRecordRepo;
  26. private MetaUserFriendApplyRecordService metaUserFriendApplyRecordService;
  27. private MetaUserFriendOperateRecordRepo metaUserFriendOperateRecordRepo;
  28. public MetaRestResult<MetaUserFriendAndApplyDTO> allFriendsAndApply() {
  29. Long userId = SecurityUtils.getAuthenticatedUser().getId();
  30. MetaUserFriendAndApplyDTO metaUserFriendAndApplyDTO = new MetaUserFriendAndApplyDTO();
  31. List<Long> friendIds = metaUserFriendRepo.findFriendIdByUserId(userId);
  32. setMetaUserFriendDTOS(metaUserFriendAndApplyDTO, friendIds);
  33. List<Map<String, String>> map = metaUserFriendApplyRecordRepo.findApplyUserIds(userId);
  34. if (CollectionUtils.isEmpty(map)) {
  35. metaUserFriendAndApplyDTO.setMetaUserFriendApplyDTOS(new ArrayList<>());
  36. return MetaRestResult.returnSuccess(metaUserFriendAndApplyDTO);
  37. }
  38. JSONArray jsonArray = new JSONArray();
  39. jsonArray.addAll(map);
  40. List<MetaUserFriendApplyDTO> metaUserFriendApplyDTOS = jsonArray.toJavaList(MetaUserFriendApplyDTO.class);
  41. setMetaUserFriendApplyDTOS(metaUserFriendAndApplyDTO, metaUserFriendApplyDTOS);
  42. return MetaRestResult.returnSuccess(metaUserFriendAndApplyDTO);
  43. }
  44. private void setMetaUserFriendDTOS(MetaUserFriendAndApplyDTO metaUserFriendAndApplyDTO, List<Long> friendIds) {
  45. List<MetaUserFriendDTO> metaUserFriendDTOS = new ArrayList<>();
  46. if (CollectionUtils.isEmpty(friendIds)) {
  47. metaUserFriendAndApplyDTO.setMetaUserFriendDTOS(metaUserFriendDTOS);
  48. return;
  49. }
  50. friendIds.forEach(friendId -> {
  51. User user = userRepo.findById(friendId).orElse(null);
  52. if (Objects.nonNull(user)) {
  53. metaUserFriendDTOS.add(new MetaUserFriendDTO(friendId, user.getNickname(), user.getAvatar()));
  54. }
  55. });
  56. metaUserFriendAndApplyDTO.setMetaUserFriendDTOS(metaUserFriendDTOS);
  57. }
  58. private void setMetaUserFriendApplyDTOS(MetaUserFriendAndApplyDTO metaUserFriendAndApplyDTO, List<MetaUserFriendApplyDTO> metaUserFriendApplyDTOS) {
  59. if (CollectionUtils.isEmpty(metaUserFriendApplyDTOS)) {
  60. metaUserFriendAndApplyDTO.setMetaUserFriendApplyDTOS(metaUserFriendApplyDTOS);
  61. return;
  62. }
  63. metaUserFriendApplyDTOS.forEach(metaUserFriendApplyDTO -> {
  64. User user = userRepo.findById(metaUserFriendApplyDTO.getUserId()).orElse(null);
  65. if (Objects.nonNull(user)) {
  66. metaUserFriendApplyDTO.setAvatar(user.getAvatar());
  67. metaUserFriendApplyDTO.setNickname(user.getNickname());
  68. }
  69. });
  70. metaUserFriendAndApplyDTO.setMetaUserFriendApplyDTOS(metaUserFriendApplyDTOS);
  71. }
  72. public MetaRestResult<List<MetaUserFriend>> allFriends() {
  73. List<MetaUserFriend> metaUserFriends = metaUserFriendRepo.findByUserIdAndDel(SecurityUtils.getAuthenticatedUser().getId(), false);
  74. metaUserFriends.forEach(metaUserFriend -> {
  75. User user = userRepo.findById(metaUserFriend.getFriendId()).orElse(null);
  76. if (Objects.nonNull(user)) {
  77. metaUserFriend.setFriendAvatar(user.getAvatar());
  78. metaUserFriend.setFriendNickname(user.getNickname());
  79. }
  80. });
  81. return MetaRestResult.returnSuccess(metaUserFriends);
  82. }
  83. public MetaRestResult<List<MetaUserFriendApplyRecord>> allApply() {
  84. List<MetaUserFriendApplyRecord> metaUserFriendApplyRecords = metaUserFriendApplyRecordRepo.findByFriendIdAndOperateTypeAndDel(SecurityUtils.getAuthenticatedUser().getId(), MetaUserFriendOperateType.APPLY, false);
  85. metaUserFriendApplyRecords.forEach(metaUserFriendApplyRecord -> {
  86. User user = userRepo.findById(metaUserFriendApplyRecord.getUserId()).orElse(null);
  87. if (Objects.nonNull(user)) {
  88. metaUserFriendApplyRecord.setUserAvatar(user.getAvatar());
  89. metaUserFriendApplyRecord.setUserNickname(user.getNickname());
  90. }
  91. });
  92. return MetaRestResult.returnSuccess(metaUserFriendApplyRecords);
  93. }
  94. public MetaRestResult<MetaUserFriendApplyRecord> apply(MetaUserFriendApplyRecord metaUserFriendApplyRecord) {
  95. return metaUserFriendApplyRecordService.apply(metaUserFriendApplyRecord);
  96. }
  97. public MetaRestResult<Void> delApply(Long applyRecordId) {
  98. MetaUserFriendApplyRecord metaUserFriendApplyRecord = metaUserFriendApplyRecordRepo.findById(applyRecordId).orElse(null);
  99. if (Objects.isNull(metaUserFriendApplyRecord)) {
  100. return MetaRestResult.returnError("申请单不存在");
  101. }
  102. if (!metaUserFriendApplyRecord.getFriendId().equals(SecurityUtils.getAuthenticatedUser().getId())) {
  103. return MetaRestResult.returnError("该申请单不属于你");
  104. }
  105. metaUserFriendApplyRecord.setDel(true);
  106. metaUserFriendApplyRecordRepo.save(metaUserFriendApplyRecord);
  107. return MetaRestResult.returnSuccess("删除成功");
  108. }
  109. @Transactional
  110. public MetaRestResult<Void> operatingApply(Long metaUserFriendApplyRecordId, MetaUserFriendOperateType operateType) {
  111. if (Objects.isNull(metaUserFriendApplyRecordId)) {
  112. return MetaRestResult.returnError("Illegal parameter : metaUserFriendApplyRecordId can not be null");
  113. }
  114. // 判断申请记录
  115. MetaUserFriendApplyRecord metaUserFriendApplyRecord = metaUserFriendApplyRecordRepo.findById(metaUserFriendApplyRecordId).orElse(null);
  116. if (Objects.isNull(metaUserFriendApplyRecord)) {
  117. return MetaRestResult.returnError("暂无申请信息");
  118. }
  119. if (!metaUserFriendApplyRecord.getFriendId().equals(SecurityUtils.getAuthenticatedUser().getId())) {
  120. return MetaRestResult.returnError("当前用户不可操作该申请单");
  121. }
  122. if (!MetaUserFriendOperateType.APPLY.equals(metaUserFriendApplyRecord.getOperateType())) {
  123. return MetaRestResult.returnError("当前申请单已经处理过,不可重复处理");
  124. }
  125. if (MetaUserFriendOperateType.PASS.equals(operateType)) {
  126. MetaUserFriend myExist = metaUserFriendRepo.findByUserIdAndFriendIdAndDel(metaUserFriendApplyRecord.getUserId(), metaUserFriendApplyRecord.getFriendId(), false);
  127. MetaUserFriend friendExist = metaUserFriendRepo.findByUserIdAndFriendIdAndDel(metaUserFriendApplyRecord.getFriendId(), metaUserFriendApplyRecord.getUserId(), false);
  128. // 双方互为好友关系,不可添加
  129. if (Objects.nonNull(myExist) && Objects.nonNull(friendExist)) {
  130. MetaServiceResult result = metaUserFriendApplyRecordService.operatingApply(metaUserFriendApplyRecord, MetaUserFriendOperateType.CANCEL);
  131. if (!result.isSuccess()) {
  132. return MetaRestResult.returnError(result.getMessage());
  133. }
  134. return MetaRestResult.returnError(String.format("用户[%S]已经是您好友", metaUserFriendApplyRecord.getFriendId()));
  135. }
  136. // 己方关系为空,添加己方关系
  137. if (Objects.isNull(myExist)) {
  138. MetaUserFriend my = new MetaUserFriend();
  139. my.setUserId(metaUserFriendApplyRecord.getUserId());
  140. my.setFriendId(metaUserFriendApplyRecord.getFriendId());
  141. my.setAddTime(LocalDateTime.now());
  142. metaUserFriendRepo.save(my);
  143. }
  144. // 好友方好友关系为空,添加好友方好友关系
  145. if (Objects.isNull(friendExist)) {
  146. MetaUserFriend friend = new MetaUserFriend();
  147. friend.setUserId(metaUserFriendApplyRecord.getFriendId());
  148. friend.setFriendId(metaUserFriendApplyRecord.getUserId());
  149. friend.setAddTime(LocalDateTime.now());
  150. metaUserFriendRepo.save(friend);
  151. }
  152. }
  153. MetaServiceResult result = metaUserFriendApplyRecordService.operatingApply(metaUserFriendApplyRecord, operateType);
  154. if (!result.isSuccess()) {
  155. return MetaRestResult.returnError(result.getMessage());
  156. }
  157. return MetaRestResult.returnSuccess("操作成功");
  158. }
  159. @Transactional
  160. public MetaRestResult<Void> del(Long friendId) {
  161. Long userId = SecurityUtils.getAuthenticatedUser().getId();
  162. // 判断是否为好友
  163. MetaUserFriend metaUserFriend = metaUserFriendRepo.findByUserIdAndFriendIdAndDel(userId, friendId, false);
  164. if (Objects.isNull(metaUserFriend)) {
  165. return MetaRestResult.returnError(String.format("删除失败,用户[%S]不是你的好友", friendId));
  166. }
  167. // 删除己方好友关系
  168. metaUserFriendRepo.delFriends(userId, friendId);
  169. // 删除好友方好友关系
  170. metaUserFriendRepo.delFriends(friendId, userId);
  171. // 保存操作记录
  172. LocalDateTime now = LocalDateTime.now();
  173. MetaUserFriendOperateRecord metaUserFriendOperateRecord = new MetaUserFriendOperateRecord();
  174. metaUserFriendOperateRecord.setUserId(userId);
  175. metaUserFriendOperateRecord.setFriendId(friendId);
  176. metaUserFriendOperateRecord.setOperateType(MetaUserFriendOperateType.DEL);
  177. metaUserFriendOperateRecord.setOperatingTime(now);
  178. metaUserFriendOperateRecord.setRemark(String.format("用户[%S]于[%S]删除好友[%S],此操作为双向删除", userId, now, friendId));
  179. metaUserFriendOperateRecordRepo.save(metaUserFriendOperateRecord);
  180. return MetaRestResult.returnSuccess("删除好友成功");
  181. }
  182. }