diff --git a/services/docstore/app/coffee/DocArchiveManager.coffee b/services/docstore/app/coffee/DocArchiveManager.coffee index e02c167edd..925ad3bfc9 100644 --- a/services/docstore/app/coffee/DocArchiveManager.coffee +++ b/services/docstore/app/coffee/DocArchiveManager.coffee @@ -11,7 +11,7 @@ thirtySeconds = 30 * 1000 module.exports = DocArchive = archiveAllDocs: (project_id, callback = (err, docs) ->) -> - MongoManager.getProjectsDocs project_id, {include_deleted: true}, (err, docs) -> + MongoManager.getProjectsDocs project_id, {include_deleted: true}, {lines: true, rev: true, inS3: true}, (err, docs) -> if err? return callback(err) else if !docs? diff --git a/services/docstore/app/coffee/DocManager.coffee b/services/docstore/app/coffee/DocManager.coffee index 8a280772ea..9102b22749 100644 --- a/services/docstore/app/coffee/DocManager.coffee +++ b/services/docstore/app/coffee/DocManager.coffee @@ -11,7 +11,7 @@ module.exports = DocManager = # migrate this version property to be part of the docs collection, to guarantee # consitency between lines and version when writing/reading, and for a simpler schema. getDoc: (project_id, doc_id, filter = { version: false }, callback = (error, doc) ->) -> - MongoManager.findDoc project_id, doc_id, (err, doc)-> + MongoManager.findDoc project_id, doc_id, filter, (err, doc)-> if err? return callback(err) else if !doc? @@ -31,9 +31,9 @@ module.exports = DocManager = else callback err, doc - getAllNonDeletedDocs: (project_id, callback = (error, docs) ->) -> + getAllNonDeletedDocs: (project_id, filter, callback = (error, docs) ->) -> DocArchive.unArchiveAllDocs project_id, (error) -> - MongoManager.getProjectsDocs project_id, {include_deleted: false}, (error, docs) -> + MongoManager.getProjectsDocs project_id, {include_deleted: false}, filter, (error, docs) -> if err? return callback(error) else if !docs? @@ -45,7 +45,7 @@ module.exports = DocManager = if !lines? or !version? return callback(new Error("no lines or version provided")) - DocManager.getDoc project_id, doc_id, {version: true}, (err, doc)-> + DocManager.getDoc project_id, doc_id, {version: true, rev: true, lines: true, version: true, ranges: true}, (err, doc)-> if err? and !(err instanceof Errors.NotFoundError) logger.err project_id: project_id, doc_id: doc_id, err:err, "error getting document for update" return callback(err) @@ -93,7 +93,7 @@ module.exports = DocManager = updateLinesAndRangesIfNeeded (error) -> return callback(error) if error? updateVersionIfNeeded (error) -> - return callback(callback) if error? + return callback(error) if error? callback null, modified, rev deleteDoc: (project_id, doc_id, callback = (error) ->) -> diff --git a/services/docstore/app/coffee/HttpController.coffee b/services/docstore/app/coffee/HttpController.coffee index 40b27cd66e..a51e825f90 100644 --- a/services/docstore/app/coffee/HttpController.coffee +++ b/services/docstore/app/coffee/HttpController.coffee @@ -10,7 +10,7 @@ module.exports = HttpController = doc_id = req.params.doc_id include_deleted = req.query?.include_deleted == "true" logger.log project_id: project_id, doc_id: doc_id, "getting doc" - DocManager.getDoc project_id, doc_id, {version: true}, (error, doc) -> + DocManager.getDoc project_id, doc_id, {lines: true, rev: true, deleted: true, version: true, ranges: true}, (error, doc) -> return next(error) if error? logger.log doc: doc, "got doc" if !doc? @@ -24,7 +24,7 @@ module.exports = HttpController = project_id = req.params.project_id doc_id = req.params.doc_id logger.log project_id: project_id, doc_id: doc_id, "getting raw doc" - DocManager.getDoc project_id, doc_id, {version: false}, (error, doc) -> + DocManager.getDoc project_id, doc_id, {lines: true}, (error, doc) -> return next(error) if error? if !doc? res.send 404 @@ -35,7 +35,7 @@ module.exports = HttpController = getAllDocs: (req, res, next = (error) ->) -> project_id = req.params.project_id logger.log project_id: project_id, "getting all docs" - DocManager.getAllNonDeletedDocs project_id, (error, docs = []) -> + DocManager.getAllNonDeletedDocs project_id, {lines: true, rev: true}, (error, docs = []) -> return next(error) if error? docViews = [] for doc in docs @@ -83,12 +83,13 @@ module.exports = HttpController = _id: doc._id?.toString() lines: doc.lines rev: doc.rev - deleted: !!doc.deleted } if doc.version? doc_view.version = doc.version if doc.ranges? doc_view.ranges = doc.ranges + if doc.deleted? + doc_view.deleted = doc.deleted return doc_view _buildRawDocView: (doc)-> diff --git a/services/docstore/app/coffee/MongoManager.coffee b/services/docstore/app/coffee/MongoManager.coffee index d6d7b46923..fe6f06e8cb 100644 --- a/services/docstore/app/coffee/MongoManager.coffee +++ b/services/docstore/app/coffee/MongoManager.coffee @@ -2,15 +2,15 @@ module.exports = MongoManager = - findDoc: (project_id, doc_id, callback = (error, doc) ->) -> - db.docs.find {_id: ObjectId(doc_id.toString()), project_id: ObjectId(project_id.toString())}, {}, (error, docs = []) -> + findDoc: (project_id, doc_id, filter, callback = (error, doc) ->) -> + db.docs.find {_id: ObjectId(doc_id.toString()), project_id: ObjectId(project_id.toString())}, filter, (error, docs = []) -> callback error, docs[0] - getProjectsDocs: (project_id, options = {include_deleted: true}, callback)-> + getProjectsDocs: (project_id, options = {include_deleted: true}, filter, callback)-> query = {project_id: ObjectId(project_id.toString())} if !options.include_deleted query.deleted = { $ne: true } - db.docs.find query, {}, callback + db.docs.find query, filter, callback getArchivedProjectDocs: (project_id, callback)-> query = diff --git a/services/docstore/test/acceptance/coffee/UpdatingDocsTests.coffee b/services/docstore/test/acceptance/coffee/UpdatingDocsTests.coffee index 0dd60baa05..f34a4e3e76 100644 --- a/services/docstore/test/acceptance/coffee/UpdatingDocsTests.coffee +++ b/services/docstore/test/acceptance/coffee/UpdatingDocsTests.coffee @@ -76,7 +76,7 @@ describe "Applying updates to a doc", -> @body.modified.should.equal true it "should return the rev", -> - @body.rev.should.equal 2 + @body.rev.should.equal 1 it "should update the doc in the API", (done) -> DocstoreClient.getDoc @project_id, @doc_id, {}, (error, res, doc) => diff --git a/services/docstore/test/unit/coffee/DocArchiveManager.coffee b/services/docstore/test/unit/coffee/DocArchiveManager.coffee index 05abcc0fb3..cac4594dd2 100644 --- a/services/docstore/test/unit/coffee/DocArchiveManager.coffee +++ b/services/docstore/test/unit/coffee/DocArchiveManager.coffee @@ -64,8 +64,8 @@ describe "DocArchiveManager", -> @MongoManager = markDocAsArchived: sinon.stub().callsArgWith(2, null) upsertIntoDocCollection: sinon.stub().callsArgWith(3, null) - getProjectsDocs: sinon.stub().callsArgWith(2, null, @mongoDocs) - getArchivedProjectDocs: sinon.stub().callsArgWith(1, null, @mongoDocs) + getProjectsDocs: sinon.stub().callsArgWith(3, null, @mongoDocs) + getArchivedProjectDocs: sinon.stub().callsArgWith(2, null, @mongoDocs) @requires = "settings-sharelatex": @settings @@ -127,7 +127,7 @@ describe "DocArchiveManager", -> describe "archiveAllDocs", -> it "should archive all project docs which are not in s3", (done)-> - @MongoManager.getProjectsDocs = sinon.stub().callsArgWith(2, null, @mongoDocs) + @MongoManager.getProjectsDocs = sinon.stub().callsArgWith(3, null, @mongoDocs) @DocArchiveManager.archiveDoc = sinon.stub().callsArgWith(2, null) @DocArchiveManager.archiveAllDocs @project_id, (err)=> @@ -142,14 +142,14 @@ describe "DocArchiveManager", -> done() it "should return error if have no docs", (done)-> - @MongoManager.getProjectsDocs = sinon.stub().callsArgWith(2, null, null) + @MongoManager.getProjectsDocs = sinon.stub().callsArgWith(3, null, null) @DocArchiveManager.archiveAllDocs @project_id, (err)=> should.exist err done() it "should return the error", (done)-> - @MongoManager.getProjectsDocs = sinon.stub().callsArgWith(2, @error, null) + @MongoManager.getProjectsDocs = sinon.stub().callsArgWith(3, @error, null) @DocArchiveManager.archiveAllDocs @project_id, (err)=> err.should.equal @error @@ -163,7 +163,7 @@ describe "DocArchiveManager", -> while --numberOfDocs != 0 @mongoDocs.push({inS3:true, _id: ObjectId()}) - @MongoManager.getProjectsDocs = sinon.stub().callsArgWith(2, null, @mongoDocs) + @MongoManager.getProjectsDocs = sinon.stub().callsArgWith(3, null, @mongoDocs) @DocArchiveManager.archiveDoc = sinon.stub().callsArgWith(2, null) it "should not throw and error", (done)-> diff --git a/services/docstore/test/unit/coffee/DocManagerTests.coffee b/services/docstore/test/unit/coffee/DocManagerTests.coffee index c17211e1de..c1356e6e6a 100644 --- a/services/docstore/test/unit/coffee/DocManagerTests.coffee +++ b/services/docstore/test/unit/coffee/DocManagerTests.coffee @@ -92,7 +92,7 @@ describe "DocManager", -> describe "when the doc does not exist in the docs collection", -> beforeEach -> - @MongoManager.findDoc = sinon.stub().callsArgWith(2, null, null) + @MongoManager.findDoc = sinon.stub().yields(null, null) @DocManager.getDoc @project_id, @doc_id, {version: true}, @callback it "should return a NotFoundError", -> @@ -104,13 +104,14 @@ describe "DocManager", -> describe "when the project exists", -> beforeEach -> @docs = [{ _id: @doc_id, project_id: @project_id, lines: ["mock-lines"] }] - @MongoManager.getProjectsDocs = sinon.stub().callsArgWith(2, null, @docs) + @MongoManager.getProjectsDocs = sinon.stub().callsArgWith(3, null, @docs) @DocArchiveManager.unArchiveAllDocs = sinon.stub().callsArgWith(1, null, @docs) - @DocManager.getAllNonDeletedDocs @project_id, @callback + @filter = { lines: true } + @DocManager.getAllNonDeletedDocs @project_id, @filter, @callback it "should get the project from the database", -> @MongoManager.getProjectsDocs - .calledWith(@project_id, {include_deleted: false}) + .calledWith(@project_id, {include_deleted: false}, @filter) .should.equal true it "should return the docs", -> @@ -118,13 +119,13 @@ describe "DocManager", -> describe "when there are no docs for the project", -> beforeEach -> - @MongoManager.getProjectsDocs = sinon.stub().callsArgWith(2, null, null) - @DocArchiveManager.unArchiveAllDocs = sinon.stub().callsArgWith(1, null, null) - @DocManager.getAllNonDeletedDocs @project_id, @callback + @MongoManager.getProjectsDocs = sinon.stub().callsArgWith(3, null, null) + @DocArchiveManager.unArchiveAllDocs = sinon.stub().callsArgWith(1, null) + @DocManager.getAllNonDeletedDocs @project_id, @filter, @callback it "should return a NotFoundError", -> @callback - .calledWith(new Errors.NotFoundError("No such docs for project #{@project_id}")) + .calledWith(new Errors.NotFoundError("No docs for project #{@project_id}")) .should.equal true describe "deleteDoc", -> @@ -196,7 +197,7 @@ describe "DocManager", -> it "should get the existing doc", -> @DocManager.getDoc - .calledWith(@project_id, @doc_id) + .calledWith(@project_id, @doc_id, {version: true, rev: true, lines: true, version: true, ranges: true}) .should.equal true it "should upsert the document to the doc collection", -> @@ -216,11 +217,6 @@ describe "DocManager", -> @RangeManager.shouldUpdateRanges.returns true @DocManager.updateDoc @project_id, @doc_id, @oldDocLines, @version, @newRanges, @callback - it "should get the existing doc", -> - @DocManager.getDoc - .calledWith(@project_id, @doc_id) - .should.equal true - it "should upsert the ranges", -> @MongoManager.upsertIntoDocCollection .calledWith(@project_id, @doc_id, {ranges: @newRanges}) @@ -237,11 +233,6 @@ describe "DocManager", -> @DocManager.getDoc = sinon.stub().callsArgWith(3, null, @doc) @DocManager.updateDoc @project_id, @doc_id, @oldDocLines, @version + 1, @originalRanges, @callback - it "should get the existing doc with the version", -> - @DocManager.getDoc - .calledWith(@project_id, @doc_id, {version: true}) - .should.equal true - it "should not change the lines or ranges", -> @MongoManager.upsertIntoDocCollection.called.should.equal false @@ -258,11 +249,6 @@ describe "DocManager", -> @DocManager.getDoc = sinon.stub().callsArgWith(3, null, @doc) @DocManager.updateDoc @project_id, @doc_id, @oldDocLines, @version, @originalRanges, @callback - it "should get the existing doc", -> - @DocManager.getDoc - .calledWith(@project_id, @doc_id) - .should.equal true - it "should not update the ranges or lines", -> @MongoManager.upsertIntoDocCollection.called.should.equal false diff --git a/services/docstore/test/unit/coffee/HttpControllerTests.coffee b/services/docstore/test/unit/coffee/HttpControllerTests.coffee index c207a56d09..b775c5f91c 100644 --- a/services/docstore/test/unit/coffee/HttpControllerTests.coffee +++ b/services/docstore/test/unit/coffee/HttpControllerTests.coffee @@ -45,7 +45,7 @@ describe "HttpController", -> it "should get the document with the version (including deleted)", -> @DocManager.getDoc - .calledWith(@project_id, @doc_id, {version: true}) + .calledWith(@project_id, @doc_id, {lines: true, rev: true, deleted: true, version: true, ranges: true}) .should.equal true it "should return the doc as JSON", -> @@ -54,7 +54,6 @@ describe "HttpController", -> _id: @doc_id lines: @doc.lines rev: @doc.rev - deleted: false version: @doc.version }) .should.equal true @@ -68,7 +67,7 @@ describe "HttpController", -> it "should get the doc from the doc manager", -> @HttpController.getDoc @req, @res, @next - @DocManager.getDoc.calledWith(@project_id, @doc_id, {version: true}).should.equal true + @DocManager.getDoc.calledWith(@project_id, @doc_id, {lines: true, rev: true, deleted: true, version: true, ranges: true}).should.equal true it "should return 404 if the query string delete is not set ", -> @HttpController.getDoc @req, @res, @next @@ -97,7 +96,7 @@ describe "HttpController", -> it "should get the document without the version", -> @DocManager.getDoc - .calledWith(@project_id, @doc_id, {version: false}) + .calledWith(@project_id, @doc_id, {lines: true}) .should.equal true it "should set the content type header", -> @@ -120,12 +119,12 @@ describe "HttpController", -> lines: ["mock", "lines", "two"] rev: 4 }] - @DocManager.getAllNonDeletedDocs = sinon.stub().callsArgWith(1, null, @docs) + @DocManager.getAllNonDeletedDocs = sinon.stub().callsArgWith(2, null, @docs) @HttpController.getAllDocs @req, @res, @next it "should get all the (non-deleted) docs", -> @DocManager.getAllNonDeletedDocs - .calledWith(@project_id) + .calledWith(@project_id, {lines: true, rev: true}) .should.equal true it "should return the doc as JSON", -> @@ -134,12 +133,10 @@ describe "HttpController", -> _id: @docs[0]._id.toString() lines: @docs[0].lines rev: @docs[0].rev - deleted: false }, { _id: @docs[1]._id.toString() lines: @docs[1].lines rev: @docs[1].rev - deleted: false }]) .should.equal true @@ -158,7 +155,7 @@ describe "HttpController", -> lines: ["mock", "lines", "two"] rev: 4 }] - @DocManager.getAllNonDeletedDocs = sinon.stub().callsArgWith(1, null, @docs) + @DocManager.getAllNonDeletedDocs = sinon.stub().callsArgWith(2, null, @docs) @HttpController.getAllDocs @req, @res, @next it "should return the non null docs as JSON", -> @@ -167,12 +164,10 @@ describe "HttpController", -> _id: @docs[0]._id.toString() lines: @docs[0].lines rev: @docs[0].rev - deleted: false }, { _id: @docs[2]._id.toString() lines: @docs[2].lines rev: @docs[2].rev - deleted: false }]) .should.equal true diff --git a/services/docstore/test/unit/coffee/MongoManagerTests.coffee b/services/docstore/test/unit/coffee/MongoManagerTests.coffee index 642531134a..b65de2cde9 100644 --- a/services/docstore/test/unit/coffee/MongoManagerTests.coffee +++ b/services/docstore/test/unit/coffee/MongoManagerTests.coffee @@ -20,14 +20,15 @@ describe "MongoManager", -> beforeEach -> @doc = { name: "mock-doc"} @db.docs.find = sinon.stub().callsArgWith(2, null, [@doc]) - @MongoManager.findDoc @project_id, @doc_id, @callback + @filter = { lines: true } + @MongoManager.findDoc @project_id, @doc_id, @filter, @callback it "should find the doc", -> @db.docs.find .calledWith({ _id: ObjectId(@doc_id) project_id: ObjectId(@project_id) - }, {}) + }, @filter) .should.equal true it "should call the callback with the doc", -> @@ -35,6 +36,7 @@ describe "MongoManager", -> describe "getProjectsDocs", -> beforeEach -> + @filter = {lines: true} @doc1 = { name: "mock-doc1" } @doc2 = { name: "mock-doc2" } @doc3 = { name: "mock-doc3" } @@ -43,28 +45,28 @@ describe "MongoManager", -> describe "with included_deleted = false", -> beforeEach -> - @MongoManager.getProjectsDocs @project_id, include_deleted: false, @callback + @MongoManager.getProjectsDocs @project_id, include_deleted: false, @filter, @callback it "should find the non-deleted docs via the project_id", -> @db.docs.find .calledWith({ project_id: ObjectId(@project_id) deleted: { $ne: true } - }, {}) + }, @filter) .should.equal true it "should call the callback with the docs", -> @callback.calledWith(null, [@doc, @doc3, @doc4]).should.equal true describe "with included_deleted = true", -> - beforeEach -> - @MongoManager.getProjectsDocs @project_id, include_deleted: true, @callback + beforeEach -> + @MongoManager.getProjectsDocs @project_id, include_deleted: true, @filter, @callback it "should find all via the project_id", -> @db.docs.find .calledWith({ project_id: ObjectId(@project_id) - }, {}) + }, @filter) .should.equal true it "should call the callback with the docs", ->