(core) Error message on Duplicate Document

Summary: Fixing error message when user can't copy document.

Test Plan: Updated tests

Reviewers: paulfitz

Reviewed By: paulfitz

Differential Revision: https://phab.getgrist.com/D3130
This commit is contained in:
Jarosław Sadziński 2021-11-09 11:34:26 +01:00
parent 267640c277
commit 96fa7ad562
4 changed files with 27 additions and 9 deletions

View File

@ -304,6 +304,7 @@ export class Notifier extends Disposable implements INotifier {
// This is exposed primarily for tests. // This is exposed primarily for tests.
public clearAppErrors() { public clearAppErrors() {
this._appErrorList.splice(0); this._appErrorList.splice(0);
this._appErrorToast.clear();
} }
/** /**

View File

@ -154,9 +154,18 @@ class SaveCopyModal extends Disposable {
const org = this._destOrg.get(); const org = this._destOrg.get();
const docWorker = await api.getWorkerAPI('import'); const docWorker = await api.getWorkerAPI('import');
const destName = this._destName.get() + '.grist'; const destName = this._destName.get() + '.grist';
const uploadId = await docWorker.copyDoc(this._doc.id, this._asTemplate.get(), destName); try {
const {id} = await docWorker.importDocToWorkspace(uploadId, ws.id); const uploadId = await docWorker.copyDoc(this._doc.id, this._asTemplate.get(), destName);
await urlState().pushUrl({org: org?.domain || undefined, doc: id, docPage: urlState().state.get().docPage}); const {id} = await docWorker.importDocToWorkspace(uploadId, ws.id);
await urlState().pushUrl({org: org?.domain || undefined, doc: id, docPage: urlState().state.get().docPage});
} catch(err) {
// Convert access denied errors to normal Error to make it consistent with other endpoints.
// TODO: Should not allow to click this button when user doesn't have permissions.
if (err.status === 403) {
throw new Error(err.details.userError || err.message);
}
throw err;
}
} }
public buildDom() { public buildDom() {

View File

@ -342,7 +342,7 @@ export class DocWorkerApi {
// check if the user has download permissions. // check if the user has download permissions.
const activeDoc = await this._getActiveDoc(req); const activeDoc = await this._getActiveDoc(req);
if (!await activeDoc.canDownload(docSessionFromRequest(req))) { if (!await activeDoc.canDownload(docSessionFromRequest(req))) {
throw new Error('not authorized to download this document'); throw new ApiError('not authorized to download this document', 403);
} }
return this._docWorker.downloadDoc(req, res, this._docManager.storageManager); return this._docWorker.downloadDoc(req, res, this._docManager.storageManager);
} }

View File

@ -67,12 +67,20 @@ export function addUploadRoute(server: GristServer, expressApp: Application, ...
const name = optStringParam(req.query.name); const name = optStringParam(req.query.name);
if (!docId) { throw new Error('doc must be specified'); } if (!docId) { throw new Error('doc must be specified'); }
const accessId = makeAccessId(req, getAuthorizedUserId(req)); const accessId = makeAccessId(req, getAuthorizedUserId(req));
const uploadResult: UploadResult = await fetchDoc(server.getHomeUrl(req), docId, req, accessId, try {
req.query.template === '1'); const uploadResult: UploadResult = await fetchDoc(server.getHomeUrl(req), docId, req, accessId,
if (name) { req.query.template === '1');
globalUploadSet.changeUploadName(uploadResult.uploadId, accessId, name); if (name) {
globalUploadSet.changeUploadName(uploadResult.uploadId, accessId, name);
}
res.status(200).send(JSON.stringify(uploadResult));
} catch(err) {
if ((err as ApiError).status === 403) {
res.status(403).json({error:'Insufficient access to document to copy it entirely'});
return;
}
throw err;
} }
res.status(200).send(JSON.stringify(uploadResult));
})); }));
} }