UNPKG

smc-hub

Version:

CoCalc: Backend webserver component

126 lines 6.54 kB
"use strict"; /* * This file is part of CoCalc: Copyright © 2020 Sagemath, Inc. * License: AGPLv3 s.t. "Commons Clause" – see LICENSE.md for details */ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.unlink_old_deleted_projects = exports.permanently_unlink_all_deleted_projects_of_user = void 0; /* Code related to permanently deleting projects. */ var async_utils_1 = require("smc-util/async-utils"); /* Permanently delete from the database all project records, where the project is explicitly deleted already (so the deleted field is true). Call this function to setup projects for permanent deltion. This blanks the user field so the user no longer can access the project, and we don't know that the user had anything to do with the project. A separate phase later then purges these projects from disk as well as the database. */ function permanently_unlink_all_deleted_projects_of_user(db, account_id_or_email_address) { return __awaiter(this, void 0, void 0, function () { var account_id; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, get_account_id(db, account_id_or_email_address)]; case 1: account_id = _a.sent(); // Get all of the projects for that user that are marked deleted and // permanently "unlink" them, i.e., set them up for permenant delete. return [4 /*yield*/, async_utils_1.callback2(db._query, { query: "UPDATE projects", set: { users: null }, where: ["deleted = true", "users#>'{" + account_id + "}' IS NOT NULL"], })]; case 2: // Get all of the projects for that user that are marked deleted and // permanently "unlink" them, i.e., set them up for permenant delete. _a.sent(); return [2 /*return*/]; } }); }); } exports.permanently_unlink_all_deleted_projects_of_user = permanently_unlink_all_deleted_projects_of_user; function get_account_id(db, account_id_or_email_address) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: if (account_id_or_email_address.indexOf("@") == -1) { return [2 /*return*/, account_id_or_email_address]; } return [4 /*yield*/, async_utils_1.callback2(db.get_account, { email_address: account_id_or_email_address, columns: ["account_id"], })]; case 1: // It is an email address return [2 /*return*/, (_a.sent()).account_id]; } }); }); } /* This deletes all projects older than the given number of days, from the perspective of a user. Another task has to run to actually get rid of the data, etc. */ function unlink_old_deleted_projects(db, age_d) { if (age_d === void 0) { age_d = 30; } return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, async_utils_1.callback2(db._query, { query: "UPDATE projects", set: { users: null }, where: [ "deleted = true", "users IS NOT NULL", "last_edited <= NOW() - '" + age_d + " days'::INTERVAL", ], })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); } exports.unlink_old_deleted_projects = unlink_old_deleted_projects; //# sourceMappingURL=delete-projects.js.map