Skip to content

Commit e117a0a

Browse files
committed
Update Org
1 parent a174be0 commit e117a0a

File tree

4 files changed

+80
-25
lines changed

4 files changed

+80
-25
lines changed

org-service/src/main/java/com/codecampus/organization/repository/OrganizationMemberRepository.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,21 +68,27 @@ Page<OrganizationMember> findByScopeTypeAndScopeIdAndIsActiveIsTrue(
6868

6969
// Đếm số membership ACTIVE cấp Organization của user
7070
@Query("""
71-
select count(m) from OrganizationMember m, Organization o
71+
select count(m) from OrganizationMember m
7272
where m.userId = :userId
7373
and m.scopeType = com.codecampus.constant.ScopeType.Organization
7474
and m.isActive = true
75-
and o.id = m.scopeId
75+
and exists (
76+
select 1 from Organization o
77+
where o.id = m.scopeId
78+
)
7679
""")
7780
long countActiveOrganizations(@Param("userId") String userId);
7881

7982
// Lấy tất cả membership ACTIVE của user ở cấp Organization
8083
@Query("""
81-
select m from OrganizationMember m, Organization o
84+
select m from OrganizationMember m
8285
where m.userId = :userId
8386
and m.scopeType = com.codecampus.constant.ScopeType.Organization
8487
and m.isActive = true
85-
and o.id = m.scopeId
88+
and exists (
89+
select 1 from Organization o
90+
where o.id = m.scopeId
91+
)
8692
""")
8793
List<OrganizationMember> findActiveOrgsOfUser(@Param("userId") String userId);
8894

org-service/src/main/java/com/codecampus/organization/service/MembershipService.java

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.codecampus.organization.helper.PageResponseHelper;
1717
import com.codecampus.organization.repository.OrganizationBlockRepository;
1818
import com.codecampus.organization.repository.OrganizationMemberRepository;
19+
import com.codecampus.organization.repository.OrganizationRepository;
1920
import com.codecampus.organization.service.cache.UserBulkLoader;
2021
import com.codecampus.organization.service.cache.UserSummaryCacheService;
2122
import com.codecampus.organization.service.kafka.OrganizationMemberEventProducer;
@@ -52,6 +53,7 @@
5253
public class MembershipService {
5354
OrganizationMemberRepository memberRepository;
5455
OrganizationBlockRepository blockRepository;
56+
OrganizationRepository organizationRepository;
5557
OrganizationMemberEventProducer eventProducer;
5658
OrganizationMemberHelper organizationMemberHelper;
5759
UserBulkLoader userBulkLoader;
@@ -378,27 +380,32 @@ public void leaveBlock(String blockId) {
378380
}
379381

380382
public PrimaryOrgResponse getPrimaryOrg(String userId) {
381-
return memberRepository
383+
var primaryOpt = memberRepository
382384
.findFirstByUserIdAndScopeTypeAndIsActiveIsTrueAndIsPrimaryIsTrueOrderByCreatedAtAsc(
383-
userId, ScopeType.Organization)
384-
.map(m -> PrimaryOrgResponse.builder()
385+
userId, ScopeType.Organization);
386+
387+
if (primaryOpt.isPresent()
388+
&& organizationRepository.existsById(primaryOpt.get().getScopeId())) {
389+
var m = primaryOpt.get();
390+
return PrimaryOrgResponse.builder()
391+
.organizationId(m.getScopeId())
392+
.role(m.getRole())
393+
.build();
394+
}
395+
396+
// fallback: lấy org active đầu tiên NHƯNG còn tồn tại
397+
var list = memberRepository
398+
.findByUserIdAndScopeTypeAndIsActiveIsTrue(userId,
399+
ScopeType.Organization);
400+
for (var m : list) {
401+
if (organizationRepository.existsById(m.getScopeId())) {
402+
return PrimaryOrgResponse.builder()
385403
.organizationId(m.getScopeId())
386404
.role(m.getRole())
387-
.build())
388-
.orElseGet(() -> {
389-
// fallback: lấy org active đầu tiên nếu chưa có primary
390-
List<OrganizationMember> list = memberRepository
391-
.findByUserIdAndScopeTypeAndIsActiveIsTrue(userId,
392-
ScopeType.Organization);
393-
if (list.isEmpty()) {
394-
return null;
395-
}
396-
OrganizationMember m = list.getFirst();
397-
return PrimaryOrgResponse.builder()
398-
.organizationId(m.getScopeId())
399-
.role(m.getRole())
400-
.build();
401-
});
405+
.build();
406+
}
407+
}
408+
return null;
402409
}
403410

404411
public PageResponse<MemberInBlockWithMemberResponse> listUnassignedMembers(
@@ -555,9 +562,21 @@ public BlocksOfUserWithMemberResponse listActiveBlocksOfUser(
555562
String userId) {
556563
var list = memberRepository
557564
.findByUserIdAndScopeTypeAndIsActiveIsTrue(userId, ScopeType.Grade);
565+
566+
var rawIds = list.stream().map(OrganizationMember::getScopeId)
567+
.collect(Collectors.toSet());
568+
569+
// chỉ giữ block còn tồn tại (OrganizationBlock có @Where deleted_at IS NULL)
570+
var aliveBlocks = blockRepository.findAllById(rawIds);
571+
var aliveIds = aliveBlocks.stream().map(OrganizationBlock::getId)
572+
.collect(java.util.stream.Collectors.toSet());
573+
558574
return BlocksOfUserWithMemberResponse.builder()
559575
.user(userSummaryCacheService.getOrLoad(userId))
560-
.blockIds(list.stream().map(OrganizationMember::getScopeId).toList())
576+
.blockIds(list.stream()
577+
.map(OrganizationMember::getScopeId)
578+
.filter(aliveIds::contains)
579+
.toList())
561580
.build();
562581
}
563582
}

org-service/src/main/java/com/codecampus/organization/service/OrganizationService.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.codecampus.organization.service;
22

3+
import com.codecampus.constant.ScopeType;
34
import com.codecampus.organization.dto.common.PageResponse;
45
import com.codecampus.organization.dto.request.CreateOrganizationForm;
56
import com.codecampus.organization.dto.request.UpdateOrganizationForm;
@@ -12,6 +13,8 @@
1213
import com.codecampus.organization.helper.OrganizationHelper;
1314
import com.codecampus.organization.helper.PageResponseHelper;
1415
import com.codecampus.organization.mapper.OrganizationMapper;
16+
import com.codecampus.organization.repository.OrganizationBlockRepository;
17+
import com.codecampus.organization.repository.OrganizationMemberRepository;
1518
import com.codecampus.organization.repository.OrganizationRepository;
1619
import com.codecampus.organization.service.kafka.OrganizationEventProducer;
1720
import events.org.data.OrganizationPayload;
@@ -31,6 +34,8 @@
3134
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
3235
public class OrganizationService {
3336
OrganizationRepository organizationRepository;
37+
OrganizationBlockRepository blockRepository;
38+
OrganizationMemberRepository memberRepository;
3439
MembershipService membershipService;
3540
BlockService blockService;
3641
OrganizationMapper organizationMapper;
@@ -91,11 +96,35 @@ public void update(
9196
public void delete(String id) {
9297
String deletedBy = AuthenticationHelper.getMyUsername();
9398
Organization o = organizationRepository.findById(id)
94-
.orElseThrow(
95-
() -> new AppException(ErrorCode.ORGANIZATION_NOT_FOUND));
99+
.orElseThrow(() -> new AppException(ErrorCode.ORGANIZATION_NOT_FOUND));
100+
101+
// Soft-delete organization
96102
o.markDeleted(deletedBy);
97103
organizationRepository.save(o);
98104

105+
// 1) Soft-delete memberships cấp Organization
106+
var orgMembers = memberRepository.findByScopeTypeAndScopeId(
107+
ScopeType.Organization, id);
108+
for (var m : orgMembers) {
109+
m.setActive(false);
110+
m.setPrimary(false);
111+
m.markDeleted(deletedBy);
112+
}
113+
memberRepository.saveAll(orgMembers);
114+
115+
// 2) Soft-delete memberships cấp Block thuộc org
116+
var blockIds = blockRepository.findBlockIdsOfOrg(id);
117+
for (String bid : blockIds) {
118+
var blockMembers = memberRepository.findByScopeTypeAndScopeId(
119+
ScopeType.Grade, bid);
120+
for (var m : blockMembers) {
121+
m.setActive(false);
122+
m.markDeleted(deletedBy);
123+
}
124+
memberRepository.saveAll(blockMembers);
125+
}
126+
127+
// publish DELETED event như cũ
99128
eventProducer.publishDeleted(o.getId());
100129
}
101130

search-service/src/main/java/com/codecampus/search/service/OrganizationSearchService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ public PageResponse<OrganizationSearchResponse> search(
8181
.id(doc.getId())
8282
.name(doc.getName())
8383
.description(doc.getDescription())
84+
.ownerId(doc.getOwnerId())
8485
.logoUrl(doc.getLogoUrl())
8586
.email(doc.getEmail())
8687
.phone(doc.getPhone())

0 commit comments

Comments
 (0)