mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-07 20:31:06 -05:00
202 lines
6.3 KiB
JavaScript
202 lines
6.3 KiB
JavaScript
/* eslint-disable
|
|
camelcase,
|
|
handle-callback-err,
|
|
no-unused-vars,
|
|
*/
|
|
// TODO: This file was created by bulk-decaffeinate.
|
|
// Fix any style issues and re-enable lint.
|
|
/*
|
|
* decaffeinate suggestions:
|
|
* DS101: Remove unnecessary use of Array.from
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
* DS207: Consider shorter variations of null checks
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
*/
|
|
let HttpController;
|
|
const UpdatesManager = require("./UpdatesManager");
|
|
const DiffManager = require("./DiffManager");
|
|
const PackManager = require("./PackManager");
|
|
const RestoreManager = require("./RestoreManager");
|
|
const logger = require("logger-sharelatex");
|
|
const HealthChecker = require("./HealthChecker");
|
|
const _ = require("underscore");
|
|
|
|
module.exports = (HttpController = {
|
|
flushDoc(req, res, next) {
|
|
if (next == null) { next = function(error) {}; }
|
|
const { doc_id } = req.params;
|
|
const { project_id } = req.params;
|
|
logger.log({project_id, doc_id}, "compressing doc history");
|
|
return UpdatesManager.processUncompressedUpdatesWithLock(project_id, doc_id, function(error) {
|
|
if (error != null) { return next(error); }
|
|
return res.send(204);
|
|
});
|
|
},
|
|
|
|
flushProject(req, res, next) {
|
|
if (next == null) { next = function(error) {}; }
|
|
const { project_id } = req.params;
|
|
logger.log({project_id}, "compressing project history");
|
|
return UpdatesManager.processUncompressedUpdatesForProject(project_id, function(error) {
|
|
if (error != null) { return next(error); }
|
|
return res.send(204);
|
|
});
|
|
},
|
|
|
|
flushAll(req, res, next) {
|
|
// limit on projects to flush or -1 for all (default)
|
|
if (next == null) { next = function(error) {}; }
|
|
const limit = (req.query.limit != null) ? parseInt(req.query.limit, 10) : -1;
|
|
logger.log({limit}, "flushing all projects");
|
|
return UpdatesManager.flushAll(limit, function(error, result) {
|
|
if (error != null) { return next(error); }
|
|
const {failed, succeeded, all} = result;
|
|
const status = `${succeeded.length} succeeded, ${failed.length} failed`;
|
|
if (limit === 0) {
|
|
return res.status(200).send(`${status}\nwould flush:\n${all.join('\n')}\n`);
|
|
} else if (failed.length > 0) {
|
|
logger.log({failed, succeeded}, "error flushing projects");
|
|
return res.status(500).send(`${status}\nfailed to flush:\n${failed.join('\n')}\n`);
|
|
} else {
|
|
return res.status(200).send(`${status}\nflushed ${succeeded.length} projects of ${all.length}\n`);
|
|
}
|
|
});
|
|
},
|
|
|
|
checkDanglingUpdates(req, res, next) {
|
|
if (next == null) { next = function(error) {}; }
|
|
logger.log("checking dangling updates");
|
|
return UpdatesManager.getDanglingUpdates(function(error, result) {
|
|
if (error != null) { return next(error); }
|
|
if (result.length > 0) {
|
|
logger.log({dangling: result}, "found dangling updates");
|
|
return res.status(500).send(`dangling updates:\n${result.join('\n')}\n`);
|
|
} else {
|
|
return res.status(200).send("no dangling updates found\n");
|
|
}
|
|
});
|
|
},
|
|
|
|
checkDoc(req, res, next) {
|
|
if (next == null) { next = function(error) {}; }
|
|
const { doc_id } = req.params;
|
|
const { project_id } = req.params;
|
|
logger.log({project_id, doc_id}, "checking doc history");
|
|
return DiffManager.getDocumentBeforeVersion(project_id, doc_id, 1, function(error, document, rewoundUpdates) {
|
|
if (error != null) { return next(error); }
|
|
const broken = [];
|
|
for (const update of Array.from(rewoundUpdates)) {
|
|
for (const op of Array.from(update.op)) {
|
|
if (op.broken === true) {
|
|
broken.push(op);
|
|
}
|
|
}
|
|
}
|
|
if (broken.length > 0) {
|
|
return res.send(broken);
|
|
} else {
|
|
return res.send(204);
|
|
}
|
|
});
|
|
},
|
|
|
|
getDiff(req, res, next) {
|
|
let from, to;
|
|
if (next == null) { next = function(error) {}; }
|
|
const { doc_id } = req.params;
|
|
const { project_id } = req.params;
|
|
|
|
if (req.query.from != null) {
|
|
from = parseInt(req.query.from, 10);
|
|
} else {
|
|
from = null;
|
|
}
|
|
if (req.query.to != null) {
|
|
to = parseInt(req.query.to, 10);
|
|
} else {
|
|
to = null;
|
|
}
|
|
|
|
logger.log({project_id, doc_id, from, to}, "getting diff");
|
|
return DiffManager.getDiff(project_id, doc_id, from, to, function(error, diff) {
|
|
if (error != null) { return next(error); }
|
|
return res.json({diff});
|
|
});
|
|
},
|
|
|
|
getUpdates(req, res, next) {
|
|
let before, min_count;
|
|
if (next == null) { next = function(error) {}; }
|
|
const { project_id } = req.params;
|
|
|
|
if (req.query.before != null) {
|
|
before = parseInt(req.query.before, 10);
|
|
}
|
|
if (req.query.min_count != null) {
|
|
min_count = parseInt(req.query.min_count, 10);
|
|
}
|
|
|
|
return UpdatesManager.getSummarizedProjectUpdates(project_id, {before, min_count}, function(error, updates, nextBeforeTimestamp) {
|
|
if (error != null) { return next(error); }
|
|
return res.json({
|
|
updates,
|
|
nextBeforeTimestamp
|
|
});
|
|
});
|
|
},
|
|
|
|
restore(req, res, next) {
|
|
if (next == null) { next = function(error) {}; }
|
|
let {doc_id, project_id, version} = req.params;
|
|
const user_id = req.headers["x-user-id"];
|
|
version = parseInt(version, 10);
|
|
return RestoreManager.restoreToBeforeVersion(project_id, doc_id, version, user_id, function(error) {
|
|
if (error != null) { return next(error); }
|
|
return res.send(204);
|
|
});
|
|
},
|
|
|
|
pushDocHistory(req, res, next) {
|
|
if (next == null) { next = function(error) {}; }
|
|
const { project_id } = req.params;
|
|
const { doc_id } = req.params;
|
|
logger.log({project_id, doc_id}, "pushing all finalised changes to s3");
|
|
return PackManager.pushOldPacks(project_id, doc_id, function(error) {
|
|
if (error != null) { return next(error); }
|
|
return res.send(204);
|
|
});
|
|
},
|
|
|
|
pullDocHistory(req, res, next) {
|
|
if (next == null) { next = function(error) {}; }
|
|
const { project_id } = req.params;
|
|
const { doc_id } = req.params;
|
|
logger.log({project_id, doc_id}, "pulling all packs from s3");
|
|
return PackManager.pullOldPacks(project_id, doc_id, function(error) {
|
|
if (error != null) { return next(error); }
|
|
return res.send(204);
|
|
});
|
|
},
|
|
|
|
healthCheck(req, res){
|
|
return HealthChecker.check(function(err){
|
|
if (err != null) {
|
|
logger.err({err}, "error performing health check");
|
|
return res.send(500);
|
|
} else {
|
|
return res.send(200);
|
|
}
|
|
});
|
|
},
|
|
|
|
checkLock(req, res){
|
|
return HealthChecker.checkLock(function(err) {
|
|
if (err != null) {
|
|
logger.err({err}, "error performing lock check");
|
|
return res.send(500);
|
|
} else {
|
|
return res.send(200);
|
|
}
|
|
});
|
|
}
|
|
});
|