Skip to content

Commit 6152bb9

Browse files
committed
FINERACT-2287: New command processing for interest rate charts
1 parent a9b5f12 commit 6152bb9

65 files changed

Lines changed: 1748 additions & 1148 deletions

File tree

Some content is hidden

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

fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/SecurityConfig.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,28 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
335335
.hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, "READ_WORKING_DAYS")
336336
.requestMatchers(API_MATCHER.matcher(HttpMethod.PUT, "/api/*/workingdays"))
337337
.hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "UPDATE_WORKING_DAYS")
338+
// interest rate chart slabs (before charts for specificity)
339+
.requestMatchers(API_MATCHER.matcher(HttpMethod.GET, "/api/*/interestratecharts/*/chartslabs"))
340+
.hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, "READ_CHARTSLAB")
341+
.requestMatchers(API_MATCHER.matcher(HttpMethod.GET, "/api/*/interestratecharts/*/chartslabs/*"))
342+
.hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, "READ_CHARTSLAB")
343+
.requestMatchers(API_MATCHER.matcher(HttpMethod.POST, "/api/*/interestratecharts/*/chartslabs"))
344+
.hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "CREATE_CHARTSLAB")
345+
.requestMatchers(API_MATCHER.matcher(HttpMethod.PUT, "/api/*/interestratecharts/*/chartslabs/*"))
346+
.hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "UPDATE_CHARTSLAB")
347+
.requestMatchers(API_MATCHER.matcher(HttpMethod.DELETE, "/api/*/interestratecharts/*/chartslabs/*"))
348+
.hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "DELETE_CHARTSLAB")
349+
// interest rate chart
350+
.requestMatchers(API_MATCHER.matcher(HttpMethod.GET, "/api/*/interestratecharts"))
351+
.hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, "READ_INTERESTRATECHART")
352+
.requestMatchers(API_MATCHER.matcher(HttpMethod.GET, "/api/*/interestratecharts/*"))
353+
.hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, "READ_INTERESTRATECHART")
354+
.requestMatchers(API_MATCHER.matcher(HttpMethod.POST, "/api/*/interestratecharts"))
355+
.hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "CREATE_INTERESTRATECHART")
356+
.requestMatchers(API_MATCHER.matcher(HttpMethod.PUT, "/api/*/interestratecharts/*"))
357+
.hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "UPDATE_INTERESTRATECHART")
358+
.requestMatchers(API_MATCHER.matcher(HttpMethod.DELETE, "/api/*/interestratecharts/*"))
359+
.hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "DELETE_INTERESTRATECHART")
338360

339361
.requestMatchers(API_MATCHER.matcher(HttpMethod.POST, "/api/*/twofactor/validate")).fullyAuthenticated()
340362
.requestMatchers(API_MATCHER.matcher("/api/*/twofactor")).fullyAuthenticated()

fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartSlabsApiResource.java

Lines changed: 48 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,9 @@
1818
*/
1919
package org.apache.fineract.portfolio.interestratechart.api;
2020

21-
import static org.apache.fineract.portfolio.interestratechart.InterestRateChartSlabApiConstants.INTERESTRATE_CHART_SLAB_RESOURCE_NAME;
22-
2321
import io.swagger.v3.oas.annotations.Operation;
24-
import io.swagger.v3.oas.annotations.Parameter;
2522
import io.swagger.v3.oas.annotations.media.Content;
2623
import io.swagger.v3.oas.annotations.media.Schema;
27-
import io.swagger.v3.oas.annotations.parameters.RequestBody;
2824
import io.swagger.v3.oas.annotations.responses.ApiResponse;
2925
import io.swagger.v3.oas.annotations.tags.Tag;
3026
import jakarta.ws.rs.Consumes;
@@ -35,118 +31,97 @@
3531
import jakarta.ws.rs.Path;
3632
import jakarta.ws.rs.PathParam;
3733
import jakarta.ws.rs.Produces;
38-
import jakarta.ws.rs.core.Context;
3934
import jakarta.ws.rs.core.MediaType;
40-
import jakarta.ws.rs.core.UriInfo;
4135
import java.util.List;
36+
import java.util.function.Supplier;
4237
import lombok.RequiredArgsConstructor;
43-
import org.apache.fineract.commands.domain.CommandWrapper;
44-
import org.apache.fineract.commands.service.CommandWrapperBuilder;
45-
import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
46-
import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
47-
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
48-
import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
49-
import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
50-
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
38+
import org.apache.fineract.command.core.CommandPipeline;
39+
import org.apache.fineract.portfolio.interestratechart.command.InterestRateChartSlabsCreateCommand;
40+
import org.apache.fineract.portfolio.interestratechart.command.InterestRateChartSlabsDeleteCommand;
41+
import org.apache.fineract.portfolio.interestratechart.command.InterestRateChartSlabsUpdateCommand;
5142
import org.apache.fineract.portfolio.interestratechart.data.InterestRateChartSlabData;
52-
import org.apache.fineract.portfolio.interestratechart.data.InterestRateChartStabRequest;
53-
import org.apache.fineract.portfolio.interestratechart.service.InterestRateChartSlabReadPlatformService;
43+
import org.apache.fineract.portfolio.interestratechart.data.InterestRateChartSlabsCreateRequest;
44+
import org.apache.fineract.portfolio.interestratechart.data.InterestRateChartSlabsCreateResponse;
45+
import org.apache.fineract.portfolio.interestratechart.data.InterestRateChartSlabsDeleteRequest;
46+
import org.apache.fineract.portfolio.interestratechart.data.InterestRateChartSlabsDeleteResponse;
47+
import org.apache.fineract.portfolio.interestratechart.data.InterestRateChartSlabsUpdateRequest;
48+
import org.apache.fineract.portfolio.interestratechart.data.InterestRateChartSlabsUpdateResponse;
49+
import org.apache.fineract.portfolio.interestratechart.service.InterestRateChartSlabsReadService;
5450
import org.springframework.stereotype.Component;
5551

