✨Added support of the session editing key for the OnlyOffice connector
This commit is contained in:
committed by
Eric Doughty-Papassideris
parent
b6be90f825
commit
c66123f450
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user