Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ bin
.checkstyle
.factorypath

#/wiki

*.versionsBackup
**/src/main/resources/lib
**/*.flattened-pom.xml
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# Changelog
All notable changes to this project will be documented in this file.

## [10.3.0]
### Changed
- Upgrade `investment-service-api` version from `1.4.1` to `1.6.0`; regenerate API clients and fix all compilation errors in production and test sources.

## [10.1.1](https://github.com/Backbase/stream-services/compare/10.1.0...10.1.1)
### Changed
- Added dependency validation to stream-compositions services pom.xml to fix product validation issues for arrangements with additional properties.
Expand Down
2 changes: 1 addition & 1 deletion stream-investment/investment-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

<properties>
<checkstyle.disable.checks>true</checkstyle.disable.checks>
<investment-service-api.version>1.4.1</investment-service-api.version>
<investment-service-api.version>1.6.0</investment-service-api.version>
</properties>

<dependencyManagement>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
* bootstrap:
* ingestions:
* investment:
* service:
* config:
* portfolio:
* default-currency: USD
* activation-past-months: 3
Expand Down Expand Up @@ -64,6 +64,10 @@ public static class PortfolioConfig {
* the portfolio is considered to have been activated 1 month ago.
*/
private int activationPastMonths = 1;

private int listProductPageSize = 50;
private int listModelPageSize = 50;
private boolean ingestImages = true;
}

// -------------------------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.backbase.stream.investment.service.resttemplate.InvestmentRestDocumentContentService;
import com.backbase.stream.investment.service.resttemplate.InvestmentRestModelPortfolioService;
import com.backbase.stream.investment.service.resttemplate.InvestmentRestNewsContentService;
import com.backbase.stream.investment.service.resttemplate.InvestmentRestProductPortfolioService;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
Expand Down Expand Up @@ -102,5 +103,12 @@ public InvestmentRestModelPortfolioService investmentRestModelPortfolioService(
return new InvestmentRestModelPortfolioService(restInvestmentApiClient);
}

