feat(aihr): add tenant organization governance
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
type ApiResult<T> = {
|
||||
code: number;
|
||||
msg: string;
|
||||
data: T;
|
||||
};
|
||||
|
||||
export type OrgDirectoryNode = {
|
||||
externalId: string;
|
||||
parentExternalId?: string;
|
||||
nodeType: 'GROUP' | 'COMPANY' | 'PROJECT' | 'DEPARTMENT';
|
||||
name: string;
|
||||
bindable: boolean;
|
||||
children: OrgDirectoryNode[];
|
||||
};
|
||||
|
||||
export type OrgDirectoryTree = {
|
||||
sourceCode: string;
|
||||
directoryVersion: string;
|
||||
nodeCount: number;
|
||||
roots: OrgDirectoryNode[];
|
||||
};
|
||||
|
||||
export type TenantOrgBinding = {
|
||||
id?: number;
|
||||
tenantId: string;
|
||||
tenantName: string;
|
||||
sourceCode?: string;
|
||||
rootExternalId?: string;
|
||||
rootName?: string;
|
||||
rootNodeType?: string;
|
||||
mode?: 'EXCLUSIVE' | 'AGGREGATE_ONLY';
|
||||
status: 'UNBOUND' | 'DRAFT' | 'ACTIVE' | 'DISABLED';
|
||||
directoryVersion?: string;
|
||||
lastSyncAt?: string;
|
||||
};
|
||||
|
||||
export type TenantOrgBindingOverview = {
|
||||
activeTenantCount: number;
|
||||
boundTenantCount: number;
|
||||
pendingTenantCount: number;
|
||||
conflictCount: number;
|
||||
bindings: TenantOrgBinding[];
|
||||
};
|
||||
|
||||
export type TenantOrgBindingRequest = {
|
||||
tenantId?: string;
|
||||
rootExternalId?: string;
|
||||
mode?: 'EXCLUSIVE' | 'AGGREGATE_ONLY';
|
||||
status?: 'DRAFT' | 'ACTIVE' | 'DISABLED';
|
||||
};
|
||||
|
||||
export type ScopeConflict = {
|
||||
tenantId: string;
|
||||
tenantName: string;
|
||||
rootExternalId: string;
|
||||
rootName: string;
|
||||
reason: string;
|
||||
};
|
||||
|
||||
export type BindingPrecheck = {
|
||||
canActivate: boolean;
|
||||
rootName: string;
|
||||
rootNodeType: string;
|
||||
conflicts: ScopeConflict[];
|
||||
};
|
||||
|
||||
export type AggregateView = {
|
||||
bindingId: number;
|
||||
coveredTenantCount: number;
|
||||
syncedPersonCount: number;
|
||||
};
|
||||
|
||||
export function getOrgDirectoryTree(): Promise<ApiResult<OrgDirectoryTree>> {
|
||||
return request({ url: '/api/aihr/platform/org-directory/tree', method: 'get' });
|
||||
}
|
||||
|
||||
export function refreshOrgDirectory(): Promise<ApiResult<{ sourceCode: string; directoryVersion: string; nodeCount: number; warnings: string[] }>> {
|
||||
return request({ url: '/api/aihr/platform/org-directory/refresh', method: 'post', headers: { repeatSubmit: false } });
|
||||
}
|
||||
|
||||
export function listTenantOrgBindings(): Promise<ApiResult<TenantOrgBindingOverview>> {
|
||||
return request({ url: '/api/aihr/platform/tenant-org-bindings', method: 'get' });
|
||||
}
|
||||
|
||||
export function precheckTenantOrgBinding(data: TenantOrgBindingRequest): Promise<ApiResult<BindingPrecheck>> {
|
||||
return request({ url: '/api/aihr/platform/tenant-org-bindings/precheck', method: 'post', data, headers: { repeatSubmit: false } });
|
||||
}
|
||||
|
||||
export function createTenantOrgBinding(data: TenantOrgBindingRequest): Promise<ApiResult<TenantOrgBinding>> {
|
||||
return request({ url: '/api/aihr/platform/tenant-org-bindings', method: 'post', data, headers: { repeatSubmit: false } });
|
||||
}
|
||||
|
||||
export function updateTenantOrgBinding(id: number, data: TenantOrgBindingRequest): Promise<ApiResult<TenantOrgBinding>> {
|
||||
return request({ url: `/api/aihr/platform/tenant-org-bindings/${id}`, method: 'patch', data, headers: { repeatSubmit: false } });
|
||||
}
|
||||
|
||||
export function getTenantOrgAggregate(id: number): Promise<ApiResult<AggregateView>> {
|
||||
return request({ url: `/api/aihr/platform/tenant-org-bindings/${id}/aggregate`, method: 'get' });
|
||||
}
|
||||
Reference in New Issue
Block a user