import type { AxiosProgressEvent, InternalAxiosRequestConfig } from 'axios'; import apiClient from '@/lib/services/core/api-client'; import { apiConfig } from '@/lib/services/core/config'; import type { ApiResponse } from '@/lib/services/core'; import { OpenFlareBaseService } from './base.service'; import type { PagesDeployment, PagesDeploymentFile, PagesDeploymentUploadPayload, PagesProject, PagesProjectPayload, } from './types'; export class PagesService extends OpenFlareBaseService { protected static override readonly basePath: string = '/api/v1/d/pages'; static listProjects(): Promise { return this.get('/'); } static getProject(id: number): Promise { return this.get(`/${id}`); } static createProject(payload: PagesProjectPayload): Promise { return this.post('/', payload); } static updateProject( id: number, payload: PagesProjectPayload, ): Promise { return this.post(`/${id}/update`, payload); } static deleteProject(id: number): Promise { return this.post(`/${id}/delete`); } static listDeployments(projectId: number): Promise { return this.get(`/${projectId}/deployments`); } static listDeploymentFiles( deploymentId: number, ): Promise { return this.get( `/deployments/${deploymentId}/files`, ); } static uploadDeployment( projectId: number, payload: PagesDeploymentUploadPayload, ): Promise { const formData = new FormData(); formData.append('package', payload.file); formData.append('root_dir', payload.rootDir ?? ''); formData.append('entry_file', payload.entryFile ?? 'index.html'); return this.postFormData( `/${projectId}/deployments/upload`, formData, payload.onProgress, ); } static activateDeployment( projectId: number, deploymentId: number, ): Promise { return this.post( `/${projectId}/deployments/${deploymentId}/activate`, ); } static deleteDeployment( projectId: number, deploymentId: number, ): Promise { return this.post(`/${projectId}/deployments/${deploymentId}/delete`); } private static async postFormData( path: string, formData: FormData, onProgress?: (percent: number) => void, ): Promise { const response = await apiClient.post>( this.getFullPath(path), formData, { timeout: apiConfig.uploadTimeout, headers: { 'Content-Type': 'multipart/form-data' }, onUploadProgress: (event: AxiosProgressEvent) => { if (!onProgress || !event.total) return; const percent = Math.round((event.loaded / event.total) * 100); onProgress(percent); }, } as InternalAxiosRequestConfig, ); return response.data.data; } }