oo-connector: rename from OO (#525)

This commit is contained in:
Eric Doughty-Papassideris
2024-09-23 02:59:34 +02:00
parent ebe8a78c7f
commit 528d8830fb
4 changed files with 70 additions and 0 deletions
@@ -15,6 +15,10 @@ interface RequestQuery {
token: string;
}
interface RenameRequestBody {
name: string;
}
/** These expose a OnlyOffice document storage service methods, called by the OnlyOffice document editing service
* to load and save files
*/
@@ -145,6 +149,25 @@ class OnlyOfficeController {
next(error || 'error');
}
};
/** This route is called directly by the inline JS in the editor page, called by the client-side OO editor component */
public rename = async (req: Request<{}, {}, RenameRequestBody, RequestQuery>, res: Response, next: NextFunction): Promise<void> => {
try {
const { token } = req.query;
const officeTokenPayload = jwt.verify(token, CREDENTIALS_SECRET) as OfficeToken;
const { company_id, drive_file_id } = officeTokenPayload;
const { name } = req.body;
if (!drive_file_id) throw new Error('OO Rename request missing drive_file_id');
if (!name) throw new Error('OO Rename request missing name');
const result = await driveService.update({ company_id, drive_file_id, changes: { name } });
res.send(result);
} catch (error) {
logger.error(`OO Rename request root error`, { error });
next(error || 'error');
}
};
}
export default OnlyOfficeController;
@@ -11,5 +11,6 @@ export const OnlyOfficeRoutes = {
const controller = new OnlyOfficeController();
router.get(`/:mode/read`, requirementsMiddleware, controller.read.bind(controller));
router.post(`/:mode/callback`, requirementsMiddleware, controller.ooCallback.bind(controller));
router.post(`/:mode/rename`, requirementsMiddleware, controller.rename.bind(controller));
},
};
@@ -36,6 +36,28 @@ class DriveService implements IDriveService {
}
};
public update = async (params: {
company_id: string;
drive_file_id: string;
changes: Partial<DriveFileType['item']>;
completeResult?: boolean;
}): Promise<(typeof params)['changes']> => {
try {
const { company_id, drive_file_id } = params;
const resource = await apiService.post<(typeof params)['changes'], ReturnType<DriveService['update']>>({
url: makeNonEditingSessionItemUrl(company_id, drive_file_id),
payload: params.changes,
});
if (params.completeResult) return resource;
const result = {};
Object.keys(params.changes).forEach(k => (result[k] = resource[k]));
return result;
} catch (error) {
logger.error('Failed to update file metadata: ', error.stack);
return Promise.reject();
}
};
public createVersion = async (params: {
company_id: string;
drive_file_id: string;
@@ -5,6 +5,7 @@
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
<script type="text/javascript" src="<%= it.onlyoffice_server %>web-apps/apps/api/documents/api.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no,shrink-to-fit=no" />
<title>Twake Drive</title>
</head>
<body style="height: 100%">
@@ -35,6 +36,11 @@
preview: <%= it.preview %>,
}
}
function updateTitle(title) {
const el = document.querySelector('head title');
if (el) el.innerText = title + ' — Twake Drive';
}
updateTitle(doc.title);
window.docEditor = new DocsAPI.DocEditor('onlyoffice_container_instance', {
scrollSensitivity: window.mode === 'text' ? 100 : 40,
@@ -44,6 +50,24 @@
document: doc,
token: "<%= it.drive_file_id %>",
type: screen.width < 600 ? 'mobile' : 'desktop',
events: {
onRequestRename: function (event) {
let name = event.data;
const prevExtension = /\.[^.]+$/.exec(doc.title);
if (prevExtension) name += prevExtension[0];
$.
post(`${window.baseURL}rename${callbackQueryString}`, { name }).
done((changed) => {
if (changed.name != name)
window.docEditor.showMessage(`✅ Renamed to: ${changed.name}`);
}).
fail(() => window.docEditor.showMessage('🚨 Error renaming the file'));
},
onMetaChange: function (event) {
const { title } = event.data;
if (title) updateTitle(title);
},
},
editorConfig: {
callbackUrl: `${window.baseURL}callback${callbackQueryString}`,
lang: window.user.language,