beam: integrate model attachments with Beam viewer

This commit is contained in:
DCCONSTRUCTIONS
2026-06-04 19:39:36 +03:00
parent 6e74964853
commit 3e41c451c1
9 changed files with 583 additions and 7 deletions
@@ -8,12 +8,29 @@ import type { AxiosRequestConfig } from "axios";
import { API_BASE_URL } from "@plane/constants";
// plane types
import { getFileMetaDataForUpload, generateFileUploadPayload } from "@plane/services";
import type { TIssueAttachment, TIssueAttachmentUploadResponse, TIssueServiceType } from "@plane/types";
import type {
TFileMetaDataLite,
TIssueAttachment,
TIssueAttachmentUploadResponse,
TIssueServiceType,
} from "@plane/types";
import { EIssueServiceType } from "@plane/types";
// services
import {
getBeamModelMimeType,
isBeamModelFile,
type TBeamViewerAttachment,
uploadBeamModelFile,
} from "@/helpers/beam-viewer";
import { APIService } from "@/services/api.service";
import { FileUploadService } from "@/services/file-upload.service";
type TIssueAttachmentCreateResponse = {
asset_id: string;
asset_url: string;
attachment: TIssueAttachment;
};
export class IssueAttachmentService extends APIService {
private fileUploadService: FileUploadService;
private serviceType: TIssueServiceType;
@@ -40,6 +57,25 @@ export class IssueAttachmentService extends APIService {
});
}
private async createBeamIssueAttachmentReference(
workspaceSlug: string,
projectId: string,
issueId: string,
payload: TFileMetaDataLite & { beamViewer: TBeamViewerAttachment }
): Promise<TIssueAttachment> {
return this.post(
`/api/assets/v2/workspaces/${workspaceSlug}/projects/${projectId}/${this.serviceType}/${issueId}/attachments/`,
payload
)
.then((response) => {
const createResponse: TIssueAttachmentCreateResponse = response?.data;
return createResponse.attachment;
})
.catch((error) => {
throw error?.response?.data ?? error;
});
}
async uploadIssueAttachment(
workspaceSlug: string,
projectId: string,
@@ -47,6 +83,22 @@ export class IssueAttachmentService extends APIService {
file: File,
uploadProgressHandler?: AxiosRequestConfig["onUploadProgress"]
): Promise<TIssueAttachment> {
if (isBeamModelFile(file.name)) {
const beamViewer = await uploadBeamModelFile(file, {
issueId,
onUploadProgress: uploadProgressHandler,
projectId,
workspaceSlug,
});
return this.createBeamIssueAttachmentReference(workspaceSlug, projectId, issueId, {
beamViewer,
name: file.name,
size: file.size,
type: getBeamModelMimeType(file),
});
}
const fileMetaData = await getFileMetaDataForUpload(file);
return this.post(
`/api/assets/v2/workspaces/${workspaceSlug}/projects/${projectId}/${this.serviceType}/${issueId}/attachments/`,