Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AP-9298 Delete assets option does not work when deleting the user #2356

Merged
merged 1 commit into from
Mar 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,10 @@ ProcessModelVersion createProcessModelVersion(Integer processId, final String br
ProcessModelVersion updateProcessModelVersion(final Integer processId, final String branchName, final Version version,
final User user, final String lockStatus,
final NativeType nativeType, final InputStream nativeStream) throws ImportException, UpdateProcessException;

/**

void deleteProcessModel(Process process, User user) throws UpdateProcessException;

/**
* Deletes the current process model version of the given branch.
* @param models A map of models that are to be removed.
* @param user with write permission
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,18 @@ private Set<GroupProcess> filterPublicGroupProcesses(Set<GroupProcess> groupProc
return publicGroupProcesses;
}


@Override
public void deleteProcessModel(final Process process, final User user) throws UpdateProcessException {
List<ProcessModelVersion> processModelVersionList =
processModelVersionRepo.getAllProcessModelVersions(process.getId(), TRUNK_NAME);

List<ProcessData> processDatas = new ArrayList<>();
for (ProcessModelVersion processModelVersion : processModelVersionList) {
processDatas.add(new ProcessData(processModelVersion.getProcessBranch().getProcess().getId(),
new Version(processModelVersion.getVersionNumber())));
}
deleteProcessModel(processDatas, user);
}

/**
* @see ProcessService#deleteProcessModel(List, User) {@inheritDoc}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1021,9 +1021,22 @@ public boolean canDeleteOwnerlessFolder(User user) {
@Transactional
public void deleteOwnerlessArtifact(User user) {

/**
* This is a temporary workaround to address following circular dependency issue.
* Circular dependency between the following tasks:
* :Process-Log-Data-Logic:compileJava
* +--- :Process-Log-Definition-Logic:compileJava
* | \--- :Apromore-Core-Components:Apromore-Manager:compileJava
* | \--- :Process-Log-Data-Logic:compileJava ()
* \--- :Apromore-Core-Components:Apromore-Manager:compileJava ()
*
* So PortalDataService's deleteLog method need be called directly in order to delete ownerless logs,
* which leaves the whole purgeOwnerlessArtifact task not guaranteed to finish in one transaction.
*
* Here is the future task to solve this Circular dependency issue properly
* https://apromore.atlassian.net/browse/AP-9452
*/
folderRepo.deleteAll(getSingleOwnerFolderByUser(user));
logRepo.deleteAll(getSingleOwnerLogByUser(user));
processRepo.deleteAll(getSingleOwnerProcessByUser(user));

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
Expand All @@ -48,6 +49,8 @@
import org.apromore.portal.types.EventQueueEvents;
import org.apromore.portal.types.EventQueueTypes;
import org.apromore.service.AuthorizationService;
import org.apromore.service.EventLogService;
import org.apromore.service.ProcessService;
import org.apromore.service.SecurityService;
import org.apromore.service.UserService;
import org.apromore.service.WorkspaceService;
Expand Down Expand Up @@ -98,6 +101,12 @@ public class DeleteUserController extends SelectorComposer<Window> {
@WireVariable("userService")
private UserService userService;

@WireVariable("processService")
private ProcessService processService;

@WireVariable("eventLogService")
private EventLogService eventLogService;

private Map<String, Object> argMap = (Map<String, Object>) Executions.getCurrent().getArg();
private User selectedUser = (User) argMap.get("selectedUser");
private String selectedUserName;
Expand Down Expand Up @@ -342,7 +351,30 @@ private void applyTransfer() {

private void purgeOwnedAssets() {
try {
/**
* This is a temporary workaround to address following circular dependency issue.
* Circular dependency between the following tasks:
* :Process-Log-Data-Logic:compileJava
* +--- :Process-Log-Definition-Logic:compileJava
* | \--- :Apromore-Core-Components:Apromore-Manager:compileJava
* | \--- :Process-Log-Data-Logic:compileJava ()
* \--- :Apromore-Core-Components:Apromore-Manager:compileJava ()
*
* So in here PortalDataService's deleteLog method is called directly, which leaves the whole
* purgeOwnerlessArtifact task not guaranteed to finish in one transaction.
*
* Here is the future task to solve this Circular dependency issue properly
* https://apromore.atlassian.net/browse/AP-9452
*/
List<Log> logList = workspaceService.getSingleOwnerLogByUser(selectedUser);
for (Log log : logList) {
eventLogService.deleteLogs(Collections.singletonList(log), selectedUser);
}

List<Process> processes = workspaceService.getSingleOwnerProcessByUser(selectedUser);
for (Process process : processes) {
processService.deleteProcessModel(process, selectedUser);
}

workspaceService.deleteOwnerlessArtifact(selectedUser);
Notification.info(getLabel("successDeleteAll_message"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,16 @@ public interface ProcessModelVersionRepository extends JpaRepository<ProcessMode
ProcessModelVersion getProcessModelVersionByUser(Integer processId, String branchName, String versionNumber,
Integer userId);

/**
* Find the process model version for the process id branch and version.
* @param processId the process id.
* @param branchName the branch name.
* @return processModelVersion we found or null.
*/
@Query("SELECT pmv FROM ProcessModelVersion pmv JOIN pmv.processBranch pb JOIN pb.process p " +
"WHERE p.id = ?1 AND pb.branchName = ?2")
List<ProcessModelVersion> getAllProcessModelVersions(Integer processId, String branchName);

/**
* Find a list of process model version for the process id branch and version.
* @param processId the process id.
Expand Down