package com.xuqm.im.service; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.xuqm.common.exception.BusinessException; import com.xuqm.im.entity.ImGroupEntity; import com.xuqm.im.repository.ImGroupRepository; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.UUID; @Service public class ImGroupService { private final ImGroupRepository groupRepository; private final ObjectMapper objectMapper; public ImGroupService(ImGroupRepository groupRepository, ObjectMapper objectMapper) { this.groupRepository = groupRepository; this.objectMapper = objectMapper; } public ImGroupEntity create(String appId, String name, String creatorId, List memberIds) { List members = new ArrayList<>(memberIds); if (!members.contains(creatorId)) members.add(creatorId); ImGroupEntity group = new ImGroupEntity(); group.setId(UUID.randomUUID().toString()); group.setAppId(appId); group.setName(name); group.setCreatorId(creatorId); group.setMemberIds(toJson(members)); group.setAdminIds(toJson(List.of(creatorId))); group.setCreatedAt(LocalDateTime.now()); return groupRepository.save(group); } public ImGroupEntity addMember(String groupId, String userId) { ImGroupEntity group = groupRepository.findById(groupId) .orElseThrow(() -> new BusinessException(404, "群组不存在")); List members = fromJson(group.getMemberIds()); if (!members.contains(userId)) { members.add(userId); group.setMemberIds(toJson(members)); groupRepository.save(group); } return group; } public ImGroupEntity removeMember(String groupId, String userId, String operatorId) { ImGroupEntity group = groupRepository.findById(groupId) .orElseThrow(() -> new BusinessException(404, "群组不存在")); List admins = fromJson(group.getAdminIds()); if (!admins.contains(operatorId) && !group.getCreatorId().equals(operatorId)) { throw new BusinessException(403, "无权操作"); } List members = new ArrayList<>(fromJson(group.getMemberIds())); members.remove(userId); group.setMemberIds(toJson(members)); return groupRepository.save(group); } public List listByApp(String appId) { return groupRepository.findByAppId(appId); } private String toJson(List list) { try { return objectMapper.writeValueAsString(list); } catch (Exception e) { return "[]"; } } private List fromJson(String json) { try { return objectMapper.readValue(json, new TypeReference<>() {}); } catch (Exception e) { return new ArrayList<>(); } } }