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, PagesDeploymentUploadFromURLPayload, PagesDeploymentUploadPayload, PagesProject, PagesProjectPayload, PagesSource, PagesSourceActionPayload, PagesSourceActionReceipt, PagesSourceUpdatePayload, PagesSourceUpdateResult, } 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 getSource(projectId: number): Promise { return this.get(`/${projectId}/source`); } static updateSource( projectId: number, payload: PagesSourceUpdatePayload, ): Promise { return this.post( `/${projectId}/source/update`, payload, ); } static deleteSource(projectId: number): Promise { return this.post(`/${projectId}/source/delete`); } static checkSource(projectId: number): Promise { return this.post( `/${projectId}/source/check`, {}, ); } static syncSource( projectId: number, payload: PagesSourceActionPayload = {}, ): Promise { return this.post( `/${projectId}/source/sync`, payload, ); } 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); return this.postFormData( `/${projectId}/deployments/upload`, formData, payload.onProgress, ); } static uploadDeploymentFromURL( projectId: number, payload: PagesDeploymentUploadFromURLPayload, ): Promise { return this.post( `/${projectId}/deployments/upload-from-url`, payload, { timeout: apiConfig.uploadTimeout } as InternalAxiosRequestConfig, ); } 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; } }