87: Add initial version of SplitOrRestartProjectService
This commit is contained in:
parent
739bf1c0bd
commit
e59178a540
core/src/main/java/se/su/dsv/scipro
@ -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);
|
||||
}
|
86
core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceImpl.java
Normal file
86
core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceImpl.java
Normal file
@ -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);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user