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 metrics.timeAsyncMethod( ThreadManager, 'findOrCreateThread', 'ThreadManager.findOrCreateThread', logger ) metrics.timeAsyncMethod( ThreadManager, 'findAllThreadRooms', 'ThreadManager.findAllThreadRooms', logger ) metrics.timeAsyncMethod( ThreadManager, 'resolveThread', 'ThreadManager.resolveThread', logger ) metrics.timeAsyncMethod( ThreadManager, 'reopenThread', 'ThreadManager.reopenThread', logger ) metrics.timeAsyncMethod( ThreadManager, 'deleteThread', 'ThreadManager.deleteThread', logger )