add prefecture and city info

pull/1644/head
Sergei Meza 2022-11-09 15:30:16 +09:00
parent 911eae897f
commit 75f49d3042
3 changed files with 26 additions and 17 deletions

View File

@ -0,0 +1,3 @@
-- AlterTable
ALTER TABLE `session` ADD COLUMN `city` VARCHAR(100) NULL,
ADD COLUMN `prefecture` VARCHAR(2) NULL;

View File

@ -2,7 +2,6 @@
import path from 'path';
import requestIp from 'request-ip';
import { browserName, detectOS } from 'detect-browser';
import isLocalhost from 'is-localhost-ip';
import maxmind from 'maxmind';
import {
@ -56,17 +55,7 @@ export function getDevice(screen, browser, os) {
}
}
export async function getCountry(req, ip) {
// Cloudflare
if (req.headers['cf-ipcountry']) {
return req.headers['cf-ipcountry'];
}
// Ignore local ips
if (await isLocalhost(ip)) {
return;
}
export async function getGeoInfo(ip) {
// Database lookup
if (!lookup) {
lookup = await maxmind.open(path.resolve('node_modules/.geo/GeoLite2-City.mmdb'));
@ -74,20 +63,32 @@ export async function getCountry(req, ip) {
const result = lookup.get(ip);
console.log(JSON.stringify(result));
if (!result) {
return undefined;
}
return result?.country?.iso_code;
console.log(result.subdivisions);
const city = result.city?.names.en;
const country = result.country?.iso_code;
const prefecture = result.subdivisions[0]?.iso_code;
return {
city,
country,
prefecture,
};
}
export async function getClientInfo(req, { screen }) {
const userAgent = req.headers['user-agent'];
const ip = getIpAddress(req);
const country = await getCountry(req, ip);
const { country, prefecture, city } = await getGeoInfo(ip);
const browser = browserName(userAgent);
const os = detectOS(userAgent);
const device = getDevice(screen, browser, os);
return { userAgent, browser, os, ip, country, device };
return { userAgent, browser, os, ip, country, prefecture, city, device };
}
export function getJsonBody(req) {

View File

@ -47,7 +47,10 @@ export async function getSession(req) {
}
// const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
const { userAgent, browser, os, ip, country, device } = await getClientInfo(req, payload);
const { userAgent, browser, os, ip, country, prefecture, city, device } = await getClientInfo(
req,
payload,
);
let session_uuid = uuid(websiteId, hostname, ip, userAgent);
if (process.env.CROSSDOMAIN_TRACKING) {
@ -80,6 +83,8 @@ export async function getSession(req) {
screen,
language,
country,
prefecture,
city,
device,
ip,
user_agent: userAgent,