87: Add initial version of SplitOrRestartProjectService

This commit is contained in:
Tom Zhao 2025-03-26 09:10:31 +01:00
parent 739bf1c0bd
commit e59178a540
3 changed files with 124 additions and 0 deletions

@ -145,6 +145,7 @@ import se.su.dsv.scipro.project.ProjectPeopleStatisticsServiceImpl;
import se.su.dsv.scipro.project.ProjectRepo;
import se.su.dsv.scipro.project.ProjectService;
import se.su.dsv.scipro.project.ProjectServiceImpl;
import se.su.dsv.scipro.project.split.SplitOrRestartProjectServiceImpl;
import se.su.dsv.scipro.projectpartner.ProjectPartnerServiceImpl;
import se.su.dsv.scipro.reflection.ReflectionService;
import se.su.dsv.scipro.reflection.ReflectionServiceImpl;
@ -812,6 +813,14 @@ public class CoreConfig {
return new ProjectServiceImpl(projectRepo, clock, eventBus, em);
}
@Bean
public SplitOrRestartProjectServiceImpl SplitOrRestartProjectService(
ProjectService projectService,
FinalSeminarService finalSeminarService
) {
return new SplitOrRestartProjectServiceImpl(projectService, finalSeminarService);
}
@Bean
public ProjectTypeServiceImpl projectTypeService(Provider<EntityManager> em) {
return new ProjectTypeServiceImpl(em);

@ -0,0 +1,29 @@
package se.su.dsv.scipro.project.split;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.util.Pair;
public interface SplitOrRestartProjectService {
enum SplittableStatus {
NOT_EXIST("Project does not exist."),
NOT_ACTIVE("Only active project can be split."),
NOT_TWO_PARTICIPANTS("To be able to split a project, it needs to have 2 participants."),
FINAL_SEMINAR_PHASE_STARTED("Final seminar phase has been started, too late to split."),
OK("Ok to split.");
private final String message;
SplittableStatus(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
Pair<SplittableStatus, Project> getSplittableStatus(int projectId);
void splitProject(int projectId);
}

@ -0,0 +1,86 @@
package se.su.dsv.scipro.project.split;
import jakarta.inject.Inject;
import se.su.dsv.scipro.finalseminar.FinalSeminarService;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.project.ProjectService;
import se.su.dsv.scipro.project.ProjectStatus;
import se.su.dsv.scipro.system.User;
import se.su.dsv.scipro.util.Pair;
import java.util.List;
public class SplitOrRestartProjectServiceImpl implements SplitOrRestartProjectService {
private final ProjectService projectService;
private final FinalSeminarService finalSeminarService;
@Inject
public SplitOrRestartProjectServiceImpl(ProjectService projectService, FinalSeminarService finalSeminarService) {
this.projectService = projectService;
this.finalSeminarService = finalSeminarService;
}
@Override
public Pair<SplittableStatus, Project> getSplittableStatus(int projectId) {
Project project = projectService.findOne(Long.valueOf(projectId));
if (project == null)
return new Pair<>(SplittableStatus.NOT_EXIST, null);
if (project.getProjectStatus() != ProjectStatus.ACTIVE) {
return new Pair<>(SplittableStatus.NOT_ACTIVE, project);
}
if (project.getProjectParticipants().size() != 2) {
return new Pair<>(SplittableStatus.NOT_TWO_PARTICIPANTS, project);
}
if (finalSeminarService.findByProject(project) != null) {
return new Pair<>(SplittableStatus.FINAL_SEMINAR_PHASE_STARTED, project);
} else {
return new Pair<>(SplittableStatus.OK, project);
}
}
@Override
public void splitProject(int projectId) {
Pair<SplittableStatus, Project> result = getSplittableStatus(projectId);
if (result.getHead() != SplittableStatus.OK) {
throw new IllegalStateException("Project must to be verified to be able to split " +
"before this method can be called.");
}
Project project = result.getTail();
for (User author : project.getProjectParticipants()) {
Project childProject = new Project();
childProject.setTitle(project.getTitle());
childProject.setProjectType(project.getProjectType());
childProject.setStartDate(project.getStartDate());
childProject.setExpectedEndDate(project.getExpectedEndDate());
// Copy supervisor
childProject.setProjectParticipants(List.of(author));
// Copy reviewer
// Copy cosupervisor
// Copy research area
childProject.setProjectStatus(ProjectStatus.ACTIVE);
// childProject.setParentProjectId
// childProject.setRootProjectId
childProject = projectService.save(childProject);
// Send event to eventBus to synchronize eventual Phase Two Approval
}
// Parent project will set as inactive
project.setProjectStatus(ProjectStatus.INACTIVE);
projectService.save(project);
System.out.println("Hello, split project -> " + projectId);
}
}