This commit is contained in:
owenchen committed 2026-10-21 15:05:55 +08:00
1 parent fd67fa8f63
commit 211d2cd253
31 files changed
+1830 -454

No files matched your search

@@ -9,6 +9,8 @@ using CloudBuilder.Master.Data;
using CloudBuilder.Core.Service;
using CloudBuilder.Security.Utility;
using CloudBuilder.Security.Service;
using CloudBuilder.Security.Entity;
using CloudBuilder.Security.Policy;
using Microsoft.Extensions.DependencyInjection;
namespace CloudBuilder.Master.Service
{
@@ -33,6 +35,7 @@ namespace CloudBuilder.Master.Service
data.FamilyGroup = familyGroup;
data.IsAdd = familyGroup.AddIndc == YesNoPolicy.YES;
data.IsOpen = familyGroup.OpenIndc == YesNoPolicy.YES;
data.IsOpenDir = familyGroup.OpenDirIndc == YesNoPolicy.YES;
@@ -66,6 +69,13 @@ namespace CloudBuilder.Master.Service
if (users == null || users.Length == 0) return data;
// 成员视图只有用户名/中文名:手机号与头像在 security_user 上,按本群成员用户名集合一次取回
string[] memberUserNames = users.Select(x => x.UserName).Where(x => !string.IsNullOrEmpty(x)).Distinct().ToArray();
IRepository<SecurityUserEntity> repositorySecurityUser = repository.GetRepository<IRepository<SecurityUserEntity>>();
SecurityUserEntity[] memberUsers = memberUserNames.Length > 0
? repositorySecurityUser.DetachedEntities.Where(x => memberUserNames.AsQueryable().Contains(x.UserName)).ToArray()
: new SecurityUserEntity[0];
bool isManager = false;
bool isUser = false;
IRepository<FamilyGroupManagerEntity> repositoryFamilyGroupManager = repository.GetRepository<IRepository<FamilyGroupManagerEntity>>();
@@ -73,7 +83,11 @@ namespace CloudBuilder.Master.Service
if (fgms != null && fgms.Length > 0)
{
data.FamilyGroupManagers = fgms.Select(x => new FamilyGroupManagerDisplayData(x)
{ UserLocalName = users.Where(y => y.UserName == x.UserName).FirstOrDefault()!.UserLocalName }).ToArray();
{
UserLocalName = users.Where(y => y.UserName == x.UserName).FirstOrDefault()!.UserLocalName,
UserMobile = memberUsers.Where(y => y.UserName == x.UserName).FirstOrDefault()?.UserMobile ?? "",
AvatarUrl = FileTypePolicy.PackAvatarUrl(service, UploadFolderPolicy.USER_AVATAR, memberUsers.Where(y => y.UserName == x.UserName).FirstOrDefault()?.UserIconImgPath ?? "") ?? "",
}).ToArray();
//如果不是管理员,则只能看到有权限的目录
@@ -91,19 +105,33 @@ namespace CloudBuilder.Master.Service
IRepository<FamilyGroupPermissionEntity> repositoryFamilyGroupPermission = repository.GetRepository<IRepository<FamilyGroupPermissionEntity>>();
FamilyGroupPermissionEntity[] fgps = repositoryFamilyGroupPermission.DetachedEntities.Where(x => x.FamilyName == key).ToArray();
// 剔除孤儿权限行(目录已删/新建目录尚未拿到编号导致 FolderName 为空):
// 视图按 folder_name 关联不到就取不到目录名,前端也不应再把它提交回来
string[] currentFolderNames = folders.Select(x => x.FolderName).ToArray();
fgps = fgps.Where(x => !string.IsNullOrEmpty(x.FolderName) && currentFolderNames.Contains(x.FolderName)).ToArray();
if (fgps != null && fgps.Length > 0)
{
data.FamilyGroupPermissions = fgps.Select(x => new FamilyGroupPermissionDisplayData(x)
{
UserLocalName = users!.Where(y => y.UserName == x.UserName).FirstOrDefault()!.UserLocalName,
FolderLocalName = ufs!.Where(y => y.UserName == x.UserName && y.FolderName == x.FolderName).FirstOrDefault()!.FolderLocalName
// 人员/目录均可能是历史脏数据(成员已移除、目录已删):兜底回退用户名/目录编号,不再空引用
UserLocalName = users!.Where(y => y.UserName == x.UserName).FirstOrDefault()?.UserLocalName ?? x.UserName,
FolderLocalName = ufs!.Where(y => y.UserName == x.UserName && y.FolderName == x.FolderName).FirstOrDefault()?.FolderLocalName ?? x.FolderName
}).ToArray();
if (!isManager)
{
FamilyGroupPermissionDisplayData[] ps = data.FamilyGroupPermissions.Where(x => x.UserName == service.UserId).ToArray();
if (ps == null || ps.Length == 0)
if (familyGroup.OpenDirIndc == YesNoPolicy.YES)
{
// 公开成员目录权限:所有目录对全体成员开放(与管理员视角、DmsFileService 的 PermissionIndc 同一出口)
data.FamilyGroupFolders = folders!.Select(x => new FamilyGroupFolderDisplayData(x)
{
IsSharePermission = true,
}).ToArray();
}
else if (ps == null || ps.Length == 0)
{
data.FamilyGroupFolders = folders!.Select(x => new FamilyGroupFolderDisplayData(x)
{
@@ -144,7 +172,11 @@ namespace CloudBuilder.Master.Service
fgms = repositoryFamilyGroupManager.DetachedEntities.Where(x => x.FamilyName == key && x.ValidIndc == YesNoPolicy.NO).ToArray();
if (fgms != null && fgms.Length > 0)
data.FamilyGroupRequests = fgms.Select(x => new FamilyGroupManagerDisplayData(x)
{ UserLocalName = users!.Where(y => y.UserName == x.UserName).FirstOrDefault()!.UserLocalName }).ToArray();
{
UserLocalName = users!.Where(y => y.UserName == x.UserName).FirstOrDefault()?.UserLocalName ?? x.UserName,
UserMobile = memberUsers.Where(y => y.UserName == x.UserName).FirstOrDefault()?.UserMobile ?? "",
AvatarUrl = FileTypePolicy.PackAvatarUrl(service, UploadFolderPolicy.USER_AVATAR, memberUsers.Where(y => y.UserName == x.UserName).FirstOrDefault()?.UserIconImgPath ?? "") ?? "",
}).ToArray();
//管理员有分享权限
data.FamilyGroupFolders = folders!.Select(x => new FamilyGroupFolderDisplayData(x)
@@ -159,10 +191,10 @@ namespace CloudBuilder.Master.Service
if (fgms != null && fgms.Length > 0)
{
data.FamilyGroupManagers = fgms.Where(x => x.ValidIndc == YesNoPolicy.YES)!.Select(x => new FamilyGroupManagerDisplayData(x)
{ UserLocalName = users!.Where(y => y.UserName == x.UserName).FirstOrDefault()!.UserLocalName }).ToArray();
{ UserLocalName = users!.Where(y => y.UserName == x.UserName).FirstOrDefault()?.UserLocalName ?? x.UserName }).ToArray();
data.FamilyGroupRequests = fgms.Where(x => x.ValidIndc == YesNoPolicy.NO)!.Select(x => new FamilyGroupManagerDisplayData(x)
{ UserLocalName = users!.Where(y => y.UserName == x.UserName).FirstOrDefault()!.UserLocalName }).ToArray();
{ UserLocalName = users!.Where(y => y.UserName == x.UserName).FirstOrDefault()?.UserLocalName ?? x.UserName }).ToArray();
}
}
@@ -347,6 +379,7 @@ namespace CloudBuilder.Master.Service
familyGroup.AddIndc = data.IsAdd ? YesNoPolicy.YES : YesNoPolicy.NO;
familyGroup.OpenIndc = data.IsOpen ? YesNoPolicy.YES : YesNoPolicy.NO;
familyGroup.OpenDirIndc = data.IsOpenDir ? YesNoPolicy.YES : YesNoPolicy.NO;
repository.InsertNow(familyGroup);
@@ -485,11 +518,18 @@ namespace CloudBuilder.Master.Service
if (permissions == null || permissions.Length == 0) return;
// 本群当前有效目录编号:新建目录在 SaveFamilyGroupFolders 之前还没有编号(FolderName 为空),
// 这种权限行插进去就是查不到目录名的孤儿(旧目录被删后前端残留的同理),一律不落库
IRepository<FamilyGroupFolderEntity> repositoryFamilyGroupFolder = repository.GetRepository<IRepository<FamilyGroupFolderEntity>>();
string[] validFolderNames = repositoryFamilyGroupFolder.Entities.Where(x => x.FamilyName == familyName).Select(x => x.FolderName).ToArray();
foreach (FamilyGroupPermissionEntity dto in permissions)
{
//原来不存在的插入
if (!string.IsNullOrEmpty(dto.CreatedBy)) continue;
if (string.IsNullOrEmpty(dto.FolderName) || !validFolderNames.Contains(dto.FolderName)) continue;
ValidateHelper.Validate(service, dto, FamilyGroupPermissionEntity.DB_NAME_FAMILY_GROUP_PERMISSION);
repositoryFamilyGroupPermission.InsertNow(new FamilyGroupPermissionEntity()
@@ -566,6 +606,7 @@ namespace CloudBuilder.Master.Service
familyGroup.AddIndc = data.IsAdd ? YesNoPolicy.YES : YesNoPolicy.NO;
familyGroup.OpenIndc = data.IsOpen ? YesNoPolicy.YES : YesNoPolicy.NO;
familyGroup.OpenDirIndc = data.IsOpenDir ? YesNoPolicy.YES : YesNoPolicy.NO;
repository.UpdateNow(familyGroup);