diff --git a/backend/core/src/main/java/org/opencdmp/query/lookup/accounting/AccountingInfoLookup.java b/backend/core/src/main/java/org/opencdmp/query/lookup/accounting/AccountingInfoLookup.java index 78b15a33b..464737440 100644 --- a/backend/core/src/main/java/org/opencdmp/query/lookup/accounting/AccountingInfoLookup.java +++ b/backend/core/src/main/java/org/opencdmp/query/lookup/accounting/AccountingInfoLookup.java @@ -17,7 +17,7 @@ import org.springframework.stereotype.Component; import java.time.Instant; import java.util.Arrays; import java.util.List; -import java.util.Set; + public class AccountingInfoLookup { @@ -39,11 +39,11 @@ public class AccountingInfoLookup { private AccountingMeasureType measure; public static final String _measure = "measure"; - private Set groupingFields; + private FieldSet groupingFields; public static final String _groupingFields = "groupingFields"; public Instant getFrom() { - return from; + return this.from; } public void setFrom(Instant from) { @@ -51,7 +51,7 @@ public class AccountingInfoLookup { } public Instant getTo() { - return to; + return this.to; } public void setTo(Instant to) { @@ -59,7 +59,7 @@ public class AccountingInfoLookup { } public List getTypes() { - return types; + return this.types; } public void setTypes(List types) { @@ -67,7 +67,7 @@ public class AccountingInfoLookup { } public List getAggregateTypes() { - return aggregateTypes; + return this.aggregateTypes; } public void setAggregateTypes(List aggregateTypes) { @@ -75,7 +75,7 @@ public class AccountingInfoLookup { } public AccountingDataRangeType getDateRangeType() { - return dateRangeType; + return this.dateRangeType; } public void setDateRangeType(AccountingDataRangeType dateRangeType) { @@ -83,18 +83,18 @@ public class AccountingInfoLookup { } public AccountingMeasureType getMeasure() { - return measure; + return this.measure; } public void setMeasure(AccountingMeasureType measure) { this.measure = measure; } - public Set getGroupingFields() { - return groupingFields; + public FieldSet getGroupingFields() { + return this.groupingFields; } - public void setGroupingFields(Set groupingFields) { + public void setGroupingFields(FieldSet groupingFields) { this.groupingFields = groupingFields; } @@ -121,24 +121,24 @@ public class AccountingInfoLookup { return Arrays.asList( this.spec() .must(() -> !this.isNull(item.getMeasure())) - .failOn(AccountingInfoLookup._measure).failWith(messageSource.getMessage("Validation_Required", new Object[]{AccountingInfoLookup._measure}, LocaleContextHolder.getLocale())), + .failOn(AccountingInfoLookup._measure).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{AccountingInfoLookup._measure}, LocaleContextHolder.getLocale())), this.spec() .must(() -> !this.isNull(item.getDateRangeType())) - .failOn(AccountingInfoLookup._dateRangeType).failWith(messageSource.getMessage("Validation_Required", new Object[]{AccountingInfoLookup._dateRangeType}, LocaleContextHolder.getLocale())), + .failOn(AccountingInfoLookup._dateRangeType).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{AccountingInfoLookup._dateRangeType}, LocaleContextHolder.getLocale())), this.spec() .iff(()-> !this.isNull(item.getDateRangeType()) && item.getDateRangeType().equals(AccountingDataRangeType.Custom)) .must(() -> !this.isNull(item.getFrom())) - .failOn(AccountingInfoLookup._from).failWith(messageSource.getMessage("Validation_Required", new Object[]{AccountingInfoLookup._from}, LocaleContextHolder.getLocale())), + .failOn(AccountingInfoLookup._from).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{AccountingInfoLookup._from}, LocaleContextHolder.getLocale())), this.spec() .iff(()-> !this.isNull(item.getDateRangeType()) && item.getDateRangeType().equals(AccountingDataRangeType.Custom)) .must(() -> !this.isNull(item.getTo())) - .failOn(AccountingInfoLookup._to).failWith(messageSource.getMessage("Validation_Required", new Object[]{AccountingInfoLookup._to}, LocaleContextHolder.getLocale())), + .failOn(AccountingInfoLookup._to).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{AccountingInfoLookup._to}, LocaleContextHolder.getLocale())), this.spec() .must(() -> !this.isListNullOrEmpty(item.getAggregateTypes())) - .failOn(AccountingInfoLookup._aggregateTypes).failWith(messageSource.getMessage("Validation_Required", new Object[]{AccountingInfoLookup._aggregateTypes}, LocaleContextHolder.getLocale())), + .failOn(AccountingInfoLookup._aggregateTypes).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{AccountingInfoLookup._aggregateTypes}, LocaleContextHolder.getLocale())), this.spec() .must(() -> !this.isNull(item.getGroupingFields())) - .failOn(AccountingInfoLookup._groupingFields).failWith(messageSource.getMessage("Validation_Required", new Object[]{AccountingInfoLookup._groupingFields}, LocaleContextHolder.getLocale())) + .failOn(AccountingInfoLookup._groupingFields).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{AccountingInfoLookup._groupingFields}, LocaleContextHolder.getLocale())) ); } } diff --git a/backend/core/src/main/java/org/opencdmp/query/lookup/accounting/FieldSet.java b/backend/core/src/main/java/org/opencdmp/query/lookup/accounting/FieldSet.java new file mode 100644 index 000000000..9f58e417d --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/query/lookup/accounting/FieldSet.java @@ -0,0 +1,19 @@ +package org.opencdmp.query.lookup.accounting; + +import java.util.List; + +public class FieldSet{ + private List fields; + + public FieldSet(List fields) { + this.fields = fields; + } + + public List getFields() { + return this.fields; + } + + public void setFields(List fields) { + this.fields = fields; + } +} diff --git a/backend/core/src/main/java/org/opencdmp/service/accounting/AccountingServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/accounting/AccountingServiceImpl.java index caa6ecbe8..a13f767e0 100644 --- a/backend/core/src/main/java/org/opencdmp/service/accounting/AccountingServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/accounting/AccountingServiceImpl.java @@ -1,5 +1,8 @@ package org.opencdmp.service.accounting; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeCacheService; import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeFilterFunction; import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeModel; @@ -23,10 +26,14 @@ import org.opencdmp.integrationevent.outbox.accountingentrycreated.AccountingEnt import org.opencdmp.model.AccountingAggregateResultItem; import org.opencdmp.query.UserCredentialQuery; import org.opencdmp.query.lookup.accounting.AccountingInfoLookup; +import org.opencdmp.query.lookup.accounting.FieldSet; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.http.MediaType; +import org.springframework.http.codec.json.Jackson2JsonDecoder; +import org.springframework.http.codec.json.Jackson2JsonEncoder; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.ExchangeFilterFunction; import org.springframework.web.reactive.function.client.WebClient; @@ -42,8 +49,8 @@ import java.security.NoSuchAlgorithmException; import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.Set; @Service public class AccountingServiceImpl implements AccountingService { @@ -82,7 +89,7 @@ public class AccountingServiceImpl implements AccountingService { if (this.clients.containsKey(repositoryId)) return this.clients.get(repositoryId); //GK: It's register time - AccountingSourceEntity source = accountingProperties.getSources().stream().filter(x -> x.getRepositoryId().equals(repositoryId)).findFirst().orElse(null); + AccountingSourceEntity source = this.accountingProperties.getSources().stream().filter(x -> x.getRepositoryId().equals(repositoryId)).findFirst().orElse(null); if (source != null) { TokenExchangeModel tokenExchangeModel = new TokenExchangeModel("accounting:" + source, source.getIssuerUrl(), source.getClientId(), source.getClientSecret(), source.getScope()); TokenExchangeFilterFunction apiKeyExchangeFilterFunction = new TokenExchangeFilterFunction(this.tokenExchangeCacheService, tokenExchangeModel); @@ -91,9 +98,10 @@ public class AccountingServiceImpl implements AccountingService { exchangeFilterFunctions.add(apiKeyExchangeFilterFunction); exchangeFilterFunctions.add(logRequest()); exchangeFilterFunctions.add(logResponse()); - }).codecs(codecs -> codecs - .defaultCodecs() - ).build(); + }).codecs(codecs -> { + codecs.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(new ObjectMapper().configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false).registerModule(new JavaTimeModule()), MediaType.APPLICATION_JSON)); + codecs.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder(new ObjectMapper().configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false).registerModule(new JavaTimeModule()), MediaType.APPLICATION_JSON)); + }).build(); AccountingClientImpl accounting = new AccountingClientImpl(webClient); this.clients.put(repositoryId, accounting); return accounting; @@ -152,14 +160,14 @@ public class AccountingServiceImpl implements AccountingService { lookup.setAggregateTypes(new ArrayList<>()); lookup.getAggregateTypes().add(AccountingAggregateType.Sum); - lookup.setGroupingFields(Set.of( + lookup.setGroupingFields(new FieldSet(List.of( AccountingEntryCreatedIntegrationEvent._serviceId, AccountingEntryCreatedIntegrationEvent._action, AccountingEntryCreatedIntegrationEvent._resource, AccountingEntryCreatedIntegrationEvent._userId - )); + ))); - this.validatorFactory.validator(AccountingInfoLookup.AccountingInfoLookupValidator.class).validateForce(lookup); + // this.validatorFactory.validator(AccountingInfoLookup.AccountingInfoLookupValidator.class).validateForce(lookup); AccountingAggregateResultItem accountingAggregateResultItem = null; try { diff --git a/frontend/src/app/core/services/configuration/configuration.service.ts b/frontend/src/app/core/services/configuration/configuration.service.ts index d1e8c1c9a..8aadf0737 100644 --- a/frontend/src/app/core/services/configuration/configuration.service.ts +++ b/frontend/src/app/core/services/configuration/configuration.service.ts @@ -122,12 +122,12 @@ export class ConfigurationService extends BaseComponent { get notificationServiceEnabled(): boolean { return this._notificationServiceEnabled; } - + private _statusIcons: StatusIcon[]; get statusIcons(): StatusIcon[] { return this._statusIcons; } - + private _defaultStatusIcon: string; get defaultStatusIcon(): string { return this._defaultStatusIcon || 'animation'; @@ -177,7 +177,7 @@ export class ConfigurationService extends BaseComponent { get sidebar(): Sidebar { return this._sidebar; } - + private _mergeAccountDelayInSeconds: number; get mergeAccountDelayInSeconds(): number { return this._mergeAccountDelayInSeconds; @@ -208,7 +208,7 @@ export class ConfigurationService extends BaseComponent { return this._cssColorsTenantConfiguration; } - + public loadConfiguration(): Promise { return new Promise((r, e) => {