You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.8 KiB
94 lines
2.8 KiB
import 'dotenv/config';
|
|
import {faker} from '@faker-js/faker';
|
|
|
|
export const statsConfig = {
|
|
endpoint: process.env.STATS_ENDPOINT,
|
|
token: process.env.STATS_TOKEN,
|
|
id: process.env.STATS_ID,
|
|
local: {
|
|
enabled: true,
|
|
token: process.env.STATS_LOCAL_TOKEN,
|
|
endpoint: process.env.STATS_LOCAL_ENDPOINT,
|
|
datasource: process.env.STATS_LOCAL_DATASOURCE
|
|
}
|
|
};
|
|
|
|
interface AnalyticsEventProps {
|
|
siteUuid: string;
|
|
timestamp?: Date;
|
|
location?: string;
|
|
locale?: string;
|
|
referrer?: string;
|
|
referrerSource?: string;
|
|
}
|
|
|
|
const formatDate = (date: Date): string => {
|
|
const pad = (n: number) => n.toString().padStart(2, '0');
|
|
|
|
const year = date.getFullYear();
|
|
const month = pad(date.getMonth() + 1);
|
|
const day = pad(date.getDate());
|
|
const hours = pad(date.getHours());
|
|
const minutes = pad(date.getMinutes());
|
|
const seconds = pad(date.getSeconds());
|
|
|
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
};
|
|
|
|
function getFormattedDate(daysAgo: number) {
|
|
const date = new Date(Date.now() - daysAgo * 24 * 60 * 60 * 1000);
|
|
return formatDate(date);
|
|
}
|
|
|
|
export async function addAnalyticsEvent(eventProps: AnalyticsEventProps) {
|
|
const {siteUuid, locale, location, referrer, referrerSource} = eventProps;
|
|
|
|
const {local} = statsConfig;
|
|
const eventsUrl = `${local.endpoint}/v0/events?name=${local.datasource}`;
|
|
|
|
const response = await fetch(eventsUrl, {
|
|
method: 'POST',
|
|
headers: {
|
|
Authorization: `Bearer ${local.token}`,
|
|
'Content-Type': 'application/json'
|
|
},
|
|
body: JSON.stringify({
|
|
timestamp: getFormattedDate(5),
|
|
session_id: faker.string.uuid(),
|
|
action: 'page_hit',
|
|
version: '1',
|
|
payload: {
|
|
site_uuid: siteUuid,
|
|
member_uuid: faker.string.uuid(),
|
|
member_status: 'undefined',
|
|
post_uuid: faker.string.uuid(),
|
|
post_type: 'post',
|
|
'user-agent': faker.internet.userAgent(),
|
|
locale: locale || 'en-GB',
|
|
location: location || 'GB',
|
|
referrer: referrer || 'https://example.com',
|
|
pathname: '/hello-world/',
|
|
href: 'https://my-ghost-site.com/hello-world/',
|
|
meta: {
|
|
referrerSource: referrerSource || 'https://example.com'
|
|
}
|
|
}
|
|
})
|
|
});
|
|
|
|
const bodyText = await response.text();
|
|
|
|
if (!response.ok) {
|
|
let errorMessage;
|
|
|
|
try {
|
|
const data = JSON.parse(bodyText);
|
|
errorMessage = data.message || JSON.stringify(data);
|
|
} catch (_) {
|
|
errorMessage = bodyText;
|
|
}
|
|
|
|
throw new Error(`Request failed (${response.status}): ${errorMessage}`);
|
|
}
|
|
}
|