Skip to content

Commit 162ae35

Browse files
committed
Refactor: simple usage summary using /executions/summary backend API
1 parent aeef685 commit 162ae35

13 files changed

Lines changed: 327 additions & 169 deletions

File tree

app/common/src/services/Backend.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,6 +1328,29 @@ export interface ListExecutionsRequestParams {
13281328
readonly lastExecutionId?: ProjectExecutionId | null
13291329
}
13301330

1331+
/** URL query string parameters for the "list execution usage summary" endpoint. */
1332+
export interface ListExecutionsSummaryRequestParams {
1333+
readonly month?: string | null | undefined
1334+
}
1335+
1336+
export interface ExecutionUsageSummaryProject {
1337+
readonly projectId: ProjectId
1338+
readonly name: string | null
1339+
}
1340+
1341+
export interface ExecutionUsageSummaryUser {
1342+
readonly name: string | null
1343+
readonly email: EmailAddress | null
1344+
}
1345+
1346+
export interface ExecutionUsageSummary {
1347+
readonly project: ExecutionUsageSummaryProject
1348+
readonly user: ExecutionUsageSummaryUser
1349+
readonly totalSessions: number
1350+
readonly totalUptimeSeconds: number
1351+
readonly averageUptimeSeconds: number
1352+
}
1353+
13311354
export type AssetSortExpression = 'asset_id_discriminator_and_modified_at' | 'modified_at' | 'title'
13321355

