Ver código fonte

feat(family): 新增 renameFamily 服务(仅家庭管理员可改家庭名称)

Agnes Agent 1 semana atrás
pai
commit
0d6b11e3cc

+ 36 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/FamilyMemberService.java

@@ -1060,6 +1060,42 @@ vo.setIsSelf(viewerMember != null && viewerMember.getId().equals(fm.getId()));
         }
     }
 
+    /**
+     * 修改家庭名称(仅家庭管理员:家庭创建者或成员记录 is_admin=1)。
+     * 返回更新后的家庭名称。
+     */
+    public String renameFamily(Long userId, String name) {
+        if (userId == null || userId <= 0) {
+            throw new IllegalArgumentException("请先登录");
+        }
+        String newName = name == null ? "" : name.trim();
+        if (newName.isEmpty()) {
+            throw new IllegalArgumentException("家庭名称不能为空");
+        }
+        if (newName.length() > 20) {
+            throw new IllegalArgumentException("家庭名称不能超过20个字");
+        }
+        User operator = userMapper.selectById(userId);
+        if (operator == null) {
+            throw new IllegalArgumentException("用户不存在");
+        }
+        Long familyId = operator.getFamilyId();
+        if (familyId == null) {
+            throw new IllegalArgumentException("请先创建或加入家庭");
+        }
+        if (!isFamilyAdminOperator(userId, familyId)) {
+            throw new IllegalArgumentException("仅家庭管理员可修改家庭名称");
+        }
+        Family family = familyMapper.selectById(familyId);
+        if (family == null) {
+            throw new IllegalArgumentException("家庭不存在");
+        }
+        family.setName(newName);
+        family.setUpdatedAt(new Date());
+        familyMapper.updateById(family);
+        return newName;
+    }
+
     /**
      * 更新家庭主账号(users 表成员)的基本资料。
      * 家庭主账号只存在于 users 表(family_id + role=parent),无 family_members 记录,

+ 63 - 0
cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberServiceRenameTest.java

@@ -0,0 +1,63 @@
+package com.etotem.cfc.unit;
+
+import com.etotem.cfc.entity.Family;
+import com.etotem.cfc.entity.FamilyMember;
+import com.etotem.cfc.entity.User;
+import com.etotem.cfc.mapper.FamilyMapper;
+import com.etotem.cfc.mapper.FamilyMemberMapper;
+import com.etotem.cfc.mapper.UserMapper;
+import com.etotem.cfc.service.FamilyMemberService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Arrays;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+public class FamilyMemberServiceRenameTest {
+
+    @Mock private FamilyMemberMapper familyMemberMapper;
+    @Mock private UserMapper userMapper;
+    @Mock private FamilyMapper familyMapper;
+
+    @InjectMocks private FamilyMemberService service;
+
+    private User user(Long id, Long familyId) {
+        User u = new User(); u.setId(id); u.setFamilyId(familyId); return u;
+    }
+
+    @Test void rename_管理员_成功更新() {
+        when(userMapper.selectById(10L)).thenReturn(user(10L, 7L));
+        Family f = new Family(); f.setId(7L); f.setName("旧家庭"); f.setCreatorId(10L);
+        when(familyMapper.selectById(7L)).thenReturn(f);
+
+        String out = service.renameFamily(10L, "  新家庭  ");
+        assertEquals("新家庭", out);
+        verify(familyMapper).updateById(argThat(fam -> "新家庭".equals(fam.getName())));
+    }
+
+    @Test void rename_非管理员_抛错() {
+        when(userMapper.selectById(20L)).thenReturn(user(20L, 7L));
+        Family f = new Family(); f.setId(7L); f.setName("旧家庭"); f.setCreatorId(10L);
+        when(familyMapper.selectById(7L)).thenReturn(f);
+        when(familyMemberMapper.selectCount(any(LambdaQueryWrapper.class))).thenReturn(0L);
+
+        assertThrows(RuntimeException.class, () -> service.renameFamily(20L, "新家庭"));
+    }
+
+    @Test void rename_空白名_抛错() {
+        assertThrows(RuntimeException.class, () -> service.renameFamily(10L, "   "));
+    }
+
+    @Test void rename_超长名_抛错() {
+        assertThrows(RuntimeException.class, () -> service.renameFamily(10L, "一二三四五六七八九十一二三四五六七八九十一"));
+    }
+}