SUPPORT-8470: Fix

This commit is contained in:
Eduard Tihomirov 2024-09-11 15:54:46 +03:00
parent 3f54d22828
commit c6422e3238
14 changed files with 199 additions and 278 deletions

View file

@ -19,17 +19,17 @@ import org.springframework.kafka.core.ProducerFactory;
*/
@Configuration
public class KafkaProducerConfig {
@Value("${kafka.send.url}")
@Value("${av-kafka.send.url}")
private String kafkaUrl;
@Value("${kafka.send.security.protocol}")
@Value("${av-kafka.send.security.protocol}")
private String securityProtocol;
@Value("${kafka.send.login.module:org.apache.kafka.common.security.scram.ScramLoginModule}")
@Value("${av-kafka.send.login.module:org.apache.kafka.common.security.scram.ScramLoginModule}")
private String loginModule;
@Value("${kafka.send.username}")
@Value("${av-kafka.send.username}")
private String username;
@Value("${kafka.send.password}")
@Value("${av-kafka.send.password}")
private String password;
@Value("${kafka.sasl.mechanism}")
@Value("${av-kafka.sasl.mechanism}")
private String saslMechanism;
@Bean

View file

@ -1,5 +1,8 @@
package ervu.controller;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import ervu.service.fileupload.EmployeeInfoFileUploadService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@ -18,8 +21,21 @@ public class EmployeeInfoFileUploadController {
@RequestMapping(value = "/employee/document", method = RequestMethod.POST)
public ResponseEntity<?> saveEmployeeInformationFile(@RequestParam("file") MultipartFile multipartFile,
@RequestHeader("X-Employee-Info-File-Form-Type") String formType) {
if (this.fileUploadService.saveEmployeeInformationFile(multipartFile, formType)) {
@RequestHeader("X-Employee-Info-File-Form-Type") String formType, HttpServletRequest request) {
String accessToken = null;
String authToken = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("access_token")) {
accessToken = cookie.getValue();
}
else if (cookie.getName().equals("auth_token")) {
authToken = cookie.getValue();
}
}
}
if (accessToken != null && this.fileUploadService.saveEmployeeInformationFile(multipartFile, formType, accessToken, authToken)) {
return ResponseEntity.ok("File successfully uploaded.");
}
else {

View file

@ -1,6 +1,8 @@
package ervu.service.fileupload;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
@ -8,13 +10,19 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import ervu.client.fileupload.FileUploadWebDavClient;
import ervu.service.fileupload.model.EmployeeInfoKafkaMessage;
import ervu.service.fileupload.model.FileStatus;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import ru.micord.ervu.security.esia.model.EmployeeModel;
import ru.micord.ervu.security.esia.model.PersonModel;
import ru.micord.ervu.security.esia.service.UlDataService;
import ru.micord.ervu.service.StatusService;
/**
* @author Alexandr Shalaginov
@ -22,12 +30,15 @@ import org.springframework.web.multipart.MultipartFile;
@Service
public class EmployeeInfoFileUploadService {
private static final Logger logger = LoggerFactory.getLogger(EmployeeInfoFileUploadService.class);
private static final String FORMAT = "dd.MM.yyyy HH:mm";
private final FileUploadWebDavClient fileWebDavUploadClient;
private final EmployeeInfoKafkaMessageService employeeInfoKafkaMessageService;
private final KafkaTemplate<String, String> kafkaTemplate;
private final StatusService statusService;
private final UlDataService ulDataService;
@Value("${kafka.send.message.topic.name:employee-files}")
@Value("${av-kafka.send.message.topic.name:employee-files}")
private String kafkaTopicName;
@Value("${file.webdav.upload.url:http://localhost:5757}")
private String url;
@ -38,25 +49,43 @@ public class EmployeeInfoFileUploadService {
public EmployeeInfoFileUploadService(
FileUploadWebDavClient fileWebDavUploadClient,
EmployeeInfoKafkaMessageService employeeInfoKafkaMessageService, KafkaTemplate<String, String> kafkaTemplate) {
EmployeeInfoKafkaMessageService employeeInfoKafkaMessageService,
KafkaTemplate<String, String> kafkaTemplate, StatusService statusService,
UlDataService ulDataService) {
this.fileWebDavUploadClient = fileWebDavUploadClient;
this.employeeInfoKafkaMessageService = employeeInfoKafkaMessageService;
this.kafkaTemplate = kafkaTemplate;
this.statusService = statusService;
this.ulDataService = ulDataService;
}
public boolean saveEmployeeInformationFile(MultipartFile multipartFile, String formType) {
public boolean saveEmployeeInformationFile(MultipartFile multipartFile, String formType,
String accessToken, String authToken) {
String fileUploadUrl = this.url + "/" + getNewFilename(multipartFile.getOriginalFilename());
String departureDateTime = getDepartureDateTime();
LocalDateTime now = LocalDateTime.now();
String departureDateTime = now.format(DateTimeFormatter.ofPattern(FORMAT));;
String timeZone = getTimeZone();
if (this.fileWebDavUploadClient.webDavUploadFile(fileUploadUrl, username, password, multipartFile)) {
FileStatus fileStatus = new FileStatus();
fileStatus.setStatus("Загрузка.");
fileStatus.setCode("01");
fileStatus.setDescription("Файл принят до проверки на вирусы.");
String fileName = multipartFile.getOriginalFilename();
EmployeeInfoFileFormType employeeInfoFileFormType = EmployeeInfoFileFormType.valueOf(formType);
String jsonMessage = getJsonKafkaMessage(
employeeInfoKafkaMessageService.getKafkaMessage(
fileUploadUrl,
multipartFile.getOriginalFilename(),
EmployeeInfoFileFormType.valueOf(formType),
departureDateTime
fileName,
employeeInfoFileFormType,
departureDateTime,
accessToken, authToken, timeZone, fileStatus
)
);
EmployeeModel employeeModel = ulDataService.getEmployeeModel(accessToken);
PersonModel personModel = employeeModel.getPerson();
statusService.setStatus(fileStatus.getStatus(), fileName, employeeInfoFileFormType.getFilePatternName(), Timestamp.valueOf(now),
personModel.getLastName() + " " + personModel.getFirstName().charAt(0) + ". " + personModel.getMiddleName().charAt(0) + ".", (int) multipartFile.getSize());
return sendMessage(jsonMessage);
}
else {
@ -100,7 +129,7 @@ public class EmployeeInfoFileUploadService {
}
}
private String getDepartureDateTime() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"));
private String getTimeZone() {
return ZonedDateTime.now().getOffset().toString();
}
}

View file

@ -2,10 +2,13 @@ package ervu.service.fileupload;
import ervu.service.fileupload.model.EmployeeInfoKafkaMessage;
import ervu.service.fileupload.model.FileInfo;
import ervu.service.fileupload.model.FileStatus;
import ervu.service.fileupload.model.OrgInfo;
import ervu.service.fileupload.model.SenderInfo;
import ru.micord.ervu.security.esia.service.UlDataService;
import org.springframework.stereotype.Service;
import ru.micord.ervu.security.esia.model.OrganizationModel;
import ru.micord.ervu.security.esia.service.UlDataService;
import ru.micord.ervu.security.webbpm.jwt.model.Token;
import ru.micord.ervu.security.webbpm.jwt.service.JwtTokenService;
/**
* @author Alexandr Shalaginov
@ -13,67 +16,48 @@ import org.springframework.stereotype.Service;
@Service
public class EmployeeInfoKafkaMessageService {
private final UlDataService ulDataService;
private final JwtTokenService jwtTokenService;
public EmployeeInfoKafkaMessageService(UlDataService ulDataService) {
public EmployeeInfoKafkaMessageService(UlDataService ulDataService, JwtTokenService jwtTokenService) {
this.ulDataService = ulDataService;
this.jwtTokenService = jwtTokenService;
}
public EmployeeInfoKafkaMessage getKafkaMessage(String fileNameBase, String fileName,
EmployeeInfoFileFormType formType, String departureDateTime) {
EmployeeInfoFileFormType formType, String departureDateTime, String accessToken,
String authToken, String timeZone, FileStatus fileStatus) {
return new EmployeeInfoKafkaMessage(
getOrgInfo(),
getSenderInfo(),
getOrgInfo(accessToken, authToken),
getFileInfo(
fileNameBase,
fileName,
formType,
departureDateTime
departureDateTime,
timeZone,
fileStatus
)
);
}
//TODO: refactor SUPPORT-8381
private OrgInfo getOrgInfo() {
// OrganizationModel organizationModel = ulDataService.getOrganizationModel();
// return new OrgInfo(
// organizationModel.getShortName(),
// organizationModel.getLeg(),
// organizationModel.getLegName(),
// organizationModel.getOgrn(),
// organizationModel.getInn(),
// organizationModel.getKpp()
// );
return null;
}
private SenderInfo getSenderInfo() {
// MillitaryRegistrationPersonModel personModel = ulDataService.getPersonModel();
// return new SenderInfo(
// personModel.getLastName(),
// personModel.getFirstName(),
// personModel.getMiddleName(),
// personModel.getBirthday(),
// personModel.getRoleCode(),
// personModel.getRoleName(),
// personModel.getSnils(),
// personModel.getIdERN(),
// new PassportInfo(
// personModel.getPassportSeries(),
// personModel.getPassportNumber(),
// personModel.getPassportIssueDate()
// )
// );
return null;
}
private FileInfo getFileInfo(String fileNameBase, String fileName,
EmployeeInfoFileFormType formType, String departureDateTime) {
EmployeeInfoFileFormType formType, String departureDateTime, String timeZone,
FileStatus fileStatus) {
return new FileInfo(
fileNameBase,
fileName,
formType.getFilePatternCode(),
formType.getFilePatternName(),
departureDateTime
departureDateTime,
timeZone,
fileStatus
);
}
private OrgInfo getOrgInfo(String accessToken, String authToken) {
OrganizationModel organizationModel = ulDataService.getOrganizationModel(accessToken);
Token token = jwtTokenService.getToken(authToken);
String[] ids = token.getUserAccountId().split(":");
return new OrgInfo(organizationModel.getFullName(), ids[1], ids[0]);
}
}

View file

@ -7,12 +7,10 @@ import java.util.Objects;
*/
public class EmployeeInfoKafkaMessage {
private final OrgInfo orgInfo;
private final SenderInfo senderInfo;
private final FileInfo fileInfo;
public EmployeeInfoKafkaMessage(OrgInfo orgInfo, SenderInfo senderInfo, FileInfo fileInfo) {
public EmployeeInfoKafkaMessage(OrgInfo orgInfo, FileInfo fileInfo) {
this.orgInfo = orgInfo;
this.senderInfo = senderInfo;
this.fileInfo = fileInfo;
}
@ -20,10 +18,6 @@ public class EmployeeInfoKafkaMessage {
return orgInfo;
}
public SenderInfo getSenderInfo() {
return senderInfo;
}
public FileInfo getFileInfo() {
return fileInfo;
}
@ -33,21 +27,18 @@ public class EmployeeInfoKafkaMessage {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
EmployeeInfoKafkaMessage that = (EmployeeInfoKafkaMessage) o;
return Objects.equals(orgInfo, that.orgInfo) && Objects.equals(senderInfo,
that.senderInfo
) && Objects.equals(fileInfo, that.fileInfo);
return Objects.equals(orgInfo, that.orgInfo) && Objects.equals(fileInfo, that.fileInfo);
}
@Override
public int hashCode() {
return Objects.hash(orgInfo, senderInfo, fileInfo);
return Objects.hash(orgInfo, fileInfo);
}
@Override
public String toString() {
return "KafkaMessage{" +
"orgInfo=" + orgInfo +
", senderInfo=" + senderInfo +
", fileInfo=" + fileInfo +
'}';
}

View file

@ -11,14 +11,18 @@ public class FileInfo {
private final String filePatternCode;
private final String filePatternName;
private final String departureDateTime;
private final String timeZone;
private final FileStatus fileStatus;
public FileInfo(String fileNameBase, String fileName, String filePatternCode,
String filePatternName, String departureDateTime) {
String filePatternName, String departureDateTime, String timeZone, FileStatus fileStatus) {
this.fileNameBase = fileNameBase;
this.fileName = fileName;
this.filePatternCode = filePatternCode;
this.filePatternName = filePatternName;
this.departureDateTime = departureDateTime;
this.timeZone = timeZone;
this.fileStatus = fileStatus;
}
public String getFileNameBase() {
@ -41,6 +45,14 @@ public class FileInfo {
return departureDateTime;
}
public String getTimeZone() {
return timeZone;
}
public FileStatus getFileStatus() {
return fileStatus;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;

View file

@ -0,0 +1,37 @@
package ervu.service.fileupload.model;
import java.io.Serializable;
/**
* @author Eduard Tihomirov
*/
public class FileStatus {
private String code;
private String status;
private String description;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}

View file

@ -7,44 +7,25 @@ import java.util.Objects;
*/
public class OrgInfo {
private final String orgName;
private final String orgTypeCode;
private final String orgTypeName;
private final String ogrn;
private final String inn;
private final String kpp;
private final String orgId;
private final String prnOid;
public OrgInfo(String orgName, String orgTypeCode, String orgTypeName, String ogrn, String inn,
String kpp) {
public OrgInfo(String orgName, String orgId, String prnOid) {
this.orgName = orgName;
this.orgTypeCode = orgTypeCode;
this.orgTypeName = orgTypeName;
this.ogrn = ogrn;
this.inn = inn;
this.kpp = kpp;
this.orgId = orgId;
this.prnOid = prnOid;
}
public String getOrgName() {
return orgName;
}
public String getOrgTypeCode() {
return orgTypeCode;
public String getOrgId() {
return orgId;
}
public String getOrgTypeName() {
return orgTypeName;
}
public String getOgrn() {
return ogrn;
}
public String getInn() {
return inn;
}
public String getKpp() {
return kpp;
public String getPrnOid() {
return prnOid;
}
@Override
@ -52,27 +33,22 @@ public class OrgInfo {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
OrgInfo orgInfo = (OrgInfo) o;
return Objects.equals(orgName, orgInfo.orgName) && Objects.equals(orgTypeCode,
orgInfo.orgTypeCode
) && Objects.equals(orgTypeName, orgInfo.orgTypeName) && Objects.equals(ogrn,
orgInfo.ogrn
) && Objects.equals(inn, orgInfo.inn) && Objects.equals(kpp, orgInfo.kpp);
return Objects.equals(orgName, orgInfo.orgName) && Objects.equals(orgId,
orgInfo.orgId
) && Objects.equals(prnOid, orgInfo.prnOid);
}
@Override
public int hashCode() {
return Objects.hash(orgName, orgTypeCode, orgTypeName, ogrn, inn, kpp);
return Objects.hash(orgName, orgId, prnOid);
}
@Override
public String toString() {
return "OrgInfo{" +
"orgName='" + orgName + '\'' +
", orgTypeCode='" + orgTypeCode + '\'' +
", orgTypeName='" + orgTypeName + '\'' +
", ogrn='" + ogrn + '\'' +
", inn='" + inn + '\'' +
", kpp='" + kpp + '\'' +
", orgId='" + orgId + '\'' +
", prnOid='" + prnOid + '\'' +
'}';
}
}

View file

@ -1,54 +0,0 @@
package ervu.service.fileupload.model;
import java.util.Objects;
/**
* @author Alexandr Shalaginov
*/
public class PassportInfo {
private final String series;
private final String number;
private final String issueDate;
public PassportInfo(String series, String number, String issueDate) {
this.series = series;
this.number = number;
this.issueDate = issueDate;
}
public String getSeries() {
return series;
}
public String getNumber() {
return number;
}
public String getIssueDate() {
return issueDate;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PassportInfo that = (PassportInfo) o;
return Objects.equals(series, that.series) && Objects.equals(number,
that.number
) && Objects.equals(issueDate, that.issueDate);
}
@Override
public int hashCode() {
return Objects.hash(series, number, issueDate);
}
@Override
public String toString() {
return "PassportInfo{" +
"series='" + series + '\'' +
", number='" + number + '\'' +
", issueDate='" + issueDate + '\'' +
'}';
}
}

View file

@ -1,106 +0,0 @@
package ervu.service.fileupload.model;
import java.util.Objects;
/**
* @author Alexandr Shalaginov
*/
public class SenderInfo {
private final String senderLastName;
private final String senderFirstName;
private final String senderMiddleName;
private final String birthDate;
private final String senderRoleCode;
private final String senderRoleName;
private final String snils;
private final String idERN;
private final PassportInfo document;
public SenderInfo(String senderLastName, String senderFirstName, String senderMiddleName,
String birthDate, String senderRoleCode, String senderRoleName, String snils, String idERN,
PassportInfo document) {
this.senderLastName = senderLastName;
this.senderFirstName = senderFirstName;
this.senderMiddleName = senderMiddleName;
this.birthDate = birthDate;
this.senderRoleCode = senderRoleCode;
this.senderRoleName = senderRoleName;
this.snils = snils;
this.idERN = idERN;
this.document = document;
}
public String getSenderLastName() {
return senderLastName;
}
public String getSenderFirstName() {
return senderFirstName;
}
public String getSenderMiddleName() {
return senderMiddleName;
}
public String getBirthDate() {
return birthDate;
}
public String getSenderRoleCode() {
return senderRoleCode;
}
public String getSenderRoleName() {
return senderRoleName;
}
public String getSnils() {
return snils;
}
public String getIdERN() {
return idERN;
}
public PassportInfo getDocument() {
return document;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SenderInfo that = (SenderInfo) o;
return Objects.equals(senderLastName, that.senderLastName) && Objects.equals(
senderFirstName, that.senderFirstName) && Objects.equals(senderMiddleName,
that.senderMiddleName
) && Objects.equals(birthDate, that.birthDate) && Objects.equals(
senderRoleCode, that.senderRoleCode) && Objects.equals(senderRoleName,
that.senderRoleName
) && Objects.equals(snils, that.snils) && Objects.equals(idERN, that.idERN)
&& Objects.equals(document, that.document);
}
@Override
public int hashCode() {
return Objects.hash(senderLastName, senderFirstName, senderMiddleName, birthDate,
senderRoleCode,
senderRoleName, snils, idERN, document
);
}
@Override
public String toString() {
return "SenderInfo{" +
"senderLastName='" + senderLastName + '\'' +
", senderFirstName='" + senderFirstName + '\'' +
", senderMiddleName='" + senderMiddleName + '\'' +
", birthDate='" + birthDate + '\'' +
", senderRoleCode='" + senderRoleCode + '\'' +
", senderRoleName='" + senderRoleName + '\'' +
", snils='" + snils + '\'' +
", idERN='" + idERN + '\'' +
", document=" + document +
'}';
}
}

View file

@ -1,7 +1,9 @@
package ru.micord.ervu.kafka;
import org.apache.kafka.clients.CommonClientConfigs;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.config.SaslConfigs;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.beans.factory.annotation.Value;
@ -33,12 +35,27 @@ public class ReplyingKafkaConfig {
@Value("${ervu-kafka.reply-connection-timeout:30}")
private long connectionTimeout;
@Value("${ervu-kafka.send.security.protocol}")
private String securityProtocol;
@Value("${ervu-kafka.send.login.module:org.apache.kafka.common.security.scram.ScramLoginModule}")
private String loginModule;
@Value("${ervu-kafka.send.username}")
private String username;
@Value("${ervu-kafka.send.password}")
private String password;
@Value("${ervu-kafka.sasl.mechanism}")
private String saslMechanism;
@Bean
public ProducerFactory<String, String> producerFactory() {
Map<String, Object> configProps = new HashMap<>();
configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
configProps.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, securityProtocol);
configProps.put(SaslConfigs.SASL_JAAS_CONFIG, loginModule + " required username=\""
+ username + "\" password=\"" + password + "\";");
configProps.put(SaslConfigs.SASL_MECHANISM, saslMechanism);
return new DefaultKafkaProducerFactory<>(configProps);
}
@ -54,6 +71,10 @@ public class ReplyingKafkaConfig {
configProps.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
configProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
configProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
configProps.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, securityProtocol);
configProps.put(SaslConfigs.SASL_JAAS_CONFIG, loginModule + " required username=\""
+ username + "\" password=\"" + password + "\";");
configProps.put(SaslConfigs.SASL_MECHANISM, saslMechanism);
return new DefaultKafkaConsumerFactory<>(configProps);
}

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
<changeSet id="001" author="tihomirov">
<comment>add file id column into interaction_log table</comment>
<addColumn schemaName="public" tableName="interaction_log">
<column name="file_id" type="varchar(36)">
<constraints nullable="false"/>
</column>
</addColumn>
</changeSet>
</databaseChangeLog>

1
config/asd Normal file
View file

@ -0,0 +1 @@
org_fullname, org_shortname, org_brhs, org_brhs_ctts, org_brhs_addrs, org_type, org_ogrn, org_inn, org_leg, org_kpp, org_ctts, org_addrs, org_grps, org_emps

View file

@ -57,12 +57,11 @@
<property name="file.webdav.upload.url" value="https://ervu-webdav.k8s.micord.ru"/>
<property name="file.webdav.upload.username" value="test"/>
<property name="file.webdav.upload.password" value="test"/>
<property name="kafka.send.message.topic.name" value="file-upload-v2"/>
<property name="kafka.send.url" value="http://10.10.31.11:32609"/>
<property name="kafka.send.security.protocol" value="SASL_PLAINTEXT"/>
<property name="kafka.sasl.mechanism" value="SCRAM-SHA-256"/>
<property name="kafka.send.username" value="user1"/>
<property name="kafka.send.password" value="Blfi9d2OFG"/>
<property name="ervu-kafka.download-request-topic" value="ervu.lkrp.download.request"/>
<property name="ervu-kafka.send.security.protocol" value="SASL_PLAINTEXT"/>
<property name="ervu-kafka.sasl.mechanism" value="SCRAM-SHA-256"/>
<property name="ervu-kafka.send.username" value="user1"/>
<property name="ervu-kafka.send.password" value="Blfi9d2OFG"/>
<property name="ervu.fileupload.max_file_size" value="5242880"/>
<property name="ervu.fileupload.max_request_size" value="6291456"/>
<property name="ervu.fileupload.file_size_threshold" value="0"/>