ChatApiHandler.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // @ts-check
  2. const { fetchJson, fetchNothing } = require('@overleaf/fetch-utils')
  3. const settings = require('@overleaf/settings')
  4. const { callbackify } = require('util')
  5. async function getThreads(projectId) {
  6. return await fetchJson(chatApiUrl(`/project/${projectId}/threads`))
  7. }
  8. async function destroyProject(projectId) {
  9. await fetchNothing(chatApiUrl(`/project/${projectId}`), { method: 'DELETE' })
  10. }
  11. async function sendGlobalMessage(projectId, userId, content) {
  12. const message = await fetchJson(
  13. chatApiUrl(`/project/${projectId}/messages`),
  14. {
  15. method: 'POST',
  16. json: { user_id: userId, content },
  17. }
  18. )
  19. return message
  20. }
  21. async function getGlobalMessages(projectId, limit, before) {
  22. const url = chatApiUrl(`/project/${projectId}/messages`)
  23. if (limit != null) {
  24. url.searchParams.set('limit', limit)
  25. }
  26. if (before != null) {
  27. url.searchParams.set('before', before)
  28. }
  29. return await fetchJson(url)
  30. }
  31. async function sendComment(projectId, threadId, userId, content) {
  32. const comment = await fetchJson(
  33. chatApiUrl(`/project/${projectId}/thread/${threadId}/messages`),
  34. {
  35. method: 'POST',
  36. json: { user_id: userId, content },
  37. }
  38. )
  39. return comment
  40. }
  41. async function resolveThread(projectId, threadId, userId) {
  42. await fetchNothing(
  43. chatApiUrl(`/project/${projectId}/thread/${threadId}/resolve`),
  44. {
  45. method: 'POST',
  46. json: { user_id: userId },
  47. }
  48. )
  49. }
  50. async function reopenThread(projectId, threadId) {
  51. await fetchNothing(
  52. chatApiUrl(`/project/${projectId}/thread/${threadId}/reopen`),
  53. { method: 'POST' }
  54. )
  55. }
  56. async function deleteThread(projectId, threadId) {
  57. await fetchNothing(chatApiUrl(`/project/${projectId}/thread/${threadId}`), {
  58. method: 'DELETE',
  59. })
  60. }
  61. async function editMessage(projectId, threadId, messageId, userId, content) {
  62. await fetchNothing(
  63. chatApiUrl(
  64. `/project/${projectId}/thread/${threadId}/messages/${messageId}/edit`
  65. ),
  66. {
  67. method: 'POST',
  68. json: { content, userId },
  69. }
  70. )
  71. }
  72. async function deleteMessage(projectId, threadId, messageId) {
  73. await fetchNothing(
  74. chatApiUrl(
  75. `/project/${projectId}/thread/${threadId}/messages/${messageId}`
  76. ),
  77. { method: 'DELETE' }
  78. )
  79. }
  80. async function getResolvedThreadIds(projectId) {
  81. const body = await fetchJson(
  82. chatApiUrl(`/project/${projectId}/resolved-thread-ids`)
  83. )
  84. return body.resolvedThreadIds
  85. }
  86. function chatApiUrl(path) {
  87. return new URL(path, settings.apis.chat.internal_url)
  88. }
  89. module.exports = {
  90. getThreads: callbackify(getThreads),
  91. destroyProject: callbackify(destroyProject),
  92. sendGlobalMessage: callbackify(sendGlobalMessage),
  93. getGlobalMessages: callbackify(getGlobalMessages),
  94. sendComment: callbackify(sendComment),
  95. resolveThread: callbackify(resolveThread),
  96. reopenThread: callbackify(reopenThread),
  97. deleteThread: callbackify(deleteThread),
  98. editMessage: callbackify(editMessage),
  99. deleteMessage: callbackify(deleteMessage),
  100. getResolvedThreadIds: callbackify(getResolvedThreadIds),
  101. promises: {
  102. getThreads,
  103. destroyProject,
  104. sendGlobalMessage,
  105. getGlobalMessages,
  106. sendComment,
  107. resolveThread,
  108. reopenThread,
  109. deleteThread,
  110. editMessage,
  111. deleteMessage,
  112. getResolvedThreadIds,
  113. },
  114. }