2020-07-20 10:54:21 +02:00
|
|
|
import { getWebsite, getSession, createSession } from 'lib/db';
|
2020-07-23 05:45:09 +02:00
|
|
|
import { getCountry, getDevice, getIpAddress } from 'lib/utils';
|
2020-07-24 04:56:55 +02:00
|
|
|
import { uuid, isValidId, verifyToken } from 'lib/crypto';
|
2020-07-20 10:54:21 +02:00
|
|
|
|
2020-07-21 04:24:33 +02:00
|
|
|
export default async req => {
|
2020-07-20 10:54:21 +02:00
|
|
|
const { payload } = req.body;
|
2020-07-23 05:45:09 +02:00
|
|
|
const { website: website_uuid, hostname, screen, language, session } = payload;
|
2020-07-20 10:54:21 +02:00
|
|
|
|
2020-07-24 04:56:55 +02:00
|
|
|
if (!isValidId(website_uuid)) {
|
2020-07-23 05:45:09 +02:00
|
|
|
throw new Error(`Invalid website: ${website_uuid}`);
|
2020-07-20 10:54:21 +02:00
|
|
|
}
|
|
|
|
|
2020-07-23 05:45:09 +02:00
|
|
|
try {
|
2020-07-23 06:33:17 +02:00
|
|
|
return await verifyToken(session);
|
2020-07-23 05:45:09 +02:00
|
|
|
} catch {
|
|
|
|
const ip = getIpAddress(req);
|
|
|
|
const { userAgent, browser, os } = getDevice(req);
|
|
|
|
const country = await getCountry(req, ip);
|
|
|
|
|
|
|
|
if (website_uuid) {
|
|
|
|
const website = await getWebsite(website_uuid);
|
|
|
|
|
|
|
|
if (website) {
|
|
|
|
const { website_id } = website;
|
|
|
|
const session_uuid = uuid(website_id, hostname, ip, userAgent, os);
|
|
|
|
|
|
|
|
let session = await getSession(session_uuid);
|
|
|
|
|
|
|
|
if (!session) {
|
|
|
|
session = await createSession(website_id, {
|
|
|
|
session_uuid,
|
|
|
|
hostname,
|
|
|
|
browser,
|
|
|
|
os,
|
|
|
|
screen,
|
|
|
|
language,
|
|
|
|
country,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
const { session_id } = session;
|
|
|
|
|
|
|
|
return {
|
|
|
|
website_id,
|
|
|
|
website_uuid,
|
|
|
|
session_id,
|
2020-07-20 10:54:21 +02:00
|
|
|
session_uuid,
|
2020-07-23 05:45:09 +02:00
|
|
|
};
|
2020-07-20 10:54:21 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-07-21 04:24:33 +02:00
|
|
|
};
|