import axios from 'axios' const updateClient = axios.create({ baseURL: 'http://192.168.116.9:8084', timeout: 30000, }) if (import.meta.env.DEV) { updateClient.interceptors.request.use((config) => { console.debug('[tenant-platform][UPDATE] request', { method: config.method?.toUpperCase(), url: config.baseURL ? `${config.baseURL}${config.url ?? ''}` : config.url, params: config.params, }) return config }) updateClient.interceptors.response.use((res) => { console.debug('[tenant-platform][UPDATE] response', { status: res.status, url: res.config.url, }) return res }) } updateClient.interceptors.request.use((config) => { const token = localStorage.getItem('token') if (token) config.headers.Authorization = `Bearer ${token}` return config }) export type StoreType = 'HUAWEI' | 'MI' | 'OPPO' | 'VIVO' | 'HONOR' | 'APP_STORE' | 'GOOGLE_PLAY' export type StoreReviewState = 'PENDING' | 'UNDER_REVIEW' | 'APPROVED' | 'REJECTED' export interface StoreConfig { id: string appId: string storeType: StoreType configJson?: string enabled: boolean updatedAt: string } export interface AppVersion { id: string appId: string platform: 'ANDROID' | 'IOS' versionName: string versionCode: number packageName?: string downloadUrl?: string changeLog?: string forceUpdate: boolean publishStatus: 'DRAFT' | 'PUBLISHED' | 'DEPRECATED' grayEnabled: boolean grayPercent: number appStoreUrl?: string marketUrl?: string scheduledPublishAt?: string autoPublishAfterReview: boolean webhookUrl?: string storeSubmitTargets?: string storeReviewStatus?: string createdAt: string } export interface RnBundle { id: string appId: string moduleId: string platform: 'ANDROID' | 'IOS' version: string md5: string minCommonVersion?: string note?: string publishStatus: 'DRAFT' | 'PUBLISHED' | 'DEPRECATED' grayEnabled: boolean grayPercent: number createdAt: string } export interface UnifiedAppUploadItem { fileKey: string platform: 'ANDROID' | 'IOS' versionName: string versionCode: number changeLog?: string forceUpdate: boolean appStoreUrl?: string marketUrl?: string } export interface UnifiedRnUploadItem { fileKey: string moduleId: string platform: 'ANDROID' | 'IOS' version: string minCommonVersion?: string note?: string } export interface UnifiedReleaseManifest { appVersions: UnifiedAppUploadItem[] rnBundles: UnifiedRnUploadItem[] } export const updateAdminApi = { listAppVersions(appId: string, platform: 'ANDROID' | 'IOS') { return updateClient.get<{ data: AppVersion[] }>('/api/v1/updates/app/list', { params: { appId, platform }, }) }, publishAppVersion(id: string) { return updateClient.post(`/api/v1/updates/app/${id}/publish`) }, unpublishAppVersion(id: string) { return updateClient.post(`/api/v1/updates/app/${id}/unpublish`) }, grayAppVersion(id: string, enabled: boolean, percent: number) { return updateClient.post(`/api/v1/updates/app/${id}/gray`, { enabled, percent }) }, uploadAppVersion(formData: FormData) { return updateClient.post<{ data: AppVersion }>('/api/v1/updates/app/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' }, }) }, listRnBundles(appId: string, moduleId?: string, platform?: string) { return updateClient.get<{ data: RnBundle[] }>('/api/v1/rn/list', { params: { appId, ...(moduleId && { moduleId }), ...(platform && { platform }) }, }) }, publishRnBundle(id: string) { return updateClient.post(`/api/v1/rn/${id}/publish`) }, unpublishRnBundle(id: string) { return updateClient.post(`/api/v1/rn/${id}/unpublish`) }, grayRnBundle(id: string, enabled: boolean, percent: number) { return updateClient.post(`/api/v1/rn/${id}/gray`, { enabled, percent }) }, uploadRnBundle(formData: FormData) { return updateClient.post<{ data: RnBundle }>('/api/v1/rn/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' }, }) }, uploadUnifiedRelease(formData: FormData) { return updateClient.post('/api/v1/updates/unified/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' }, }) }, // ── Store config ──────────────────────────────────────────────────────── getStoreConfigs(appId: string) { return updateClient.get<{ data: StoreConfig[] }>('/api/v1/updates/store/configs', { params: { appId } }) }, saveStoreConfig(appId: string, storeType: StoreType, configJson: string, enabled: boolean) { return updateClient.put<{ data: StoreConfig }>( `/api/v1/updates/store/configs/${storeType}`, { configJson, enabled }, { params: { appId } }, ) }, deleteStoreConfig(appId: string, storeType: StoreType) { return updateClient.delete(`/api/v1/updates/store/configs/${storeType}`, { params: { appId } }) }, executeSubmitToStores(versionId: string, storeTypes: StoreType[]) { return updateClient.post<{ data: AppVersion }>( `/api/v1/updates/store/app/${versionId}/execute-submit`, { storeTypes }, ) }, updateStoreReview(versionId: string, storeType: StoreType, state: StoreReviewState) { return updateClient.post<{ data: AppVersion }>( `/api/v1/updates/store/app/${versionId}/review`, { storeType, state }, ) }, }