Skip to content

Commit 6c20d3e

Browse files
committed
FINERACT-2239: New command processing - Resource Notes (org.apache.fineract.portfolio.note)
1 parent 0629bb2 commit 6c20d3e

File tree

63 files changed

+1158
-1268
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+1158
-1268
lines changed

custom/acme/note/service/src/main/java/com/acme/fineract/portfolio/note/service/AcmeNoteReadPlatformService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import java.util.Collections;
2222
import java.util.List;
2323
import lombok.extern.slf4j.Slf4j;
24-
import org.apache.fineract.portfolio.note.data.NoteData;
24+
import org.apache.fineract.portfolio.note.data.NoteResponse;
2525
import org.apache.fineract.portfolio.note.service.NoteReadPlatformService;
2626
import org.springframework.beans.factory.InitializingBean;
2727
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -38,12 +38,12 @@ public void afterPropertiesSet() throws Exception {
3838
}
3939

4040
@Override
41-
public NoteData retrieveNote(Long noteId, Long resourceId, Integer noteTypeId) {
41+
public NoteResponse retrieveNote(Long noteId, Long resourceId, Integer noteTypeId) {
4242
return null;
4343
}
4444

4545
@Override
46-
public List<NoteData> retrieveNotesByResource(Long resourceId, Integer noteTypeId) {
46+
public List<NoteResponse> retrieveNotesByResource(Long resourceId, Integer noteTypeId) {
4747
return Collections.emptyList();
4848
}
4949
}

custom/acme/note/service/src/main/java/com/acme/fineract/portfolio/note/service/AcmeNoteWritePlatformService.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,13 @@
1919
package com.acme.fineract.portfolio.note.service;
2020

2121
import lombok.extern.slf4j.Slf4j;
22-
import org.apache.fineract.infrastructure.core.api.JsonCommand;
23-
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
24-
import org.apache.fineract.portfolio.client.domain.Client;
22+
import org.apache.fineract.portfolio.note.data.NoteCreateRequest;
23+
import org.apache.fineract.portfolio.note.data.NoteCreateResponse;
24+
import org.apache.fineract.portfolio.note.data.NoteDeleteByResourceIdRequest;
25+
import org.apache.fineract.portfolio.note.data.NoteDeleteRequest;
26+
import org.apache.fineract.portfolio.note.data.NoteDeleteResponse;
27+
import org.apache.fineract.portfolio.note.data.NoteUpdateRequest;
28+
import org.apache.fineract.portfolio.note.data.NoteUpdateResponse;
2529
import org.apache.fineract.portfolio.note.service.NoteWritePlatformService;
2630
import org.springframework.beans.factory.InitializingBean;
2731
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -38,27 +42,22 @@ public void afterPropertiesSet() throws Exception {
3842
}
3943

4044
@Override
41-
public CommandProcessingResult createNote(JsonCommand command) {
45+
public NoteCreateResponse createNote(NoteCreateRequest request) {
4246
throw new UnsupportedOperationException("createNote() is not yet implemented.");
4347
}
4448

4549
@Override
46-
public void createLoanTransactionNote(Long loanTransactionId, String note) {
47-
throw new UnsupportedOperationException("createLoanTransactionNote() is not yet implemented.");
48-
}
49-
50-
@Override
51-
public CommandProcessingResult updateNote(JsonCommand command) {
50+
public NoteUpdateResponse updateNote(NoteUpdateRequest request) {
5251
throw new UnsupportedOperationException("updateNote() is not yet implemented.");
5352
}
5453

5554
@Override
56-
public CommandProcessingResult deleteNote(JsonCommand command) {
55+
public NoteDeleteResponse deleteNote(NoteDeleteRequest request) {
5756
throw new UnsupportedOperationException("deleteNote() is not yet implemented.");
5857
}
5958

6059
@Override
61-
public void createAndPersistClientNote(Client client, JsonCommand command) {
62-
log.warn("createAndPersistClientNote() is intentionally left empty and does nothing.");
60+
public void deleteByResource(NoteDeleteByResourceIdRequest request) {
61+
throw new UnsupportedOperationException("deleteBySavingsAccount() is not yet implemented.");
6362
}
6463
}

custom/acme/note/starter/src/test/java/com/acme/fineract/portfolio/note/starter/TestDefaultConfiguration.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
3030
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
3131
import org.apache.fineract.portfolio.note.domain.NoteRepository;
32-
import org.apache.fineract.portfolio.note.serialization.NoteCommandFromApiJsonDeserializer;
3332
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3433
import org.springframework.context.annotation.Bean;
3534
import org.springframework.jdbc.core.JdbcTemplate;
@@ -82,9 +81,4 @@ public LoanRepositoryWrapper loanRepository() {
8281
public LoanTransactionRepository loanTransactionRepository() {
8382
return mock(LoanTransactionRepository.class);
8483
}
85-
86-
@Bean
87-
public NoteCommandFromApiJsonDeserializer fromApiJsonDeserializer(FromJsonHelper fromJsonHelper) {
88-
return new NoteCommandFromApiJsonDeserializer(fromJsonHelper);
89-
}
9084
}

custom/acme/note/starter/src/test/java/com/acme/fineract/portfolio/note/starter/TestOverrideConfiguration.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,13 @@
2020

2121
import static org.mockito.Mockito.mock;
2222

23-
import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
2423
import org.apache.fineract.infrastructure.core.service.database.RoutingDataSource;
2524
import org.apache.fineract.infrastructure.core.service.database.RoutingDataSourceServiceFactory;
2625
import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper;
2726
import org.apache.fineract.portfolio.group.domain.GroupRepository;
2827
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
2928
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
3029
import org.apache.fineract.portfolio.note.domain.NoteRepository;
31-
import org.apache.fineract.portfolio.note.serialization.NoteCommandFromApiJsonDeserializer;
3230
import org.springframework.context.annotation.Bean;
3331
import org.springframework.context.annotation.ComponentScan;
3432
import org.springframework.jdbc.core.JdbcTemplate;
@@ -37,11 +35,6 @@
3735
public class TestOverrideConfiguration {
3836
// NOTE: unfortunately an abastract base class that contains all these mock functions won't work
3937

40-
@Bean
41-
public FromJsonHelper fromJsonHelper() {
42-
return mock(FromJsonHelper.class);
43-
}
44-
4538
@Bean
4639
public RoutingDataSourceServiceFactory routingDataSourceServiceFactory() {
4740
return mock(RoutingDataSourceServiceFactory.class);
@@ -81,9 +74,4 @@ public LoanRepositoryWrapper loanRepository() {
8174
public LoanTransactionRepository loanTransactionRepository() {
8275
return mock(LoanTransactionRepository.class);
8376
}
84-
85-
@Bean
86-
public NoteCommandFromApiJsonDeserializer fromApiJsonDeserializer(FromJsonHelper fromJsonHelper) {
87-
return new NoteCommandFromApiJsonDeserializer(fromJsonHelper);
88-
}
8977
}

fineract-accounting/src/main/java/org/apache/fineract/accounting/journalentry/data/TransactionDetailData.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
import lombok.Getter;
2222
import lombok.RequiredArgsConstructor;
23-
import org.apache.fineract.portfolio.note.data.NoteData;
23+
import org.apache.fineract.portfolio.note.data.NoteResponse;
2424
import org.apache.fineract.portfolio.paymentdetail.data.PaymentDetailData;
2525

2626
@RequiredArgsConstructor
@@ -29,13 +29,13 @@ public class TransactionDetailData {
2929

3030
private final Long transactionId;
3131
private final PaymentDetailData paymentDetails;
32-
private final NoteData noteData;
32+
private final NoteResponse noteResponse;
3333
private final TransactionTypeEnumData transactionType;
3434

35-
public TransactionDetailData(final Long transactionId, final PaymentDetailData paymentDetails, final NoteData noteData) {
35+
public TransactionDetailData(final Long transactionId, final PaymentDetailData paymentDetails, final NoteResponse noteResponse) {
3636
this.transactionId = transactionId;
3737
this.paymentDetails = paymentDetails;
38-
this.noteData = noteData;
38+
this.noteResponse = noteResponse;
3939
this.transactionType = null;
4040
}
4141
}

fineract-command/src/test/java/org/apache/fineract/command/sample/api/DummyApiController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
2323
import static org.springframework.http.MediaType.APPLICATION_PROBLEM_JSON_VALUE;
2424

25+
import jakarta.validation.Valid;
2526
import java.time.OffsetDateTime;
2627
import java.time.ZoneId;
2728
import java.util.UUID;
@@ -55,7 +56,7 @@ class DummyApiController {
5556

5657
@PostMapping("/sync")
5758
DummyResponse dummySync(@RequestHeader(value = COMMAND_REQUEST_ID, required = false) UUID requestId,
58-
@RequestHeader(value = "x-fineract-tenant-id", required = false) String tenantId, @RequestBody DummyRequest request) {
59+
@RequestHeader(value = "x-fineract-tenant-id", required = false) String tenantId, @Valid @RequestBody DummyRequest request) {
5960
var command = new DummyCommand();
6061
command.setId(requestId);
6162
command.setPayload(request);

fineract-core/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java

Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1837,55 +1837,6 @@ public CommandWrapperBuilder deleteCalendar(final String supportedEntityType, fi
18371837
return this;
18381838
}
18391839

1840-
public CommandWrapperBuilder createNote(final CommandWrapper resourceDetails, final String resourceType, final Long resourceId) {
1841-
this.actionName = "CREATE";
1842-
this.entityName = resourceDetails.entityName();// Note supports multiple
1843-
// resources. Note
1844-
// Permissions are set
1845-
// for each resource.
1846-
this.clientId = resourceDetails.getClientId();
1847-
this.loanId = resourceDetails.getLoanId();
1848-
this.savingsId = resourceDetails.getSavingsId();
1849-
this.groupId = resourceDetails.getGroupId();
1850-
this.subentityId = resourceDetails.subresourceId();
1851-
this.href = "/" + resourceType + "/" + resourceId + "/notes/template";
1852-
return this;
1853-
}
1854-
1855-
public CommandWrapperBuilder updateNote(final CommandWrapper resourceDetails, final String resourceType, final Long resourceId,
1856-
final Long noteId) {
1857-
this.actionName = "UPDATE";
1858-
this.entityName = resourceDetails.entityName();// Note supports multiple
1859-
// resources. Note
1860-
// Permissions are set
1861-
// for each resource.
1862-
this.entityId = noteId;
1863-
this.clientId = resourceDetails.getClientId();
1864-
this.loanId = resourceDetails.getLoanId();
1865-
this.savingsId = resourceDetails.getSavingsId();
1866-
this.groupId = resourceDetails.getGroupId();
1867-
this.subentityId = resourceDetails.subresourceId();
1868-
this.href = "/" + resourceType + "/" + resourceId + "/notes";
1869-
return this;
1870-
}
1871-
1872-
public CommandWrapperBuilder deleteNote(final CommandWrapper resourceDetails, final String resourceType, final Long resourceId,
1873-
final Long noteId) {
1874-
this.actionName = "DELETE";
1875-
this.entityName = resourceDetails.entityName();// Note supports multiple
1876-
// resources. Note
1877-
// Permissions are set
1878-
// for each resource.
1879-
this.entityId = noteId;
1880-
this.clientId = resourceDetails.getClientId();
1881-
this.loanId = resourceDetails.getLoanId();
1882-
this.savingsId = resourceDetails.getSavingsId();
1883-
this.groupId = resourceDetails.getGroupId();
1884-
this.subentityId = resourceDetails.subresourceId();
1885-
this.href = "/" + resourceType + "/" + resourceId + "/calendars/" + noteId;
1886-
return this;
1887-
}
1888-
18891840
public CommandWrapperBuilder createGroup() {
18901841
this.actionName = "CREATE";
18911842
this.entityName = "GROUP";
@@ -3581,13 +3532,6 @@ public CommandWrapperBuilder updateRate(final Long rateId) {
35813532
return this;
35823533
}
35833534

3584-
public CommandWrapperBuilder updateBusinessDate() {
3585-
this.actionName = "UPDATE";
3586-
this.entityName = "BUSINESS_DATE";
3587-
this.href = "/businessdate";
3588-
return this;
3589-
}
3590-
35913535
public CommandWrapperBuilder createDelinquencyRange() {
35923536
this.actionName = "CREATE";
35933537
this.entityName = "DELINQUENCY_RANGE";

fineract-core/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -276,16 +276,6 @@ private NewCommandSourceHandler findCommandHandler(final CommandWrapper wrapper)
276276
} else {
277277
throw new UnsupportedCommandException(wrapper.commandName());
278278
}
279-
} else if (wrapper.isNoteResource()) {
280-
if (wrapper.isCreate()) {
281-
handler = applicationContext.getBean("createNoteCommandHandler", NewCommandSourceHandler.class);
282-
} else if (wrapper.isUpdate()) {
283-
handler = applicationContext.getBean("updateNoteCommandHandler", NewCommandSourceHandler.class);
284-
} else if (wrapper.isDelete()) {
285-
handler = applicationContext.getBean("deleteNoteCommandHandler", NewCommandSourceHandler.class);
286-
} else {
287-
throw new UnsupportedCommandException(wrapper.commandName());
288-
}
289279
} else if (wrapper.isSurveyResource()) {
290280
if (wrapper.isRegisterSurvey()) {
291281
handler = applicationContext.getBean("registerSurveyCommandHandler", NewCommandSourceHandler.class);

fineract-core/src/main/java/org/apache/fineract/infrastructure/businessdate/api/BusinessDateApiResource.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
package org.apache.fineract.infrastructure.businessdate.api;
2020

2121
import io.swagger.v3.oas.annotations.Operation;
22-
import io.swagger.v3.oas.annotations.Parameter;
2322
import io.swagger.v3.oas.annotations.tags.Tag;
2423
import jakarta.validation.Valid;
2524
import jakarta.ws.rs.Consumes;
25+
import jakarta.ws.rs.DefaultValue;
2626
import jakarta.ws.rs.GET;
2727
import jakarta.ws.rs.HeaderParam;
2828
import jakarta.ws.rs.POST;
@@ -64,15 +64,15 @@ public List<BusinessDateResponse> getBusinessDates() {
6464
@Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
6565
@Produces(MediaType.APPLICATION_JSON)
6666
@Operation(summary = "Retrieve a specific Business date", description = "")
67-
public BusinessDateResponse getBusinessDate(@PathParam("type") @Parameter(description = "type") final String type) {
67+
public BusinessDateResponse getBusinessDate(@PathParam("type") final String type) {
6868
return this.readPlatformService.findByType(type);
6969
}
7070

7171
@POST
7272
@Consumes({ MediaType.APPLICATION_JSON })
7373
@Produces({ MediaType.APPLICATION_JSON })
7474
@Operation(summary = "Update Business Date", description = "")
75-
public BusinessDateResponse updateBusinessDate(@HeaderParam("Idempotency-Key") String idempotencyKey,
75+
public BusinessDateResponse updateBusinessDate(@HeaderParam("Idempotency-Key") @DefaultValue("") String idempotencyKey,
7676
@Valid BusinessDateUpdateRequest request) {
7777

7878
final var command = new BusinessDateUpdateCommand();

fineract-core/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableWithUTCDateTimeCustom.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,12 @@
2626
import jakarta.persistence.Column;
2727
import jakarta.persistence.MappedSuperclass;
2828
import jakarta.validation.constraints.NotNull;
29+
import java.io.Serial;
2930
import java.io.Serializable;
3031
import java.time.OffsetDateTime;
3132
import java.util.Optional;
3233
import lombok.AccessLevel;
33-
import lombok.Getter;
3434
import lombok.NoArgsConstructor;
35-
import lombok.Setter;
3635
import org.springframework.data.domain.Auditable;
3736
import org.springframework.data.jpa.domain.AbstractAuditable;
3837

@@ -44,30 +43,45 @@
4443
* Abstract base class for auditable entities. Stores the audit values in persistent fields.
4544
*/
4645
@MappedSuperclass
47-
@Getter
48-
@Setter
4946
@NoArgsConstructor(access = AccessLevel.PROTECTED)
5047
public abstract class AbstractAuditableWithUTCDateTimeCustom<T extends Serializable> extends AbstractPersistableCustom<T>
5148
implements Auditable<Long, T, OffsetDateTime> {
5249

50+
@Serial
5351
private static final long serialVersionUID = 141481953116476081L;
5452

5553
@Column(name = CREATED_BY_DB_FIELD, updatable = false, nullable = false)
56-
@Setter(onMethod_ = @Override)
5754
private Long createdBy;
5855

5956
@Column(name = CREATED_DATE_DB_FIELD, updatable = false, nullable = false)
60-
@Setter(onMethod_ = @Override)
6157
private OffsetDateTime createdDate;
6258

6359
@Column(name = LAST_MODIFIED_BY_DB_FIELD, nullable = false)
64-
@Setter(onMethod_ = @Override)
6560
private Long lastModifiedBy;
6661

6762
@Column(name = LAST_MODIFIED_DATE_DB_FIELD, nullable = false)
68-
@Setter(onMethod_ = @Override)
6963
private OffsetDateTime lastModifiedDate;
7064

65+
@Override
66+
public void setCreatedBy(Long createdBy) {
67+
this.createdBy = createdBy;
68+
}
69+
70+
@Override
71+
public void setCreatedDate(OffsetDateTime createdDate) {
72+
this.createdDate = createdDate;
73+
}
74+
75+
@Override
76+
public void setLastModifiedBy(Long lastModifiedBy) {
77+
this.lastModifiedBy = lastModifiedBy;
78+
}
79+
80+
@Override
81+
public void setLastModifiedDate(OffsetDateTime lastModifiedDate) {
82+
this.lastModifiedDate = lastModifiedDate;
83+
}
84+
7185
@Override
7286
@NotNull
7387
public Optional<Long> getCreatedBy() {

0 commit comments

Comments
 (0)