This commit is contained in:
@@ -1,5 +1,28 @@
|
||||
import { apiRequest } from '../../lib/api';
|
||||
|
||||
export type PageParams = {
|
||||
page?: number;
|
||||
limit?: number;
|
||||
keyword?: string;
|
||||
[key: string]: string | number | undefined;
|
||||
};
|
||||
|
||||
export type PagedResponse<T> = {
|
||||
items: T[];
|
||||
total: number;
|
||||
page: number;
|
||||
limit: number;
|
||||
};
|
||||
|
||||
function pageQuery(params?: PageParams) {
|
||||
const searchParams = new URLSearchParams();
|
||||
Object.entries(params ?? {}).forEach(([key, value]) => {
|
||||
if (value !== undefined && value !== '') searchParams.set(key, String(value));
|
||||
});
|
||||
const query = searchParams.toString();
|
||||
return query ? `?${query}` : '';
|
||||
}
|
||||
|
||||
export type AdminSession = {
|
||||
id?: string;
|
||||
revokedAt?: string | null;
|
||||
@@ -13,6 +36,7 @@ export type AdminSshKey = {
|
||||
|
||||
export type AdminAccount = {
|
||||
id: string;
|
||||
no?: number;
|
||||
email: string;
|
||||
name: string;
|
||||
avatarUrl?: string | null;
|
||||
@@ -64,6 +88,8 @@ export type Organization = {
|
||||
name: string;
|
||||
type: OrganizationType;
|
||||
domain?: string | null;
|
||||
defaultLicenseCode?: string | null;
|
||||
defaultLicenseName?: string | null;
|
||||
createdAt: string;
|
||||
};
|
||||
|
||||
@@ -86,18 +112,24 @@ export type LauncherNotice = {
|
||||
updatedAt?: string;
|
||||
};
|
||||
|
||||
export async function loadAdmins() {
|
||||
export async function loadAdminsPage(params?: PageParams & { role?: string; state?: string }): Promise<PagedResponse<AdminAccount>> {
|
||||
type RawAdminAccount = Omit<AdminAccount, 'appPermissions'> & {
|
||||
appPermissions?: Array<string | { appId: string }>;
|
||||
};
|
||||
const response = await apiRequest<RawAdminAccount[] | { admins?: RawAdminAccount[] }>('/admins');
|
||||
const response = await apiRequest<RawAdminAccount[] | { admins?: RawAdminAccount[]; total?: number; page?: number; limit?: number }>(`/admins${pageQuery(params)}`);
|
||||
const admins = Array.isArray(response) ? response : response.admins ?? [];
|
||||
return admins.map((admin) => ({
|
||||
const items = admins.map((admin) => ({
|
||||
...admin,
|
||||
appPermissions: (admin.appPermissions ?? []).map((permission) => (
|
||||
typeof permission === 'string' ? permission : permission.appId
|
||||
))
|
||||
}));
|
||||
if (Array.isArray(response)) return { items, total: items.length, page: params?.page ?? 1, limit: params?.limit ?? items.length };
|
||||
return { items, total: response.total ?? items.length, page: response.page ?? params?.page ?? 1, limit: response.limit ?? params?.limit ?? items.length };
|
||||
}
|
||||
|
||||
export async function loadAdmins() {
|
||||
return (await loadAdminsPage({ limit: 1000 })).items;
|
||||
}
|
||||
|
||||
export function loadAdminRoles() {
|
||||
@@ -165,13 +197,18 @@ export function updateAdminAppPermissions(adminId: string, appIds: string[]) {
|
||||
});
|
||||
}
|
||||
|
||||
export async function loadUserSessions() {
|
||||
const response = await apiRequest<{ sessions?: UserSession[] }>('/users/sessions');
|
||||
return (response.sessions ?? []).map((session) => ({
|
||||
export async function loadUserSessionsPage(params?: PageParams & { state?: string }): Promise<PagedResponse<UserSession>> {
|
||||
const response = await apiRequest<{ sessions?: UserSession[]; total?: number; page?: number; limit?: number }>(`/users/sessions${pageQuery(params)}`);
|
||||
const items = (response.sessions ?? []).map((session) => ({
|
||||
...session,
|
||||
session: session.sessionId ? session.session : '-',
|
||||
state: session.state
|
||||
}));
|
||||
return { items, total: response.total ?? items.length, page: response.page ?? params?.page ?? 1, limit: response.limit ?? params?.limit ?? items.length };
|
||||
}
|
||||
|
||||
export async function loadUserSessions() {
|
||||
return (await loadUserSessionsPage({ limit: 1000 })).items;
|
||||
}
|
||||
|
||||
export function lockUser(userId: string) {
|
||||
@@ -207,9 +244,14 @@ export function createManagedUser(payload: {
|
||||
});
|
||||
}
|
||||
|
||||
export async function loadOrganizationsPage(params?: PageParams & { type?: string }): Promise<PagedResponse<Organization>> {
|
||||
const response = await apiRequest<{ organizations?: Organization[]; total?: number; page?: number; limit?: number }>(`/organizations${pageQuery(params)}`);
|
||||
const items = response.organizations ?? [];
|
||||
return { items, total: response.total ?? items.length, page: response.page ?? params?.page ?? 1, limit: response.limit ?? params?.limit ?? items.length };
|
||||
}
|
||||
|
||||
export async function loadOrganizations() {
|
||||
const response = await apiRequest<{ organizations?: Organization[] }>('/organizations');
|
||||
return response.organizations ?? [];
|
||||
return (await loadOrganizationsPage({ limit: 1000 })).items;
|
||||
}
|
||||
|
||||
export function createOrganization(payload: { name: string; type: OrganizationType; domain?: string | null }) {
|
||||
@@ -232,9 +274,21 @@ export function deleteOrganization(organizationId: string) {
|
||||
});
|
||||
}
|
||||
|
||||
export function updateOrganizationLicense(organizationId: string, licenseCode: string | null) {
|
||||
return apiRequest<{ organization: Organization; updatedUserCount: number }>(`/organizations/${organizationId}/license`, {
|
||||
method: 'PATCH',
|
||||
body: JSON.stringify({ licenseCode })
|
||||
});
|
||||
}
|
||||
|
||||
export async function loadLauncherNoticesPage(params?: PageParams & { appKey?: string }): Promise<PagedResponse<LauncherNotice>> {
|
||||
const response = await apiRequest<{ notices?: LauncherNotice[]; total?: number; page?: number; limit?: number }>(`/notices${pageQuery(params)}`);
|
||||
const items = response.notices ?? [];
|
||||
return { items, total: response.total ?? items.length, page: response.page ?? params?.page ?? 1, limit: response.limit ?? params?.limit ?? items.length };
|
||||
}
|
||||
|
||||
export async function loadLauncherNotices() {
|
||||
const response = await apiRequest<{ notices?: LauncherNotice[] }>('/notices');
|
||||
return response.notices ?? [];
|
||||
return (await loadLauncherNoticesPage({ limit: 1000 })).items;
|
||||
}
|
||||
|
||||
export function createLauncherNotice(payload: {
|
||||
@@ -323,6 +377,19 @@ export async function loadLicensePlans() {
|
||||
return response.plans ?? [];
|
||||
}
|
||||
|
||||
export function updateLicensePlan(licenseCode: string, payload: {
|
||||
name?: string;
|
||||
description?: string | null;
|
||||
defaultDurationDays?: number | null;
|
||||
isActive?: boolean;
|
||||
permissions?: Array<{ appKey: string; canLaunch: boolean }>;
|
||||
}) {
|
||||
return apiRequest<{ plan: LicensePlan; updatedUserCount?: number }>(`/licenses/plans/${encodeURIComponent(licenseCode)}`, {
|
||||
method: 'PATCH',
|
||||
body: JSON.stringify(payload)
|
||||
});
|
||||
}
|
||||
|
||||
export async function loadLicenseUsers(params?: { keyword?: string; licenseCode?: string }) {
|
||||
const searchParams = new URLSearchParams();
|
||||
if (params?.keyword) searchParams.set('keyword', params.keyword);
|
||||
@@ -332,6 +399,27 @@ export async function loadLicenseUsers(params?: { keyword?: string; licenseCode?
|
||||
return response.users ?? [];
|
||||
}
|
||||
|
||||
export async function loadLicenseAssignments(params?: PageParams & { licenseCode?: string; status?: string }): Promise<PagedResponse<LicenseAssignment>> {
|
||||
const response = await apiRequest<{ assignments?: LicenseAssignment[]; total?: number; page?: number; limit?: number }>(`/licenses/assignments${pageQuery(params)}`);
|
||||
const items = response.assignments ?? [];
|
||||
return { items, total: response.total ?? items.length, page: response.page ?? params?.page ?? 1, limit: response.limit ?? params?.limit ?? items.length };
|
||||
}
|
||||
|
||||
export type LicenseAssignment = {
|
||||
id: string;
|
||||
no?: number;
|
||||
userId: string;
|
||||
user: string;
|
||||
name: string;
|
||||
role: string;
|
||||
code: string;
|
||||
licenseName: string;
|
||||
startsAt: string;
|
||||
expiresAt?: string | null;
|
||||
assignedBy?: string | null;
|
||||
status: string;
|
||||
};
|
||||
|
||||
export function assignUserLicense(userId: string, payload: {
|
||||
licenseCode: string;
|
||||
startsAt?: string;
|
||||
@@ -373,6 +461,33 @@ export type LauncherUserAppPermission = {
|
||||
assignedAt?: string | null;
|
||||
};
|
||||
|
||||
export type LicenseAppPermission = {
|
||||
appId: string;
|
||||
appKey: string;
|
||||
displayName: string;
|
||||
description?: string | null;
|
||||
sortOrder: number;
|
||||
isEnabled: boolean;
|
||||
policyId?: string | null;
|
||||
canView: boolean;
|
||||
canLaunch: boolean;
|
||||
};
|
||||
|
||||
export async function loadLicenseAppPermissions(licenseCode: string) {
|
||||
const response = await apiRequest<{ permissions?: LicenseAppPermission[] }>(`/licenses/plans/${encodeURIComponent(licenseCode)}/app-permissions`);
|
||||
return response.permissions ?? [];
|
||||
}
|
||||
|
||||
export function updateLicenseAppPermissions(licenseCode: string, permissions: Array<{
|
||||
appKey: string;
|
||||
canLaunch: boolean;
|
||||
}>) {
|
||||
return apiRequest<{ permissions?: LicenseAppPermission[]; updatedUserCount?: number }>(`/licenses/plans/${encodeURIComponent(licenseCode)}/app-permissions`, {
|
||||
method: 'PUT',
|
||||
body: JSON.stringify({ permissions })
|
||||
});
|
||||
}
|
||||
|
||||
export async function loadLauncherUserAppPermissions(userId: string) {
|
||||
const response = await apiRequest<{ permissions?: LauncherUserAppPermission[] }>(`/launcher/users/${userId}/app-permissions`);
|
||||
return response.permissions ?? [];
|
||||
|
||||
Reference in New Issue
Block a user