import { message, notification } from 'antd'; import axios from 'axios'; import { history } from 'umi'; import { Authorization } from '@/constants/authorization'; import i18n from '@/locales/config'; import { Routes } from '@/routes'; import api from '@/utils/api'; import authorizationUtil, { getAuthorization, } from '@/utils/authorization-util'; import { convertTheKeysOfTheObjectToSnake } from '@/utils/common-util'; import { ResultCode, RetcodeMessage } from '@/utils/request'; const request = axios.create({ timeout: 300000, }); request.interceptors.request.use((config) => { const data = convertTheKeysOfTheObjectToSnake(config.data); const params = convertTheKeysOfTheObjectToSnake(config.params) as any; const newConfig = { ...config, data, params }; // @ts-ignore if (!newConfig.skipToken) { newConfig.headers.set(Authorization, getAuthorization()); } return newConfig; }); request.interceptors.response.use( (response) => { if (response.config.responseType === 'blob') { return response; } const { data } = response ?? {}; if (data?.code === 100) { message.error(data?.message); } else if (data?.code === 401) { notification.error({ message: data?.message, description: data?.message, duration: 3, }); authorizationUtil.removeAll(); history.push(Routes.Admin); } else if (data?.code && data.code !== 0) { notification.error({ message: `${i18n.t('message.hint')}: ${data?.code}`, description: data?.message, duration: 3, }); } return response; }, (error) => { const { response, message } = error; const { data } = response ?? {}; if (error.message === 'Failed to fetch') { notification.error({ description: i18n.t('message.networkAnomalyDescription'), message: i18n.t('message.networkAnomaly'), }); } else if (data?.code === 100) { message.error(data?.message); } else if (response.status === 401 || data?.code === 401) { notification.error({ message: data?.message || response.statusText, description: data?.message || RetcodeMessage[response?.status as ResultCode], duration: 3, }); authorizationUtil.removeAll(); history.push(Routes.Admin); } else if (data?.code && data.code !== 0) { notification.error({ message: `${i18n.t('message.hint')}: ${data?.code}`, description: data?.message, duration: 3, }); } else if (response.status) { notification.error({ message: `${i18n.t('message.requestError')} ${response.status}: ${response.config.url}`, description: RetcodeMessage[response.status as ResultCode] || response.statusText, }); } else if (response.status === 413 || response?.status === 504) { message.error(RetcodeMessage[response?.status as ResultCode]); } throw error; }, ); const { getSystemVersion: _getSystemVersion, adminLogin, adminLogout, adminListUsers, adminCreateUser, adminGetUserDetails, adminUpdateUserStatus, adminUpdateUserPassword, adminDeleteUser, adminListUserDatasets, adminListUserAgents, adminListServices, adminShowServiceDetails, adminListRoles, adminListRolesWithPermission, adminCreateRole, adminDeleteRole, adminUpdateRoleDescription, adminGetRolePermissions, adminAssignRolePermissions, adminRevokeRolePermissions, adminGetUserPermissions, adminUpdateUserRole, adminListResources, adminListWhitelist, adminCreateWhitelistEntry, adminUpdateWhitelistEntry, adminDeleteWhitelistEntry, adminImportWhitelist, } = api; type ResponseData> = { code: number; message: string; data: D; }; export const login = (params: { email: string; password: string }) => request.post>(adminLogin, params); export const logout = () => request.get>(adminLogout); export const listUsers = () => request.get>(adminListUsers, {}); export const createUser = (email: string, password: string) => request.post>(adminCreateUser, { username: email, password, }); export const getUserDetails = (email: string) => request.get>( adminGetUserDetails(email), ); export const listUserDatasets = (email: string) => request.get>( adminListUserDatasets(email), ); export const listUserAgents = (email: string) => request.get>( adminListUserAgents(email), ); export const updateUserStatus = (email: string, status: 'on' | 'off') => request.put(adminUpdateUserStatus(email), { activate_status: status }); export const updateUserPassword = (email: string, password: string) => request.put(adminUpdateUserPassword(email), { new_password: password }); export const deleteUser = (email: string) => request.delete(adminDeleteUser(email)); export const listServices = () => request.get>(adminListServices); export const showServiceDetails = (serviceId: number) => request.get>( adminShowServiceDetails(String(serviceId)), ); export const createRole = (params: { roleName: string; description?: string; }) => request.post>(adminCreateRole, params); export const updateRoleDescription = (role: string, description: string) => request.put>( adminUpdateRoleDescription(role), { description }, ); export const deleteRole = (role: string) => request.delete>>(adminDeleteRole(role)); export const listRoles = () => request.get< ResponseData<{ roles: AdminService.ListRoleItem[]; total: number }> >(adminListRoles); export const listRolesWithPermission = () => request.get< ResponseData<{ roles: AdminService.ListRoleItemWithPermission[]; total: number; }> >(adminListRolesWithPermission); export const getRolePermissions = (role: string) => request.get>( adminGetRolePermissions(role), ); export const assignRolePermissions = ( role: string, permissions: Partial, ) => request.post>(adminAssignRolePermissions(role), { new_permissions: permissions, }); export const revokeRolePermissions = ( role: string, permissions: Partial, ) => request.delete>(adminRevokeRolePermissions(role), { data: { revoke_permissions: permissions }, }); export const updateUserRole = (username: string, role: string) => request.put>(adminUpdateUserRole(username), { role_name: role, }); export const getUserPermissions = (username: string) => request.get>( adminGetUserPermissions(username), ); export const listResources = () => request.get>(adminListResources); export const listWhitelist = () => request.get< ResponseData<{ total: number; white_list: AdminService.ListWhitelistItem[]; }> >(adminListWhitelist); export const createWhitelistEntry = (email: string) => request.post>(adminCreateWhitelistEntry, { email }); export const updateWhitelistEntry = (id: number, email: string) => request.put>(adminUpdateWhitelistEntry(id), { email }); export const deleteWhitelistEntry = (email: string) => request.delete>(adminDeleteWhitelistEntry(email)); export const importWhitelistFromExcel = (file: File) => { const fd = new FormData(); fd.append('file', file); return request.post>(adminImportWhitelist, fd); }; export const getSystemVersion = () => request.get>(_getSystemVersion);