Mongo.mjs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import OError from '@overleaf/o-error'
  2. import mongodb from 'mongodb-legacy'
  3. import { ObjectId as MongooseObjectId } from 'mongoose'
  4. const { ObjectId } = mongodb
  5. function _getObjectIdInstance(id) {
  6. if (typeof id === 'string') {
  7. return new ObjectId(id)
  8. } else if (id instanceof ObjectId) {
  9. return id
  10. } else if (id instanceof MongooseObjectId) {
  11. return new ObjectId(id.toString())
  12. } else {
  13. throw new OError('unexpected object id', { id })
  14. }
  15. }
  16. function normalizeQuery(query) {
  17. if (!query) {
  18. throw new Error('no query provided')
  19. }
  20. if (
  21. typeof query === 'string' ||
  22. query instanceof ObjectId ||
  23. query instanceof MongooseObjectId
  24. ) {
  25. return { _id: _getObjectIdInstance(query) }
  26. } else if (typeof query._id === 'string') {
  27. query._id = new ObjectId(query._id)
  28. return query
  29. } else {
  30. return query
  31. }
  32. }
  33. function normalizeMultiQuery(query) {
  34. if (query instanceof Set) {
  35. query = Array.from(query)
  36. }
  37. if (Array.isArray(query)) {
  38. return { _id: { $in: query.map(id => _getObjectIdInstance(id)) } }
  39. } else {
  40. return normalizeQuery(query)
  41. }
  42. }
  43. function isObjectIdInstance(id) {
  44. return id instanceof ObjectId || id instanceof MongooseObjectId
  45. }
  46. export default {
  47. isObjectIdInstance,
  48. normalizeQuery,
  49. normalizeMultiQuery,
  50. }