5652
@Path("/v1/interestratecharts/{chartId}/chartslabs")
5753
@Component
54+
@Consumes({ MediaType.APPLICATION_JSON })
55+
@Produces({ MediaType.APPLICATION_JSON })
5856
@Tag(name = "Interest Rate Slab (A.K.A interest bands)", description = "The slabs a.k.a interest bands are associated with Interest Rate Chart. These bands allow to define different interest rates for different deposit term periods.")
5957
@RequiredArgsConstructor
6058
public class InterestRateChartSlabsApiResource {
6159

62-
private final InterestRateChartSlabReadPlatformService interestRateChartSlabReadPlatformService;
63-
private final PlatformSecurityContext context;
64-
private final DefaultToApiJsonSerializer<InterestRateChartSlabData> toApiJsonSerializer;
65-
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
66-
private final ApiRequestParameterHelper apiRequestParameterHelper;
60+
private final InterestRateChartSlabsReadService interestRateChartSlabsReadService;
61+
private final CommandPipeline commandPipeline;
6762

6863
@GET
6964
@Path("template")
70-
@Consumes({ MediaType.APPLICATION_JSON })
71-
@Produces({ MediaType.APPLICATION_JSON })
72-
public InterestRateChartSlabData template(@PathParam("chartId") @Parameter(description = "chartId") final Long chartId) {
73-
return this.interestRateChartSlabReadPlatformService.retrieveTemplate();
65+
public InterestRateChartSlabData template(@PathParam("chartId") final Long chartId) {
66+
return interestRateChartSlabsReadService.retrieveTemplate();
7467
}
7568

7669
@GET
77-
@Consumes({ MediaType.APPLICATION_JSON })
78-
@Produces({ MediaType.APPLICATION_JSON })
7970
@Operation(summary = "Retrieve all Slabs", description = "Retrieve list of slabs associated with a chart\n" + "\n"
8071
+ "Example Requests:\n" + "\n" + "interestratecharts/1/chartslabs")
81-
public List<InterestRateChartSlabData> retrieveAll(@PathParam("chartId") @Parameter(description = "chartId") final Long chartId) {
82-
83-
this.context.authenticatedUser().validateHasReadPermission(INTERESTRATE_CHART_SLAB_RESOURCE_NAME);
84-
return this.interestRateChartSlabReadPlatformService.retrieveAll(chartId);
72+
public List<InterestRateChartSlabData> retrieveAll(@PathParam("chartId") final Long chartId) {
73+
return interestRateChartSlabsReadService.retrieveAll(chartId);
8574
}
8675

8776
@GET
8877
@Path("{chartSlabId}")
89-
@Consumes({ MediaType.APPLICATION_JSON })
90-
@Produces({ MediaType.APPLICATION_JSON })
9178
@Operation(summary = "Retrieve a Slab", description = "Retrieve a slab associated with an Interest rate chart\n" + "\n"
9279
+ "Example Requests:\n" + "\n" + "interestratecharts/1/chartslabs/1\n")
93-
public InterestRateChartSlabData retrieveOne(@PathParam("chartId") @Parameter(description = "chartId") final Long chartId,
94-
@PathParam("chartSlabId") @Parameter(description = "chartSlabId") final Long chartSlabId, @Context final UriInfo uriInfo) {
95-
96-
this.context.authenticatedUser().validateHasReadPermission(INTERESTRATE_CHART_SLAB_RESOURCE_NAME);
97-
98-
InterestRateChartSlabData chartSlab = this.interestRateChartSlabReadPlatformService.retrieveOne(chartId, chartSlabId);
99-
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
100-
if (settings.isTemplate()) {
101-
chartSlab = this.interestRateChartSlabReadPlatformService.retrieveWithTemplate(chartSlab);
102-
}
103-
104-
return chartSlab;
80+
public InterestRateChartSlabData retrieveOne(@PathParam("chartId") final Long chartId,
81+
@PathParam("chartSlabId") final Long chartSlabId) {
82+
return interestRateChartSlabsReadService.retrieveOne(chartId, chartSlabId);
10583
}
10684

10785
@POST
108-
@Consumes({ MediaType.APPLICATION_JSON })
109-
@Produces({ MediaType.APPLICATION_JSON })
11086
@Operation(summary = "Create a Slab", description = "Creates a new interest rate slab for an interest rate chart.\n"
11187
+ "Mandatory Fields\n" + "periodType, fromPeriod, annualInterestRate\n" + "Optional Fields\n" + "toPeriod and description\n"
11288
+ "Example Requests:\n" + "\n" + "interestratecharts/1/chartslabs")
113-
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = InterestRateChartStabRequest.class)))
114-
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = InterestRateChartSlabsApiResourceSwagger.PostInterestRateChartsChartIdChartSlabsResponse.class)))
115-
public CommandProcessingResult create(@PathParam("chartId") @Parameter(description = "chartId") final Long chartId,
116-
@Parameter(hidden = true) InterestRateChartStabRequest interestRateChartStabRequest) {
117-
118-
final CommandWrapper commandRequest = new CommandWrapperBuilder().createInterestRateChartSlab(chartId)
119-
.withJson(toApiJsonSerializer.serialize(interestRateChartStabRequest)).build();
120-
121-
return this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
89+
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = InterestRateChartSlabsCreateResponse.class)))
90+
public InterestRateChartSlabsCreateResponse create(@PathParam("chartId") final Long chartId,
91+
final InterestRateChartSlabsCreateRequest request) {
92+
request.setChartId(chartId);
93+
final var command = new InterestRateChartSlabsCreateCommand();
94+
command.setPayload(request);
95+
final Supplier<InterestRateChartSlabsCreateResponse> responseSupplier = commandPipeline.send(command);
96+
return responseSupplier.get();
12297
}
12398

