Skip to content

Commit 4152b1c

Browse files
Propagate to user if a project with the provided code already exists during project creation (#516)
* Propagate to user if project code is already in use * Fail early and intelligent and remove unused fields
1 parent 029ff48 commit 4152b1c

File tree

3 files changed

+17
-42
lines changed

3 files changed

+17
-42
lines changed

project-management/src/main/java/life/qbic/projectmanagement/application/ProjectCreationService.java

+3-24
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package life.qbic.projectmanagement.application;
22

33
import static java.util.Objects.requireNonNull;
4-
import static life.qbic.logging.service.LoggerFactory.logger;
54

65
import java.util.Objects;
76
import java.util.Optional;
87
import life.qbic.application.commons.ApplicationException;
98
import life.qbic.application.commons.ApplicationException.ErrorCode;
109
import life.qbic.application.commons.ApplicationException.ErrorParameters;
1110
import life.qbic.application.commons.Result;
12-
import life.qbic.logging.api.Logger;
1311
import life.qbic.projectmanagement.domain.model.project.Contact;
1412
import life.qbic.projectmanagement.domain.model.project.Funding;
1513
import life.qbic.projectmanagement.domain.model.project.OfferIdentifier;
@@ -18,9 +16,7 @@
1816
import life.qbic.projectmanagement.domain.model.project.ProjectIntent;
1917
import life.qbic.projectmanagement.domain.model.project.ProjectObjective;
2018
import life.qbic.projectmanagement.domain.model.project.ProjectTitle;
21-
import life.qbic.projectmanagement.domain.repository.ProjectRepository;
2219
import life.qbic.projectmanagement.domain.service.ProjectDomainService;
23-
import life.qbic.projectmanagement.domain.service.ProjectDomainService.ResponseCode;
2420
import org.springframework.stereotype.Service;
2521

2622
/**
@@ -29,14 +25,9 @@
2925
@Service
3026
public class ProjectCreationService {
3127

32-
private static final Logger log = logger(ProjectCreationService.class);
33-
34-
private final ProjectRepository projectRepository;
3528
private final ProjectDomainService projectDomainService;
3629

37-
public ProjectCreationService(ProjectRepository projectRepository,
38-
ProjectDomainService projectDomainService) {
39-
this.projectRepository = requireNonNull(projectRepository);
30+
public ProjectCreationService(ProjectDomainService projectDomainService) {
4031
this.projectDomainService = requireNonNull(projectDomainService);
4132
}
4233

@@ -64,7 +55,6 @@ public Result<Project, ApplicationException> createProject(String sourceOffer,
6455
if (Objects.isNull(projectManager)) {
6556
return Result.fromError(new ApplicationException("project manager is null"));
6657
}
67-
6858
try {
6959
Project project = createProject(code, title, objective, projectManager,
7060
principalInvestigator, responsiblePerson, funding);
@@ -84,24 +74,13 @@ private Project createProject(String code, String title, String objective,
8474
ProjectCode projectCode;
8575
try {
8676
projectCode = ProjectCode.parse(code);
87-
if (!projectRepository.find(projectCode).isEmpty()) {
88-
throw new ApplicationException("Project code: " + code + " is already in use.",
89-
ErrorCode.DUPLICATE_PROJECT_CODE,
90-
ErrorParameters.of(code));
91-
}
9277
} catch (IllegalArgumentException exception) {
9378
throw new ApplicationException("Project code: " + code + " is invalid.", exception,
9479
ErrorCode.INVALID_PROJECT_CODE,
9580
ErrorParameters.of(code, ProjectCode.getPREFIX(), ProjectCode.getLENGTH()));
9681
}
97-
98-
var registrationResult = projectDomainService.registerProject(intent, projectCode, projectManager, principalInvestigator, responsiblePerson, funding);
99-
100-
if (registrationResult.isError() && registrationResult.getError().equals(ResponseCode.PROJECT_REGISTRATION_FAILED)) {
101-
throw new ApplicationException("Project registration failed.", ErrorCode.GENERAL, ErrorParameters.of(code));
102-
}
103-
104-
return registrationResult.getValue();
82+
return projectDomainService.registerProject(intent, projectCode,
83+
projectManager, principalInvestigator, responsiblePerson, funding);
10584
}
10685

10786
private static ProjectIntent getProjectIntent(String title, String objective) {

project-management/src/main/java/life/qbic/projectmanagement/domain/service/ProjectDomainService.java

+13-17
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package life.qbic.projectmanagement.domain.service;
22

3-
import static life.qbic.logging.service.LoggerFactory.logger;
4-
3+
import life.qbic.application.commons.ApplicationException;
4+
import life.qbic.application.commons.ApplicationException.ErrorCode;
5+
import life.qbic.application.commons.ApplicationException.ErrorParameters;
56
import life.qbic.application.commons.Result;
67
import life.qbic.domain.concepts.DomainEventDispatcher;
7-
import life.qbic.logging.api.Logger;
88
import life.qbic.projectmanagement.domain.model.project.Contact;
99
import life.qbic.projectmanagement.domain.model.project.Funding;
1010
import life.qbic.projectmanagement.domain.model.project.Project;
1111
import life.qbic.projectmanagement.domain.model.project.ProjectCode;
1212
import life.qbic.projectmanagement.domain.model.project.ProjectIntent;
1313
import life.qbic.projectmanagement.domain.model.project.event.ProjectRegisteredEvent;
1414
import life.qbic.projectmanagement.domain.repository.ProjectRepository;
15+
import life.qbic.projectmanagement.domain.repository.ProjectRepository.ProjectExistsException;
1516
import org.springframework.beans.factory.annotation.Autowired;
1617
import org.springframework.stereotype.Service;
1718

@@ -26,7 +27,6 @@
2627
@Service
2728
public class ProjectDomainService {
2829

29-
private static final Logger log = logger(ProjectDomainService.class);
3030
private final ProjectRepository projectRepository;
3131

3232
@Autowired
@@ -47,30 +47,26 @@ public ProjectDomainService(ProjectRepository projectRepository) {
4747
* @return a {@link Result} of the registration
4848
* @since 1.0.0
4949
*/
50-
public Result<Project, ResponseCode> registerProject(
50+
public Project registerProject(
5151
ProjectIntent projectIntent, ProjectCode projectCode,
5252
Contact projectManager, Contact principalInvestigator,
5353
Contact responsiblePerson, Funding funding) {
5454
var project = Project.create(projectIntent, projectCode,
5555
projectManager, principalInvestigator,
5656
responsiblePerson);
5757
project.setFunding(funding);
58-
5958
try {
6059
projectRepository.add(project);
61-
} catch (Exception e) {
62-
log.error("Project with code " + project.getProjectCode() + " registration failed.", e);
63-
return Result.fromError(ResponseCode.PROJECT_REGISTRATION_FAILED);
60+
} catch (ProjectExistsException projectExistsException) {
61+
throw new ApplicationException("Project code is " + projectCode + " already in use.",
62+
projectExistsException,
63+
ErrorCode.DUPLICATE_PROJECT_CODE, ErrorParameters.of(projectCode.value()));
64+
} catch (RuntimeException exception) {
65+
throw new ApplicationException("Registration of project with code "
66+
+ projectCode + " failed.", exception);
6467
}
65-
6668
// In case of a successful registration, we dispatch the registration event
6769
DomainEventDispatcher.instance().dispatch(ProjectRegisteredEvent.create(project.getId()));
68-
69-
return Result.fromValue(project);
70+
return project;
7071
}
71-
72-
public enum ResponseCode {
73-
PROJECT_REGISTRATION_FAILED
74-
}
75-
7672
}

project-management/src/test/groovy/life/qbic/projectmanagement/application/ProjectCreationServiceSpec.groovy

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class ProjectCreationServiceSpec extends Specification {
2121
ProjectRepository projectRepositoryStub = Stub()
2222
AddExperimentToProjectService addExperimentToProjectServiceStub = Stub()
2323
ProjectDomainService projectDomainServiceStub = new ProjectDomainService(projectRepositoryStub)
24-
ProjectCreationService projectCreationServiceWithStubs = new ProjectCreationService(projectRepositoryStub, projectDomainServiceStub)
24+
ProjectCreationService projectCreationServiceWithStubs = new ProjectCreationService(projectDomainServiceStub)
2525

2626
def "invalid project title leads to INVALID_PROJECT_TITLE code"() {
2727
given:

0 commit comments

Comments
 (0)