polishing the workspace migration

This commit is contained in:
2026-06-22 13:40:58 +02:00
parent caf4e4bc89
commit 598287b0cc
43 changed files with 730 additions and 167 deletions

View File

@@ -55,7 +55,7 @@ public class RecipientGroupService {
* 5. Return the batch + any row-level errors
*/
@Transactional
public GroupCreateFromFileResult createFromFile(MultipartFile file, GroupCreateFromFileRequest request, String userId) {
public GroupCreateFromFileResult createFromFile(MultipartFile file, GroupCreateFromFileRequest request, UUID workspaceId) {
ParseResult parseResult = parseCsv(file);
if(!parseResult.parseErrors.isEmpty()) {
@@ -77,7 +77,7 @@ public class RecipientGroupService {
.name(row.name)
.account(row.account)
.phoneNumber(row.phone)
.userId(userId)
.workspaceId(workspaceId)
.build();
recipients.add(recipient);
}
@@ -86,15 +86,15 @@ public class RecipientGroupService {
RecipientGroup group = RecipientGroup.builder()
.name(request.getGroupName())
.description(request.getDescription())
.userId(userId)
.workspaceId(workspaceId)
.build();
RecipientGroup savedGroup = recipientGroupRepository.save(group);
List<RecipientGroupMember> members = addMembers(savedGroup.getId(), userId, recipients);
List<RecipientGroupMember> members = addMembers(savedGroup.getId(), workspaceId, recipients);
// Step 3: create group batch (inline to avoid circular dependency with GroupBatchService)
GroupBatch batch = createBatchInline(savedGroup.getId(), userId, request, members);
GroupBatch batch = createBatchInline(savedGroup.getId(), workspaceId, request, members);
// Step 4: update batch items with bill/provider fields from CSV
List<GroupBatchItem> batchItems = groupBatchItemRepository.findAllByGroupBatchId(batch.getId());
@@ -136,7 +136,7 @@ public class RecipientGroupService {
}
// Return the updated batch + errors
GroupBatch resultBatch = groupBatchRepository.findByIdAndUserId(batch.getId(), userId)
GroupBatch resultBatch = groupBatchRepository.findByIdAndWorkspaceId(batch.getId(), workspaceId)
.orElseThrow(() -> new ApiException("Batch not found after creation"));
return GroupCreateFromFileResult.builder()
@@ -152,12 +152,12 @@ public class RecipientGroupService {
* Create a GroupBatch and its items directly (mirrors GroupBatchService.createBatch logic
* but without circular dependency).
*/
private GroupBatch createBatchInline(UUID recipientGroupId, String userId,
private GroupBatch createBatchInline(UUID recipientGroupId, UUID workspaceId,
GroupCreateFromFileRequest request,
List<RecipientGroupMember> members) {
GroupBatch batch = GroupBatch.builder()
.recipientGroupId(recipientGroupId)
.userId(userId)
.workspaceId(workspaceId)
.description(request.getDescription())
.requestedBy(request.getRequestedBy())
.currency(request.getCurrency())
@@ -384,25 +384,26 @@ public class RecipientGroupService {
RecipientGroup savedGroup = recipientGroupRepository.save(group);
if (recipients != null && !recipients.isEmpty()) {
addMembers(savedGroup.getId(), savedGroup.getUserId(), recipients);
addMembers(savedGroup.getId(), savedGroup.getWorkspaceId(), recipients);
}
return savedGroup;
}
@Transactional
public List<RecipientGroupMember> addMembers(UUID groupId, String userId, List<Recipient> recipients) {
get(groupId, userId);
public List<RecipientGroupMember> addMembers(UUID groupId, UUID workspaceId, List<Recipient> recipients) {
get(groupId, workspaceId);
List<RecipientGroupMember> added = new ArrayList<>();
for (Recipient incomingRecipient : recipients) {
Recipient recipient = resolveOrCreateRecipient(incomingRecipient, userId);
Recipient recipient = resolveOrCreateRecipient(incomingRecipient, workspaceId);
RecipientGroupMember member = RecipientGroupMember.builder()
.recipientGroupId(groupId)
.recipientUid(recipient.getId())
.recipient(recipient)
.account(recipient.getAccount())
.userId(userId)
.workspaceId(workspaceId)
.userId(incomingRecipient.getUserId())
.build();
added.add(recipientGroupMemberRepository.save(member));
}
@@ -413,25 +414,25 @@ public class RecipientGroupService {
return recipientGroupRepository.findAll(spec, pageable);
}
public List<RecipientGroup> list(String userId) {
return recipientGroupRepository.findAllByUserId(userId);
public List<RecipientGroup> list(UUID workspaceId) {
return recipientGroupRepository.findAllByWorkspaceId(workspaceId);
}
public RecipientGroup get(UUID groupId, String userId) {
return recipientGroupRepository.findByIdAndUserId(groupId, userId)
public RecipientGroup get(UUID groupId, UUID workspaceId) {
return recipientGroupRepository.findByIdAndWorkspaceId(groupId, workspaceId)
.orElseThrow(() -> new ApiException("Recipient group not found"));
}
public RecipientGroup update(UUID groupId, String userId, String name, String description) {
RecipientGroup group = get(groupId, userId);
public RecipientGroup update(UUID groupId, UUID workspaceId, String name, String description) {
RecipientGroup group = get(groupId, workspaceId);
group.setName(name);
group.setDescription(description);
return recipientGroupRepository.save(group);
}
@Transactional
public void delete(UUID groupId, String userId) {
RecipientGroup group = get(groupId, userId);
public void delete(UUID groupId, UUID workspaceId) {
RecipientGroup group = get(groupId, workspaceId);
group.setDeleted(true);
recipientGroupRepository.save(group);
@@ -441,14 +442,14 @@ public class RecipientGroupService {
}
@Transactional
public List<RecipientGroupMember> addMembersByIds(UUID groupId, String userId, List<UUID> recipientIds) {
get(groupId, userId);
public List<RecipientGroupMember> addMembersByIds(UUID groupId, UUID workspaceId, List<UUID> recipientIds) {
get(groupId, workspaceId);
List<RecipientGroupMember> added = new ArrayList<>();
for (UUID recipientId : recipientIds) {
Recipient recipient = recipientRepository.findById(recipientId)
.orElseThrow(() -> new ApiException("Recipient not found: " + recipientId));
if (!userId.equals(recipient.getUserId())) {
throw new ApiException("Recipient does not belong to user");
if (!workspaceId.equals(recipient.getWorkspaceId())) {
throw new ApiException("Recipient does not belong to workspace");
}
if (recipientGroupMemberRepository.existsByRecipientGroupIdAndRecipientId(groupId, recipientId)) {
continue;
@@ -458,23 +459,23 @@ public class RecipientGroupService {
.recipientUid(recipientId)
.recipient(recipient)
.account(recipient.getAccount())
.userId(userId)
.workspaceId(workspaceId)
.build();
added.add(recipientGroupMemberRepository.save(member));
}
return added;
}
private Recipient resolveOrCreateRecipient(Recipient incomingRecipient, String fallbackUserId) {
private Recipient resolveOrCreateRecipient(Recipient incomingRecipient, UUID fallbackWorkspaceId) {
if (incomingRecipient == null || incomingRecipient.getAccount() == null || incomingRecipient.getAccount().isBlank()) {
throw new ApiException("Recipient account is required");
}
String recipientUserId = incomingRecipient.getUserId() == null || incomingRecipient.getUserId().isBlank()
? fallbackUserId
: incomingRecipient.getUserId();
UUID recipientWorkspaceId = incomingRecipient.getWorkspaceId() == null
? fallbackWorkspaceId
: incomingRecipient.getWorkspaceId();
List<Recipient> existing = recipientRepository.findByAccountAndUserId(incomingRecipient.getAccount(), recipientUserId);
List<Recipient> existing = recipientRepository.findByAccountAndWorkspaceId(incomingRecipient.getAccount(), recipientWorkspaceId);
if (!existing.isEmpty()) {
Recipient recipient = existing.get(0);
recipient.setName(incomingRecipient.getName());
@@ -483,13 +484,13 @@ public class RecipientGroupService {
}
incomingRecipient.setId(null);
incomingRecipient.setUserId(recipientUserId);
incomingRecipient.setWorkspaceId(recipientWorkspaceId);
return recipientRepository.save(incomingRecipient);
}
@Transactional
public void removeMember(UUID groupId, UUID recipientId, String userId) {
get(groupId, userId);
public void removeMember(UUID groupId, UUID recipientId, UUID workspaceId) {
get(groupId, workspaceId);
List<RecipientGroupMember> members = recipientGroupMemberRepository.findAllByRecipientGroupId(groupId);
RecipientGroupMember target = members.stream()
.filter(item -> recipientId.equals(item.getRecipientUid()))
@@ -499,8 +500,8 @@ public class RecipientGroupService {
recipientGroupMemberRepository.save(target);
}
public List<RecipientGroupMember> members(UUID groupId, String userId) {
get(groupId, userId);
public List<RecipientGroupMember> members(UUID groupId, UUID workspaceId) {
get(groupId, workspaceId);
return recipientGroupMemberRepository.findAllByRecipientGroupId(groupId);
}