diff --git a/app/components/dashboard/Nav.vue b/app/components/dashboard/Nav.vue index 1f74333..87871a0 100644 --- a/app/components/dashboard/Nav.vue +++ b/app/components/dashboard/Nav.vue @@ -18,9 +18,9 @@ const route = useRoute() {{ $t('nav.analysis') }} - + diff --git a/app/components/dashboard/realtime/Globe.vue b/app/components/dashboard/realtime/Globe.vue index ba26034..2493eae 100644 --- a/app/components/dashboard/realtime/Globe.vue +++ b/app/components/dashboard/realtime/Globe.vue @@ -3,7 +3,6 @@ import { scaleSequentialSqrt } from 'd3-scale' import { interpolateYlOrRd } from 'd3-scale-chromatic' import Globe from 'globe.gl' import { debounce } from 'lodash-es' -import data from './data.json' const countries = ref({}) @@ -14,14 +13,14 @@ async function getWorldMapJSON() { const liveSessionLocations = computed(() => { const map = new Map() - data.forEach((item) => { - if (!item.country) - return - if (!map.has(item.country)) - map.set(item.country, { lat: 37.75100, lon: -122.4194, count: 1 }) + // data.forEach((item) => { + // if (!item.country) + // return + // if (!map.has(item.country)) + // map.set(item.country, { lat: 37.75100, lon: -122.4194, count: 1 }) - map.get(item.country).count += 1 - }) + // map.get(item.country).count += 1 + // }) return Array.from(map.values()) }) diff --git a/server/utils/access-log.ts b/server/utils/access-log.ts index 1b18bce..c320d15 100644 --- a/server/utils/access-log.ts +++ b/server/utils/access-log.ts @@ -36,27 +36,59 @@ export const blobsMap = { blob15: 'deviceType', } as const +export const doublesMap = { + double1: 'latitude', + double2: 'longitude', +} as const + export type BlobsMap = typeof blobsMap export type BlobsKey = keyof BlobsMap -export type LogsKey = BlobsMap[BlobsKey] -export type LogsMap = { [key in LogsKey]: string | undefined } -export const logsMap: LogsMap = Object.entries(blobsMap).reduce((acc, [k, v]) => ({ ...acc, [v]: k }), {}) as LogsMap +export type DoublesMap = typeof doublesMap +export type DoublesKey = keyof DoublesMap + +export type LogsKey = BlobsMap[BlobsKey] | DoublesMap[DoublesKey] +export type LogsMap = { + [key in BlobsMap[BlobsKey]]: string | undefined +} & { + [key in DoublesMap[DoublesKey]]?: number | undefined +} + +export const logsMap = { + ...Object.entries(blobsMap).reduce((acc, [k, v]) => ({ ...acc, [v]: k }), {}), + ...Object.entries(doublesMap).reduce((acc, [k, v]) => ({ ...acc, [v]: k }), {}), +} as LogsMap export function logs2blobs(logs: LogsMap) { - // @ts-expect-error todo - return Object.keys(blobsMap).sort((a, b) => toBlobNumber(a) - toBlobNumber(b)).map(key => logs[blobsMap[key]] || '') + return (Object.keys(blobsMap) as BlobsKey[]) + .sort((a, b) => toBlobNumber(a) - toBlobNumber(b)) + .map(key => String(logs[blobsMap[key] as LogsKey] || '')) } export function blobs2logs(blobs: string[]) { const logsList = Object.keys(blobsMap) - // @ts-expect-error todo - return blobs.reduce((logs: LogsMap, blob, i) => { - // @ts-expect-error todo - logs[blobsMap[logsList[i]]] = blob + return blobs.reduce((logs, blob, i) => { + const key = blobsMap[logsList[i] as BlobsKey] + logs[key] = blob return logs - }, {}) as LogsMap + }, {} as Partial) +} + +export function logs2doubles(logs: LogsMap) { + return (Object.keys(doublesMap) as DoublesKey[]) + .sort((a, b) => toBlobNumber(a) - toBlobNumber(b)) + .map(key => Number(logs[doublesMap[key] as LogsKey] || 0)) +} + +export function doubles2logs(doubles: number[]) { + const logsList = Object.keys(doublesMap) + + return doubles.reduce((logs, double, i) => { + const key = doublesMap[logsList[i] as DoublesKey] + logs[key] = double + return logs + }, {} as Partial) } export function useAccessLog(event: H3Event) { @@ -108,16 +140,21 @@ export function useAccessLog(event: H3Event) { browserType: uaInfo?.browser?.type, device: uaInfo?.device?.model, deviceType: uaInfo?.device?.type, + + // For RealTime Globe + latitude: Number(cf?.latitude || getHeader(event, 'cf-iplatitude') || 0), + longitude: Number(cf?.longitude || getHeader(event, 'cf-iplongitude') || 0), } if (process.env.NODE_ENV === 'production') { return hubAnalytics().put({ indexes: [link.id], // only one index blobs: logs2blobs(accessLogs), + doubles: logs2doubles(accessLogs), }) } else { - console.log('access logs:', logs2blobs(accessLogs), blobs2logs(logs2blobs(accessLogs))) + console.log('access logs:', accessLogs, logs2blobs(accessLogs), logs2doubles(accessLogs), { ...blobs2logs(logs2blobs(accessLogs)), ...doubles2logs(logs2doubles(accessLogs)) }) return Promise.resolve() } }