Skip to content

Commit c28b63c

Browse files
Merge pull request #142 from qbicsoftware/release/0.9.0
Release/0.9.0
2 parents 393be0e + b5d5128 commit c28b63c

30 files changed

+1026
-441
lines changed

mariadb-connector/src/main/java/life/qbic/finance/persistence/SimpleOfferSearchService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import java.util.List;
44
import java.util.Optional;
5-
import life.qbic.OffsetBasedRequest;
5+
import life.qbic.persistence.OffsetBasedRequest;
66
import life.qbic.projectmanagement.application.finances.offer.OfferSearchService;
77
import life.qbic.projectmanagement.domain.finances.offer.Offer;
88
import life.qbic.projectmanagement.domain.finances.offer.OfferId;

mariadb-connector/src/main/java/life/qbic/OffsetBasedRequest.java mariadb-connector/src/main/java/life/qbic/persistence/OffsetBasedRequest.java

+21-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
package life.qbic;
1+
package life.qbic.persistence;
22

3+
import java.util.Objects;
34
import org.springframework.data.domain.Pageable;
45
import org.springframework.data.domain.Sort;
6+
import org.springframework.lang.NonNull;
57

68
/**
79
* Simple implementation of a {@link Pageable} interface that provides offset and limit based
@@ -36,6 +38,18 @@ public OffsetBasedRequest(int offset, int limit) {
3638
sort = Sort.by(Sort.Direction.DESC, "id");
3739
}
3840

41+
public OffsetBasedRequest(int offset, int limit, Sort sort) {
42+
if (limit < 1) {
43+
throw new IllegalArgumentException("Limit must not be less than one!");
44+
}
45+
if (offset < 0) {
46+
throw new IllegalArgumentException("Offset index must not be less than zero!");
47+
}
48+
this.offset = offset;
49+
this.limit = limit;
50+
this.sort = sort;
51+
}
52+
3953
@Override
4054
public int getPageNumber() {
4155
return offset / limit;
@@ -52,11 +66,14 @@ public long getOffset() {
5266
}
5367

5468
@Override
69+
@NonNull
5570
public Sort getSort() {
71+
Objects.requireNonNull(sort);
5672
return sort;
5773
}
5874

5975
@Override
76+
@NonNull
6077
public Pageable next() {
6178
return new OffsetBasedRequest((int) (getOffset() + getPageSize()), getPageSize());
6279
}
@@ -67,16 +84,19 @@ public Pageable previous() {
6784
}
6885

6986
@Override
87+
@NonNull
7088
public Pageable previousOrFirst() {
7189
return hasPrevious() ? previous() : first();
7290
}
7391

7492
@Override
93+
@NonNull
7594
public Pageable first() {
7695
return new OffsetBasedRequest(0, getPageSize());
7796
}
7897

7998
@Override
99+
@NonNull
80100
public Pageable withPage(int pageNumber) {
81101
return new OffsetBasedRequest(offset * pageNumber, getPageSize());
82102
}

mariadb-connector/src/main/java/life/qbic/projectmanagement/persistence/ProjectPreviewJpaRepository.java

+16-3
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22

33
import java.util.List;
44
import java.util.Objects;
5-
import life.qbic.OffsetBasedRequest;
5+
import life.qbic.persistence.OffsetBasedRequest;
66
import life.qbic.projectmanagement.application.ProjectPreview;
7+
import life.qbic.projectmanagement.application.SortOrder;
78
import life.qbic.projectmanagement.application.api.ProjectPreviewLookup;
89
import org.springframework.beans.factory.annotation.Autowired;
910
import org.springframework.context.annotation.Scope;
11+
import org.springframework.data.domain.Sort;
12+
import org.springframework.data.domain.Sort.Order;
1013
import org.springframework.stereotype.Component;
1114

1215
/**
@@ -31,9 +34,19 @@ public List<ProjectPreview> query(int offset, int limit) {
3134
}
3235

3336
@Override
34-
public List<ProjectPreview> query(String filter, int offset, int limit) {
37+
public List<ProjectPreview> query(String filter, int offset, int limit,
38+
List<SortOrder> sortOrders) {
39+
List<Order> orders = sortOrders.stream().map(it -> {
40+
Order order;
41+
if (it.isDescending()) {
42+
order = Order.desc(it.propertyName());
43+
} else {
44+
order = Order.asc(it.propertyName());
45+
}
46+
return order;
47+
}).toList();
3548
return projectPreviewRepository.findByProjectTitleContainingIgnoreCaseOrProjectCodeContainingIgnoreCase(
36-
filter, filter, new OffsetBasedRequest(offset, limit)).getContent();
49+
filter, filter, new OffsetBasedRequest(offset, limit, Sort.by(orders))).getContent();
3750
}
3851

3952
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package life.qbic.projectmanagement.persistence.person;
2+
3+
import javax.persistence.Column;
4+
import javax.persistence.Entity;
5+
import javax.persistence.Id;
6+
import javax.persistence.Table;
7+
8+
/**
9+
* JPA query object for person information.
10+
*
11+
* @since 1.0.0
12+
*/
13+
@Entity
14+
@Table(name = "person_datamanager")
15+
public class Person {
16+
17+
@Column(name = "firstName")
18+
private String firstName;
19+
20+
@Column(name = "lastName")
21+
private String lastName;
22+
23+
@Id
24+
private Long id;
25+
26+
@Column(name = "email")
27+
private String email;
28+
29+
@Column(name = "referenceId")
30+
private String referenceId;
31+
32+
public void setId(Long id) {
33+
this.id = id;
34+
}
35+
36+
@Id
37+
public Long getId() {
38+
return id;
39+
}
40+
41+
public String fullName() {
42+
return this.firstName + " " + this.lastName;
43+
}
44+
45+
public String referenceId() {
46+
return this.referenceId;
47+
}
48+
49+
public String emailAddress() {
50+
return this.email;
51+
}
52+
53+
private String getFirstName() {
54+
return firstName;
55+
}
56+
57+
private void setFirstName(String firstName) {
58+
this.firstName = firstName;
59+
}
60+
61+
private String getLastName() {
62+
return lastName;
63+
}
64+
65+
private void setLastName(String lastName) {
66+
this.lastName = lastName;
67+
}
68+
69+
private String getEmail() {
70+
return email;
71+
}
72+
73+
private void setEmail(String email) {
74+
this.email = email;
75+
}
76+
77+
private String getReferenceId() {
78+
return referenceId;
79+
}
80+
81+
private void setReferenceId(String referenceId) {
82+
this.referenceId = referenceId;
83+
}
84+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package life.qbic.projectmanagement.persistence.person;
2+
3+
import java.util.List;
4+
import life.qbic.persistence.OffsetBasedRequest;
5+
import life.qbic.projectmanagement.application.api.PersonLookupService;
6+
import life.qbic.projectmanagement.domain.project.PersonReference;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.stereotype.Component;
9+
10+
/**
11+
* Simple implementation of the {@link PersonLookupService} interface.
12+
*
13+
* @since 1.0.0
14+
*/
15+
@Component
16+
public class PersonReferenceJpaRepository implements PersonLookupService {
17+
18+
private final PersonRepo personRepo;
19+
20+
public PersonReferenceJpaRepository(@Autowired PersonRepo personRepo) {
21+
this.personRepo = personRepo;
22+
}
23+
24+
@Override
25+
public List<PersonReference> find(String filter, int offset, int limit) {
26+
var personsResult = personRepo.findPersonByFirstNameContainingIgnoreCaseOrLastNameContainingIgnoreCase(filter,
27+
filter, new OffsetBasedRequest(offset, limit));
28+
return personsResult.getContent().stream().map(person -> new PersonReference(
29+
person.referenceId(), person.fullName(), person.emailAddress())).toList();
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package life.qbic.projectmanagement.persistence.person;
2+
3+
import org.springframework.data.domain.Page;
4+
import org.springframework.data.domain.Pageable;
5+
import org.springframework.data.repository.PagingAndSortingRepository;
6+
7+
public interface PersonRepo extends PagingAndSortingRepository<Person, Long> {
8+
9+
Page<Person> findPersonByFirstNameContainingIgnoreCaseOrLastNameContainingIgnoreCase(
10+
String firstName, String lastName, Pageable pageable);
11+
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package life.qbic.projectmanagement.application;
2+
3+
import java.util.List;
4+
import life.qbic.projectmanagement.application.api.PersonLookupService;
5+
import life.qbic.projectmanagement.domain.project.PersonReference;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.stereotype.Component;
8+
9+
/**
10+
* Person Search Service
11+
*
12+
* @since 1.0.0
13+
*/
14+
@Component
15+
public class PersonSearchService {
16+
17+
private final PersonLookupService personLookupService;
18+
19+
public PersonSearchService(@Autowired PersonLookupService personLookupService) {
20+
this.personLookupService = personLookupService;
21+
}
22+
23+
/**
24+
* Lists all findings for a person based on a provided filter expression.
25+
* <p>
26+
* Supports pagination by the parameters <code>offset</code> and
27+
* <code>limit</code>.
28+
*
29+
* @param filter a character sequence to filter the person references output for
30+
* @param offset a pagination offset
31+
* @param limit a pagination limit
32+
* @return a list of {@link PersonReference} matching the search filter
33+
* @since 1.0.0
34+
*/
35+
public List<PersonReference> find(String filter, int offset, int limit) {
36+
return personLookupService.find(filter, offset, limit);
37+
}
38+
}

projectmanagement/src/main/java/life/qbic/projectmanagement/application/ProjectCreationService.java

+15-8
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import life.qbic.logging.api.Logger;
1212
import life.qbic.projectmanagement.domain.project.ExperimentalDesignDescription;
1313
import life.qbic.projectmanagement.domain.project.OfferIdentifier;
14+
import life.qbic.projectmanagement.domain.project.PersonReference;
1415
import life.qbic.projectmanagement.domain.project.Project;
1516
import life.qbic.projectmanagement.domain.project.ProjectCode;
1617
import life.qbic.projectmanagement.domain.project.ProjectIntent;
@@ -41,13 +42,16 @@ public ProjectCreationService(ProjectRepository projectRepository) {
4142
* @return the created project
4243
*/
4344
public Result<Project, ApplicationException> createProject(String title, String objective,
44-
String experimentalDesign, String sourceOffer) {
45+
String experimentalDesign, String sourceOffer, PersonReference projectManager,
46+
PersonReference principalInvestigator) {
4547
try {
4648
Project project;
4749
if (Objects.isNull(experimentalDesign) || experimentalDesign.isEmpty()) {
48-
project = createProjectWithoutExperimentalDesign(title, objective);
50+
project = createProjectWithoutExperimentalDesign(title, objective, projectManager,
51+
principalInvestigator);
4952
} else {
50-
project = createProjectWithExperimentalDesign(title, objective, experimentalDesign);
53+
project = createProjectWithExperimentalDesign(title, objective, experimentalDesign,
54+
projectManager, principalInvestigator);
5155
}
5256
Optional.ofNullable(sourceOffer)
5357
.flatMap(it -> it.isBlank() ? Optional.empty() : Optional.of(it))
@@ -72,14 +76,17 @@ private ProjectCode createRandomCode() {
7276
return code;
7377
}
7478

75-
private Project createProjectWithoutExperimentalDesign(String title, String objective) {
79+
private Project createProjectWithoutExperimentalDesign(String title, String objective,
80+
PersonReference projectManager,
81+
PersonReference principalInvestigator) {
7682
ProjectIntent intent = getProjectIntent(title, objective);
77-
return Project.create(intent, createRandomCode());
83+
return Project.create(intent, createRandomCode(), projectManager, principalInvestigator);
7884
}
7985

8086
private Project createProjectWithExperimentalDesign(String title,
8187
String objective,
82-
String experimentalDesign) {
88+
String experimentalDesign, PersonReference projectManager,
89+
PersonReference principalInvestigator) {
8390

8491
ExperimentalDesignDescription experimentalDesignDescription;
8592
try {
@@ -91,13 +98,13 @@ private Project createProjectWithExperimentalDesign(String title,
9198
}
9299

93100
ProjectIntent intent = getProjectIntent(title, objective).with(experimentalDesignDescription);
94-
return Project.create(intent, createRandomCode());
101+
return Project.create(intent, createRandomCode(), projectManager, principalInvestigator);
95102
}
96103

97104
private static ProjectIntent getProjectIntent(String title, String objective) {
98105
ProjectTitle projectTitle;
99106
try {
100-
projectTitle = ProjectTitle.create(title);
107+
projectTitle = ProjectTitle.of(title);
101108
} catch (RuntimeException e) {
102109
log.error(e.getMessage(), e);
103110
throw new ProjectManagementException(ErrorCode.INVALID_PROJECT_TITLE,

0 commit comments

Comments
 (0)