Added support of the session editing key for the OnlyOffice connector

This commit is contained in:
Anton SHEPILOV
2024-08-25 22:26:29 +02:00
committed by Eric Doughty-Papassideris
parent b6be90f825
commit c66123f450
9 changed files with 217 additions and 53 deletions
@@ -1,6 +1,8 @@
import { DriveFileType, IDriveService } from '@/interfaces/drive.interface';
import apiService from './api.service';
import logger from '../lib/logger';
import { Stream } from 'stream';
import FormData from 'form-data';
/**
* Client for Twake Drive's APIs dealing with `DriveItem`s, using {@see apiService}
@@ -30,7 +32,7 @@ class DriveService implements IDriveService {
}): Promise<DriveFileType['item']['last_version_cache']> => {
try {
const { company_id, drive_file_id, file_id } = params;
const resource = await apiService.post<{}, DriveFileType['item']['last_version_cache']>({
return await apiService.post<{}, DriveFileType['item']['last_version_cache']>({
url: `/internal/services/documents/v1/companies/${company_id}/item/${drive_file_id}/version`,
payload: {
drive_item_id: drive_file_id,
@@ -41,8 +43,6 @@ class DriveService implements IDriveService {
},
},
});
return resource;
} catch (error) {
logger.error('Failed to create version: ', error.stack);
return Promise.reject();
@@ -68,10 +68,49 @@ class DriveService implements IDriveService {
}
}
public async endEditing(company_id: string, editing_session_key: string) {
public async cancelEditing(company_id: string, editing_session_key) {
try {
await apiService.delete<{}>({
url: `/internal/services/documents/v1/companies/${company_id}/item/editing_session/${editing_session_key}`,
url: `/internal/services/documents/v1/companies/${company_id}/item/editing_session/${encodeURIComponent(editing_session_key)}`,
});
} catch (error) {
logger.error('Failed to begin editing session: ', error.stack);
throw error;
//TODO make monitoring for such kind of errors
}
}
public async endEditing(company_id: string, editing_session_key: string, url: string) {
try {
if (!url) {
throw Error('no url found');
}
const originalFile = await this.getByEditingSessionKey({ company_id, editing_session_key });
if (!originalFile) {
throw Error('original file not found');
}
const newFile = await apiService.get<Stream>({
url,
responseType: 'stream',
});
const form = new FormData();
const filename = encodeURIComponent(originalFile.last_version_cache.file_metadata.name);
form.append('file', newFile, {
filename,
});
logger.info('Saving file version to Twake Drive: ', filename);
await apiService.post({
url: `/internal/services/documents/v1/companies/${company_id}/item/editing_session/${encodeURIComponent(editing_session_key)}`,
payload: form,
headers: form.getHeaders(),
});
} catch (error) {
logger.error('Failed to begin editing session: ', error.stack);
@@ -89,11 +128,11 @@ class DriveService implements IDriveService {
company_id: string;
editing_session_key: string;
user_token?: string;
}): Promise<DriveFileType> => {
}): Promise<DriveFileType['item']> => {
try {
const { company_id, editing_session_key } = params;
return await apiService.get<DriveFileType>({
url: `/internal/services/documents/v1/companies/${company_id}/item/editing_session/${editing_session_key}`,
return await apiService.get<DriveFileType['item']>({
url: `/internal/services/documents/v1/companies/${company_id}/item/editing_session/${encodeURIComponent(editing_session_key)}`,
token: params.user_token,
});
} catch (error) {