13331356
export type AssetSortDirection = 'ascending' | 'descending'
@@ -1894,6 +1917,10 @@ export abstract class Backend {
18941917
): Promise<readonly ProjectExecution[]>
18951918
/** Return a list of executions for an organization (if admin) or a user. */
18961919
abstract listExecutions(params: ListExecutionsRequestParams): Promise<readonly ProjectExecution[]>
1920+
/** Return usage summary rows for an organization (if admin) or a user. */
1921+
abstract listExecutionsSummary(
1922+
params: ListExecutionsSummaryRequestParams,
1923+
): Promise<readonly ExecutionUsageSummary[]>
18971924
abstract syncProjectExecution(
18981925
executionId: ProjectExecutionId,
18991926
projectTitle: string,

app/common/src/services/Backend/remoteBackendPaths.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ export const LIST_API_KEYS_PATH = 'credentials'
103103
export const CREATE_API_KEY_PATH = 'credentials'
104104
/** Relative HTTP path to the "create API key" endpoint of the Cloud backend API. */
105105
export const LIST_EXECUTIONS_PATH = 'executions'
106+
/** Relative HTTP path to the "list execution usage summary" endpoint of the Cloud backend API. */
107+
export const LIST_EXECUTIONS_SUMMARY_PATH = 'executions/summary'
106108
/** Relative HTTP path to the "delete API key" endpoint of the Cloud backend API. */
107109
export function deleteApiKeyPath(apiKeyId: ApiKeyId) {
108110
return `credentials/${apiKeyId}`

app/common/src/services/LocalBackend.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,6 +1011,11 @@ export class LocalBackend extends backend.Backend {
10111011
return this.invalidOperation()
10121012
}
10131013

1014+
/** Invalid operation. */
1015+
override listExecutionsSummary() {
1016+
return this.invalidOperation()
1017+
}
1018+
10141019
/** Invalid operation. */
10151020
override syncProjectExecution() {
10161021
return this.invalidOperation()

app/common/src/services/RemoteBackend.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -749,10 +749,12 @@ export class RemoteBackend extends backend.Backend {
749749
* Return a list of executions for an organization (if called by an admin) or a request user.
750750
* @throws An error if a non-successful status code (not 200-299) was received.
751751
*/
752-
override async listExecutions(params: backend.ListExecutionsRequestParams): Promise<readonly backend.ProjectExecution[]> {
752+
override async listExecutions(
753+
params: backend.ListExecutionsRequestParams,
754+
): Promise<readonly backend.ProjectExecution[]> {
753755
const paramsString = new URLSearchParams({
754756
/* eslint-disable camelcase */
755-
...(params.lastExecutionId != null ? { last_execution_id: params.lastExecutionId } : {})
757+
...(params.lastExecutionId != null ? { last_execution_id: params.lastExecutionId } : {}),
756758
/* eslint-enable camelcase */
757759
}).toString()
758760
const path = `${remoteBackendPaths.LIST_EXECUTIONS_PATH}?${paramsString}`
@@ -764,6 +766,24 @@ export class RemoteBackend extends backend.Backend {
764766
}
765767
}
766768

769+
/**
770+
* Return usage summary rows for an organization (if admin) or a user.
771+
* @throws An error if a non-successful status code (not 200-299) was received.
772+
*/
773+
override async listExecutionsSummary(
774+
params: backend.ListExecutionsSummaryRequestParams,
775+
): Promise<readonly backend.ExecutionUsageSummary[]> {
776+
const response = await this.get<readonly backend.ExecutionUsageSummary[]>(
777+
remoteBackendPaths.LIST_EXECUTIONS_SUMMARY_PATH,
778+
params.month != null ? { month: params.month } : undefined,
779+
)
780+
if (!response.ok) {
781+
return await this.throw(response, 'listExecutionsSummaryBackendError')
782+
} else {
783+
return await response.json()
784+
}
785+
}
786+
767787
/**
768788
* Return a list of executions for a project.
769789
* @throws An error if a non-successful status code (not 200-299) was received.

app/common/src/text/english.json

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@
152152
"deleteProjectExecutionBackendError": "Could not delete project execution for project '$0'",
153153
"listProjectExecutionsBackendError": "Could not list project executions for project '$0'",
154154
"listExecutionsBackendError": "Could not list executions",
155+
"listExecutionsSummaryBackendError": "Could not list usage summary",
155156
"syncProjectExecutionBackendError": "Could not sync project execution of project '$0'",
156157
"getProjectDetailsBackendError": "Could not get details of project",
157158
"getProjectLogsBackendError": "Could not get logs for project '$0'",
@@ -1071,15 +1072,25 @@
10711072
"keyboardShortcutsSettingsSection": "Keyboard Shortcuts",
10721073
"keyboardShortcutsSettingsCustomEntryAliases": "keyboard shortcuts",
10731074
"securitySettingsTabSection": "Security",
1074-
"financesSettingsTabSection": "Finances",
1075+
"usageSettingsTabSection": "Usage",
10751076
"activityLogSettingsTab": "Activity log",
10761077
"activityLogSettingsSection": "Activity Log",
10771078
"apiKeysSettingsTab": "API Keys",
1078-
"financesSettingsTab": "Finances",
1079+
"usageSettingsTab": "Usage",
10791080
"apiKeysSettingsSection": "API Keys",
1080-
"financesSettingsSection": "Finances",
1081+
"usageSettingsSection": "Usage Summary",
10811082
"apiKeysSettingsCustomEntryAliases": "api keys\napi key",
1082-
"financesSettingsCustomEntryAliases": "Finances",
1083+
"usageSettingsCustomEntryAliases": "usage\nusage summary",
1084+
"executionSummaryMonthLabel": "Month",
1085+
"executionSummaryUserColumn": "User",
1086+
"executionSummaryProjectColumn": "Project",
1087+
"executionSummaryCountOfExecutionsColumn": "Count of executions",
1088+
"executionSummaryTotalUptimeColumn": "Total uptime",
1089+
"executionSummaryAverageUptimeColumn": "Average uptime",
1090+
"executionSummaryLoading": "Loading usage summary...",
1091+
"executionSummaryEmpty": "No usage found for selected month.",
1092+
"executionSummaryUnknownUser": "Unknown user",
1093+
"executionSummaryUnknownProject": "Unknown project",
10831094
"free": "Community",
10841095
"freePlan": "Community Plan",
10851096
"solo": "Solo",

app/gui/src/dashboard/layouts/Settings/FinancesSettingsSection.tsx

Lines changed: 0 additions & 145 deletions
This file was deleted.

app/gui/src/dashboard/layouts/Settings/TabType.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ enum SettingsTabType {
1818
// compliance = 'compliance',
1919
// usageStatistics = 'usage-statistics',
2020
apiKeys = 'api-keys',
21-
finances = 'finances',
21+
usage = 'usage',
2222
}
2323

2424
export default SettingsTabType

0 commit comments

Comments
 (0)