Skip to content

Commit ba06234

Browse files
VictorPavfuriousvidakovic
authored andcommitted
FINERACT-2242: New command processing - External Event Configuration (org.apache.fineract.infrastructure.event.external)
1 parent 86024b8 commit ba06234

34 files changed

Lines changed: 341 additions & 317 deletions

File tree

fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/api/ExternalEventConfigurationApiResource.java

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,25 @@
1919
package org.apache.fineract.infrastructure.event.external.api;
2020

2121
import io.swagger.v3.oas.annotations.Operation;
22-
import io.swagger.v3.oas.annotations.Parameter;
23-
import io.swagger.v3.oas.annotations.media.Content;
24-
import io.swagger.v3.oas.annotations.media.Schema;
25-
import io.swagger.v3.oas.annotations.parameters.RequestBody;
2622
import io.swagger.v3.oas.annotations.tags.Tag;
23+
import jakarta.validation.Valid;
2724
import jakarta.ws.rs.Consumes;
2825
import jakarta.ws.rs.GET;
26+
import jakarta.ws.rs.HeaderParam;
2927
import jakarta.ws.rs.PUT;
3028
import jakarta.ws.rs.Path;
3129
import jakarta.ws.rs.Produces;
3230
import jakarta.ws.rs.core.MediaType;
31+
import java.util.UUID;
32+
import java.util.function.Supplier;
3333
import lombok.RequiredArgsConstructor;
34-
import org.apache.fineract.commands.domain.CommandWrapper;
35-
import org.apache.fineract.commands.service.CommandWrapperBuilder;
36-
import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
37-
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
38-
import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
39-
import org.apache.fineract.infrastructure.event.external.command.ExternalEventConfigurationCommand;
40-
import org.apache.fineract.infrastructure.event.external.data.ExternalEventConfigurationData;
34+
import org.apache.fineract.command.core.CommandPipeline;
35+
import org.apache.fineract.infrastructure.core.service.DateUtils;
36+
import org.apache.fineract.infrastructure.event.external.command.ExternalConfigurationsUpdateCommand;
37+
import org.apache.fineract.infrastructure.event.external.data.ExternalEventConfigurationResponse;
38+
import org.apache.fineract.infrastructure.event.external.data.ExternalEventConfigurationUpdateRequest;
39+
import org.apache.fineract.infrastructure.event.external.data.ExternalEventConfigurationUpdateResponse;
4140
import org.apache.fineract.infrastructure.event.external.service.ExternalEventConfigurationReadPlatformService;
42-
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
4341
import org.springframework.stereotype.Component;
4442

4543
@RequiredArgsConstructor
@@ -48,32 +46,32 @@
4846
@Tag(name = "External event configuration", description = "External event configuration enables user to enable/disable event posting to downstream message channel")
4947
public class ExternalEventConfigurationApiResource {
5048

51-
private static final String RESOURCE_NAME_FOR_PERMISSIONS = "EXTERNAL_EVENT_CONFIGURATION";
52-
53-
private final PlatformSecurityContext context;
54-
private final PortfolioCommandSourceWritePlatformService commandWritePlatformService;
55-
private final DefaultToApiJsonSerializer<ExternalEventConfigurationData> jsonSerializer;
5649
private final ExternalEventConfigurationReadPlatformService readPlatformService;
50+
private final CommandPipeline commandPipeline;
5751

5852
@GET
5953
@Consumes({ MediaType.APPLICATION_JSON })
6054
@Produces({ MediaType.APPLICATION_JSON })
6155
@Operation(summary = "List all external event configurations", description = "")
62-
public ExternalEventConfigurationData retrieveExternalEventConfiguration() {
63-
context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
56+
public ExternalEventConfigurationResponse getExternalEventConfigurations() {
6457
return readPlatformService.findAllExternalEventConfigurations();
6558
}
6659

6760
@PUT
6861
@Consumes({ MediaType.APPLICATION_JSON })
6962
@Produces({ MediaType.APPLICATION_JSON })
7063
@Operation(summary = "Enable/Disable external events posting", description = "")
71-
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = ExternalEventConfigurationCommand.class)))
72-
public CommandProcessingResult updateExternalEventConfigurationsDetails(
73-
@Parameter(hidden = true) ExternalEventConfigurationCommand command) {
74-
context.authenticatedUser().validateHasUpdatePermission(RESOURCE_NAME_FOR_PERMISSIONS);
75-
final CommandWrapper commandRequest = new CommandWrapperBuilder().updateExternalEventConfigurations()
76-
.withJson(jsonSerializer.serialize(command)).build();
77-
return commandWritePlatformService.logCommandSource(commandRequest);
64+
public ExternalEventConfigurationUpdateResponse updateExternalEventConfigurations(@HeaderParam("Idempotency-Key") String idempotencyKey,
65+
@Valid ExternalEventConfigurationUpdateRequest request) {
66+
final var command = new ExternalConfigurationsUpdateCommand();
67+
68+
command.setId(UUID.randomUUID());
69+
command.setIdempotencyKey(idempotencyKey);
70+
command.setCreatedAt(DateUtils.getAuditOffsetDateTime());
71+
command.setPayload(request);
72+
73+
final Supplier<ExternalEventConfigurationUpdateResponse> response = commandPipeline.send(command);
74+
75+
return response.get();
7876
}
7977
}

fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/api/InternalExternalEventsApiResource.java

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
*/
1919
package org.apache.fineract.infrastructure.event.external.api;
2020

21-
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
2221
import jakarta.ws.rs.Consumes;
2322
import jakarta.ws.rs.DELETE;
2423
import jakarta.ws.rs.GET;
@@ -30,51 +29,36 @@
3029
import lombok.RequiredArgsConstructor;
3130
import lombok.extern.slf4j.Slf4j;
3231
import org.apache.fineract.infrastructure.core.boot.FineractProfiles;
33-
import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
32+
import org.apache.fineract.infrastructure.event.external.data.ExternalEventResponse;
3433
import org.apache.fineract.infrastructure.event.external.service.InternalExternalEventService;
35-
import org.apache.fineract.infrastructure.event.external.service.validation.ExternalEventDTO;
36-
import org.springframework.beans.factory.InitializingBean;
3734
import org.springframework.context.annotation.Profile;
3835
import org.springframework.stereotype.Component;
3936

37+
@Slf4j
38+
// TODO: can't we test this differently without creating boilerplate code that's only available during testing?
4039
@Profile(FineractProfiles.TEST)
4140
@Component
4241
@Path("/v1/internal/externalevents")
4342
@RequiredArgsConstructor
44-
@Slf4j
45-
public class InternalExternalEventsApiResource implements InitializingBean {
43+
public class InternalExternalEventsApiResource {
4644

4745
private final InternalExternalEventService internalExternalEventService;
48-
private final DefaultToApiJsonSerializer<List<ExternalEventDTO>> jsonSerializer;
49-
50-
@Override
51-
@SuppressFBWarnings("SLF4J_SIGN_ONLY_FORMAT")
52-
public void afterPropertiesSet() throws Exception {
53-
log.warn("------------------------------------------------------------");
54-
log.warn(" ");
55-
log.warn("DO NOT USE THIS IN PRODUCTION!");
56-
log.warn("Internal client services mode is enabled");
57-
log.warn("DO NOT USE THIS IN PRODUCTION!");
58-
log.warn(" ");
59-
log.warn("------------------------------------------------------------");
60-
}
6146

6247
@GET
6348
@Consumes({ MediaType.APPLICATION_JSON })
6449
@Produces({ MediaType.APPLICATION_JSON })
65-
public String getAllExternalEvents(@QueryParam("idempotencyKey") final String idempotencyKey, @QueryParam("type") final String type,
66-
@QueryParam("category") final String category, @QueryParam("aggregateRootId") final Long aggregateRootId) {
67-
log.debug("getAllExternalEvents called with params idempotencyKey:{}, type:{}, category:{}, aggregateRootId:{} ", idempotencyKey,
68-
type, category, aggregateRootId);
69-
List<ExternalEventDTO> allExternalEvents = internalExternalEventService.getAllExternalEvents(idempotencyKey, type, category,
70-
aggregateRootId);
71-
return jsonSerializer.serialize(allExternalEvents);
50+
public List<ExternalEventResponse> getAllExternalEvents(@QueryParam("idempotencyKey") final String idempotencyKey,
51+
@QueryParam("type") final String type, @QueryParam("category") final String category,
52+
@QueryParam("aggregateRootId") final Long aggregateRootId) {
53+
// TODO: authorization constraints?
54+
return internalExternalEventService.getAllExternalEvents(idempotencyKey, type, category, aggregateRootId);
7255
}
7356

7457
@DELETE
58+
@Consumes({ MediaType.APPLICATION_JSON })
59+
@Produces({ MediaType.APPLICATION_JSON })
7560
public void deleteAllExternalEvents() {
76-
log.debug("deleteAllExternalEvents called");
61+
// TODO: authorization constraints?
7762
internalExternalEventService.deleteAllExternalEvents();
7863
}
79-
8064
}

fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/command/ExternalEventConfigurationCommand.java renamed to fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/command/ExternalConfigurationsUpdateCommand.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,11 @@
1818
*/
1919
package org.apache.fineract.infrastructure.event.external.command;
2020

21-
import java.io.Serial;
22-
import java.io.Serializable;
23-
import java.util.Map;
21+
import lombok.Data;
22+
import lombok.EqualsAndHashCode;
23+
import org.apache.fineract.command.core.Command;
24+
import org.apache.fineract.infrastructure.event.external.data.ExternalEventConfigurationUpdateRequest;
2425

25-
public record ExternalEventConfigurationCommand(Map<String, Boolean> externalEventConfigurations) implements Serializable {
26-
27-
@Serial
28-
private static final long serialVersionUID = 1L;
29-
30-
}
26+
@Data
27+
@EqualsAndHashCode(callSuper = true)
28+
public class ExternalConfigurationsUpdateCommand extends Command<ExternalEventConfigurationUpdateRequest> {}

fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/data/ExternalEventConfigurationItemData.java renamed to fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/data/ExternalEventConfigurationItemResponse.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,21 @@
1818
*/
1919
package org.apache.fineract.infrastructure.event.external.data;
2020

21+
import java.io.Serial;
22+
import java.io.Serializable;
2123
import lombok.AllArgsConstructor;
24+
import lombok.Builder;
2225
import lombok.Data;
2326
import lombok.NoArgsConstructor;
2427

28+
@Builder
2529
@Data
2630
@NoArgsConstructor
2731
@AllArgsConstructor
28-
public class ExternalEventConfigurationItemData {
32+
public class ExternalEventConfigurationItemResponse implements Serializable {
33+
34+
@Serial
35+
private static final long serialVersionUID = 1L;
2936

3037
private String type;
3138
private boolean enabled;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/**
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.apache.fineract.infrastructure.event.external.data;
20+
21+
import java.io.Serial;
22+
import java.io.Serializable;
23+
import java.util.List;
24+
import lombok.AllArgsConstructor;
25+
import lombok.Builder;
26+
import lombok.Data;
27+
import lombok.NoArgsConstructor;
28+
29+
@Builder
30+
@Data
31+
@NoArgsConstructor
32+
@AllArgsConstructor
33+
public class ExternalEventConfigurationResponse implements Serializable {
34+
35+
@Serial
36+
private static final long serialVersionUID = 1L;
37+
38+
// TODO: why wrap things in this useless class?!? Just more boilerplate! Keeping for compatibility...
39+
private List<ExternalEventConfigurationItemResponse> externalEventConfiguration;
40+
}

fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/service/validation/ExternalEventDTO.java renamed to fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/data/ExternalEventConfigurationUpdateRequest.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,26 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.apache.fineract.infrastructure.event.external.service.validation;
19+
package org.apache.fineract.infrastructure.event.external.data;
2020

21-
import java.time.LocalDate;
22-
import java.time.OffsetDateTime;
21+
import jakarta.validation.constraints.NotNull;
22+
import java.io.Serial;
23+
import java.io.Serializable;
2324
import java.util.Map;
2425
import lombok.AllArgsConstructor;
25-
import lombok.Getter;
26-
import lombok.ToString;
26+
import lombok.Builder;
27+
import lombok.Data;
28+
import lombok.NoArgsConstructor;
2729

28-
@Getter
30+
@Builder
31+
@Data
32+
@NoArgsConstructor
2933
@AllArgsConstructor
30-
@ToString
31-
public class ExternalEventDTO {
34+
public class ExternalEventConfigurationUpdateRequest implements Serializable {
3235

33-
private final Long eventId;
34-
private final String type;
35-
private final String category;
36-
private final OffsetDateTime createdAt;
37-
private final Map<String, Object> payLoad;
38-
private final LocalDate businessDate;
39-
private final String schema;
40-
private final Long aggregateRootId;
36+
@Serial
37+
private static final long serialVersionUID = 1L;
38+
39+
@NotNull(message = "{org.apache.fineract.externalevent.configurations.not-null}")
40+
private Map<String, Boolean> externalEventConfigurations;
4141
}

fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/data/ExternalEventConfigurationData.java renamed to fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/data/ExternalEventConfigurationUpdateResponse.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,22 @@
1818
*/
1919
package org.apache.fineract.infrastructure.event.external.data;
2020

21-
import java.util.List;
21+
import java.io.Serial;
22+
import java.io.Serializable;
23+
import java.util.HashMap;
24+
import lombok.AllArgsConstructor;
25+
import lombok.Builder;
2226
import lombok.Data;
2327
import lombok.NoArgsConstructor;
2428

29+
@Builder
2530
@Data
2631
@NoArgsConstructor
27-
public class ExternalEventConfigurationData {
32+
@AllArgsConstructor
33+
public class ExternalEventConfigurationUpdateResponse implements Serializable {
2834

29-
private List<ExternalEventConfigurationItemData> externalEventConfiguration;
35+
@Serial
36+
private static final long serialVersionUID = 1L;
37+
38+
private HashMap<String, Object> changes;
3039
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.apache.fineract.infrastructure.event.external.data;
20+
21+
import java.io.Serial;
22+
import java.io.Serializable;
23+
import java.time.LocalDate;
24+
import java.time.OffsetDateTime;
25+
import java.util.Map;
26+
import lombok.AllArgsConstructor;
27+
import lombok.Builder;
28+
import lombok.Data;
29+
import lombok.NoArgsConstructor;
30+
31+
@Builder
32+
@Data
33+
@NoArgsConstructor
34+
@AllArgsConstructor
35+
public class ExternalEventResponse implements Serializable {
36+
37+
@Serial
38+
private static final long serialVersionUID = 1L;
39+
40+
private Long eventId;
41+
private String type;
42+
private String category;
43+
private OffsetDateTime createdAt;
44+
private Map<String, Object> payLoad;
45+
private LocalDate businessDate;
46+
private String schema;
47+
private Long aggregateRootId;
48+
}

fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/handler/ExternalEventConfigurationUpdateHandler.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,27 @@
1818
*/
1919
package org.apache.fineract.infrastructure.event.external.handler;
2020

21-
import jakarta.validation.constraints.NotNull;
2221
import lombok.RequiredArgsConstructor;
22+
import org.apache.fineract.command.core.Command;
23+
import org.apache.fineract.command.core.CommandHandler;
2324
import org.apache.fineract.commands.annotation.CommandType;
24-
import org.apache.fineract.commands.handler.NewCommandSourceHandler;
25-
import org.apache.fineract.infrastructure.core.api.JsonCommand;
26-
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
25+
import org.apache.fineract.infrastructure.event.external.data.ExternalEventConfigurationUpdateRequest;
26+
import org.apache.fineract.infrastructure.event.external.data.ExternalEventConfigurationUpdateResponse;
2727
import org.apache.fineract.infrastructure.event.external.service.ExternalEventConfigurationWritePlatformService;
2828
import org.springframework.stereotype.Service;
2929
import org.springframework.transaction.annotation.Transactional;
3030

3131
@RequiredArgsConstructor
3232
@Service
3333
@CommandType(entity = "EXTERNAL_EVENT_CONFIGURATION", action = "UPDATE")
34-
public class ExternalEventConfigurationUpdateHandler implements NewCommandSourceHandler {
34+
public class ExternalEventConfigurationUpdateHandler
35+
implements CommandHandler<ExternalEventConfigurationUpdateRequest, ExternalEventConfigurationUpdateResponse> {
3536

3637
private final ExternalEventConfigurationWritePlatformService writePlatformService;
3738

3839
@Transactional
3940
@Override
40-
public CommandProcessingResult processCommand(@NotNull final JsonCommand command) {
41-
return writePlatformService.updateConfigurations(command);
41+
public ExternalEventConfigurationUpdateResponse handle(Command<ExternalEventConfigurationUpdateRequest> command) {
42+
return writePlatformService.updateConfigurations(command.getPayload());
4243
}
4344
}

0 commit comments

Comments
 (0)