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
@@ -82,28 +82,9 @@ class OnlyOfficeController {
break;
case OnlyOffice.Callback.Status.READY_FOR_SAVING:
const driveFile = await driveService.getByEditingSessionKey({
company_id,
editing_session_key,
});
if (!driveFile) {
throw new Error('Error getting drive files ');
}
const newVersionFile = await fileService.save({
company_id,
file_id,
url,
create_new: true,
});
const version = await driveService.createVersion({
company_id,
drive_file_id,
file_id: newVersionFile?.resource?.id,
});
logger.info('New version created', version);
await driveService.endEditing(company_id, editing_session_key, url);
logger.info(`New version for session ${editing_session_key} created`);
return respondToOO();
case OnlyOffice.Callback.Status.CLOSED_WITHOUT_CHANGES:
@@ -6,6 +6,7 @@ export type DriveFileType = {
date_added: number;
file_metadata: {
external_id: string;
name?: string;
};
};
};
@@ -20,6 +21,6 @@ export interface IDriveService {
get: (params: DriveRequestParams) => Promise<DriveFileType>;
createVersion: (params: { company_id: string; drive_file_id: string; file_id: string }) => Promise<DriveFileType['item']['last_version_cache']>;
beginEditingSession: (company_id: string, drive_file_id: string) => Promise<string>;
endEditing: (company_id: string, editing_session_key: string) => Promise<void>;
getByEditingSessionKey: (params: { company_id: string; editing_session_key: string; user_token?: string }) => Promise<DriveFileType>;
endEditing: (company_id: string, editing_session_key: string, file_source_url: string) => Promise<void>;
getByEditingSessionKey: (params: { company_id: string; editing_session_key: string; user_token?: string }) => Promise<DriveFileType['item']>;
}
@@ -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) {