From 9f655913b1ef1a85278968b5887acc38749030b3 Mon Sep 17 00:00:00 2001 From: Felipe Cardoso Date: Mon, 24 Nov 2025 16:28:59 +0100 Subject: [PATCH] Add `adminGetStats` API and extend statistics types for admin dashboard - Introduced `adminGetStats` API endpoint for fetching aggregated admin dashboard statistics. - Expanded `AdminStatsResponse` to include `registration_activity` and new type definitions for `UserGrowthData`, `OrgDistributionData`, and `UserStatusData`. - Added `AdminGetStatsData` and `AdminGetStatsResponses` types to improve API integration consistency. - Updated client generation and type annotations to support the new endpoint structure. --- frontend/src/lib/api/admin.ts | 6 ++ frontend/src/lib/api/generated/sdk.gen.ts | 21 +++- frontend/src/lib/api/generated/types.gen.ts | 112 ++++++++++++++++++++ 3 files changed, 138 insertions(+), 1 deletion(-) diff --git a/frontend/src/lib/api/admin.ts b/frontend/src/lib/api/admin.ts index 01a2c3a..29ddf65 100644 --- a/frontend/src/lib/api/admin.ts +++ b/frontend/src/lib/api/admin.ts @@ -12,6 +12,11 @@ export interface OrgDistributionData { value: number; } +export interface RegistrationActivityData { + date: string; + registrations: number; +} + export interface UserStatusData { name: string; value: number; @@ -20,6 +25,7 @@ export interface UserStatusData { export interface AdminStatsResponse { user_growth: UserGrowthData[]; organization_distribution: OrgDistributionData[]; + registration_activity: RegistrationActivityData[]; user_status: UserStatusData[]; } diff --git a/frontend/src/lib/api/generated/sdk.gen.ts b/frontend/src/lib/api/generated/sdk.gen.ts index 81508fa..24ae482 100644 --- a/frontend/src/lib/api/generated/sdk.gen.ts +++ b/frontend/src/lib/api/generated/sdk.gen.ts @@ -3,7 +3,7 @@ import { type Client, type Options as Options2, type TDataShape, urlSearchParamsBodySerializer } from './client'; import { client } from './client.gen'; -import type { AdminActivateUserData, AdminActivateUserErrors, AdminActivateUserResponses, AdminAddOrganizationMemberData, AdminAddOrganizationMemberErrors, AdminAddOrganizationMemberResponses, AdminBulkUserActionData, AdminBulkUserActionErrors, AdminBulkUserActionResponses, AdminCreateOrganizationData, AdminCreateOrganizationErrors, AdminCreateOrganizationResponses, AdminCreateUserData, AdminCreateUserErrors, AdminCreateUserResponses, AdminDeactivateUserData, AdminDeactivateUserErrors, AdminDeactivateUserResponses, AdminDeleteOrganizationData, AdminDeleteOrganizationErrors, AdminDeleteOrganizationResponses, AdminDeleteUserData, AdminDeleteUserErrors, AdminDeleteUserResponses, AdminGetOrganizationData, AdminGetOrganizationErrors, AdminGetOrganizationResponses, AdminGetUserData, AdminGetUserErrors, AdminGetUserResponses, AdminListOrganizationMembersData, AdminListOrganizationMembersErrors, AdminListOrganizationMembersResponses, AdminListOrganizationsData, AdminListOrganizationsErrors, AdminListOrganizationsResponses, AdminListSessionsData, AdminListSessionsErrors, AdminListSessionsResponses, AdminListUsersData, AdminListUsersErrors, AdminListUsersResponses, AdminRemoveOrganizationMemberData, AdminRemoveOrganizationMemberErrors, AdminRemoveOrganizationMemberResponses, AdminUpdateOrganizationData, AdminUpdateOrganizationErrors, AdminUpdateOrganizationResponses, AdminUpdateUserData, AdminUpdateUserErrors, AdminUpdateUserResponses, ChangeCurrentUserPasswordData, ChangeCurrentUserPasswordErrors, ChangeCurrentUserPasswordResponses, CleanupExpiredSessionsData, CleanupExpiredSessionsResponses, ConfirmPasswordResetData, ConfirmPasswordResetErrors, ConfirmPasswordResetResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponses, GetCurrentUserProfileData, GetCurrentUserProfileResponses, GetMyOrganizationsData, GetMyOrganizationsErrors, GetMyOrganizationsResponses, GetOrganizationData, GetOrganizationErrors, GetOrganizationMembersData, GetOrganizationMembersErrors, GetOrganizationMembersResponses, GetOrganizationResponses, GetUserByIdData, GetUserByIdErrors, GetUserByIdResponses, HealthCheckData, HealthCheckResponses, ListMySessionsData, ListMySessionsResponses, ListUsersData, ListUsersErrors, ListUsersResponses, LoginData, LoginErrors, LoginOauthData, LoginOauthErrors, LoginOauthResponses, LoginResponses, LogoutAllData, LogoutAllResponses, LogoutData, LogoutErrors, LogoutResponses, RefreshTokenData, RefreshTokenErrors, RefreshTokenResponses, RegisterData, RegisterErrors, RegisterResponses, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponses, RevokeSessionData, RevokeSessionErrors, RevokeSessionResponses, RootGetData, RootGetResponses, UpdateCurrentUserData, UpdateCurrentUserErrors, UpdateCurrentUserResponses, UpdateOrganizationData, UpdateOrganizationErrors, UpdateOrganizationResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses } from './types.gen'; +import type { AdminActivateUserData, AdminActivateUserErrors, AdminActivateUserResponses, AdminAddOrganizationMemberData, AdminAddOrganizationMemberErrors, AdminAddOrganizationMemberResponses, AdminBulkUserActionData, AdminBulkUserActionErrors, AdminBulkUserActionResponses, AdminCreateOrganizationData, AdminCreateOrganizationErrors, AdminCreateOrganizationResponses, AdminCreateUserData, AdminCreateUserErrors, AdminCreateUserResponses, AdminDeactivateUserData, AdminDeactivateUserErrors, AdminDeactivateUserResponses, AdminDeleteOrganizationData, AdminDeleteOrganizationErrors, AdminDeleteOrganizationResponses, AdminDeleteUserData, AdminDeleteUserErrors, AdminDeleteUserResponses, AdminGetOrganizationData, AdminGetOrganizationErrors, AdminGetOrganizationResponses, AdminGetStatsData, AdminGetStatsResponses, AdminGetUserData, AdminGetUserErrors, AdminGetUserResponses, AdminListOrganizationMembersData, AdminListOrganizationMembersErrors, AdminListOrganizationMembersResponses, AdminListOrganizationsData, AdminListOrganizationsErrors, AdminListOrganizationsResponses, AdminListSessionsData, AdminListSessionsErrors, AdminListSessionsResponses, AdminListUsersData, AdminListUsersErrors, AdminListUsersResponses, AdminRemoveOrganizationMemberData, AdminRemoveOrganizationMemberErrors, AdminRemoveOrganizationMemberResponses, AdminUpdateOrganizationData, AdminUpdateOrganizationErrors, AdminUpdateOrganizationResponses, AdminUpdateUserData, AdminUpdateUserErrors, AdminUpdateUserResponses, ChangeCurrentUserPasswordData, ChangeCurrentUserPasswordErrors, ChangeCurrentUserPasswordResponses, CleanupExpiredSessionsData, CleanupExpiredSessionsResponses, ConfirmPasswordResetData, ConfirmPasswordResetErrors, ConfirmPasswordResetResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponses, GetCurrentUserProfileData, GetCurrentUserProfileResponses, GetMyOrganizationsData, GetMyOrganizationsErrors, GetMyOrganizationsResponses, GetOrganizationData, GetOrganizationErrors, GetOrganizationMembersData, GetOrganizationMembersErrors, GetOrganizationMembersResponses, GetOrganizationResponses, GetUserByIdData, GetUserByIdErrors, GetUserByIdResponses, HealthCheckData, HealthCheckResponses, ListMySessionsData, ListMySessionsResponses, ListUsersData, ListUsersErrors, ListUsersResponses, LoginData, LoginErrors, LoginOauthData, LoginOauthErrors, LoginOauthResponses, LoginResponses, LogoutAllData, LogoutAllResponses, LogoutData, LogoutErrors, LogoutResponses, RefreshTokenData, RefreshTokenErrors, RefreshTokenResponses, RegisterData, RegisterErrors, RegisterResponses, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponses, RevokeSessionData, RevokeSessionErrors, RevokeSessionResponses, RootGetData, RootGetResponses, UpdateCurrentUserData, UpdateCurrentUserErrors, UpdateCurrentUserResponses, UpdateOrganizationData, UpdateOrganizationErrors, UpdateOrganizationResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses } from './types.gen'; export type Options = Options2 & { /** @@ -484,6 +484,25 @@ export const cleanupExpiredSessions = (opt }); }; +/** + * Admin: Get Dashboard Stats + * + * Get aggregated statistics for the admin dashboard (admin only) + */ +export const adminGetStats = (options?: Options) => { + return (options?.client ?? client).get({ + responseType: 'json', + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/api/v1/admin/stats', + ...options + }); +}; + /** * Admin: List All Users * diff --git a/frontend/src/lib/api/generated/types.gen.ts b/frontend/src/lib/api/generated/types.gen.ts index 19d77a3..98630e3 100644 --- a/frontend/src/lib/api/generated/types.gen.ts +++ b/frontend/src/lib/api/generated/types.gen.ts @@ -93,6 +93,28 @@ export type AdminSessionResponse = { is_active: boolean; }; +/** + * AdminStatsResponse + */ +export type AdminStatsResponse = { + /** + * User Growth + */ + user_growth: Array; + /** + * Organization Distribution + */ + organization_distribution: Array; + /** + * Registration Activity + */ + registration_activity: Array; + /** + * User Status + */ + user_status: Array; +}; + /** * Body_login_oauth */ @@ -234,6 +256,20 @@ export type MessageResponse = { message: string; }; +/** + * OrgDistributionData + */ +export type OrgDistributionData = { + /** + * Name + */ + name: string; + /** + * Value + */ + value: number; +}; + /** * OrganizationCreate * @@ -550,6 +586,20 @@ export type RefreshTokenRequest = { refresh_token: string; }; +/** + * RegistrationActivityData + */ +export type RegistrationActivityData = { + /** + * Date + */ + date: string; + /** + * Registrations + */ + registrations: number; +}; + /** * SessionListResponse * @@ -682,6 +732,28 @@ export type UserCreate = { * Is Superuser */ is_superuser?: boolean; + /** + * Is Active + */ + is_active?: boolean; +}; + +/** + * UserGrowthData + */ +export type UserGrowthData = { + /** + * Date + */ + date: string; + /** + * Total Users + */ + total_users: number; + /** + * Active Users + */ + active_users: number; }; /** @@ -724,6 +796,24 @@ export type UserResponse = { * Updated At */ updated_at?: string | null; + /** + * Locale + */ + locale?: string | null; +}; + +/** + * UserStatusData + */ +export type UserStatusData = { + /** + * Name + */ + name: string; + /** + * Value + */ + value: number; }; /** @@ -752,6 +842,12 @@ export type UserUpdate = { preferences?: { [key: string]: unknown; } | null; + /** + * Locale + * + * User's preferred locale (BCP 47 format: en, it, en-US, it-IT) + */ + locale?: string | null; /** * Is Active */ @@ -1270,6 +1366,22 @@ export type CleanupExpiredSessionsResponses = { export type CleanupExpiredSessionsResponse = CleanupExpiredSessionsResponses[keyof CleanupExpiredSessionsResponses]; +export type AdminGetStatsData = { + body?: never; + path?: never; + query?: never; + url: '/api/v1/admin/stats'; +}; + +export type AdminGetStatsResponses = { + /** + * Successful Response + */ + 200: AdminStatsResponse; +}; + +export type AdminGetStatsResponse = AdminGetStatsResponses[keyof AdminGetStatsResponses]; + export type AdminListUsersData = { body?: never; path?: never;