mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
(core) switch to newer download endpoint in client
Summary: * Fix old download endpoint to correctly pass org info in redirect. * Switch to use newer download endpoint in client. Old endpoint not removed. I started doing that, but it is used in copying, and it struck me that I'm not sure what should happen when copying from a site document to "Personal" - should it be the Personal that is associated with docs.getgrist.com currently, of should it be the Personal that is associated with the email of the user on whatever-site-we-are-on.getgrist.com. So leaving that as separate work. Test Plan: updated tests Reviewers: dsagal Reviewed By: dsagal Differential Revision: https://phab.getgrist.com/D2639
This commit is contained in:
parent
ad7be0fd8d
commit
27fd894fc7
@ -475,14 +475,6 @@ export class GristDoc extends DisposableWithEvents {
|
||||
}
|
||||
}
|
||||
|
||||
public getDownloadLink() {
|
||||
return this.docComm.docUrl('download') + '?' + encodeQueryParams({
|
||||
doc: this.docPageModel.currentDocId.get(),
|
||||
title: this.docPageModel.currentDocTitle.get(),
|
||||
...this.docComm.getUrlParams(),
|
||||
});
|
||||
}
|
||||
|
||||
public getCsvLink() {
|
||||
return this.docComm.docUrl('gen_csv') + '?' + encodeQueryParams({
|
||||
...this.docComm.getUrlParams(),
|
||||
|
@ -194,7 +194,10 @@ function menuExports(doc: Document, pageModel: DocPageModel) {
|
||||
(isElectron ?
|
||||
menuItem(() => gristDoc.app.comm.showItemInFolder(doc.name),
|
||||
'Show in folder', testId('tb-share-option')) :
|
||||
menuItemLink({ href: gristDoc.getDownloadLink(), target: '_blank', download: ''},
|
||||
menuItemLink({
|
||||
href: pageModel.appModel.api.getDocAPI(doc.id).getDownloadUrl(),
|
||||
target: '_blank', download: ''
|
||||
},
|
||||
menuIcon('Download'), 'Download', testId('tb-share-option'))
|
||||
),
|
||||
menuItemLink({ href: gristDoc.getCsvLink(), target: '_blank', download: ''},
|
||||
|
@ -312,6 +312,7 @@ export interface DocAPI {
|
||||
// Currently, leftHash is expected to be an ancestor of rightHash. If rightHash
|
||||
// is HEAD, the result will contain a copy of any rows added or updated.
|
||||
compareVersion(leftHash: string, rightHash: string): Promise<DocStateComparison>;
|
||||
getDownloadUrl(template?: boolean): string;
|
||||
}
|
||||
|
||||
// Operations that are supported by a doc worker.
|
||||
@ -712,9 +713,13 @@ export class DocAPIImpl extends BaseAPI implements DocAPI {
|
||||
}
|
||||
|
||||
public async compareVersion(leftHash: string, rightHash: string): Promise<DocStateComparison> {
|
||||
const url = new URL(`${this._url}/compare`);
|
||||
const url = new URL(`${this._url}/compare`);
|
||||
url.searchParams.append('left', leftHash);
|
||||
url.searchParams.append('right', rightHash);
|
||||
return this.requestJson(url.href);
|
||||
}
|
||||
|
||||
public getDownloadUrl(template: boolean = false) {
|
||||
return this._url + `/download?template=${Number(template)}`;
|
||||
}
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ import {getLoginMiddleware} from 'app/server/lib/logins';
|
||||
import {getAppPathTo, getAppRoot, getUnpackedAppRoot} from 'app/server/lib/places';
|
||||
import {addPluginEndpoints, limitToPlugins} from 'app/server/lib/PluginEndpoint';
|
||||
import {PluginManager} from 'app/server/lib/PluginManager';
|
||||
import {adaptServerUrl, addOrgToPathIfNeeded, addPermit, getScope, optStringParam, RequestWithGristInfo, stringParam,
|
||||
import {adaptServerUrl, addOrgToPath, addPermit, getScope, optStringParam, RequestWithGristInfo, stringParam,
|
||||
TEST_HTTPS_OFFSET, trustOrigin} from 'app/server/lib/requestUtils';
|
||||
import {ISendAppPageOptions, makeGristConfig, makeSendAppPage} from 'app/server/lib/sendAppPage';
|
||||
import {getDatabaseUrl} from 'app/server/lib/serverUtils';
|
||||
@ -1117,7 +1117,7 @@ export class FlexServer implements GristServer {
|
||||
this.app.get('/download', ...docAccessMiddleware, expressWrap(async (req, res) => {
|
||||
// Forward this endpoint to regular API. This endpoint is now deprecated.
|
||||
const docId = String(req.query.doc);
|
||||
let url = await this.getHomeUrlByDocId(docId, addOrgToPathIfNeeded(req, `/api/docs/${docId}/download`));
|
||||
let url = await this.getHomeUrlByDocId(docId, addOrgToPath(req, `/api/docs/${docId}/download`));
|
||||
if (req.query.template === '1') { url += '?template=1'; }
|
||||
return res.redirect(url);
|
||||
}));
|
||||
|
@ -49,11 +49,20 @@ export function adaptServerUrl(url: URL, req: RequestWithOrg): void {
|
||||
|
||||
/**
|
||||
* If org is not encoded in domain, prefix it to path - otherwise leave path unchanged.
|
||||
* The domain is extracted from the request, so this method is only useful for constructing
|
||||
* urls that stay within that domain.
|
||||
*/
|
||||
export function addOrgToPathIfNeeded(req: RequestWithOrg, path: string): string {
|
||||
return (isOrgInPathOnly(req.hostname) && req.org) ? `/o/${req.org}${path}` : path;
|
||||
}
|
||||
|
||||
/**
|
||||
* If org is known, prefix it to path unconditionally.
|
||||
*/
|
||||
export function addOrgToPath(req: RequestWithOrg, path: string): string {
|
||||
return req.org ? `/o/${req.org}${path}` : path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true for requests from permitted origins. For such requests, an
|
||||
* "Access-Control-Allow-Origin" header is added to the response. Vary: Origin
|
||||
|
Loading…
Reference in New Issue
Block a user