From 21282baed130426febab2264efa7275ceec9bb59 Mon Sep 17 00:00:00 2001 From: Jerod Fritz Date: Sat, 27 Dec 2025 21:40:14 -0500 Subject: [PATCH 1/6] move updatedScriptAvailable to AppInfoDetailed from AppInfo --- eshtek/apps.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eshtek/apps.ts b/eshtek/apps.ts index 87ab391..ee3d768 100644 --- a/eshtek/apps.ts +++ b/eshtek/apps.ts @@ -89,11 +89,11 @@ export interface AppInfo extends AppBasics { status: AppState; url_webui: string; upgradeAvailable: boolean; - updatedScriptAvailable: boolean; latestVersion: string; recommended: boolean; } export interface AppInfoDetailed extends AppInfo { + updatedScriptAvailable: boolean; data: number[][]; } From b39790fae24ca3522ab757ebadf071da4619fbae Mon Sep 17 00:00:00 2001 From: Jerod Fritz Date: Tue, 6 Jan 2026 21:32:50 -0500 Subject: [PATCH 2/6] wip : events stats interfaces for admin portal --- eshtek/events.ts | 135 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/eshtek/events.ts b/eshtek/events.ts index 1bd9788..3bf43d8 100644 --- a/eshtek/events.ts +++ b/eshtek/events.ts @@ -68,4 +68,139 @@ export interface AppPopularityMetrics { upgradeCount: number; failureCount: number; lastInstalled: Date; +} + +export enum EventsStatsCategory { + TASKS = 'tasks', + USERS = 'users', + APPS = 'apps', + SERVERS = 'servers', + DRIVES = 'drives', + POOLS = 'pools', + FOLDERS = 'folders', + TIMELINE = 'timeline', + ERRORS = 'errors', +} + +export interface EventTaskStats { + taskType: string; + total: number; + completed: number; + failed: number; + successRate: number; + avgDurationSeconds: number | null; +} + +export interface EventUserActivity { + userId: string; + totalEvents: number; + lastLogin: string | null; + tasksInitiated: number; + appActions: number; + failures: number; +} + +export interface EventAppLifecycle { + appId: string; + discovered: number; + installAttempts: number; + installSuccesses: number; + installFailures: number; + upgradeAttempts: number; + upgradeSuccesses: number; + uninstalls: number; + lastActivity: string; +} + +export interface EventServerActivity { + hostId: string; + connections: number; + disconnections: number; + totalEvents: number; + lastConnection: string | null; +} + +export interface EventTimeline { + timestamp: string; + eventCount: number; + failures: number; +} + +export interface EventErrorPattern { + taskType: string | null; + errorMessage: string; + occurrences: number; + lastOccurrence: string; +} + +export interface EventDriveActivity { + driveSerial: string; + driveModel: string | null; + discovered: number; + utilized: number; + replaced: number; + removed: number; + failed: number; + healthy: number; + lastActivity: string; +} + +export interface EventPoolActivity { + poolName: string; + poolId: number | null; + creates: number; + updates: number; + deletes: number; + totalEvents: number; + lastActivity: string; +} + +export interface EventFolderActivity { + folderName: string; + creates: number; + updates: number; + deletes: number; + locks: number; + unlocks: number; + totalEvents: number; + lastActivity: string; +} + +export type EventsStatsData = + | EventTaskStats + | EventUserActivity + | EventAppLifecycle + | EventServerActivity + | EventTimeline + | EventErrorPattern + | EventDriveActivity + | EventPoolActivity + | EventFolderActivity; + +export type TimelineGroupBy = 'hour' | 'day'; + +export interface EventsListParams { + page?: number; + pageSize?: number; + eventName?: string | string[]; + userId?: string; + hostId?: string; + taskType?: string; + taskStatus?: string; + appId?: string; + startDate?: string; + endDate?: string; +} + +export interface EventsStatsParams { + type: EventsStatsCategory; + days?: number; + groupBy?: TimelineGroupBy; + userId?: string; + hostId?: string; + taskType?: string; + taskStatus?: string; + appId?: string; + startDate?: string; + endDate?: string; } \ No newline at end of file From 252177ee4c89a780bb7b4ebe75bd700ece130001 Mon Sep 17 00:00:00 2001 From: Jerod Fritz Date: Tue, 6 Jan 2026 22:28:32 -0500 Subject: [PATCH 3/6] additional meta on pagination --- eshtek/events.ts | 1 - eshtek/routes.ts | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/eshtek/events.ts b/eshtek/events.ts index 3bf43d8..2c63be2 100644 --- a/eshtek/events.ts +++ b/eshtek/events.ts @@ -73,7 +73,6 @@ export interface AppPopularityMetrics { export enum EventsStatsCategory { TASKS = 'tasks', USERS = 'users', - APPS = 'apps', SERVERS = 'servers', DRIVES = 'drives', POOLS = 'pools', diff --git a/eshtek/routes.ts b/eshtek/routes.ts index b13b785..ca0395b 100644 --- a/eshtek/routes.ts +++ b/eshtek/routes.ts @@ -23,6 +23,11 @@ export interface PaginationMeta { page_size: number; } +export interface PaginationMetaUnique extends PaginationMeta { + unique_users: number; + unique_servers: number; +} + export interface PaginationRequest { page: number; page_size: number; From bd30562a0f2befcf826150321c6ed7c54a13ab7d Mon Sep 17 00:00:00 2001 From: Jerod Fritz Date: Wed, 7 Jan 2026 00:14:54 -0500 Subject: [PATCH 4/6] additional app id props added for event listing endpoints --- eshtek/admin.types.ts | 1 + eshtek/events.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/eshtek/admin.types.ts b/eshtek/admin.types.ts index 9b87a03..ddecdbe 100644 --- a/eshtek/admin.types.ts +++ b/eshtek/admin.types.ts @@ -19,6 +19,7 @@ export interface CatalogStatusResponse { */ export interface CatalogApp { id: number; + appId: string; name: string; train: string | null; version: string | null; diff --git a/eshtek/events.ts b/eshtek/events.ts index 2c63be2..3b3c9bb 100644 --- a/eshtek/events.ts +++ b/eshtek/events.ts @@ -187,6 +187,7 @@ export interface EventsListParams { taskType?: string; taskStatus?: string; appId?: string; + appIdRaw?: string; startDate?: string; endDate?: string; } From 35c8317de2d83a30dea6d2e447b63f2aadf6ed80 Mon Sep 17 00:00:00 2001 From: Jerod Fritz Date: Wed, 7 Jan 2026 09:07:59 -0500 Subject: [PATCH 5/6] Remove unnecessary typing that will not be used --- eshtek/events.ts | 73 +----------------------------------------------- 1 file changed, 1 insertion(+), 72 deletions(-) diff --git a/eshtek/events.ts b/eshtek/events.ts index 3b3c9bb..edb505a 100644 --- a/eshtek/events.ts +++ b/eshtek/events.ts @@ -73,12 +73,7 @@ export interface AppPopularityMetrics { export enum EventsStatsCategory { TASKS = 'tasks', USERS = 'users', - SERVERS = 'servers', - DRIVES = 'drives', - POOLS = 'pools', - FOLDERS = 'folders', TIMELINE = 'timeline', - ERRORS = 'errors', } export interface EventTaskStats { @@ -99,82 +94,16 @@ export interface EventUserActivity { failures: number; } -export interface EventAppLifecycle { - appId: string; - discovered: number; - installAttempts: number; - installSuccesses: number; - installFailures: number; - upgradeAttempts: number; - upgradeSuccesses: number; - uninstalls: number; - lastActivity: string; -} - -export interface EventServerActivity { - hostId: string; - connections: number; - disconnections: number; - totalEvents: number; - lastConnection: string | null; -} - export interface EventTimeline { timestamp: string; eventCount: number; failures: number; } -export interface EventErrorPattern { - taskType: string | null; - errorMessage: string; - occurrences: number; - lastOccurrence: string; -} - -export interface EventDriveActivity { - driveSerial: string; - driveModel: string | null; - discovered: number; - utilized: number; - replaced: number; - removed: number; - failed: number; - healthy: number; - lastActivity: string; -} - -export interface EventPoolActivity { - poolName: string; - poolId: number | null; - creates: number; - updates: number; - deletes: number; - totalEvents: number; - lastActivity: string; -} - -export interface EventFolderActivity { - folderName: string; - creates: number; - updates: number; - deletes: number; - locks: number; - unlocks: number; - totalEvents: number; - lastActivity: string; -} - export type EventsStatsData = | EventTaskStats | EventUserActivity - | EventAppLifecycle - | EventServerActivity - | EventTimeline - | EventErrorPattern - | EventDriveActivity - | EventPoolActivity - | EventFolderActivity; + | EventTimeline; export type TimelineGroupBy = 'hour' | 'day'; From d980b2eac7da77a541b2545e75f771746eed7333 Mon Sep 17 00:00:00 2001 From: Jerod Fritz Date: Wed, 7 Jan 2026 16:07:11 -0500 Subject: [PATCH 6/6] Include id prop on EventListParams to fetch a single event --- eshtek/events.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/eshtek/events.ts b/eshtek/events.ts index edb505a..d0a8bc9 100644 --- a/eshtek/events.ts +++ b/eshtek/events.ts @@ -108,6 +108,7 @@ export type EventsStatsData = export type TimelineGroupBy = 'hour' | 'day'; export interface EventsListParams { + id?: number | string; page?: number; pageSize?: number; eventName?: string | string[];