ow
This commit is contained in:
1 parent
fd67fa8f63
commit
211d2cd253
31 files changed
+1830
-454
No files matched your search
@@ -275,6 +275,24 @@ namespace CloudBuilder.Master.Service
|
||||
FamilyGroupPermissionEntity[] permissionEntities = repositoryFamilyGroupPermission.DetachedEntities.Where(x => x.UserName == service.UserId).ToArray();
|
||||
FamilyFolderFavoriteEntity[] favorites = repositoryFamilyFolderFavorite.DetachedEntities.Where(x => x.UserName == service.UserId).ToArray();
|
||||
|
||||
// 管理员权限的唯一出口:本人任管理员的群,所有目录一律有权限(与 FamilyGroupService.FindByKey 管理员视角 IsSharePermission 全 Y 同口径)。
|
||||
// 权限表只记普通成员的授权记录,管理员不逐目录补录——否则别的管理员建的新目录会漏锁(本接口是共享大厅/文件页/共享目标选择器共用的PermissionIndc判定点)
|
||||
IRepository<FamilyGroupManagerEntity> repositoryFamilyGroupManager = repository.GetRepository<IRepository<FamilyGroupManagerEntity>>();
|
||||
string[] managerFamilyNames = repositoryFamilyGroupManager.DetachedEntities
|
||||
.Where(x => x.UserName == service.UserId && x.ManagerIndc == YesNoPolicy.YES && x.ValidIndc == YesNoPolicy.YES)
|
||||
.Select(x => x.FamilyName).Distinct().ToArray();
|
||||
|
||||
// 群组开启「公开成员目录权限」(open_dir_indc=Y):群内所有目录对所有成员开放,与管理员放行同一出口
|
||||
string[] memberFamilyNames = repositoryFamilyGroupManager.DetachedEntities
|
||||
.Where(x => x.UserName == service.UserId && x.ValidIndc == YesNoPolicy.YES)
|
||||
.Select(x => x.FamilyName).Distinct().ToArray();
|
||||
IRepository<FamilyGroupEntity> repositoryFamilyGroup = repository.GetRepository<IRepository<FamilyGroupEntity>>();
|
||||
string[] openDirFamilyNames = memberFamilyNames.Length > 0
|
||||
? repositoryFamilyGroup.DetachedEntities
|
||||
.Where(x => x.OpenDirIndc == YesNoPolicy.YES && memberFamilyNames.AsQueryable().Contains(x.FamilyName))
|
||||
.Select(x => x.FamilyName).ToArray()
|
||||
: new string[0];
|
||||
|
||||
string err = null;
|
||||
try
|
||||
{
|
||||
@@ -293,7 +311,12 @@ namespace CloudBuilder.Master.Service
|
||||
|
||||
foreach (var item in list)
|
||||
{
|
||||
if (permissionEntities != null && permissionEntities.Length > 0)
|
||||
if (managerFamilyNames.Contains(item.FamilyName) || openDirFamilyNames.Contains(item.FamilyName))
|
||||
{
|
||||
// 管理员 / 群开放全部目录:全目录放行
|
||||
item.PermissionIndc = YesNoPolicy.YES;
|
||||
}
|
||||
else if (permissionEntities != null && permissionEntities.Length > 0)
|
||||
{
|
||||
foreach (var p in permissionEntities)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in new issue
Block a user