SnapshotManager.coffee 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. {db, ObjectId} = require "./mongojs"
  2. module.exports = SnapshotManager =
  3. recordSnapshot: (project_id, doc_id, version, pathname, lines, ranges, callback) ->
  4. try
  5. project_id = ObjectId(project_id)
  6. doc_id = ObjectId(doc_id)
  7. catch error
  8. return callback(error)
  9. db.docSnapshots.insert {
  10. project_id, doc_id, version, lines, pathname,
  11. ranges: SnapshotManager.jsonRangesToMongo(ranges),
  12. ts: new Date()
  13. }, callback
  14. # Suggested indexes:
  15. # db.docSnapshots.createIndex({project_id:1, doc_id:1})
  16. # db.docSnapshots.createIndex({ts:1},{expiresAfterSeconds: 30*24*3600)) # expires after 30 days
  17. jsonRangesToMongo: (ranges) ->
  18. return null if !ranges?
  19. updateMetadata = (metadata) ->
  20. if metadata?.ts?
  21. metadata.ts = new Date(metadata.ts)
  22. if metadata?.user_id?
  23. metadata.user_id = SnapshotManager._safeObjectId(metadata.user_id)
  24. for change in ranges.changes or []
  25. change.id = SnapshotManager._safeObjectId(change.id)
  26. updateMetadata(change.metadata)
  27. for comment in ranges.comments or []
  28. comment.id = SnapshotManager._safeObjectId(comment.id)
  29. if comment.op?.t?
  30. comment.op.t = SnapshotManager._safeObjectId(comment.op.t)
  31. updateMetadata(comment.metadata)
  32. return ranges
  33. _safeObjectId: (data) ->
  34. try
  35. return ObjectId(data)
  36. catch error
  37. return data