package org.xcolab.view.auth.endpoints;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.xcolab.client.members.pojo.Member;
import org.xcolab.client.tracking.TrackingClient;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
public class UserTrackingController {
@PostMapping("/trackVisitor")
protected ResponseJson trackVisitor(HttpServletRequest request, HttpServletResponse response,
Member loggedInMember)
throws ServletException, IOException {
//get ip
String ip = getClientIpAddress(request);
//city, country
String url = request.getParameter("url");
String referer = request.getParameter(HttpHeaders.REFERER);
String browser = request.getHeader(HttpHeaders.USER_AGENT);
//get headers
String headers = getHeadersAsString(request);
//find out uuid. if it is not sent as request parameter, try to retrieve existing token if user is logged in.
String uuid = request.getParameter("uuid");
String isTrackedVisitor = request.getParameter("isTrackedVisitor");
if (StringUtils.isBlank(uuid)) {
if (loggedInMember != null) {
uuid = TrackingClient.getTrackedVisitorOrCreate(loggedInMember.getId_()).getUuid_();
isTrackedVisitor = "true";
} else {
uuid = TrackingClient.generateUUID();
}
}
TrackingClient.addTrackedVisit(uuid, url, ip, browser, referer, headers);
return new ResponseJson(uuid, Boolean.valueOf(isTrackedVisitor));
}
private String getClientIpAddress(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
private String getHeadersAsString(HttpServletRequest request) {
StringBuilder headerStringBuilder = new StringBuilder();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
Enumeration<String> headers = request.getHeaders(headerName);
while (headers.hasMoreElements()) {
headerStringBuilder.append(headers.nextElement()).append("\n");
}
}
return headerStringBuilder.toString();
}
private static class ResponseJson {
private final String uuid;
private final boolean isTrackedVisitor;
private ResponseJson(String uuid, boolean isTrackedVisitor) {
this.uuid = uuid;
this.isTrackedVisitor = isTrackedVisitor;
}
public String getUuid() {
return uuid;
}
public boolean isTrackedVisitor() {
return isTrackedVisitor;
}
}
}