From db5171f3b2041c1ac9769b4f978bae13f94b1155 Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 11 Aug 2022 15:53:05 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-16 --- .../backendapi/config/KafkaConfig.java | 2 +- .../controller/cud/CudController.java | 13 +-- .../request/cud/MoneyMarketCreateAction.java | 106 ++++++++++++++++++ .../backendapi/meta/CudMetaService.java | 4 +- .../security/WebSecurityConfig.java | 1 + platform-parent/platform-messaging/pom.xml | 15 +++ .../config/KafkaProducerFactory.java | 9 +- .../securitites/MoneyMarketCreateRequest.java | 10 +- .../serialization/JsonSerializer.java | 24 ++++ 9 files changed, 163 insertions(+), 21 deletions(-) create mode 100644 clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/MoneyMarketCreateAction.java rename clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/MoneyMarketCreate.java => platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketCreateRequest.java (88%) create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/serialization/JsonSerializer.java diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/KafkaConfig.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/KafkaConfig.java index 3febf0247..0c642394a 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/KafkaConfig.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/KafkaConfig.java @@ -12,7 +12,7 @@ public class KafkaConfig { @Autowired @Bean - public Producer createProducer(BackendApiSettings settings) { + public Producer createProducer(BackendApiSettings settings) { return KafkaProducerFactory.producer(settings.getKafka()); } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/cud/CudController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/cud/CudController.java index 7d7891d1c..d5a78360a 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/cud/CudController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/cud/CudController.java @@ -8,10 +8,7 @@ import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.clients.producer.RecordMetadata; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.*; import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse; import ru.spcex.clearing.backendapi.domain.actions.IAction; import ru.spcex.clearing.backendapi.meta.CudMetaService; @@ -22,18 +19,19 @@ import java.util.concurrent.Future; @Controller @RequestMapping("/cud") public class CudController { - private final Producer kafka; + private final Producer kafka; private final ObjectMapper json; private final CudMetaService meta; @Autowired - public CudController(Producer kafka, CudMetaService meta) { + public CudController(Producer kafka, CudMetaService meta) { this.kafka = kafka; this.meta = meta; this.json = new ObjectMapper(); } @RequestMapping(value = "/{destination}", method = RequestMethod.POST) + @ResponseBody public BasicSpcexResponse add(@PathVariable("destination") String destination, @RequestBody String body) throws JsonProcessingException, ExecutionException, InterruptedException { Class> actionClazz = meta.byDestination(destination); @@ -41,8 +39,7 @@ public class CudController { throw new UnsupportedOperationException("unsupported destination " + destination); } IAction iAction = json.readValue(body, actionClazz); - - Future send = kafka.send(new ProducerRecord<>(destination, body)); + Future send = kafka.send(new ProducerRecord<>(destination, iAction.toRequest())); RecordMetadata kafkaMetaData = send.get(); MetaDataResponse responseToClient = new MetaDataResponse(); responseToClient.setOffset(kafkaMetaData.offset()); diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/MoneyMarketCreateAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/MoneyMarketCreateAction.java new file mode 100644 index 000000000..0e13f40d0 --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/MoneyMarketCreateAction.java @@ -0,0 +1,106 @@ +package ru.spcex.clearing.backendapi.controller.request.cud; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import ru.spcex.clearing.backendapi.domain.actions.IAction; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketCreateRequest; + +import java.time.Instant; + +public class MoneyMarketCreateAction implements IAction { + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "Europe/Moscow") + @JsonProperty + public Instant startDate; + @JsonProperty + public Instant endDate; + @JsonProperty + public Double nominalValue; + @JsonProperty + public Long nominalCurrencyId; + @JsonProperty + public String instrumentType; + @JsonProperty + public String fullName; + @JsonProperty + public String securitySymbol; + @JsonProperty + public Double lotSize; + + @Override + public MoneyMarketCreateRequest toRequest() { + var req = new MoneyMarketCreateRequest(); + req.setStartDate(this.getStartDate()); + req.setEndDate(this.getEndDate()); + req.setNominalValue(this.getNominalValue()); + req.setNominalCurrencyId(this.getNominalCurrencyId()); + req.setInstrumentType(this.getInstrumentType()); + req.setFullName(this.getFullName()); + req.setSecuritySymbol(this.getSecuritySymbol()); + req.setLotSize(this.getLotSize()); + return req; + } + + public Instant getStartDate() { + return startDate; + } + + public void setStartDate(Instant startDate) { + this.startDate = startDate; + } + + public Instant getEndDate() { + return endDate; + } + + public void setEndDate(Instant endDate) { + this.endDate = endDate; + } + + public Double getNominalValue() { + return nominalValue; + } + + public void setNominalValue(Double nominalValue) { + this.nominalValue = nominalValue; + } + + public Long getNominalCurrencyId() { + return nominalCurrencyId; + } + + public void setNominalCurrencyId(Long nominalCurrencyId) { + this.nominalCurrencyId = nominalCurrencyId; + } + + public String getInstrumentType() { + return instrumentType; + } + + public void setInstrumentType(String instrumentType) { + this.instrumentType = instrumentType; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getSecuritySymbol() { + return securitySymbol; + } + + public void setSecuritySymbol(String securitySymbol) { + this.securitySymbol = securitySymbol; + } + + public Double getLotSize() { + return lotSize; + } + + public void setLotSize(Double lotSize) { + this.lotSize = lotSize; + } +} diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/CudMetaService.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/CudMetaService.java index 3de34ba57..e0cef96dc 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/CudMetaService.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/CudMetaService.java @@ -1,7 +1,7 @@ package ru.spcex.clearing.backendapi.meta; import org.springframework.stereotype.Service; -import ru.spcex.clearing.backendapi.controller.request.cud.MoneyMarketCreate; +import ru.spcex.clearing.backendapi.controller.request.cud.MoneyMarketCreateAction; import ru.spcex.clearing.backendapi.domain.actions.IAction; import java.util.HashMap; @@ -13,7 +13,7 @@ public class CudMetaService { public CudMetaService() { this.mapping = new HashMap<>(); - this.mapping.put("money-market-security-new", MoneyMarketCreate.class); + this.mapping.put("money-market-security-new", MoneyMarketCreateAction.class); } public > Class byDestination(String destination) { diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/WebSecurityConfig.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/WebSecurityConfig.java index eeff2b438..c85304290 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/WebSecurityConfig.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/WebSecurityConfig.java @@ -39,6 +39,7 @@ public class WebSecurityConfig extends KeycloakWebSecurityConfigurerAdapter { .antMatchers("/anonymous/**").permitAll() .antMatchers("/sso/login").permitAll() .antMatchers("/error").permitAll() + .antMatchers( "/cud/**").permitAll() //todo remove .antMatchers("/backend-api-login/**").permitAll() .anyRequest().hasAnyRole("admin", "default-roles-master"); } diff --git a/platform-parent/platform-messaging/pom.xml b/platform-parent/platform-messaging/pom.xml index 9266c472f..dd128d8e4 100644 --- a/platform-parent/platform-messaging/pom.xml +++ b/platform-parent/platform-messaging/pom.xml @@ -24,6 +24,21 @@ org.apache.kafka kafka-clients + + com.fasterxml.jackson.core + jackson-core + provided + + + com.fasterxml.jackson.core + jackson-databind + provided + + + ru.spcex.platform + platform-utils + provided + \ No newline at end of file diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/config/KafkaProducerFactory.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/config/KafkaProducerFactory.java index dd533d501..00498178e 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/config/KafkaProducerFactory.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/config/KafkaProducerFactory.java @@ -2,12 +2,14 @@ package ru.spcex.clearing.platform.messaging.config; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerConfig; import ru.spcex.clearing.platform.messaging.config.element.KafkaSettings; +import ru.spcex.clearing.platform.messaging.serialization.JsonSerializer; import java.util.Properties; public class KafkaProducerFactory { - public static Producer producer(KafkaSettings kafkaSettings) { + public static Producer producer(KafkaSettings kafkaSettings) { Properties kafkaProps = new Properties(); //Assign localhost id @@ -27,7 +29,10 @@ public class KafkaProducerFactory { //The buffer.memory controls the total amount of memory available to the producer for buffering. kafkaProps.put("buffer.memory", kafkaSettings.getBufferMemory()); kafkaProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); - kafkaProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + kafkaProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class.getName()); +// kafkaProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + //ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + // prop.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, Employee.class.getName()); return new KafkaProducer<>(kafkaProps); diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/MoneyMarketCreate.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketCreateRequest.java similarity index 88% rename from clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/MoneyMarketCreate.java rename to platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketCreateRequest.java index ac90c6039..9512972b0 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/MoneyMarketCreate.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketCreateRequest.java @@ -1,12 +1,11 @@ -package ru.spcex.clearing.backendapi.controller.request.cud; +package ru.spcex.clearing.platform.messaging.domain.cud.securitites; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; -import ru.spcex.clearing.backendapi.domain.actions.IAction; import java.time.Instant; -public class MoneyMarketCreate implements IAction { +public class MoneyMarketCreateRequest { @JsonFormat(pattern = "yyyy-MM-dd", timezone = "Europe/Moscow") @JsonProperty public Instant startDate; @@ -25,11 +24,6 @@ public class MoneyMarketCreate implements IAction { @JsonProperty public Double lotSize; - @Override - public Object toRequest() { - return new Object(); - } - public Instant getStartDate() { return startDate; } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/serialization/JsonSerializer.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/serialization/JsonSerializer.java new file mode 100644 index 000000000..5e9cedf82 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/serialization/JsonSerializer.java @@ -0,0 +1,24 @@ +package ru.spcex.clearing.platform.messaging.serialization; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.kafka.common.serialization.Serializer; + +import java.nio.charset.StandardCharsets; + +public class JsonSerializer implements Serializer { + private final ObjectMapper json; + + public JsonSerializer() { + this.json = new ObjectMapper(); + } + + @Override + public byte[] serialize(String topic, Object data) { + try { + String s = json.writeValueAsString(data); + return s.getBytes(StandardCharsets.UTF_8); + } catch (Throwable e) { + throw new RuntimeException("couldn't serialize kafka message ", e); + } + } +}