Brian Gough 9 лет назад
Родитель
Сommit
b9b0596d83

+ 21 - 10
services/docstore/app/coffee/DocManager.coffee

@@ -55,17 +55,28 @@ module.exports = DocManager =
 				return callback(err)
 			callback(err, doc)
 
-	getAllNonDeletedDocs: (project_id, filter, callback = (error, docs) ->) ->
-		DocArchive.unArchiveAllDocs project_id, (error) ->
-			if error?
+	_getAllDocs: (project_id, filter, callback = (error, docs) ->) ->
+		MongoManager.getProjectsDocs project_id, {include_deleted: false}, filter, (error, docs) ->
+			if err?
 				return callback(error)
-			MongoManager.getProjectsDocs project_id, {include_deleted: false}, filter, (error, docs) ->
-				if err?
-					return callback(error)
-				else if !docs?
-					return callback new Errors.NotFoundError("No docs for project #{project_id}")
-				else
-					return callback(null, docs)
+			else if !docs?
+				return callback new Errors.NotFoundError("No docs for project #{project_id}")
+			else
+				callback(null, docs)
+
+	getAllNonDeletedDocs: (project_id, filter, callback = (error, docs) ->) ->
+		DocManager._getAllDocs project_id, filter, (error, docs) ->
+			return callback(error) if error?
+			# check if any docs have been archived
+			docsInS3 = (doc for doc in docs when doc?.inS3)
+			if docsInS3.length > 0
+				DocArchive.unArchiveAllDocs project_id, (error) ->
+					if error?
+						logger.err err:error, project_id:project_id, "error unarchiving docs"
+						return callback(error)
+					DocManager._getAllDocs project_id, filter, callback
+			else
+				return callback(null, docs)
 
 	updateDoc: (project_id, doc_id, lines, version, ranges, callback = (error, modified, rev) ->) ->
 		if !lines? or !version? or !ranges?

+ 23 - 0
services/docstore/test/unit/coffee/DocManagerTests.coffee

@@ -215,6 +215,29 @@ describe "DocManager", ->
 					.calledWith(new Errors.NotFoundError("No docs for project #{@project_id}"))
 					.should.equal true
 
+		describe "when there are some archived docs for the project", ->
+			beforeEach ->
+				@stubs = [{ _id: @doc_id, project_id: @project_id, inS3:true }]
+				@docs = [{ _id: @doc_id, project_id: @project_id, lines: ["mock-lines"] }]
+				@MongoManager.getProjectsDocs = sinon.stub()
+					.callsArgWith(3, null, @stubs) # first call
+					.callsArgWith(3, null, @docs)  # second call (after unarchiving)
+				@DocArchiveManager.unArchiveAllDocs = sinon.stub().callsArgWith(1, null)
+				@DocManager.getAllNonDeletedDocs @project_id, @filter, @callback
+
+			it "should get the project from the database", ->
+				@MongoManager.getProjectsDocs
+					.calledWith(@project_id, {include_deleted: false}, @filter)
+					.should.equal true
+
+			it "should unarchive the documents", ->
+				@DocArchiveManager.unArchiveAllDocs
+					.calledWith(@project_id)
+					.should.equal true
+
+			it "should return the docs", ->
+				@callback.calledWith(null, @docs).should.equal true
+
 	describe "deleteDoc", ->
 		describe "when the doc exists", ->
 			beforeEach ->