request = require("request").defaults(jar: false) logger = require "logger-sharelatex" settings = require "settings-sharelatex" Errors = require "../Errors/Errors" module.exports = DocstoreManager = deleteDoc: (project_id, doc_id, callback = (error) ->) -> logger.log project_id: project_id, doc_id: doc_id, "deleting doc in docstore api" url = "#{settings.apis.docstore.url}/project/#{project_id}/doc/#{doc_id}" request.del url, (error, res, body) -> return callback(error) if error? if 200 <= res.statusCode < 300 callback(null) else if res.statusCode is 404 error = new Errors.NotFoundError("tried to delete doc not in docstore") logger.error err: error, project_id: project_id, doc_id: doc_id, "tried to delete doc not in docstore" callback(error) # maybe suppress the error when delete doc which is not present? else error = new Error("docstore api responded with non-success code: #{res.statusCode}") logger.error err: error, project_id: project_id, doc_id: doc_id, "error deleting doc in docstore" callback(error) getAllDocs: (project_id, callback = (error) ->) -> logger.log project_id: project_id, "getting all docs for project in docstore api" url = "#{settings.apis.docstore.url}/project/#{project_id}/doc" request.get { url: url json: true }, (error, res, docs) -> return callback(error) if error? if 200 <= res.statusCode < 300 callback(null, docs) else error = new Error("docstore api responded with non-success code: #{res.statusCode}") logger.error err: error, project_id: project_id, "error getting all docs from docstore" callback(error) getAllRanges: (project_id, callback = (error) ->) -> logger.log { project_id }, "getting all doc ranges for project in docstore api" url = "#{settings.apis.docstore.url}/project/#{project_id}/ranges" request.get { url: url json: true }, (error, res, docs) -> return callback(error) if error? if 200 <= res.statusCode < 300 callback(null, docs) else error = new Error("docstore api responded with non-success code: #{res.statusCode}") logger.error err: error, project_id: project_id, "error getting all doc ranges from docstore" callback(error) getDoc: (project_id, doc_id, options = {}, callback = (error, lines, rev, version) ->) -> if typeof(options) == "function" callback = options options = {} logger.log project_id: project_id, doc_id: doc_id, options: options, "getting doc in docstore api" url = "#{settings.apis.docstore.url}/project/#{project_id}/doc/#{doc_id}" if options.include_deleted url += "?include_deleted=true" request.get { url: url json: true }, (error, res, doc) -> return callback(error) if error? if 200 <= res.statusCode < 300 logger.log doc_id: doc_id, project_id: project_id, version: doc.version, rev: doc.rev, "got doc from docstore api" callback(null, doc.lines, doc.rev, doc.version, doc.ranges) else if res.statusCode is 404 error = new Errors.NotFoundError("doc not found in docstore") logger.error err: error, project_id: project_id, doc_id: doc_id, "doc not found in docstore" callback(error) else error = new Error("docstore api responded with non-success code: #{res.statusCode}") logger.error err: error, project_id: project_id, doc_id: doc_id, "error getting doc from docstore" callback(error) updateDoc: (project_id, doc_id, lines, version, ranges, callback = (error, modified, rev) ->) -> logger.log project_id: project_id, doc_id: doc_id, "updating doc in docstore api" url = "#{settings.apis.docstore.url}/project/#{project_id}/doc/#{doc_id}" request.post { url: url json: lines: lines version: version ranges: ranges }, (error, res, result) -> return callback(error) if error? if 200 <= res.statusCode < 300 logger.log project_id: project_id, doc_id: doc_id, "update doc in docstore url finished" callback(null, result.modified, result.rev) else error = new Error("docstore api responded with non-success code: #{res.statusCode}") logger.error err: error, project_id: project_id, doc_id: doc_id, "error updating doc in docstore" callback(error) archiveProject: (project_id, callback)-> url = "#{settings.apis.docstore.url}/project/#{project_id}/archive" logger.log project_id:project_id, "archiving project in docstore" request.post url, (err, res, docs) -> if err? logger.err err:err, project_id:project_id, "error archving project in docstore" return callback(err) if 200 <= res.statusCode < 300 callback() else error = new Error("docstore api responded with non-success code: #{res.statusCode}") logger.err err: error, project_id: project_id, "error archiving project in docstore" return callback(error) unarchiveProject: (project_id, callback)-> url = "#{settings.apis.docstore.url}/project/#{project_id}/unarchive" logger.log project_id:project_id, "unarchiving project in docstore" request.post url, (err, res, docs) -> if err? logger.err err:err, project_id:project_id, "error unarchiving project in docstore" return callback(err) if 200 <= res.statusCode < 300 callback() else error = new Error("docstore api responded with non-success code: #{res.statusCode}") logger.err err: error, project_id: project_id, "error unarchiving project in docstore" return callback(error)