visit.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. const useragent = require("useragent");
  2. const geoip = require("geoip-lite");
  3. const URL = require("url");
  4. const { getStatsLimit, removeWww } = require("../utils");
  5. const query = require("../queries");
  6. const browsersList = ["IE", "Firefox", "Chrome", "Opera", "Safari", "Edge"];
  7. const osList = ["Windows", "Mac OS", "Linux", "Android", "iOS"];
  8. function filterInBrowser(agent) {
  9. return function(item) {
  10. return agent.family.toLowerCase().includes(item.toLocaleLowerCase());
  11. }
  12. }
  13. function filterInOs(agent) {
  14. return function(item) {
  15. return agent.os.family.toLowerCase().includes(item.toLocaleLowerCase());
  16. }
  17. }
  18. module.exports = function({ data }) {
  19. const tasks = [];
  20. tasks.push(query.link.incrementVisit({ id: data.link.id }));
  21. if (data.link.visit_count < getStatsLimit()) {
  22. const agent = useragent.parse(data.headers["user-agent"]);
  23. const [browser = "Other"] = browsersList.filter(filterInBrowser(agent));
  24. const [os = "Other"] = osList.filter(filterInOs(agent));
  25. const referrer =
  26. data.referrer && removeWww(URL.parse(data.referrer).hostname);
  27. const location = geoip.lookup(data.realIP);
  28. const country = location && location.country;
  29. tasks.push(
  30. query.visit.add({
  31. browser: browser.toLowerCase(),
  32. country: country || "Unknown",
  33. id: data.link.id,
  34. os: os.toLowerCase().replace(/\s/gi, ""),
  35. referrer: (referrer && referrer.replace(/\./gi, "[dot]")) || "Direct"
  36. })
  37. );
  38. }
  39. return Promise.all(tasks);
  40. }