Skip to content

Commit 2b18982

Browse files
committed
FINERACT-2245: Mix Taxonomy (org.apache.fineract.mix)
1 parent aaf1351 commit 2b18982

10 files changed

+113
-53
lines changed

fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,17 @@
2525
import jakarta.ws.rs.Path;
2626
import jakarta.ws.rs.Produces;
2727
import jakarta.ws.rs.core.MediaType;
28+
import java.time.OffsetDateTime;
29+
import java.time.ZoneId;
30+
import java.util.UUID;
31+
import java.util.function.Supplier;
2832
import lombok.RequiredArgsConstructor;
29-
import org.apache.fineract.commands.domain.CommandWrapper;
30-
import org.apache.fineract.commands.service.CommandWrapperBuilder;
31-
import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
32-
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
33-
import org.apache.fineract.infrastructure.core.serialization.ToApiJsonSerializer;
33+
import org.apache.fineract.command.core.CommandPipeline;
34+
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
3435
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
35-
import org.apache.fineract.mix.data.MixTaxonomyMappingData;
36-
import org.apache.fineract.mix.data.MixTaxonomyRequest;
36+
import org.apache.fineract.mix.command.MixTaxonomyCommand;
37+
import org.apache.fineract.mix.data.MixTaxonomyMappingRequest;
38+
import org.apache.fineract.mix.data.MixTaxonomyMappingResponse;
3739
import org.apache.fineract.mix.service.MixTaxonomyMappingReadPlatformService;
3840
import org.springframework.stereotype.Component;
3941