12499
@PUT
125100
@Path("{chartSlabId}")
126-
@Consumes({ MediaType.APPLICATION_JSON })
127-
@Produces({ MediaType.APPLICATION_JSON })
128101
@Operation(summary = "Update a Slab", description = "It updates the Slab from chart")
129-
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = InterestRateChartStabRequest.class)))
130-
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = InterestRateChartSlabsApiResourceSwagger.PutInterestRateChartsChartIdChartSlabsChartSlabIdResponse.class)))
131-
public CommandProcessingResult update(@PathParam("chartId") @Parameter(description = "chartId") final Long chartId,
132-
@PathParam("chartSlabId") @Parameter(description = "chartSlabId") final Long chartSlabId,
133-
@Parameter(hidden = true) InterestRateChartStabRequest request) {
102+
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = InterestRateChartSlabsUpdateResponse.class)))
103+
public InterestRateChartSlabsUpdateResponse update(@PathParam("chartId") final Long chartId,
104+
@PathParam("chartSlabId") final Long chartSlabId, final InterestRateChartSlabsUpdateRequest request) {
105+
request.setChartId(chartId);
106+
request.setChartSlabId(chartSlabId);
107+
108+
final var command = new InterestRateChartSlabsUpdateCommand();
109+
command.setPayload(request);
134110

135-
final CommandWrapper commandRequest = new CommandWrapperBuilder().updateInterestRateChartSlab(chartId, chartSlabId)
136-
.withJson(toApiJsonSerializer.serialize(request)).build();
111+
final Supplier<InterestRateChartSlabsUpdateResponse> responseSupplier = commandPipeline.send(command);
137112

138-
return this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
113+
return responseSupplier.get();
139114
}
140115

141116
@DELETE
142117
@Path("{chartSlabId}")
143-
@Consumes({ MediaType.APPLICATION_JSON })
144-
@Produces({ MediaType.APPLICATION_JSON })
145118
@Operation(summary = "Delete a Slab", description = "Delete a Slab from a chart")
146-
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = InterestRateChartSlabsApiResourceSwagger.DeleteInterestRateChartsChartIdChartSlabsResponse.class)))
147-
public CommandProcessingResult delete(@PathParam("chartId") @Parameter(description = "chartId") final Long chartId,
148-
@PathParam("chartSlabId") @Parameter(description = "chartSlabId") final Long chartSlabId) {
149-
final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteInterestRateChartSlab(chartId, chartSlabId).build();
150-
return this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
119+
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = InterestRateChartSlabsDeleteResponse.class)))
120+
public InterestRateChartSlabsDeleteResponse delete(@PathParam("chartId") final Long chartId,
121+
@PathParam("chartSlabId") final Long chartSlabId) {
122+
final var command = new InterestRateChartSlabsDeleteCommand();
123+
command.setPayload(InterestRateChartSlabsDeleteRequest.builder().chartId(chartId).chartSlabId(chartSlabId).build());
124+
final Supplier<InterestRateChartSlabsDeleteResponse> responseSupplier = commandPipeline.send(command);
125+
return responseSupplier.get();
151126
}
152127
}

fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartSlabsApiResourceSwagger.java

Lines changed: 0 additions & 108 deletions
This file was deleted.

0 commit comments

Comments
 (0)