♻️🩹🚨 backend,oo: remove company_id when key available and minor cleanup (#525)
This commit is contained in:
@@ -1043,6 +1043,20 @@ export class DocumentsService {
|
|||||||
throw new CrudException("Invalid editing_session_key", 400);
|
throw new CrudException("Invalid editing_session_key", 400);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const parsedKey = EditingSessionKeyFormat.parse(editing_session_key);
|
||||||
|
context = {
|
||||||
|
...context,
|
||||||
|
company: { id: parsedKey.companyId },
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
this.logger.error(
|
||||||
|
"Invalid editing_session_key value: " + JSON.stringify(editing_session_key),
|
||||||
|
e,
|
||||||
|
);
|
||||||
|
throw new CrudException("Invalid editing_session_key", 400);
|
||||||
|
}
|
||||||
|
|
||||||
const driveFile = await this.repository.findOne({ editing_session_key }, {}, context);
|
const driveFile = await this.repository.findOne({ editing_session_key }, {}, context);
|
||||||
if (!driveFile) {
|
if (!driveFile) {
|
||||||
this.logger.error("Drive item not found by editing session key");
|
this.logger.error("Drive item not found by editing session key");
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { createDocumentSchema, createVersionSchema, beginEditingSchema } from ".
|
|||||||
|
|
||||||
const baseUrl = "/companies/:company_id";
|
const baseUrl = "/companies/:company_id";
|
||||||
const serviceUrl = `${baseUrl}/item`;
|
const serviceUrl = `${baseUrl}/item`;
|
||||||
|
const editingSessionBase = "/editing_session/:editing_session_key";
|
||||||
|
|
||||||
const routes: FastifyPluginCallback = (fastify: FastifyInstance, _options, next) => {
|
const routes: FastifyPluginCallback = (fastify: FastifyInstance, _options, next) => {
|
||||||
const documentsController = new DocumentsController();
|
const documentsController = new DocumentsController();
|
||||||
@@ -89,21 +90,21 @@ const routes: FastifyPluginCallback = (fastify: FastifyInstance, _options, next)
|
|||||||
|
|
||||||
fastify.route({
|
fastify.route({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
url: `${serviceUrl}/editing_session/:editing_session_key`,
|
url: editingSessionBase, //TODO NONONO check authenticate*Optional*
|
||||||
preValidation: [fastify.authenticateOptional],
|
preValidation: [fastify.authenticateOptional],
|
||||||
handler: documentsController.getByEditingSessionKey.bind(documentsController),
|
handler: documentsController.getByEditingSessionKey.bind(documentsController),
|
||||||
});
|
});
|
||||||
|
|
||||||
fastify.route({
|
fastify.route({
|
||||||
method: "POST",
|
method: "POST",
|
||||||
url: `${serviceUrl}/editing_session/:editing_session_key`,
|
url: editingSessionBase,
|
||||||
preValidation: [fastify.authenticateOptional],
|
preValidation: [fastify.authenticateOptional],
|
||||||
handler: documentsController.endEditing.bind(documentsController),
|
handler: documentsController.endEditing.bind(documentsController),
|
||||||
});
|
});
|
||||||
|
|
||||||
fastify.route({
|
fastify.route({
|
||||||
method: "DELETE",
|
method: "DELETE",
|
||||||
url: `${serviceUrl}/editing_session/:editing_session_key`,
|
url: editingSessionBase,
|
||||||
preValidation: [fastify.authenticateOptional],
|
preValidation: [fastify.authenticateOptional],
|
||||||
handler: documentsController.cancelEditing.bind(documentsController),
|
handler: documentsController.cancelEditing.bind(documentsController),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -419,7 +419,7 @@ export default class UserApi {
|
|||||||
|
|
||||||
return await this.platform.app.inject({
|
return await this.platform.app.inject({
|
||||||
method: "POST",
|
method: "POST",
|
||||||
url: `${UserApi.DOC_URL}/companies/${this.platform.workspace.company_id}/item/editing_session/${editingSessionKey}`,
|
url: `${UserApi.DOC_URL}/editing_session/${editingSessionKey}`,
|
||||||
headers: {
|
headers: {
|
||||||
authorization: `Bearer ${this.jwt}`
|
authorization: `Bearer ${this.jwt}`
|
||||||
},
|
},
|
||||||
@@ -432,7 +432,7 @@ export default class UserApi {
|
|||||||
): Promise<Response> {
|
): Promise<Response> {
|
||||||
return await this.platform.app.inject({
|
return await this.platform.app.inject({
|
||||||
method: "DELETE",
|
method: "DELETE",
|
||||||
url: `${UserApi.DOC_URL}/companies/${this.platform.workspace.company_id}/item/editing_session/${editingSessionKey}`,
|
url: `${UserApi.DOC_URL}/editing_session/${editingSessionKey}`,
|
||||||
headers: {
|
headers: {
|
||||||
authorization: `Bearer ${this.jwt}`
|
authorization: `Bearer ${this.jwt}`
|
||||||
}
|
}
|
||||||
|
|||||||
-11
@@ -83,15 +83,4 @@ export default class TwakeDriveBackendCallbackController {
|
|||||||
throw new Error(`Unexpected callback status: ${JSON.stringify(info.result)}`);
|
throw new Error(`Unexpected callback status: ${JSON.stringify(info.result)}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Force deletion of the provided `editing_session_key` in the OO document server.
|
|
||||||
* If the key was succesfully deleted, the `done` property in the response body will be true.
|
|
||||||
*/
|
|
||||||
public async deleteSessionKey(req: Request<RequestQuery>, res: Response): Promise<void> {
|
|
||||||
await ignoreMissingKeyErrorButNoneElse(res, async () => {
|
|
||||||
await onlyofficeService.deleteForgotten(req.params.editing_session_key);
|
|
||||||
await res.send({ done: true });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,10 +96,9 @@ class OnlyOfficeController {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case OnlyOffice.Callback.Status.READY_FOR_SAVING:
|
case OnlyOffice.Callback.Status.READY_FOR_SAVING:
|
||||||
await driveService.endEditing(company_id, editing_session_key, url);
|
|
||||||
|
|
||||||
logger.info(`New version for session ${editing_session_key} created`);
|
logger.info(`New version for session ${editing_session_key} created`);
|
||||||
return respondToOO();
|
return respondToOO();
|
||||||
|
await driveService.endEditing(editing_session_key, url);
|
||||||
|
|
||||||
case OnlyOffice.Callback.Status.CLOSED_WITHOUT_CHANGES:
|
case OnlyOffice.Callback.Status.CLOSED_WITHOUT_CHANGES:
|
||||||
// Save end of transaction
|
// Save end of transaction
|
||||||
|
|||||||
@@ -21,6 +21,6 @@ export interface IDriveService {
|
|||||||
get: (params: DriveRequestParams) => Promise<DriveFileType>;
|
get: (params: DriveRequestParams) => Promise<DriveFileType>;
|
||||||
createVersion: (params: { company_id: string; drive_file_id: string; file_id: string }) => Promise<DriveFileType['item']['last_version_cache']>;
|
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>;
|
beginEditingSession: (company_id: string, drive_file_id: string) => Promise<string>;
|
||||||
endEditing: (company_id: string, editing_session_key: string, url: string) => Promise<void>;
|
endEditing: (editing_session_key: string, url: string) => Promise<void>;
|
||||||
getByEditingSessionKey: (params: { company_id: string; editing_session_key: string; user_token?: string }) => Promise<DriveFileType['item']>;
|
getByEditingSessionKey: (params: { company_id: string; editing_session_key: string; user_token?: string }) => Promise<DriveFileType['item']>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import logger from '@/lib/logger';
|
import logger from '@/lib/logger';
|
||||||
import { NextFunction, Request, Response } from 'express';
|
import { NextFunction, Request, Response } from 'express';
|
||||||
import { makeURLTo } from '@/routes';
|
|
||||||
|
|
||||||
export default (error: Error & { status?: number }, req: Request, res: Response, next: NextFunction): void => {
|
export default (error: Error & { status?: number }, req: Request, res: Response, next: NextFunction): void => {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -11,6 +11,5 @@ export const TwakeDriveBackendCallbackRoutes = {
|
|||||||
const controller = new TwakeDriveBackendCallbackController();
|
const controller = new TwakeDriveBackendCallbackController();
|
||||||
// Why post ? to garantee it is never cached and always ran
|
// Why post ? to garantee it is never cached and always ran
|
||||||
router.post('/session/:editing_session_key/check', authMiddleware, controller.checkSessionStatus);
|
router.post('/session/:editing_session_key/check', authMiddleware, controller.checkSessionStatus);
|
||||||
router.delete('/session/:editing_session_key', authMiddleware, controller.deleteSessionKey);
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -70,10 +70,10 @@ class DriveService implements IDriveService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async cancelEditing(company_id: string, editing_session_key) {
|
public async cancelEditing(editing_session_key: string) {
|
||||||
try {
|
try {
|
||||||
await apiService.delete<{}>({
|
await apiService.delete<{}>({
|
||||||
url: `/internal/services/documents/v1/companies/${company_id}/item/editing_session/${encodeURIComponent(editing_session_key)}`,
|
url: `/internal/services/documents/v1/editing_session/${encodeURIComponent(editing_session_key)}`,
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error('Failed to begin editing session: ', error.stack);
|
logger.error('Failed to begin editing session: ', error.stack);
|
||||||
@@ -82,13 +82,13 @@ class DriveService implements IDriveService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async endEditing(company_id: string, editing_session_key: string, url: string) {
|
public async endEditing(editing_session_key: string, url: string) {
|
||||||
try {
|
try {
|
||||||
if (!url) {
|
if (!url) {
|
||||||
throw Error('no url found');
|
throw Error('no url found');
|
||||||
}
|
}
|
||||||
|
|
||||||
const originalFile = await this.getByEditingSessionKey({ company_id, editing_session_key });
|
const originalFile = await this.getByEditingSessionKey({ editing_session_key });
|
||||||
|
|
||||||
if (!originalFile) {
|
if (!originalFile) {
|
||||||
throw Error('original file not found');
|
throw Error('original file not found');
|
||||||
@@ -110,7 +110,7 @@ class DriveService implements IDriveService {
|
|||||||
logger.info('Saving file version to Twake Drive: ', filename);
|
logger.info('Saving file version to Twake Drive: ', filename);
|
||||||
|
|
||||||
await apiService.post({
|
await apiService.post({
|
||||||
url: `/internal/services/documents/v1/companies/${company_id}/item/editing_session/${encodeURIComponent(editing_session_key)}`,
|
url: `/internal/services/documents/v1/editing_session/${encodeURIComponent(editing_session_key)}`,
|
||||||
payload: form,
|
payload: form,
|
||||||
headers: form.getHeaders(),
|
headers: form.getHeaders(),
|
||||||
});
|
});
|
||||||
@@ -126,15 +126,11 @@ class DriveService implements IDriveService {
|
|||||||
* /item/editing_session/${editing_session_key}
|
* /item/editing_session/${editing_session_key}
|
||||||
* @param params
|
* @param params
|
||||||
*/
|
*/
|
||||||
public getByEditingSessionKey = async (params: {
|
public getByEditingSessionKey = async (params: { editing_session_key: string; user_token?: string }): Promise<DriveFileType['item']> => {
|
||||||
company_id: string;
|
|
||||||
editing_session_key: string;
|
|
||||||
user_token?: string;
|
|
||||||
}): Promise<DriveFileType['item']> => {
|
|
||||||
try {
|
try {
|
||||||
const { company_id, editing_session_key } = params;
|
const { editing_session_key } = params;
|
||||||
return await apiService.get<DriveFileType['item']>({
|
return await apiService.get<DriveFileType['item']>({
|
||||||
url: `/internal/services/documents/v1/companies/${company_id}/item/editing_session/${encodeURIComponent(editing_session_key)}`,
|
url: `/internal/services/documents/v1/editing_session/${encodeURIComponent(editing_session_key)}`,
|
||||||
token: params.user_token,
|
token: params.user_token,
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user