diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f0f103..6859061 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), ### Improved +- **Cleaner internal API code.** The analytics data-fetching layer has been streamlined — 13 near-identical endpoint functions were consolidated using a shared pattern, cutting roughly half the code while keeping every feature working exactly as before. This makes it easier to add new analytics endpoints in the future and reduces the chance of inconsistencies between them. + - **More reliable list rendering across the dashboard.** Pages, referrers, locations, devices, funnels, and other data lists now use stable identifiers (like page paths and referrer URLs) instead of array positions as their React keys. This prevents potential display glitches — such as stale data appearing in the wrong row — when lists are filtered, sorted, or updated in real time. - **Deleting a site now fully cleans up all its data.** Previously, deleting a site removed the site record but could leave behind orphaned analytics events in the database, slowly accumulating unused data. Now all events are cleaned up automatically in small batches before the site is removed, keeping your database tidy. diff --git a/lib/api/stats.ts b/lib/api/stats.ts index 2f4c871..250af50 100644 --- a/lib/api/stats.ts +++ b/lib/api/stats.ts @@ -1,6 +1,8 @@ import apiRequest from './client' import { Site } from './sites' +// ─── Types ────────────────────────────────────────────────────────── + export interface Stats { pageviews: number visitors: number @@ -11,7 +13,7 @@ export interface Stats { export interface TopPage { path: string pageviews: number - visits?: number // For entry/exit pages + visits?: number } export interface ScreenResolutionStat { @@ -101,6 +103,8 @@ export interface AuthParams { captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } } +// ─── Helpers ──────────────────────────────────────────────────────── + function appendAuthParams(params: URLSearchParams, auth?: AuthParams) { if (auth?.password) params.append('password', auth.password) if (auth?.captcha?.captcha_id) params.append('captcha_id', auth.captcha.captcha_id) @@ -108,198 +112,115 @@ function appendAuthParams(params: URLSearchParams, auth?: AuthParams) { if (auth?.captcha?.captcha_token) params.append('captcha_token', auth.captcha.captcha_token) } -export async function getStats(siteId: string, startDate?: string, endDate?: string): Promise { +function buildQuery( + opts: { + startDate?: string + endDate?: string + limit?: number + interval?: string + countryLimit?: number + sort?: string + }, + auth?: AuthParams +): string { const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) + if (opts.startDate) params.append('start_date', opts.startDate) + if (opts.endDate) params.append('end_date', opts.endDate) + if (opts.limit != null) params.append('limit', opts.limit.toString()) + if (opts.interval) params.append('interval', opts.interval) + if (opts.countryLimit != null) params.append('country_limit', opts.countryLimit.toString()) + if (opts.sort) params.append('sort', opts.sort) + if (auth) appendAuthParams(params, auth) const query = params.toString() - return apiRequest(`/sites/${siteId}/stats${query ? `?${query}` : ''}`) + return query ? `?${query}` : '' } -export async function getPublicStats(siteId: string, startDate?: string, endDate?: string, auth?: AuthParams): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - appendAuthParams(params, auth) - const query = params.toString() - return apiRequest(`/public/sites/${siteId}/stats${query ? `?${query}` : ''}`) +/** Factory for endpoints that return an array nested under a response key. */ +function createListFetcher(path: string, field: string, defaultLimit = 10) { + return (siteId: string, startDate?: string, endDate?: string, limit = defaultLimit): Promise => + apiRequest>(`/sites/${siteId}/${path}${buildQuery({ startDate, endDate, limit })}`) + .then(r => r?.[field] || []) } -export async function getRealtime(siteId: string): Promise { +// ─── List Endpoints ───────────────────────────────────────────────── + +export const getTopPages = createListFetcher('pages', 'pages') +export const getTopReferrers = createListFetcher('referrers', 'referrers') +export const getCountries = createListFetcher('countries', 'countries') +export const getCities = createListFetcher('cities', 'cities') +export const getRegions = createListFetcher('regions', 'regions') +export const getBrowsers = createListFetcher('browsers', 'browsers') +export const getOS = createListFetcher('os', 'os') +export const getDevices = createListFetcher('devices', 'devices') +export const getEntryPages = createListFetcher('entry-pages', 'pages') +export const getExitPages = createListFetcher('exit-pages', 'pages') +export const getScreenResolutions = createListFetcher('screen-resolutions', 'screen_resolutions') +export const getGoalStats = createListFetcher('goals/stats', 'goal_counts', 20) +export const getCampaigns = createListFetcher('campaigns', 'campaigns') + +// ─── Stats & Realtime ─────────────────────────────────────────────── + +export function getStats(siteId: string, startDate?: string, endDate?: string): Promise { + return apiRequest(`/sites/${siteId}/stats${buildQuery({ startDate, endDate })}`) +} + +export function getPublicStats(siteId: string, startDate?: string, endDate?: string, auth?: AuthParams): Promise { + return apiRequest(`/public/sites/${siteId}/stats${buildQuery({ startDate, endDate }, auth)}`) +} + +export function getRealtime(siteId: string): Promise { return apiRequest(`/sites/${siteId}/realtime`) } -export async function getPublicRealtime(siteId: string, auth?: AuthParams): Promise { - const params = new URLSearchParams() - appendAuthParams(params, auth) - return apiRequest(`/public/sites/${siteId}/realtime?${params.toString()}`) +export function getPublicRealtime(siteId: string, auth?: AuthParams): Promise { + return apiRequest(`/public/sites/${siteId}/realtime${buildQuery({}, auth)}`) } -export async function getTopPages(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest<{ pages: TopPage[] }>(`/sites/${siteId}/pages?${params.toString()}`).then(r => r?.pages || []) +// ─── Daily Stats ──────────────────────────────────────────────────── + +export function getDailyStats(siteId: string, startDate?: string, endDate?: string, interval?: string): Promise { + return apiRequest<{ stats: DailyStat[] }>(`/sites/${siteId}/daily${buildQuery({ startDate, endDate, interval })}`) + .then(r => r?.stats || []) } -export async function getTopReferrers(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest<{ referrers: TopReferrer[] }>(`/sites/${siteId}/referrers?${params.toString()}`).then(r => r?.referrers || []) +export function getPublicDailyStats(siteId: string, startDate?: string, endDate?: string, interval?: string, auth?: AuthParams): Promise { + return apiRequest<{ stats: DailyStat[] }>(`/public/sites/${siteId}/daily${buildQuery({ startDate, endDate, interval }, auth)}`) + .then(r => r?.stats || []) } -export async function getCountries(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest<{ countries: CountryStat[] }>(`/sites/${siteId}/countries?${params.toString()}`).then(r => r?.countries || []) +// ─── Public Campaigns ─────────────────────────────────────────────── + +export function getPublicCampaigns(siteId: string, startDate?: string, endDate?: string, limit = 10, auth?: AuthParams): Promise { + return apiRequest<{ campaigns: CampaignStat[] }>(`/public/sites/${siteId}/campaigns${buildQuery({ startDate, endDate, limit }, auth)}`) + .then(r => r?.campaigns || []) } -export async function getCities(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest<{ cities: CityStat[] }>(`/sites/${siteId}/cities?${params.toString()}`).then(r => r?.cities || []) -} +// ─── Performance By Page ──────────────────────────────────────────── -export async function getRegions(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest<{ regions: RegionStat[] }>(`/sites/${siteId}/regions?${params.toString()}`).then(r => r?.regions || []) -} - -export async function getBrowsers(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest<{ browsers: BrowserStat[] }>(`/sites/${siteId}/browsers?${params.toString()}`).then(r => r?.browsers || []) -} - -export async function getOS(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest<{ os: OSStat[] }>(`/sites/${siteId}/os?${params.toString()}`).then(r => r?.os || []) -} - -export async function getDevices(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest<{ devices: DeviceStat[] }>(`/sites/${siteId}/devices?${params.toString()}`).then(r => r?.devices || []) -} - -export async function getDailyStats(siteId: string, startDate?: string, endDate?: string, interval?: string): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - if (interval) params.append('interval', interval) - return apiRequest<{ stats: DailyStat[] }>(`/sites/${siteId}/daily?${params.toString()}`).then(r => r?.stats || []) -} - -export async function getPublicDailyStats(siteId: string, startDate?: string, endDate?: string, interval?: string, auth?: AuthParams): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - if (interval) params.append('interval', interval) - appendAuthParams(params, auth) - return apiRequest<{ stats: DailyStat[] }>(`/public/sites/${siteId}/daily?${params.toString()}`).then(r => r?.stats || []) -} - -export async function getEntryPages(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest<{ pages: TopPage[] }>(`/sites/${siteId}/entry-pages?${params.toString()}`).then(r => r?.pages || []) -} - -export async function getExitPages(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest<{ pages: TopPage[] }>(`/sites/${siteId}/exit-pages?${params.toString()}`).then(r => r?.pages || []) -} - -export async function getScreenResolutions(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest<{ screen_resolutions: ScreenResolutionStat[] }>(`/sites/${siteId}/screen-resolutions?${params.toString()}`).then(r => r?.screen_resolutions || []) -} - -export async function getPerformanceByPage( +export function getPerformanceByPage( siteId: string, startDate?: string, endDate?: string, opts?: { limit?: number; sort?: 'lcp' | 'cls' | 'inp' } ): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - if (opts?.limit != null) params.append('limit', String(opts.limit)) - if (opts?.sort) params.append('sort', opts.sort) - const res = await apiRequest<{ performance_by_page: PerformanceByPageStat[] }>( - `/sites/${siteId}/performance-by-page?${params.toString()}` - ) - return res?.performance_by_page ?? [] + return apiRequest<{ performance_by_page: PerformanceByPageStat[] }>( + `/sites/${siteId}/performance-by-page${buildQuery({ startDate, endDate, limit: opts?.limit, sort: opts?.sort })}` + ).then(r => r?.performance_by_page ?? []) } -export async function getPublicPerformanceByPage( +export function getPublicPerformanceByPage( siteId: string, startDate?: string, endDate?: string, opts?: { limit?: number; sort?: 'lcp' | 'cls' | 'inp' }, auth?: AuthParams ): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - if (opts?.limit != null) params.append('limit', String(opts.limit)) - if (opts?.sort) params.append('sort', opts.sort) - appendAuthParams(params, auth) - const res = await apiRequest<{ performance_by_page: PerformanceByPageStat[] }>( - `/public/sites/${siteId}/performance-by-page?${params.toString()}` - ) - return res?.performance_by_page ?? [] + return apiRequest<{ performance_by_page: PerformanceByPageStat[] }>( + `/public/sites/${siteId}/performance-by-page${buildQuery({ startDate, endDate, limit: opts?.limit, sort: opts?.sort }, auth)}` + ).then(r => r?.performance_by_page ?? []) } -export async function getGoalStats(siteId: string, startDate?: string, endDate?: string, limit = 20): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest<{ goal_counts: GoalCountStat[] }>(`/sites/${siteId}/goals/stats?${params.toString()}`).then(r => r?.goal_counts || []) -} - -export async function getCampaigns(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest<{ campaigns: CampaignStat[] }>(`/sites/${siteId}/campaigns?${params.toString()}`).then(r => r?.campaigns || []) -} - -export async function getPublicCampaigns(siteId: string, startDate?: string, endDate?: string, limit = 10, auth?: AuthParams): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - appendAuthParams(params, auth) - return apiRequest<{ campaigns: CampaignStat[] }>(`/public/sites/${siteId}/campaigns?${params.toString()}`).then(r => r?.campaigns || []) -} +// ─── Full Dashboard ───────────────────────────────────────────────── export interface DashboardData { site: Site @@ -322,16 +243,11 @@ export interface DashboardData { goal_counts?: GoalCountStat[] } -export async function getDashboard(siteId: string, startDate?: string, endDate?: string, limit = 10, interval?: string): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - if (interval) params.append('interval', interval) - params.append('limit', limit.toString()) - return apiRequest(`/sites/${siteId}/dashboard?${params.toString()}`) +export function getDashboard(siteId: string, startDate?: string, endDate?: string, limit = 10, interval?: string): Promise { + return apiRequest(`/sites/${siteId}/dashboard${buildQuery({ startDate, endDate, limit, interval })}`) } -export async function getPublicDashboard( +export function getPublicDashboard( siteId: string, startDate?: string, endDate?: string, @@ -340,21 +256,12 @@ export async function getPublicDashboard( password?: string, captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } ): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - if (interval) params.append('interval', interval) - - appendAuthParams(params, { password, captcha }) - - params.append('limit', limit.toString()) - return apiRequest(`/public/sites/${siteId}/dashboard?${params.toString()}`) + return apiRequest( + `/public/sites/${siteId}/dashboard${buildQuery({ startDate, endDate, limit, interval }, { password, captcha })}` + ) } -// * ============================================================================ -// * Focused Dashboard Endpoints (Fix 4.2: Efficient Data Transfer) -// * These split the massive dashboard payload into smaller, focused chunks -// * ============================================================================ +// ─── Focused Dashboard Endpoints ──────────────────────────────────── export interface DashboardOverviewData { site: Site @@ -363,109 +270,18 @@ export interface DashboardOverviewData { daily_stats: DailyStat[] } -export async function getDashboardOverview( - siteId: string, - startDate?: string, - endDate?: string, - interval?: string -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - if (interval) params.append('interval', interval) - return apiRequest(`/sites/${siteId}/dashboard/overview?${params.toString()}`) -} - -export async function getPublicDashboardOverview( - siteId: string, - startDate?: string, - endDate?: string, - interval?: string, - password?: string, - captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - if (interval) params.append('interval', interval) - appendAuthParams(params, { password, captcha }) - return apiRequest(`/public/sites/${siteId}/dashboard/overview?${params.toString()}`) -} - export interface DashboardPagesData { top_pages: TopPage[] entry_pages: TopPage[] exit_pages: TopPage[] } -export async function getDashboardPages( - siteId: string, - startDate?: string, - endDate?: string, - limit = 10 -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest(`/sites/${siteId}/dashboard/pages?${params.toString()}`) -} - -export async function getPublicDashboardPages( - siteId: string, - startDate?: string, - endDate?: string, - limit = 10, - password?: string, - captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - appendAuthParams(params, { password, captcha }) - return apiRequest(`/public/sites/${siteId}/dashboard/pages?${params.toString()}`) -} - export interface DashboardLocationsData { countries: CountryStat[] cities: CityStat[] regions: RegionStat[] } -export async function getDashboardLocations( - siteId: string, - startDate?: string, - endDate?: string, - limit = 10, - countryLimit = 250 -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - params.append('country_limit', countryLimit.toString()) - return apiRequest(`/sites/${siteId}/dashboard/locations?${params.toString()}`) -} - -export async function getPublicDashboardLocations( - siteId: string, - startDate?: string, - endDate?: string, - limit = 10, - countryLimit = 250, - password?: string, - captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - params.append('country_limit', countryLimit.toString()) - appendAuthParams(params, { password, captcha }) - return apiRequest(`/public/sites/${siteId}/dashboard/locations?${params.toString()}`) -} - export interface DashboardDevicesData { browsers: BrowserStat[] os: OSStat[] @@ -473,127 +289,92 @@ export interface DashboardDevicesData { screen_resolutions: ScreenResolutionStat[] } -export async function getDashboardDevices( - siteId: string, - startDate?: string, - endDate?: string, - limit = 10 -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest(`/sites/${siteId}/dashboard/devices?${params.toString()}`) -} - -export async function getPublicDashboardDevices( - siteId: string, - startDate?: string, - endDate?: string, - limit = 10, - password?: string, - captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - appendAuthParams(params, { password, captcha }) - return apiRequest(`/public/sites/${siteId}/dashboard/devices?${params.toString()}`) -} - export interface DashboardReferrersData { top_referrers: TopReferrer[] } -export async function getDashboardReferrers( - siteId: string, - startDate?: string, - endDate?: string, - limit = 10 -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest(`/sites/${siteId}/dashboard/referrers?${params.toString()}`) -} - -export async function getPublicDashboardReferrers( - siteId: string, - startDate?: string, - endDate?: string, - limit = 10, - password?: string, - captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - appendAuthParams(params, { password, captcha }) - return apiRequest(`/public/sites/${siteId}/dashboard/referrers?${params.toString()}`) -} - export interface DashboardPerformanceData { performance?: PerformanceStats performance_by_page?: PerformanceByPageStat[] } -export async function getDashboardPerformance( - siteId: string, - startDate?: string, - endDate?: string -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - return apiRequest(`/sites/${siteId}/dashboard/performance?${params.toString()}`) -} - -export async function getPublicDashboardPerformance( - siteId: string, - startDate?: string, - endDate?: string, - password?: string, - captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - appendAuthParams(params, { password, captcha }) - return apiRequest(`/public/sites/${siteId}/dashboard/performance?${params.toString()}`) -} - export interface DashboardGoalsData { goal_counts: GoalCountStat[] } -export async function getDashboardGoals( - siteId: string, - startDate?: string, - endDate?: string, - limit = 10 -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - return apiRequest(`/sites/${siteId}/dashboard/goals?${params.toString()}`) +export function getDashboardOverview(siteId: string, startDate?: string, endDate?: string, interval?: string): Promise { + return apiRequest(`/sites/${siteId}/dashboard/overview${buildQuery({ startDate, endDate, interval })}`) } -export async function getPublicDashboardGoals( - siteId: string, - startDate?: string, - endDate?: string, - limit = 10, - password?: string, - captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } -): Promise { - const params = new URLSearchParams() - if (startDate) params.append('start_date', startDate) - if (endDate) params.append('end_date', endDate) - params.append('limit', limit.toString()) - appendAuthParams(params, { password, captcha }) - return apiRequest(`/public/sites/${siteId}/dashboard/goals?${params.toString()}`) +export function getPublicDashboardOverview( + siteId: string, startDate?: string, endDate?: string, interval?: string, + password?: string, captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } +): Promise { + return apiRequest(`/public/sites/${siteId}/dashboard/overview${buildQuery({ startDate, endDate, interval }, { password, captcha })}`) +} + +export function getDashboardPages(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { + return apiRequest(`/sites/${siteId}/dashboard/pages${buildQuery({ startDate, endDate, limit })}`) +} + +export function getPublicDashboardPages( + siteId: string, startDate?: string, endDate?: string, limit = 10, + password?: string, captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } +): Promise { + return apiRequest(`/public/sites/${siteId}/dashboard/pages${buildQuery({ startDate, endDate, limit }, { password, captcha })}`) +} + +export function getDashboardLocations(siteId: string, startDate?: string, endDate?: string, limit = 10, countryLimit = 250): Promise { + return apiRequest(`/sites/${siteId}/dashboard/locations${buildQuery({ startDate, endDate, limit, countryLimit })}`) +} + +export function getPublicDashboardLocations( + siteId: string, startDate?: string, endDate?: string, limit = 10, countryLimit = 250, + password?: string, captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } +): Promise { + return apiRequest(`/public/sites/${siteId}/dashboard/locations${buildQuery({ startDate, endDate, limit, countryLimit }, { password, captcha })}`) +} + +export function getDashboardDevices(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { + return apiRequest(`/sites/${siteId}/dashboard/devices${buildQuery({ startDate, endDate, limit })}`) +} + +export function getPublicDashboardDevices( + siteId: string, startDate?: string, endDate?: string, limit = 10, + password?: string, captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } +): Promise { + return apiRequest(`/public/sites/${siteId}/dashboard/devices${buildQuery({ startDate, endDate, limit }, { password, captcha })}`) +} + +export function getDashboardReferrers(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { + return apiRequest(`/sites/${siteId}/dashboard/referrers${buildQuery({ startDate, endDate, limit })}`) +} + +export function getPublicDashboardReferrers( + siteId: string, startDate?: string, endDate?: string, limit = 10, + password?: string, captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } +): Promise { + return apiRequest(`/public/sites/${siteId}/dashboard/referrers${buildQuery({ startDate, endDate, limit }, { password, captcha })}`) +} + +export function getDashboardPerformance(siteId: string, startDate?: string, endDate?: string): Promise { + return apiRequest(`/sites/${siteId}/dashboard/performance${buildQuery({ startDate, endDate })}`) +} + +export function getPublicDashboardPerformance( + siteId: string, startDate?: string, endDate?: string, + password?: string, captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } +): Promise { + return apiRequest(`/public/sites/${siteId}/dashboard/performance${buildQuery({ startDate, endDate }, { password, captcha })}`) +} + +export function getDashboardGoals(siteId: string, startDate?: string, endDate?: string, limit = 10): Promise { + return apiRequest(`/sites/${siteId}/dashboard/goals${buildQuery({ startDate, endDate, limit })}`) +} + +export function getPublicDashboardGoals( + siteId: string, startDate?: string, endDate?: string, limit = 10, + password?: string, captcha?: { captcha_id?: string, captcha_solution?: string, captcha_token?: string } +): Promise { + return apiRequest(`/public/sites/${siteId}/dashboard/goals${buildQuery({ startDate, endDate, limit }, { password, captcha })}`) }