diff --git a/litmus-proxy/src/main/java/com/navi/medici/filter/RequestHandlerConfig.java b/litmus-proxy/src/main/java/com/navi/medici/filter/RequestHandlerConfig.java new file mode 100644 index 0000000..b4e26e7 --- /dev/null +++ b/litmus-proxy/src/main/java/com/navi/medici/filter/RequestHandlerConfig.java @@ -0,0 +1,19 @@ +package com.navi.medici.filter; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class RequestHandlerConfig implements WebMvcConfigurer { + + @Autowired + private RequestMetadataHandler requestMetadataHandler; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(requestMetadataHandler); + } +} \ No newline at end of file diff --git a/litmus-proxy/src/main/java/com/navi/medici/filter/RequestMetadataHandler.java b/litmus-proxy/src/main/java/com/navi/medici/filter/RequestMetadataHandler.java new file mode 100644 index 0000000..5989fac --- /dev/null +++ b/litmus-proxy/src/main/java/com/navi/medici/filter/RequestMetadataHandler.java @@ -0,0 +1,60 @@ +package com.navi.medici.filter; + +import com.navi.medici.model.RequestMetadata; +import java.util.Optional; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.log4j.Log4j2; +import org.apache.logging.log4j.util.Strings; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +@Component +@Log4j2 +public class RequestMetadataHandler extends HandlerInterceptorAdapter { + + public static final String X_CORRELATION_ID = "X-Correlation-Id"; + public static final String APP_VERSION_CODE = "appVersionCode"; + public static final String OS_VERSION = "osVersion"; + public static final String X_CLICK_STREAM_DATA = "X-Click-Stream-Data"; + + private final RequestMetadata requestMetadata; + + @Autowired + public RequestMetadataHandler(RequestMetadata requestMetadata) { + this.requestMetadata = requestMetadata; + } + + @Override + public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, + final Object handler) { + requestMetadata.resetCorrelationId(); + requestMetadata.resetCustomerId(); + requestMetadata.resetAppVersionCode(); + requestMetadata.resetOsVersion(); + requestMetadata.resetClickStreamData(); + String correlationId = request.getHeader(X_CORRELATION_ID); + String appVersionCode = request.getHeader(APP_VERSION_CODE); + String osVersion = request.getHeader(OS_VERSION); + requestMetadata.updateCorrelationId(Optional.ofNullable(correlationId) + .filter(Strings::isNotBlank).orElseGet(requestMetadata::generateCorrelationId)); + Optional.ofNullable(appVersionCode).ifPresent(requestMetadata::updateAppVersionCode); + Optional.ofNullable(osVersion).ifPresent(requestMetadata::updateOSVersionCode); + + String clickStreamData = request.getHeader(X_CLICK_STREAM_DATA); + Optional.ofNullable(clickStreamData).ifPresent(requestMetadata::updateClickStreamData); + + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, + ModelAndView modelAndView) { + requestMetadata.resetCorrelationId(); + requestMetadata.resetCustomerId(); + requestMetadata.resetAppVersionCode(); + requestMetadata.resetOsVersion(); + } +} \ No newline at end of file diff --git a/litmus-proxy/src/main/java/com/navi/medici/model/RequestMetadata.java b/litmus-proxy/src/main/java/com/navi/medici/model/RequestMetadata.java new file mode 100644 index 0000000..c7be928 --- /dev/null +++ b/litmus-proxy/src/main/java/com/navi/medici/model/RequestMetadata.java @@ -0,0 +1,83 @@ +package com.navi.medici.model; + +import java.util.Optional; +import java.util.UUID; +import org.apache.logging.log4j.ThreadContext; +import org.springframework.stereotype.Component; + +@Component +public class RequestMetadata { + + public static final String MESSAGE = "X-Reply-Message"; + private static final String CORRELATION_ID = "correlationId"; + public static final String CUSTOMER_ID_HEADER = "X-Medici-Customer-Id"; + public static final String CUSTOMER_ID = "customerId"; + public static final String REQUEST_TYPE_HEADER = "X-Request-Type"; + public static final String STATUS = "X-Reply-Status"; + public static final String APP_VERSION_CODE = "appVersionCode"; + public static final String OS_VERSION = "osVersion"; + public static final String X_CLICK_STREAM_DATA = "X-Click-Stream-Data"; + + public String correlationId() { + return ThreadContext.get(CORRELATION_ID); + } + + public String getClickStreamData() { + return ThreadContext.get(X_CLICK_STREAM_DATA); + } + + public void updateClickStreamData(String clickStreamData) { + ThreadContext.put(X_CLICK_STREAM_DATA, clickStreamData); + } + + public Optional customerId() { + return Optional.ofNullable(ThreadContext.get(CUSTOMER_ID)); + } + + public String generateCorrelationId() { + return UUID.randomUUID().toString(); + } + + + public void updateAppVersionCode(String appVersionCode) { + ThreadContext.put(APP_VERSION_CODE, appVersionCode); + } + + public Optional getAppVersionCode() { + return Optional.ofNullable(ThreadContext.get(APP_VERSION_CODE)); + } + + public void resetAppVersionCode() { + ThreadContext.remove(APP_VERSION_CODE); + } + + public void updateOSVersionCode(String osVersionCode) { + ThreadContext.put(OS_VERSION, osVersionCode); + } + + public Optional getOsVersion() { + return Optional.ofNullable(ThreadContext.get(OS_VERSION)); + } + + public void resetOsVersion() { + ThreadContext.remove(OS_VERSION); + } + + public void updateCorrelationId(String requestId) { + ThreadContext.put(CORRELATION_ID, requestId); + } + + public void resetCorrelationId() { + ThreadContext.remove(CORRELATION_ID); + } + + public void updateCustomerId(String customerId) { + ThreadContext.put(CUSTOMER_ID, customerId); + } + + public void resetCustomerId() { + ThreadContext.remove(CUSTOMER_ID); + } + + public void resetClickStreamData() {ThreadContext.remove(X_CLICK_STREAM_DATA);} +} diff --git a/litmus-proxy/src/main/java/com/navi/medici/provider/CustomLitmusProxyContextProvider.java b/litmus-proxy/src/main/java/com/navi/medici/provider/CustomLitmusProxyContextProvider.java index 601231e..5c4b5c5 100644 --- a/litmus-proxy/src/main/java/com/navi/medici/provider/CustomLitmusProxyContextProvider.java +++ b/litmus-proxy/src/main/java/com/navi/medici/provider/CustomLitmusProxyContextProvider.java @@ -1,23 +1,26 @@ package com.navi.medici.provider; import com.navi.medici.context.LitmusContext; +import com.navi.medici.model.RequestMetadata; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Component; import org.springframework.web.context.annotation.RequestScope; @RequestScope @Log4j2 @RequiredArgsConstructor +@Component public class CustomLitmusProxyContextProvider implements LitmusContextProvider { + private final RequestMetadata requestMetadata; @Override public LitmusContext getContext() { - return LitmusContext.builder().build(); -// return LitmusContext.builder() -// .userId(requestMetadata.customerId().orElseGet(() -> "")) -// .clickStreamPayload(requestMetadata.getClickStreamData()) -// .appVersionCode(requestMetadata.getAppVersionCode().orElse("")) -// .osType(requestMetadata.getOsVersion().orElse("")) -// .build(); + return LitmusContext.builder() + .userId(requestMetadata.customerId().orElseGet(() -> "")) + .clickStreamPayload(requestMetadata.getClickStreamData()) + .appVersionCode(requestMetadata.getAppVersionCode().orElse("")) + .osType(requestMetadata.getOsVersion().orElse("")) + .build(); } } diff --git a/litmus-proxy/src/main/resources/application.properties b/litmus-proxy/src/main/resources/application.properties index 8eeae68..71cfc09 100644 --- a/litmus-proxy/src/main/resources/application.properties +++ b/litmus-proxy/src/main/resources/application.properties @@ -8,6 +8,6 @@ spring.jmx.enabled=true management.metrics.kafka.consumer.enabled=true management.metrics.kafka.producer.enabled=true -litmus.api.endpoint=${LITMUS_API_ENDPOINT:http://localhost:12000/litmus-core/v1} +litmus.api.endpoint=${LITMUS_API_ENDPOINT:https://dev-litmus-core.np.navi-tech.in/litmus-core/v1} clickstream.api.endpoint=${CLICK_STREAM_API_ENDPOINT:https://dev-janus.np.navi-tech.in/events/json}