@Bean
public InvestmentRestProductPortfolioService investmentRestProductPortfolioService(
com.backbase.investment.api.service.sync.ApiClient restInvestmentApiClient,
IngestConfigProperties portfolioProperties) {
return new InvestmentRestProductPortfolioService(restInvestmentApiClient, portfolioProperties);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,15 @@
import com.backbase.stream.investment.service.InvestmentIntradayAssetPriceService;
import com.backbase.stream.investment.service.InvestmentModelPortfolioService;
import com.backbase.stream.investment.service.InvestmentPortfolioAllocationService;
import com.backbase.stream.investment.service.InvestmentPortfolioProductService;
import com.backbase.stream.investment.service.InvestmentPortfolioService;
import com.backbase.stream.investment.service.InvestmentRiskAssessmentService;
import com.backbase.stream.investment.service.InvestmentRiskQuestionaryService;
import com.backbase.stream.investment.service.resttemplate.InvestmentRestAssetUniverseService;
import com.backbase.stream.investment.service.resttemplate.InvestmentRestDocumentContentService;
import com.backbase.stream.investment.service.resttemplate.InvestmentRestModelPortfolioService;
import com.backbase.stream.investment.service.resttemplate.InvestmentRestNewsContentService;
import com.backbase.stream.investment.service.resttemplate.InvestmentRestProductPortfolioService;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
Expand Down Expand Up @@ -58,16 +60,26 @@ public InvestmentClientService investmentClientService(ClientApi clientApi) {

@Bean
public InvestmentModelPortfolioService investmentModelPortfolioService(FinancialAdviceApi financialAdviceApi,
InvestmentRestModelPortfolioService investmentRestModelPortfolioService) {
return new InvestmentModelPortfolioService(financialAdviceApi, investmentRestModelPortfolioService);
InvestmentRestModelPortfolioService investmentRestModelPortfolioService,
IngestConfigProperties portfolioProperties) {
return new InvestmentModelPortfolioService(financialAdviceApi, investmentRestModelPortfolioService,
portfolioProperties);
}

@Bean
public InvestmentPortfolioService investmentPortfolioService(PortfolioApi portfolioApi,
InvestmentProductsApi investmentProductsApi, PaymentsApi paymentsApi,
public InvestmentPortfolioProductService investmentPortfolioProductService(
InvestmentProductsApi investmentProductsApi, IngestConfigProperties portfolioProperties,
InvestmentModelPortfolioService modelPortfolioService,
InvestmentRestProductPortfolioService investmentRestProductPortfolioService) {
return new InvestmentPortfolioProductService(investmentProductsApi, portfolioProperties, modelPortfolioService,
investmentRestProductPortfolioService);
}

@Bean
public InvestmentPortfolioService investmentPortfolioService(PortfolioApi portfolioApi, PaymentsApi paymentsApi,
PortfolioTradingAccountsApi portfolioTradingAccountsApi,
IngestConfigProperties portfolioProperties) {
return new InvestmentPortfolioService(investmentProductsApi, portfolioApi, paymentsApi,
return new InvestmentPortfolioService(portfolioApi, paymentsApi,
portfolioTradingAccountsApi, portfolioProperties);
}

Expand Down Expand Up @@ -122,11 +134,14 @@ public InvestmentSaga investmentSaga(InvestmentClientService investmentClientSer
InvestmentRiskQuestionaryService investmentRiskQuestionaryService,
InvestmentPortfolioService investmentPortfolioService,
InvestmentModelPortfolioService investmentModelPortfolioService,
InvestmentPortfolioProductService investmentPortfolioProductService,
InvestmentPortfolioAllocationService investmentPortfolioAllocationService, AsyncTaskService asyncTaskService,
InvestmentIngestionConfigurationProperties coreConfigurationProperties) {
InvestmentIngestionConfigurationProperties coreConfigurationProperties,
AssetUniverseApi assetUniverseApi) {
return new InvestmentSaga(investmentClientService, investmentRiskAssessmentService,
investmentRiskQuestionaryService, investmentPortfolioService, investmentPortfolioAllocationService,
investmentModelPortfolioService, asyncTaskService, coreConfigurationProperties);
investmentModelPortfolioService, investmentPortfolioProductService, asyncTaskService,
coreConfigurationProperties, assetUniverseApi);
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public class InvestmentArrangement {
private String externalUserId;
private String productTypeExternalId;
private String currency;
private String productPortfolioName;
private BigDecimal initialCash;

private UUID investmentProductId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ public class InvestmentData implements InvestmentDataValue {
private List<ClientUser> clientUsers;
private List<InvestmentArrangement> investmentArrangements;
private List<ModelPortfolio> modelPortfolios;
private List<PortfolioProduct> portfolioProducts;
private List<ProductPortfolio> portfolioProducts;
private List<PortfolioProduct> ingestedPortfolioProducts;
private InvestmentAssetData investmentAssetData;
private List<InvestmentPortfolio> portfolios;
private List<InvestmentPortfolioTradingAccount> investmentPortfolioTradingAccounts;
Expand All @@ -38,16 +39,16 @@ public Map<String, List<UUID>> getClientsByLeExternalId() {
return clientsByLeExternalId;
}

public void setPortfoliosProducts(List<PortfolioProduct> products) {
this.portfolioProducts = products;
public void addPortfoliosProducts(List<PortfolioProduct> products) {
products.forEach(this::addPortfolioProducts);
}

public void addPortfolioProducts(PortfolioProduct portfolioProduct) {
if (portfolioProducts == null) {
portfolioProducts = new ArrayList<>();
public void addPortfolioProducts(PortfolioProduct ingestedPortfolioProduct) {
if (ingestedPortfolioProducts == null) {
ingestedPortfolioProducts = new ArrayList<>();
}
if (portfolioProducts.stream().noneMatch(p -> p.getUuid().equals(portfolioProduct.getUuid()))) {
portfolioProducts.add(portfolioProduct);
if (ingestedPortfolioProducts.stream().noneMatch(p -> p.getUuid().equals(ingestedPortfolioProduct.getUuid()))) {
ingestedPortfolioProducts.add(ingestedPortfolioProduct);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.backbase.investment.api.service.v1.model.ProductTypeEnum;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import lombok.Builder;
import lombok.Data;
Expand All @@ -17,6 +18,8 @@ public class ModelPortfolio {
private double cashWeight;
private int riskLevel;
private List<Allocation> allocations;
private UUID createdFor;
private Map<String, String> extraData;

public void uuid(UUID uuid) {
this.uuid = uuid;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.backbase.stream.investment;

import com.backbase.investment.api.service.v1.model.InvestorModelPortfolio;
import com.backbase.investment.api.service.v1.model.PortfolioProductBadge;
import com.backbase.investment.api.service.v1.model.PortfolioProductStatusEnum;
import com.backbase.investment.api.service.v1.model.ProductTypeEnum;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.core.io.Resource;

/**
* Lightweight projection of {@link com.backbase.investment.api.service.v1.model.Asset} that keeps the DTO immutable
* while providing helpers to translate to/from the generated model.
*/
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class ProductPortfolio {

private String name;
private String description;
private String image;
private Resource imageResource;
private Integer order;
private PortfolioProductBadge badge;
@JsonProperty("external_id")
private String externalId;
private PortfolioProductStatusEnum status = PortfolioProductStatusEnum.ACTIVE;
@JsonProperty("product_category")
private String productCategory;
private UUID uuid;
@JsonProperty("advice_engine")
private String adviceEngine;
@JsonProperty("model_portfolio")
private InvestorModelPortfolio modelPortfolio;
@JsonProperty("product_type")
private ProductTypeEnum productType;
@JsonProperty("extra_data")
private Map<String, String> extraData = new HashMap<>();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.backbase.stream.investment.model;

import com.backbase.investment.api.service.v1.model.InvestorModelPortfolio;
import com.backbase.stream.investment.ModelPortfolio;

Check warning on line 4 in stream-investment/investment-core/src/main/java/com/backbase/stream/investment/model/PaginatedExpandedModelPortfolioList.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this unused import 'com.backbase.stream.investment.ModelPortfolio'.

See more on https://sonarcloud.io/project/issues?id=com.backbase.stream%3Astream-services&issues=AZ50PkW2l7QMB1FFwRrs&open=AZ50PkW2l7QMB1FFwRrs&pullRequest=608
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;

@EqualsAndHashCode
@Data
@Builder
public class PaginatedExpandedModelPortfolioList {

private Integer count;
private URI next;
private URI previous;
private List<InvestorModelPortfolio> results = new ArrayList<>();

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.backbase.stream.investment.saga;

import com.backbase.investment.api.service.v1.AssetUniverseApi;
import com.backbase.investment.api.service.v1.model.BaseAssessmentRequest;
import com.backbase.investment.api.service.v1.model.PortfolioList;
import com.backbase.stream.configuration.InvestmentIngestionConfigurationProperties;
import com.backbase.stream.investment.Asset;
import com.backbase.stream.investment.InvestmentData;
import com.backbase.stream.investment.InvestmentTask;
import com.backbase.stream.investment.PortfolioRiskAssessment;
Expand All @@ -14,6 +16,7 @@
import com.backbase.stream.investment.service.InvestmentClientService;
import com.backbase.stream.investment.service.InvestmentModelPortfolioService;
import com.backbase.stream.investment.service.InvestmentPortfolioAllocationService;
import com.backbase.stream.investment.service.InvestmentPortfolioProductService;
import com.backbase.stream.investment.service.InvestmentPortfolioService;
import com.backbase.stream.investment.service.InvestmentRiskAssessmentService;
import com.backbase.stream.investment.service.InvestmentRiskQuestionaryService;
Expand Down Expand Up @@ -80,8 +83,10 @@ public class InvestmentSaga implements StreamTaskExecutor<InvestmentTask> {
private final InvestmentPortfolioService investmentPortfolioService;
private final InvestmentPortfolioAllocationService investmentPortfolioAllocationService;
private final InvestmentModelPortfolioService investmentModelPortfolioService;
private final InvestmentPortfolioProductService investmentPortfolioProductService;
private final AsyncTaskService asyncTaskService;
private final InvestmentIngestionConfigurationProperties coreConfigurationProperties;
private final AssetUniverseApi assetUniverseApi;

@Override
public Mono<InvestmentTask> executeTask(InvestmentTask streamTask) {
Expand All @@ -93,6 +98,7 @@ public Mono<InvestmentTask> executeTask(InvestmentTask streamTask) {
log.info("Starting investment saga execution: taskId={}, taskName={}",
streamTask.getId(), streamTask.getName());
return this.upsertInvestmentPortfolioModels(streamTask)
.flatMap(this::loadAssets)
.flatMap(this::upsertClients)
.flatMap(this::upsertRiskQuestions)
.flatMap(this::upsertRiskAssessments)
Expand Down Expand Up @@ -149,7 +155,7 @@ private Mono<InvestmentTask> upsertPortfoliosAllocations(InvestmentTask investme
.thenMany(Flux.fromIterable(Objects.requireNonNullElse(data.getPortfolios(), List.of()))
.flatMap(
p -> investmentPortfolioAllocationService.generateAllocations(p,
data.getPortfolioProducts(),
data.getIngestedPortfolioProducts(),
investmentTask.getData().getInvestmentAssetData())))
.collectList()
.doOnError(throwable -> {
Expand All @@ -161,7 +167,7 @@ private Mono<InvestmentTask> upsertPortfoliosAllocations(InvestmentTask investme
investmentTask.getName(), investmentTask.getId(),
"Failed to upsert investment portfolio trading accounts: " + throwable.getMessage());
})
.map(o -> investmentTask);
.map(_ -> investmentTask);
}

/**
Expand Down Expand Up @@ -247,6 +253,25 @@ private Mono<InvestmentTask> upsertInvestmentPortfolioModels(InvestmentTask inve
});
}


private Mono<InvestmentTask> loadAssets(InvestmentTask investmentTask) {
if (coreConfigurationProperties.isAssetUniverseEnabled()) {
log.debug("Skip loading assets. Assets have to be provided on previous step");
return Mono.just(investmentTask);
}
log.info("Loading assets");
List<Asset> assets = investmentTask.getData().getInvestmentAssetData().getAssets();
return Flux.fromIterable(assets)
.flatMap(asset -> assetUniverseApi.getAsset(asset.getKeyString(), null, null, null)
.map(a -> {
asset.setUuid(a.getUuid());
return asset;
}))
.collectList()
.map(o -> investmentTask);

}

/**
* Upserts investment products for all investment arrangements.
*
Expand All @@ -269,12 +294,12 @@ private Mono<InvestmentTask> upsertInvestmentProducts(InvestmentTask investmentT
investmentTask.info(INVESTMENT_PRODUCTS, OP_UPSERT, null, investmentTask.getName(),
investmentTask.getId(), PROCESSING_PREFIX + arrangementCount + " investment products");

return investmentPortfolioService.upsertInvestmentProducts(data, data.getInvestmentArrangements())
return investmentPortfolioProductService.upsertInvestmentProducts(data, data.getInvestmentArrangements())
.map(products -> {
investmentTask.info(INVESTMENT_PRODUCTS, OP_UPSERT, RESULT_CREATED,
investmentTask.getName(), investmentTask.getId(),
UPSERTED_PREFIX + products.size() + " investment products");
data.setPortfoliosProducts(products);
data.addPortfoliosProducts(products);
log.info("Successfully upserted all investment products: taskId={}, productCount={}",
investmentTask.getId(), products.size());

Expand Down
Loading
Loading