Skip to content

Commit b94b442

Browse files
committed
feat: 完善文档权限检查,支持团队共享权限验证
功能增强: - DocumentService 添加团队成员仓储依赖 (TeamMemberRepository) - 完善 hasAccess 方法: * 保留原有的所有者和直接分享检查 * 新增团队分享权限检查 * 验证用户是否为团队成员 * 支持通过团队间接访问文档 - 完善 canEdit 方法: * 保留原有的所有者和直接编辑权限检查 * 新增团队编辑权限检查 * 验证用户是否为有编辑权限的团队成员 * 支持通过团队间接编辑文档 技术实现: - 使用 TeamMemberId 复合主键查询团队成员关系 - 使用 Stream API 过滤团队分享记录 - 权限检查逻辑:所有者 > 直接分享 > 团队分享 修改文件: - src/main/java/com/halolight/service/DocumentService.java 新增导入: - com.halolight.domain.entity.TeamMember - com.halolight.domain.entity.id.TeamMemberId - com.halolight.domain.repository.TeamMemberRepository
1 parent f65fa12 commit b94b442

File tree

1 file changed

+43
-8
lines changed

1 file changed

+43
-8
lines changed

src/main/java/com/halolight/service/DocumentService.java

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
import com.halolight.domain.entity.DocumentShare;
55
import com.halolight.domain.entity.DocumentTag;
66
import com.halolight.domain.entity.Tag;
7+
import com.halolight.domain.entity.TeamMember;
78
import com.halolight.domain.entity.User;
89
import com.halolight.domain.entity.id.DocumentTagId;
10+
import com.halolight.domain.entity.id.TeamMemberId;
911
import com.halolight.domain.repository.DocumentRepository;
1012
import com.halolight.domain.repository.DocumentShareRepository;
1113
import com.halolight.domain.repository.TagRepository;
14+
import com.halolight.domain.repository.TeamMemberRepository;
1215
import com.halolight.domain.repository.UserRepository;
1316
import com.halolight.dto.UserDTO;
1417
import com.halolight.dto.UserMapper;
@@ -43,6 +46,7 @@ public class DocumentService {
4346
private final DocumentShareRepository documentShareRepository;
4447
private final TagRepository tagRepository;
4548
private final UserRepository userRepository;
49+
private final TeamMemberRepository teamMemberRepository;
4650
private final UserMapper userMapper;
4751

4852
/**
@@ -430,14 +434,26 @@ private boolean hasAccess(Document document, String userId) {
430434
return true;
431435
}
432436

433-
// Check if document is shared with user
437+
// Check if document is shared directly with user
434438
if (documentShareRepository.existsByDocumentIdAndSharedWithId(document.getId(), userId)) {
435439
return true;
436440
}
437441

438-
// Check if document is shared with user's teams
439-
// TODO: Implement team membership check when TeamMember repository is available
440-
// For now, assuming team sharing is handled separately
442+
// Check if document is shared with any of user's teams
443+
List<DocumentShare> teamShares = documentShareRepository.findByDocumentId(document.getId()).stream()
444+
.filter(share -> share.getTeamId() != null)
445+
.collect(Collectors.toList());
446+
447+
for (DocumentShare share : teamShares) {
448+
// Check if user is a member of this team
449+
TeamMemberId teamMemberId = new TeamMemberId();
450+
teamMemberId.setTeamId(share.getTeamId());
451+
teamMemberId.setUserId(userId);
452+
453+
if (teamMemberRepository.existsById(teamMemberId)) {
454+
return true;
455+
}
456+
}
441457

442458
return false;
443459
}
@@ -455,9 +471,28 @@ private boolean hasEditPermission(Document document, String userId) {
455471
return true;
456472
}
457473

458-
// Check if user has EDIT permission via share
459-
return documentShareRepository.findByDocumentIdAndSharedWithId(document.getId(), userId)
460-
.map(share -> share.getPermission() == com.halolight.domain.entity.enums.SharePermission.EDIT)
461-
.orElse(false);
474+
// Check if user has EDIT permission via direct share
475+
var directShare = documentShareRepository.findByDocumentIdAndSharedWithId(document.getId(), userId);
476+
if (directShare.isPresent() && directShare.get().getPermission() == com.halolight.domain.entity.enums.SharePermission.EDIT) {
477+
return true;
478+
}
479+
480+
// Check if user has EDIT permission via team share
481+
List<DocumentShare> teamShares = documentShareRepository.findByDocumentId(document.getId()).stream()
482+
.filter(share -> share.getTeamId() != null && share.getPermission() == com.halolight.domain.entity.enums.SharePermission.EDIT)
483+
.collect(Collectors.toList());
484+
485+
for (DocumentShare share : teamShares) {
486+
// Check if user is a member of this team
487+
TeamMemberId teamMemberId = new TeamMemberId();
488+
teamMemberId.setTeamId(share.getTeamId());
489+
teamMemberId.setUserId(userId);
490+
491+
if (teamMemberRepository.existsById(teamMemberId)) {
492+
return true;
493+
}
494+
}
495+
496+
return false;
462497
}
463498
}

0 commit comments

Comments
 (0)