@@ -44,30 +46,36 @@
4446
public class MixTaxonomyMappingApiResource {
4547

4648
private final PlatformSecurityContext context;
47-
private final ToApiJsonSerializer<MixTaxonomyMappingData> toApiJsonSerializer;
4849
private final MixTaxonomyMappingReadPlatformService readTaxonomyMappingService;
49-
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
50+
private final CommandPipeline pipeline;
5051

5152
@GET
5253
@Consumes({ MediaType.APPLICATION_JSON })
5354
@Produces({ MediaType.APPLICATION_JSON })
54-
public MixTaxonomyMappingData retrieveTaxonomyMapping() {
55+
public MixTaxonomyMappingResponse retrieveTaxonomyMapping() {
5556
this.context.authenticatedUser();
5657
return this.readTaxonomyMappingService.retrieveTaxonomyMapping();
5758
}
5859

60+
// TODO support multiple configuration file loading ?
5961
@PUT
6062
@Consumes({ MediaType.APPLICATION_JSON })
6163
@Produces({ MediaType.APPLICATION_JSON })
62-
public String updateTaxonomyMapping(final MixTaxonomyRequest mixTaxonomyRequest) {
63-
// TODO support multiple configuration file loading
64+
public MixTaxonomyMappingResponse updateTaxonomyMapping(final MixTaxonomyMappingRequest mixTaxonomyMappingRequest) {
65+
6466
final Long mappingId = (long) 1;
65-
final CommandWrapper commandRequest = new CommandWrapperBuilder().updateTaxonomyMapping(mappingId)
66-
.withJson(toApiJsonSerializer.serialize(mixTaxonomyRequest)).build();
67+
var command = new MixTaxonomyCommand();
68+
69+
String tenantIdentifier = ThreadLocalContextUtil.getTenant().getTenantIdentifier();
70+
command.setId(UUID.randomUUID());
71+
command.setCreatedAt(OffsetDateTime.now(ZoneId.of("UTC")));
6772

68-
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
73+
command.setMappingId(mappingId);
74+
command.setTenantId(tenantIdentifier);
75+
command.setPayload(mixTaxonomyMappingRequest);
6976

70-
return this.toApiJsonSerializer.serialize(result);
77+
Supplier<MixTaxonomyMappingResponse> result = pipeline.send(command);
78+
return result.get();
7179
}
7280

7381
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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.mix.command;
20+
21+
import java.io.Serial;
22+
import java.io.Serializable;
23+
import lombok.Data;
24+
import lombok.EqualsAndHashCode;
25+
import org.apache.fineract.command.core.Command;
26+
import org.apache.fineract.mix.data.MixTaxonomyMappingRequest;
27+
28+
@Data
29+
@EqualsAndHashCode(callSuper = true)
30+
public class MixTaxonomyCommand extends Command<MixTaxonomyMappingRequest> implements Serializable {
31+
32+
@Serial
33+
private static final long serialVersionUID = 1L;
34+
35+
private Long mappingId;
36+
37+
}

fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyRequest.java renamed to fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingRequest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,12 @@
2727
@Data
2828
@NoArgsConstructor
2929
@AllArgsConstructor
30-
public class MixTaxonomyRequest implements Serializable {
30+
public class MixTaxonomyMappingRequest implements Serializable {
3131

3232
@Serial
3333
private static final long serialVersionUID = 1L;
3434

3535
private String identifier;
3636
private String config;
37+
private String currency;
3738
}

fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingData.java renamed to fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingResponse.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,21 @@
1818
*/
1919
package org.apache.fineract.mix.data;
2020

21-
import com.fasterxml.jackson.annotation.JsonInclude;
21+
import java.io.Serial;
22+
import java.io.Serializable;
23+
import lombok.AllArgsConstructor;
2224
import lombok.Data;
2325
import lombok.NoArgsConstructor;
2426
import lombok.experimental.Accessors;
2527

2628
@Data
2729
@NoArgsConstructor
30+
@AllArgsConstructor
2831
@Accessors(chain = true)
29-
@JsonInclude(JsonInclude.Include.NON_NULL)
30-
public class MixTaxonomyMappingData {
32+
public class MixTaxonomyMappingResponse implements Serializable {
33+
34+
@Serial
35+
private static final long serialVersionUID = 1L;
3136

3237
private String identifier;
3338
private String config;

fineract-provider/src/main/java/org/apache/fineract/mix/handler/UpdateTaxonomyMappingCommandHandler.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,19 @@
1818
*/
1919
package org.apache.fineract.mix.handler;
2020

21+
import org.apache.fineract.command.core.Command;
22+
import org.apache.fineract.command.core.CommandHandler;
2123
import org.apache.fineract.commands.annotation.CommandType;
22-
import org.apache.fineract.commands.handler.NewCommandSourceHandler;
23-
import org.apache.fineract.infrastructure.core.api.JsonCommand;
24-
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
24+
import org.apache.fineract.mix.data.MixTaxonomyMappingRequest;
25+
import org.apache.fineract.mix.data.MixTaxonomyMappingResponse;
2526
import org.apache.fineract.mix.service.MixTaxonomyMappingWritePlatformService;
2627
import org.springframework.beans.factory.annotation.Autowired;
2728
import org.springframework.stereotype.Service;
2829
import org.springframework.transaction.annotation.Transactional;
2930

3031
@Service
3132
@CommandType(entity = "XBRLMAPPING", action = "UPDATE")
32-
public class UpdateTaxonomyMappingCommandHandler implements NewCommandSourceHandler {
33+
public class UpdateTaxonomyMappingCommandHandler implements CommandHandler<MixTaxonomyMappingRequest, MixTaxonomyMappingResponse> {
3334

3435
private final MixTaxonomyMappingWritePlatformService writeTaxonomyService;
3536

@@ -40,8 +41,8 @@ public UpdateTaxonomyMappingCommandHandler(final MixTaxonomyMappingWritePlatform
4041

4142
@Transactional
4243
@Override
43-
public CommandProcessingResult processCommand(final JsonCommand command) {
44-
return this.writeTaxonomyService.updateMapping(command.entityId(), command);
44+
public MixTaxonomyMappingResponse handle(Command<MixTaxonomyMappingRequest> command) {
45+
return this.writeTaxonomyService.updateMapping(command);
4546
}
4647

4748
}

fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
*/
1919
package org.apache.fineract.mix.service;
2020

21-
import org.apache.fineract.mix.data.MixTaxonomyMappingData;
21+
import org.apache.fineract.mix.data.MixTaxonomyMappingResponse;
2222

2323
public interface MixTaxonomyMappingReadPlatformService {
2424

25-
MixTaxonomyMappingData retrieveTaxonomyMapping();
25+
MixTaxonomyMappingResponse retrieveTaxonomyMapping();
2626
}

fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformServiceImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import java.sql.ResultSet;
2222
import java.sql.SQLException;
2323
import lombok.RequiredArgsConstructor;
24-
import org.apache.fineract.mix.data.MixTaxonomyMappingData;
24+
import org.apache.fineract.mix.data.MixTaxonomyMappingResponse;
2525
import org.springframework.dao.EmptyResultDataAccessException;
2626
import org.springframework.jdbc.core.JdbcTemplate;
2727
import org.springframework.jdbc.core.RowMapper;
@@ -31,23 +31,23 @@ public class MixTaxonomyMappingReadPlatformServiceImpl implements MixTaxonomyMap
3131

3232
private final JdbcTemplate jdbcTemplate;
3333

34-
private static final class TaxonomyMappingMapper implements RowMapper<MixTaxonomyMappingData> {
34+
private static final class TaxonomyMappingMapper implements RowMapper<MixTaxonomyMappingResponse> {
3535

3636
public String schema() {
3737
return "identifier, config " + "from mix_taxonomy_mapping";
3838
}
3939

4040
@Override
41-
public MixTaxonomyMappingData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
41+
public MixTaxonomyMappingResponse mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
4242
final String identifier = rs.getString("identifier");
4343
final String config = rs.getString("config");
44-
return new MixTaxonomyMappingData().setIdentifier(identifier).setConfig(config);
44+
return new MixTaxonomyMappingResponse().setIdentifier(identifier).setConfig(config);
4545
}
4646

4747
}
4848

4949
@Override
50-
public MixTaxonomyMappingData retrieveTaxonomyMapping() {
50+
public MixTaxonomyMappingResponse retrieveTaxonomyMapping() {
5151
try {
5252
final TaxonomyMappingMapper rm = new TaxonomyMappingMapper();
5353
final String sqlString = "select " + rm.schema();

fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWritePlatformService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@
1818
*/
1919
package org.apache.fineract.mix.service;
2020

21-
import org.apache.fineract.infrastructure.core.api.JsonCommand;
22-
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
21+
import org.apache.fineract.command.core.Command;
22+
import org.apache.fineract.mix.data.MixTaxonomyMappingRequest;
23+
import org.apache.fineract.mix.data.MixTaxonomyMappingResponse;
2324

2425
public interface MixTaxonomyMappingWritePlatformService {
2526

26-
CommandProcessingResult updateMapping(Long mappingId, JsonCommand command);
27+
MixTaxonomyMappingResponse updateMapping(Command<MixTaxonomyMappingRequest> command);
2728
}

fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWritePlatformServiceImpl.java

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@
1919
package org.apache.fineract.mix.service;
2020

2121
import lombok.RequiredArgsConstructor;
22-
import org.apache.fineract.infrastructure.core.api.JsonCommand;
23-
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
24-
import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
22+
import org.apache.fineract.command.core.Command;
23+
import org.apache.fineract.mix.command.MixTaxonomyCommand;
24+
import org.apache.fineract.mix.data.MixTaxonomyMappingRequest;
25+
import org.apache.fineract.mix.data.MixTaxonomyMappingResponse;
2526
import org.apache.fineract.mix.domain.MixTaxonomyMapping;
2627
import org.apache.fineract.mix.domain.MixTaxonomyMappingRepository;
2728
import org.springframework.dao.DataIntegrityViolationException;
@@ -35,21 +36,27 @@ public class MixTaxonomyMappingWritePlatformServiceImpl implements MixTaxonomyMa
3536

3637
@Transactional
3738
@Override
38-
public CommandProcessingResult updateMapping(final Long mappingId, final JsonCommand command) {
39-
try {
40-
MixTaxonomyMapping mapping = this.mappingRepository.findById(mappingId).orElse(null);
41-
if (mapping == null) {
42-
mapping = MixTaxonomyMapping.fromJson(command);
43-
} else {
44-
mapping.update(command);
45-
}
39+
public MixTaxonomyMappingResponse updateMapping(Command<MixTaxonomyMappingRequest> command) {
40+
if (command instanceof MixTaxonomyCommand) {
41+
Long mappingId = ((MixTaxonomyCommand) command).getMappingId();
4642

47-
this.mappingRepository.saveAndFlush(mapping);
43+
try {
44+
MixTaxonomyMapping mapping = this.mappingRepository.findById(mappingId).orElse(null);
45+
if (mapping == null) {
46+
mapping = new MixTaxonomyMapping();
47+
}
48+
mapping.setIdentifier(command.getPayload().getIdentifier());
49+
mapping.setConfig(command.getPayload().getConfig());
50+
mapping.setCurrency(command.getPayload().getCurrency());
4851

49-
return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(mapping.getId()).build();
52+
MixTaxonomyMapping result = this.mappingRepository.saveAndFlush(mapping);
5053

51-
} catch (final JpaSystemException | DataIntegrityViolationException dve) {
52-
return CommandProcessingResult.empty();
54+
return new MixTaxonomyMappingResponse(result.getIdentifier(), result.getConfig());
55+
} catch (final JpaSystemException | DataIntegrityViolationException dve) {
56+
return new MixTaxonomyMappingResponse();
57+
}
58+
} else {
59+
return new MixTaxonomyMappingResponse();
5360
}
5461
}
5562
}

fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLResultServiceImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import javax.script.ScriptException;
3333
import lombok.extern.slf4j.Slf4j;
3434
import org.apache.fineract.mix.data.MixTaxonomyData;
35-
import org.apache.fineract.mix.data.MixTaxonomyMappingData;
35+
import org.apache.fineract.mix.data.MixTaxonomyMappingResponse;
3636
import org.apache.fineract.mix.data.XBRLData;
3737
import org.apache.fineract.mix.exception.XBRLMappingInvalidException;
3838
import org.springframework.beans.factory.annotation.Autowired;
@@ -70,7 +70,7 @@ public XBRLData getXBRLResult(final Date startDate, final Date endDate, final St
7070

7171
@SuppressWarnings("unchecked")
7272
private HashMap<MixTaxonomyData, BigDecimal> retrieveTaxonomyConfig(final Date startDate, final Date endDate) {
73-
final MixTaxonomyMappingData taxonomyMapping = this.readTaxonomyMappingService.retrieveTaxonomyMapping();
73+
final MixTaxonomyMappingResponse taxonomyMapping = this.readTaxonomyMappingService.retrieveTaxonomyMapping();
7474
if (taxonomyMapping == null) {
7575
return null;
7676
}

0 commit comments

Comments
 (0)