smc-hub
Version:
CoCalc: Backend webserver component
134 lines (131 loc) • 6.27 kB
JavaScript
/*
1. Periodically pull all data from Stripe for now. The only point of this is
to ensure there isn't drift between stripe and our database. Any time a user
actually looks at their subscription info, or an admin updates the stripe info
(by 'add user to stripe' in account settings) the info is also synced. So this
is not super important.
TODO: Obviously, we should redo this to only pull maybe once per week (?) AND
also have a webhook so that any changes in stripe are immediately reflected here...
2. Periodically
This is run as a singleton deployment on some preemptible.
*/
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 };
}
};
var ms = require("ms");
var postgres = require("smc-hub/postgres");
var stripe_sync = require("smc-hub/stripe/sync").stripe_sync;
var callback2 = require("smc-util/async-utils").callback2;
var db = postgres.db({ ensure_exists: false });
function do_stripe_sync() {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
console.log("doing stripe_sync...");
return [4 /*yield*/, stripe_sync({
database: db,
logger: { debug: console.log },
})];
case 1:
_a.sent();
console.log("did stripe_sync");
return [2 /*return*/];
}
});
});
}
// make sure site licenses subscriptions are not expired iff they are active in stripe
// 2021-03: this now also checks if each license's subscription is still funding it (not cancelled)
function do_sync_site_licenses() {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
console.log("doing sync site licenses...");
return [4 /*yield*/, db.sync_site_license_subscriptions()];
case 1:
_a.sent();
console.log("did sync site licenses");
return [2 /*return*/];
}
});
});
}
// make sure all user upgrades to projects are valid and consistent
// (e.g. if upgrades expire remove them)
function upgrade_check() {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
console.log("doing project upgrade_check...");
return [4 /*yield*/, callback2(db.ensure_all_user_project_upgrades_are_valid.bind(db), {
limit: 1,
})];
case 1:
_a.sent();
console.log("done with project upgrade_check");
return [2 /*return*/];
}
});
});
}
function main() {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
console.log("doing the stripe related periodic tasks...");
return [4 /*yield*/, do_stripe_sync()];
case 1:
_a.sent();
return [4 /*yield*/, do_sync_site_licenses()];
case 2:
_a.sent();
return [4 /*yield*/, upgrade_check()];
case 3:
_a.sent();
console.log("success -- waiting 5 hours before doing them again...");
setTimeout(main, ms("5 hours"));
return [2 /*return*/];
}
});
});
}
main();
//# sourceMappingURL=stripe-sync.js.map