87: Refactor SplittableStatusRecord using Java record
This commit is contained in:
parent
8266b1f1fe
commit
1ebf21f14b
core/src/main/java/se/su/dsv/scipro
view/src
main/java/se/su/dsv/scipro/admin/pages
test/java/se/su/dsv/scipro/admin/pages
@ -816,9 +816,10 @@ public class CoreConfig {
|
|||||||
@Bean
|
@Bean
|
||||||
public SplitOrRestartProjectServiceImpl SplitOrRestartProjectService(
|
public SplitOrRestartProjectServiceImpl SplitOrRestartProjectService(
|
||||||
ProjectService projectService,
|
ProjectService projectService,
|
||||||
FinalSeminarService finalSeminarService
|
FinalSeminarService finalSeminarService,
|
||||||
|
RoughDraftApprovalService roughDraftApprovalService
|
||||||
) {
|
) {
|
||||||
return new SplitOrRestartProjectServiceImpl(projectService, finalSeminarService);
|
return new SplitOrRestartProjectServiceImpl(projectService, finalSeminarService, roughDraftApprovalService);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
@ -2,13 +2,14 @@ package se.su.dsv.scipro.project.split;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import se.su.dsv.scipro.project.Project;
|
import se.su.dsv.scipro.project.Project;
|
||||||
import se.su.dsv.scipro.util.Pair;
|
import se.su.dsv.scipro.reviewing.RoughDraftApproval;
|
||||||
|
|
||||||
public interface SplitOrRestartProjectService {
|
public interface SplitOrRestartProjectService {
|
||||||
enum SplittableStatus {
|
enum SplittableStatus {
|
||||||
NOT_EXIST("Project does not exist."),
|
NOT_EXIST("Project does not exist."),
|
||||||
NOT_ACTIVE("Only active project can be split."),
|
NOT_ACTIVE("Only active project can be split."),
|
||||||
NOT_TWO_PARTICIPANTS("To be able to split a project, it needs to have 2 participants."),
|
NOT_TWO_PARTICIPANTS("To be able to split a project, it needs to have 2 participants."),
|
||||||
|
PHASE_TWO_STARTED("Phase 2 (Review) is already started, can't split right now."),
|
||||||
FINAL_SEMINAR_PHASE_STARTED("Final seminar phase has been started, too late to split."),
|
FINAL_SEMINAR_PHASE_STARTED("Final seminar phase has been started, too late to split."),
|
||||||
OK("Ok to split.");
|
OK("Ok to split.");
|
||||||
|
|
||||||
@ -23,7 +24,13 @@ public interface SplitOrRestartProjectService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Pair<SplittableStatus, Project> getSplittableStatus(long projectId);
|
record SplittableStatusRecord(
|
||||||
|
SplittableStatus splittableStatus,
|
||||||
|
Project project,
|
||||||
|
RoughDraftApproval roughDraftApproval
|
||||||
|
) {}
|
||||||
|
|
||||||
|
SplittableStatusRecord getSplittableStatus(long projectId);
|
||||||
|
|
||||||
void splitProject(long projectId);
|
void splitProject(long projectId);
|
||||||
|
|
||||||
|
@ -4,11 +4,14 @@ import com.querydsl.core.types.dsl.BooleanExpression;
|
|||||||
import jakarta.inject.Inject;
|
import jakarta.inject.Inject;
|
||||||
import jakarta.transaction.Transactional;
|
import jakarta.transaction.Transactional;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
import se.su.dsv.scipro.finalseminar.FinalSeminarService;
|
import se.su.dsv.scipro.finalseminar.FinalSeminarService;
|
||||||
import se.su.dsv.scipro.project.Project;
|
import se.su.dsv.scipro.project.Project;
|
||||||
import se.su.dsv.scipro.project.ProjectService;
|
import se.su.dsv.scipro.project.ProjectService;
|
||||||
import se.su.dsv.scipro.project.ProjectStatus;
|
import se.su.dsv.scipro.project.ProjectStatus;
|
||||||
import se.su.dsv.scipro.project.QProject;
|
import se.su.dsv.scipro.project.QProject;
|
||||||
|
import se.su.dsv.scipro.reviewing.RoughDraftApproval;
|
||||||
|
import se.su.dsv.scipro.reviewing.RoughDraftApprovalService;
|
||||||
import se.su.dsv.scipro.system.User;
|
import se.su.dsv.scipro.system.User;
|
||||||
import se.su.dsv.scipro.util.Pair;
|
import se.su.dsv.scipro.util.Pair;
|
||||||
|
|
||||||
@ -16,47 +19,60 @@ public class SplitOrRestartProjectServiceImpl implements SplitOrRestartProjectSe
|
|||||||
|
|
||||||
private final ProjectService projectService;
|
private final ProjectService projectService;
|
||||||
private final FinalSeminarService finalSeminarService;
|
private final FinalSeminarService finalSeminarService;
|
||||||
|
private final RoughDraftApprovalService roughDraftApprovalService;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public SplitOrRestartProjectServiceImpl(ProjectService projectService, FinalSeminarService finalSeminarService) {
|
public SplitOrRestartProjectServiceImpl(
|
||||||
|
ProjectService projectService,
|
||||||
|
FinalSeminarService finalSeminarService,
|
||||||
|
RoughDraftApprovalService roughDraftApprovalService
|
||||||
|
) {
|
||||||
this.projectService = projectService;
|
this.projectService = projectService;
|
||||||
this.finalSeminarService = finalSeminarService;
|
this.finalSeminarService = finalSeminarService;
|
||||||
|
this.roughDraftApprovalService = roughDraftApprovalService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public Pair<SplittableStatus, Project> getSplittableStatus(long projectId) {
|
public SplittableStatusRecord getSplittableStatus(long projectId) {
|
||||||
Project project = projectService.findOne(projectId);
|
Project project = projectService.findOne(projectId);
|
||||||
if (project == null) return new Pair<>(SplittableStatus.NOT_EXIST, null);
|
if (project == null) return new SplittableStatusRecord(SplittableStatus.NOT_EXIST, null, null);
|
||||||
|
|
||||||
if (project.getProjectStatus() != ProjectStatus.ACTIVE) {
|
if (project.getProjectStatus() != ProjectStatus.ACTIVE) {
|
||||||
return new Pair<>(SplittableStatus.NOT_ACTIVE, project);
|
return new SplittableStatusRecord(SplittableStatus.NOT_ACTIVE, project, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (project.getProjectParticipants().size() != 2) {
|
if (project.getProjectParticipants().size() != 2) {
|
||||||
return new Pair<>(SplittableStatus.NOT_TWO_PARTICIPANTS, project);
|
return new SplittableStatusRecord(SplittableStatus.NOT_TWO_PARTICIPANTS, project, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (finalSeminarService.findByProject(project) != null) {
|
if (finalSeminarService.findByProject(project) != null) {
|
||||||
return new Pair<>(SplittableStatus.FINAL_SEMINAR_PHASE_STARTED, project);
|
return new SplittableStatusRecord(SplittableStatus.FINAL_SEMINAR_PHASE_STARTED, project, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
Optional<RoughDraftApproval> o = roughDraftApprovalService.findBy(project);
|
||||||
|
if (o.isPresent() && !o.get().isDecided()) {
|
||||||
|
return new SplittableStatusRecord(SplittableStatus.PHASE_TWO_STARTED, project, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (o.isPresent() && o.get().isApproved()) {
|
||||||
|
return new SplittableStatusRecord(SplittableStatus.OK, project, o.get());
|
||||||
} else {
|
} else {
|
||||||
return new Pair<>(SplittableStatus.OK, project);
|
return new SplittableStatusRecord(SplittableStatus.OK, project, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public void splitProject(long projectId) {
|
public void splitProject(long projectId) {
|
||||||
Pair<SplittableStatus, Project> result = getSplittableStatus(projectId);
|
SplittableStatusRecord result = getSplittableStatus(projectId);
|
||||||
if (result.getHead() != SplittableStatus.OK) {
|
if (result.splittableStatus() != SplittableStatus.OK) {
|
||||||
throw new IllegalStateException(
|
throw new IllegalStateException(
|
||||||
"Project must to be verified to be able to split " + "before this method can be called."
|
"Project must to be verified to be able to split " + "before this method can be called."
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Project project = result.getTail();
|
Project project = result.project();
|
||||||
|
|
||||||
// Todo: Get ev. Phase Two Approval
|
|
||||||
|
|
||||||
for (User author : project.getProjectParticipants()) {
|
for (User author : project.getProjectParticipants()) {
|
||||||
Project childProject = new Project();
|
Project childProject = new Project();
|
||||||
@ -81,6 +97,7 @@ public class SplitOrRestartProjectServiceImpl implements SplitOrRestartProjectSe
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Todo: add RoughDraftApproval if it's 'APPROVED'
|
// Todo: add RoughDraftApproval if it's 'APPROVED'
|
||||||
|
if (result.roughDraftApproval() != null) {}
|
||||||
|
|
||||||
childProject = projectService.save(childProject);
|
childProject = projectService.save(childProject);
|
||||||
// Todo: Send event to eventBus to synchronize eventual Phase Two Approval with MileStone
|
// Todo: Send event to eventBus to synchronize eventual Phase Two Approval with MileStone
|
||||||
|
@ -17,7 +17,6 @@ import se.su.dsv.scipro.project.split.SplitOrRestartProjectService;
|
|||||||
import se.su.dsv.scipro.security.auth.roles.Roles;
|
import se.su.dsv.scipro.security.auth.roles.Roles;
|
||||||
import se.su.dsv.scipro.session.SciProSession;
|
import se.su.dsv.scipro.session.SciProSession;
|
||||||
import se.su.dsv.scipro.util.PageParameterKeys;
|
import se.su.dsv.scipro.util.PageParameterKeys;
|
||||||
import se.su.dsv.scipro.util.Pair;
|
|
||||||
|
|
||||||
public class AdminSplitProjectPanel extends Panel {
|
public class AdminSplitProjectPanel extends Panel {
|
||||||
|
|
||||||
@ -29,8 +28,9 @@ public class AdminSplitProjectPanel extends Panel {
|
|||||||
Project project = projectModel.getObject();
|
Project project = projectModel.getObject();
|
||||||
|
|
||||||
LoadableDetachableModel<SplittableStatus> ldModel = LoadableDetachableModel.of(() -> {
|
LoadableDetachableModel<SplittableStatus> ldModel = LoadableDetachableModel.of(() -> {
|
||||||
Pair<SplittableStatus, Project> pair = splitOrRestartProjectService.getSplittableStatus(project.getId());
|
SplitOrRestartProjectService.SplittableStatusRecord status =
|
||||||
return pair.getHead();
|
splitOrRestartProjectService.getSplittableStatus(project.getId());
|
||||||
|
return status.splittableStatus();
|
||||||
});
|
});
|
||||||
|
|
||||||
final PageParameters pp = new PageParameters();
|
final PageParameters pp = new PageParameters();
|
||||||
|
@ -273,7 +273,13 @@ public class AdminEditProjectPageTest extends SciProTest {
|
|||||||
if (project.getId() != null) when(projectService.findOne(project.getId())).thenReturn(project);
|
if (project.getId() != null) when(projectService.findOne(project.getId())).thenReturn(project);
|
||||||
lenient()
|
lenient()
|
||||||
.when(splitOrRestartProjectService.getSplittableStatus(project.getId() != null ? project.getId() : 0L))
|
.when(splitOrRestartProjectService.getSplittableStatus(project.getId() != null ? project.getId() : 0L))
|
||||||
.thenReturn(new Pair<>(SplitOrRestartProjectService.SplittableStatus.OK, project));
|
.thenReturn(
|
||||||
|
new SplitOrRestartProjectService.SplittableStatusRecord(
|
||||||
|
SplitOrRestartProjectService.SplittableStatus.OK,
|
||||||
|
project,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
PageParameters pp = new PageParameters();
|
PageParameters pp = new PageParameters();
|
||||||
pp.set(PageParameterKeys.MAP.get(Project.class), project.getId());
|
pp.set(PageParameterKeys.MAP.get(Project.class), project.getId());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user