You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
29 lines
1.4 KiB
29 lines
1.4 KiB
import { OpenMode, SQLiteDB } from 'app/server/lib/SQLiteDB';
|
|
import { OptDocSession } from "app/server/lib/DocSession";
|
|
|
|
/**
|
|
* Filter a Grist document when it is copied or downloaded. Changes made:
|
|
* - Any FullCopies special rules are removed.
|
|
* In the future, the changes could be made conditional on the user. This would
|
|
* allow us for example to permit downloads of documents with row-level filters
|
|
* in place.
|
|
*/
|
|
export async function filterDocumentInPlace(docSession: OptDocSession, filename: string) {
|
|
// We ignore docSession for now, since no changes are user-dependent yet.
|
|
// The change we need to make is simple, so we open the doc as a SQLite DB.
|
|
// Note: the change is not entered in document history.
|
|
const db = await SQLiteDB.openDBRaw(filename, OpenMode.OPEN_EXISTING);
|
|
// Fetch ids of any special resources mentioning FullCopies (ideally there would be
|
|
// at most one).
|
|
const resourceIds = (await db.all("SELECT id FROM _grist_ACLResources " +
|
|
"WHERE tableId='*SPECIAL' AND colIds='FullCopies'"))
|
|
.map(row => row.id as number);
|
|
if (resourceIds.length > 0) {
|
|
// Remove any related rules.
|
|
await db.run(`DELETE FROM _grist_ACLRules WHERE resource IN (${resourceIds})`);
|
|
// Remove the resources.
|
|
await db.run(`DELETE FROM _grist_ACLResources WHERE id IN (${resourceIds})`);
|
|
}
|
|
await db.close();
|
|
}
|