Don't read from comment thread if no global message thread exists

This commit is contained in:
James Allen 2017-02-24 16:20:06 +01:00
parent cb47ec464e
commit 2f30732011
2 changed files with 77 additions and 50 deletions

View file

@ -6,21 +6,33 @@ module.exports = ThreadManager =
GLOBAL_THREAD: "GLOBAL" GLOBAL_THREAD: "GLOBAL"
findOrCreateThread: (project_id, thread_id, callback = (error, thread) ->) -> findOrCreateThread: (project_id, thread_id, callback = (error, thread) ->) ->
query = project_id = ObjectId(project_id.toString())
project_id: ObjectId(project_id.toString()) if thread_id != ThreadManager.GLOBAL_THREAD
thread_id = ObjectId(thread_id.toString())
if thread_id? and thread_id != ThreadManager.GLOBAL_THREAD if thread_id == ThreadManager.GLOBAL_THREAD
query.thread_id = ObjectId(thread_id.toString()) query = {
project_id: project_id
# Threads used to be called rooms, and still are in the DB thread_id: { $exists: false }
db.rooms.findOne query, (error, thread) -> }
update = {
project_id: project_id
}
else
query = {
project_id: project_id
thread_id: thread_id
}
update = {
project_id: project_id
thread_id: thread_id
}
db.rooms.update query, update, { upsert: true }, (error) ->
return callback(error) if error? return callback(error) if error?
if thread? db.rooms.find query, (error, rooms = []) ->
callback null, thread return callback(error) if error?
else return callback null, rooms[0]
db.rooms.save query, (error, thread) ->
return callback(error) if error?
callback null, thread
findAllThreadRooms: (project_id, callback = (error, rooms) ->) -> findAllThreadRooms: (project_id, callback = (error, rooms) ->) ->
db.rooms.find { db.rooms.find {

View file

@ -5,12 +5,11 @@ ChatClient = require "./helpers/ChatClient"
describe "Sending a message", -> describe "Sending a message", ->
before -> before ->
@project_id = ObjectId().toString()
@user_id = ObjectId().toString()
@thread_id = ObjectId().toString()
describe "globally", -> describe "globally", ->
before (done) -> before (done) ->
@project_id = ObjectId().toString()
@user_id = ObjectId().toString()
@content = "global message" @content = "global message"
ChatClient.sendGlobalMessage @project_id, @user_id, @content, (error, response, body) => ChatClient.sendGlobalMessage @project_id, @user_id, @content, (error, response, body) =>
expect(error).to.be.null expect(error).to.be.null
@ -30,6 +29,9 @@ describe "Sending a message", ->
describe "to a thread", -> describe "to a thread", ->
before (done) -> before (done) ->
@project_id = ObjectId().toString()
@user_id = ObjectId().toString()
@thread_id = ObjectId().toString()
@content = "thread message" @content = "thread message"
ChatClient.sendMessage @project_id, @thread_id, @user_id, @content, (error, response, body) => ChatClient.sendMessage @project_id, @thread_id, @user_id, @content, (error, response, body) =>
expect(error).to.be.null expect(error).to.be.null
@ -46,39 +48,52 @@ describe "Sending a message", ->
expect(threads[@thread_id].messages.length).to.equal 1 expect(threads[@thread_id].messages.length).to.equal 1
expect(threads[@thread_id].messages[0].content).to.equal @content expect(threads[@thread_id].messages[0].content).to.equal @content
done() done()
describe "with a malformed user_id", -> it "should not appear in the global messages", (done) ->
it "should return a graceful error", (done) -> ChatClient.getGlobalMessages @project_id, (error, response, messages) =>
ChatClient.sendMessage @project_id, @thread_id, "malformed-user", "content", (error, response, body) => expect(error).to.be.null
expect(response.statusCode).to.equal 400 expect(response.statusCode).to.equal 200
expect(body).to.equal "Invalid user_id" expect(messages.length).to.equal 0
done() done()
describe "with a malformed project_id", -> describe "failure cases", ->
it "should return a graceful error", (done) -> before () ->
ChatClient.sendMessage "malformed-project", @thread_id, @user_id, "content", (error, response, body) => @project_id = ObjectId().toString()
expect(response.statusCode).to.equal 400 @user_id = ObjectId().toString()
expect(body).to.equal "Invalid project_id" @thread_id = ObjectId().toString()
done()
describe "with a malformed user_id", ->
describe "with a malformed thread_id", -> it "should return a graceful error", (done) ->
it "should return a graceful error", (done) -> ChatClient.sendMessage @project_id, @thread_id, "malformed-user", "content", (error, response, body) =>
ChatClient.sendMessage @project_id, "malformed-thread-id", @user_id, "content", (error, response, body) => expect(response.statusCode).to.equal 400
expect(response.statusCode).to.equal 400 expect(body).to.equal "Invalid user_id"
expect(body).to.equal "Invalid thread_id" done()
done()
describe "with a malformed project_id", ->
describe "with no content", -> it "should return a graceful error", (done) ->
it "should return a graceful error", (done) -> ChatClient.sendMessage "malformed-project", @thread_id, @user_id, "content", (error, response, body) =>
ChatClient.sendMessage @project_id, @thread_id, @user_id, null, (error, response, body) => expect(response.statusCode).to.equal 400
expect(response.statusCode).to.equal 400 expect(body).to.equal "Invalid project_id"
expect(body).to.equal "No content provided" done()
done()
describe "with a malformed thread_id", ->
describe "with very long content", -> it "should return a graceful error", (done) ->
it "should return a graceful error", (done) -> ChatClient.sendMessage @project_id, "malformed-thread-id", @user_id, "content", (error, response, body) =>
content = new Buffer(10240).toString("hex") expect(response.statusCode).to.equal 400
ChatClient.sendMessage @project_id, @thread_id, @user_id, content, (error, response, body) => expect(body).to.equal "Invalid thread_id"
expect(response.statusCode).to.equal 400 done()
expect(body).to.equal "Content too long (> 10240 bytes)"
done() describe "with no content", ->
it "should return a graceful error", (done) ->
ChatClient.sendMessage @project_id, @thread_id, @user_id, null, (error, response, body) =>
expect(response.statusCode).to.equal 400
expect(body).to.equal "No content provided"
done()
describe "with very long content", ->
it "should return a graceful error", (done) ->
content = new Buffer(10240).toString("hex")
ChatClient.sendMessage @project_id, @thread_id, @user_id, content, (error, response, body) =>
expect(response.statusCode).to.equal 400
expect(body).to.equal "Content too long (> 10240 bytes)"
done()