|
@@ -1,47 +1,41 @@
|
|
|
package com.sikey.wa04.business.application.service.user;
|
|
|
|
|
|
-import cn.hutool.core.collection.CollectionUtil;
|
|
|
import cn.hutool.core.util.RandomUtil;
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
import com.google.common.cache.Cache;
|
|
|
import com.google.common.cache.CacheBuilder;
|
|
|
import com.sikey.wa04.business.application.converter.MessageConverter;
|
|
|
import com.sikey.wa04.business.domain.adapter.*;
|
|
|
-import com.sikey.wa04.business.domain.entity.*;
|
|
|
+import com.sikey.wa04.business.domain.entity.Child;
|
|
|
+import com.sikey.wa04.business.domain.entity.ChildId;
|
|
|
+import com.sikey.wa04.business.domain.entity.MessageCenter;
|
|
|
import com.sikey.wa04.business.domain.entity.message.Message;
|
|
|
import com.sikey.wa04.business.domain.entity.message.MessageId;
|
|
|
import com.sikey.wa04.business.domain.usecase.ChildIdFactory;
|
|
|
import com.sikey.wa04.business.infrastructure.adapter.RabbitMQMessaging;
|
|
|
import com.sikey.wa04.business.infrastructure.adapter.RedisMessageIdIncrementingAdapter;
|
|
|
-import com.sikey.wa04.business.infrastructure.dto.model.ChildModel;
|
|
|
import com.sikey.wa04.business.infrastructure.dto.model.ContactModel;
|
|
|
import com.sikey.wa04.business.infrastructure.dto.model.DeviceModel;
|
|
|
import com.sikey.wa04.business.infrastructure.dto.request.contact.AddFriendRequest;
|
|
|
import com.sikey.wa04.business.infrastructure.dto.request.contact.GenerateFriendCodeRequest;
|
|
|
+import com.sikey.wa04.business.infrastructure.dto.response.contact.AddFriendResponse;
|
|
|
import com.sikey.wa04.business.infrastructure.dto.response.contact.GenerateFriendCodeResponse;
|
|
|
import com.sikey.wa04.business.infrastructure.repository.ChildRepository;
|
|
|
import com.sikey.wa04.business.infrastructure.repository.ContactRepository;
|
|
|
import com.sikey.wa04.business.infrastructure.repository.DeviceRepository;
|
|
|
import com.sikey.wa04.common.dto.header.GenericManufacturerHeader;
|
|
|
import com.sikey.wa04.common.dto.message.AddFriendNoticeMessage;
|
|
|
-import com.sikey.wa04.common.enums.ContactRole;
|
|
|
-import com.sikey.wa04.common.enums.MessageCenterType;
|
|
|
-import com.sikey.wa04.common.enums.MessageType;
|
|
|
-import com.sikey.wa04.common.enums.UserType;
|
|
|
+import com.sikey.wa04.common.enums.*;
|
|
|
import jakarta.annotation.Resource;
|
|
|
import jakarta.transaction.Transactional;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
-import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.time.Instant;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Optional;
|
|
|
-import java.util.Set;
|
|
|
+import java.util.*;
|
|
|
import java.util.concurrent.ConcurrentMap;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
@@ -146,7 +140,6 @@ public class FriendService {
|
|
|
return new GenerateFriendCodeResponse(friendCode);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* 添加好友
|
|
|
*
|
|
@@ -154,59 +147,83 @@ public class FriendService {
|
|
|
* @throws Exception 异常
|
|
|
*/
|
|
|
@Transactional
|
|
|
- public void addFriend(AddFriendRequest request) throws Exception {
|
|
|
- ConcurrentMap<String, String> cacheCodes = friendCodeCache.asMap();
|
|
|
-
|
|
|
+ public AddFriendResponse addFriend(AddFriendRequest request) {
|
|
|
String ticket = null;
|
|
|
- Set<String> keys = cacheCodes.keySet();
|
|
|
- for (String key : keys) {
|
|
|
- Optional<String> friendCodeOptional = Optional.ofNullable(cacheCodes.getOrDefault(key, null));
|
|
|
- if (friendCodeOptional.isEmpty()) {
|
|
|
- continue;
|
|
|
+ ChildId passiveChildId;
|
|
|
+ Child passiveChild;
|
|
|
+ Child activeChild;
|
|
|
+ try {
|
|
|
+ ConcurrentMap<String, String> cacheCodes = friendCodeCache.asMap();
|
|
|
+
|
|
|
+ Set<String> keys = cacheCodes.keySet();
|
|
|
+ for (String key : keys) {
|
|
|
+ Optional<String> friendCodeOptional = Optional.ofNullable(cacheCodes.getOrDefault(key, null));
|
|
|
+ if (friendCodeOptional.isEmpty()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ String friendCode = friendCodeOptional.get();
|
|
|
+ if (request.getCode().equals(friendCode)) {
|
|
|
+ ticket = key;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- String friendCode = friendCodeOptional.get();
|
|
|
- if (request.getCode().equals(friendCode)) {
|
|
|
- ticket = key;
|
|
|
+ // 判断好友码是否存在,如果 ticket 存在 则开始执行下面的逻辑
|
|
|
+ if (ticket == null) {
|
|
|
+ AddFriendResponse resp = new AddFriendResponse().setResultType(AddFriendResultType.FRIEND_CODE_NOT_EXIST.getValue());
|
|
|
+ log.info("[addFriend] JSONUtil resp:{}", JSONUtil.toJsonPrettyStr(resp));
|
|
|
+ log.info("[addFriend] resp:{}", resp);
|
|
|
+ log.info("[addFriend] resp.toString:{}", resp.toString());
|
|
|
+ return resp;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- // 如果 ticket 存在 则开始执行下面的逻辑
|
|
|
- if (ticket == null) {
|
|
|
- throw new RuntimeException("好友码不存在");
|
|
|
- }
|
|
|
+ // 获取 被动添加 小孩信息
|
|
|
+ passiveChildId = deviceBindStateAdapter.getBinder(ticket);
|
|
|
+ passiveChild = childQueryAdapter.findByChildId(passiveChildId);
|
|
|
+ // 获取 主动添加 小孩信息
|
|
|
+ activeChild = childQueryAdapter.findByChildId(ChildIdFactory.create(request.getId()));
|
|
|
|
|
|
- // 获取双方小孩信息
|
|
|
- ChildId passiveChildId = deviceBindStateAdapter.getBinder(ticket);
|
|
|
- Child passiveChild = childQueryAdapter.findByChildId(passiveChildId);
|
|
|
- Child activeChild = childQueryAdapter.findByChildId(ChildIdFactory.create(request.getId()));
|
|
|
-
|
|
|
- // 向被加用户的好友列表中添加好友
|
|
|
- ContactModel passiveContactModel = new ContactModel();
|
|
|
- passiveContactModel.setChildId(passiveChildId.getId())
|
|
|
- .setRefId(request.getId())
|
|
|
- .setRefRole(ContactRole.FRIEND.getValue())
|
|
|
- .setRefType(UserType.CHILD.getValue())
|
|
|
- .setRemarkName(activeChild.getName())
|
|
|
- .setRemarkAvatar(activeChild.getAvatar());
|
|
|
- contactRepository.save(passiveContactModel);
|
|
|
-
|
|
|
- // 向发起用户的好友列表中添加好友
|
|
|
- ContactModel activeContactModel = new ContactModel();
|
|
|
- activeContactModel.setChildId(activeChild.getId())
|
|
|
- .setRefId(passiveChildId.getId())
|
|
|
- .setRefRole(ContactRole.FRIEND.getValue())
|
|
|
- .setRefType(UserType.CHILD.getValue())
|
|
|
- .setRemarkName(passiveChild.getName())
|
|
|
- .setRemarkAvatar(passiveChild.getAvatar());
|
|
|
- contactRepository.save(activeContactModel);
|
|
|
-
|
|
|
- friendCodeCache.invalidate(ticket);
|
|
|
-
|
|
|
- // 更新家长通讯录中的手表儿童昵称等信息
|
|
|
- contactRepository.updateContactByChildId(passiveChild.getName(), passiveChild.getAvatar(), Instant.now(), activeChild.getId(), passiveChildId.getId());
|
|
|
-
|
|
|
- log.info("添加好友成功, ticket: {}", ticket);
|
|
|
+ //判断是否添加自己为好友
|
|
|
+ if (Objects.equals(activeChild.getId(), passiveChild.getId())) {
|
|
|
+ return new AddFriendResponse().setResultType(AddFriendResultType.ADD_MYSELF_FRIEND.getValue());
|
|
|
+ }
|
|
|
+
|
|
|
+ //判断是否重复添加好友 查询主动添加的小孩的通讯录中是否有被动添加的小孩了
|
|
|
+ ContactModel contactModel = contactRepository.findByChildIdAndRefId(request.getId(), passiveChildId.getId());
|
|
|
+ if (Objects.nonNull(contactModel)) {
|
|
|
+ return new AddFriendResponse().setResultType(AddFriendResultType.FRIEND_REPEAT.getValue());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 向被加用户的好友列表中添加好友
|
|
|
+ ContactModel passiveContactModel = new ContactModel();
|
|
|
+ passiveContactModel.setChildId(passiveChildId.getId())
|
|
|
+ .setRefId(request.getId())
|
|
|
+ .setRefRole(ContactRole.FRIEND.getValue())
|
|
|
+ .setRefType(UserType.CHILD.getValue())
|
|
|
+ .setRemarkName(activeChild.getName())
|
|
|
+ .setRemarkAvatar(activeChild.getAvatar());
|
|
|
+ contactRepository.save(passiveContactModel);
|
|
|
+
|
|
|
+ // 向发起用户的好友列表中添加好友
|
|
|
+ ContactModel activeContactModel = new ContactModel();
|
|
|
+ activeContactModel.setChildId(activeChild.getId())
|
|
|
+ .setRefId(passiveChildId.getId())
|
|
|
+ .setRefRole(ContactRole.FRIEND.getValue())
|
|
|
+ .setRefType(UserType.CHILD.getValue())
|
|
|
+ .setRemarkName(passiveChild.getName())
|
|
|
+ .setRemarkAvatar(passiveChild.getAvatar());
|
|
|
+ contactRepository.save(activeContactModel);
|
|
|
+
|
|
|
+ friendCodeCache.invalidate(ticket);
|
|
|
+
|
|
|
+ // 更新家长通讯录中的手表儿童昵称等信息
|
|
|
+ contactRepository.updateContactByChildId(passiveChild.getName(), passiveChild.getAvatar(), Instant.now(), activeChild.getId(), passiveChildId.getId());
|
|
|
+
|
|
|
+ log.info("添加好友成功, ticket: {}", ticket);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("AddFriend failed error: Id:{}; ", request.getId(), e);
|
|
|
+ return new AddFriendResponse().setResultType(AddFriendResultType.FAILED.getValue());
|
|
|
+ }
|
|
|
|
|
|
// 消息中心
|
|
|
String finalTicket = ticket;
|
|
@@ -235,8 +252,8 @@ public class FriendService {
|
|
|
deviceRepository.updateVersionAndModelById(deviceModel.getId(), softWareVersion, model);
|
|
|
});
|
|
|
|
|
|
- GenericManufacturerHeader genericManufacturerHeader = request.getHeaders();
|
|
|
// 添加好友加过通知消息
|
|
|
+ GenericManufacturerHeader genericManufacturerHeader = request.getHeaders();
|
|
|
myTaskExecutor.execute(() -> {
|
|
|
// 向被加用户和发起用户发送加好友成功的通知消息
|
|
|
AddFriendNoticeMessage.AddFriendNoticeContent content = new AddFriendNoticeMessage.AddFriendNoticeContent()
|
|
@@ -268,6 +285,7 @@ public class FriendService {
|
|
|
publish(genericManufacturerHeader, activeChildMessage);
|
|
|
});
|
|
|
|
|
|
+ return new AddFriendResponse().setResultType(AddFriendResultType.SUCC.getValue());
|
|
|
}
|
|
|
|
|
|
private void publish(GenericManufacturerHeader headers, Message message) {
|