overleaf/services/chat/app/coffee/Features/Threads/ThreadManager.coffee
2017-03-17 15:16:38 +00:00

88 lines
2.2 KiB
CoffeeScript

mongojs = require("../../mongojs")
db = mongojs.db
ObjectId = mongojs.ObjectId
logger = require('logger-sharelatex')
metrics = require('metrics-sharelatex')
module.exports = ThreadManager =
GLOBAL_THREAD: "GLOBAL"
findOrCreateThread: (project_id, thread_id, callback = (error, thread) ->) ->
project_id = ObjectId(project_id.toString())
if thread_id != ThreadManager.GLOBAL_THREAD
thread_id = ObjectId(thread_id.toString())
if thread_id == ThreadManager.GLOBAL_THREAD
query = {
project_id: project_id
thread_id: { $exists: false }
}
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?
db.rooms.find query, (error, rooms = []) ->
return callback(error) if error?
return callback null, rooms[0]
findAllThreadRooms: (project_id, callback = (error, rooms) ->) ->
db.rooms.find {
project_id: ObjectId(project_id.toString())
thread_id: { $exists: true }
}, {
thread_id: 1,
resolved: 1
}, callback
resolveThread: (project_id, thread_id, user_id, callback = (error) ->) ->
db.rooms.update {
project_id: ObjectId(project_id.toString())
thread_id: ObjectId(thread_id.toString())
}, {
$set: {
resolved: {
user_id: user_id
ts: new Date()
}
}
}, callback
reopenThread: (project_id, thread_id, callback = (error) ->) ->
db.rooms.update {
project_id: ObjectId(project_id.toString())
thread_id: ObjectId(thread_id.toString())
}, {
$unset: {
resolved: true
}
}, callback
deleteThread: (project_id, thread_id, callback = (error, room_id) ->) ->
@findOrCreateThread project_id, thread_id, (error, room) ->
return callback(error) if error?
db.rooms.remove {
_id: room._id
}, (error) ->
return callback(error) if error?
return callback null, room._id
[
'findOrCreateThread',
'findAllThreadRooms',
'resolveThread',
'reopenThread',
'deleteThread',
].map (method) ->
metrics.timeAsyncMethod(ThreadManager, method, 'mongo.ThreadManager', logger)