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.
This commit is contained in:
Felipe Cardoso
2025-11-24 16:28:59 +01:00
parent 13abd159fa
commit 9f655913b1
3 changed files with 138 additions and 1 deletions

View File

@@ -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[];
}

View File

@@ -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<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean> = Options2<TData, ThrowOnError> & {
/**
@@ -484,6 +484,25 @@ export const cleanupExpiredSessions = <ThrowOnError extends boolean = false>(opt
});
};
/**
* Admin: Get Dashboard Stats
*
* Get aggregated statistics for the admin dashboard (admin only)
*/
export const adminGetStats = <ThrowOnError extends boolean = false>(options?: Options<AdminGetStatsData, ThrowOnError>) => {
return (options?.client ?? client).get<AdminGetStatsResponses, unknown, ThrowOnError>({
responseType: 'json',
security: [
{
scheme: 'bearer',
type: 'http'
}
],
url: '/api/v1/admin/stats',
...options
});
};
/**
* Admin: List All Users
*

View File

@@ -93,6 +93,28 @@ export type AdminSessionResponse = {
is_active: boolean;
};
/**
* AdminStatsResponse
*/
export type AdminStatsResponse = {
/**
* User Growth
*/
user_growth: Array<UserGrowthData>;
/**
* Organization Distribution
*/
organization_distribution: Array<OrgDistributionData>;
/**
* Registration Activity
*/
registration_activity: Array<RegistrationActivityData>;
/**
* User Status
*/
user_status: Array<UserStatusData>;
};
/**
* 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;