(core) make document assignment endpoint available via /housekeeping api

Summary:
The /assign endpoint checks if a document is on the desired worker
and moves it if not. This is never done under regular operation, but
is useful when quarantining a misbehaving document.

The endpoint was failing to operate correctly if the requester did
not have access to the document. This diff makes the endpoint
accessible through a /housekeeping route, using the same pattern as
the /force-reload endpoint.

Test Plan: added test

Reviewers: dsagal

Reviewed By: dsagal

Differential Revision: https://phab.getgrist.com/D3109
pull/115/head
Paul Fitzpatrick 3 years ago
parent cce679d928
commit 10a4cbb6bd

@ -161,6 +161,16 @@ export class Housekeeper {
headers,
});
}));
// Move a document to its assigned worker. Can be useful during administrative
// actions.
app.post('/api/housekeeping/docs/:docId/assign', this._withSupport(async (docId, headers) => {
const url = await this._server.getHomeUrlByDocId(docId, `/api/docs/${docId}/assign`);
return fetch(url, {
method: 'POST',
headers,
});
}));
}
/**

@ -132,8 +132,6 @@ export class DocWorkerApi {
const isOwner = expressWrap(this._assertAccess.bind(this, 'owners', false));
// check user can edit document, with soft-deleted documents being acceptable
const canEditMaybeRemoved = expressWrap(this._assertAccess.bind(this, 'editors', true));
// check document exists, don't check user access
const docExists = expressWrap(this._assertAccess.bind(this, null, false));
// converts google code to access token and adds it to request object
const decodeGoogleToken = expressWrap(googleAuthTokenMiddleware.bind(null));
@ -581,7 +579,7 @@ export class DocWorkerApi {
// and frees it for reassignment if not. Has no effect if document is in the
// expected group. Does not require specific rights. Returns true if the document
// is freed up for reassignment, otherwise false.
this._app.post('/api/docs/:docId/assign', docExists, throttled(async (req, res) => {
this._app.post('/api/docs/:docId/assign', canEdit, throttled(async (req, res) => {
const docId = getDocId(req);
const status = await this._docWorkerMap.getDocWorker(docId);
if (!status) { res.json(false); return; }

Loading…
Cancel
Save