ChatApiHandler.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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 getThread(projectId, threadId) {
  6. return await fetchJson(chatApiUrl(`/project/${projectId}/thread/${threadId}`))
  7. }
  8. async function getThreads(projectId) {
  9. return await fetchJson(chatApiUrl(`/project/${projectId}/threads`))
  10. }
  11. async function destroyProject(projectId) {
  12. await fetchNothing(chatApiUrl(`/project/${projectId}`), { method: 'DELETE' })
  13. }
  14. async function sendGlobalMessage(projectId, userId, content) {
  15. const message = await fetchJson(
  16. chatApiUrl(`/project/${projectId}/messages`),
  17. {
  18. method: 'POST',
  19. json: { user_id: userId, content },
  20. }
  21. )
  22. return message
  23. }
  24. async function getGlobalMessages(projectId, limit, before) {
  25. const url = chatApiUrl(`/project/${projectId}/messages`)
  26. if (limit != null) {
  27. url.searchParams.set('limit', limit)
  28. }
  29. if (before != null) {
  30. url.searchParams.set('before', before)
  31. }
  32. return await fetchJson(url)
  33. }
  34. async function getGlobalMessage(projectId, messageId) {
  35. return await fetchJson(
  36. chatApiUrl(`/project/${projectId}/messages/${messageId}`)
  37. )
  38. }
  39. async function sendComment(projectId, threadId, userId, content) {
  40. const comment = await fetchJson(
  41. chatApiUrl(`/project/${projectId}/thread/${threadId}/messages`),
  42. {
  43. method: 'POST',
  44. json: { user_id: userId, content },
  45. }
  46. )
  47. return comment
  48. }
  49. async function resolveThread(projectId, threadId, userId) {
  50. await fetchNothing(
  51. chatApiUrl(`/project/${projectId}/thread/${threadId}/resolve`),
  52. {
  53. method: 'POST',
  54. json: { user_id: userId },
  55. }
  56. )
  57. }
  58. async function reopenThread(projectId, threadId) {
  59. await fetchNothing(
  60. chatApiUrl(`/project/${projectId}/thread/${threadId}/reopen`),
  61. { method: 'POST' }
  62. )
  63. }
  64. async function deleteThread(projectId, threadId) {
  65. await fetchNothing(chatApiUrl(`/project/${projectId}/thread/${threadId}`), {
  66. method: 'DELETE',
  67. })
  68. }
  69. async function editMessage(projectId, threadId, messageId, userId, content) {
  70. await fetchNothing(
  71. chatApiUrl(
  72. `/project/${projectId}/thread/${threadId}/messages/${messageId}/edit`
  73. ),
  74. {
  75. method: 'POST',
  76. json: { content, userId },
  77. }
  78. )
  79. }
  80. async function editGlobalMessage(projectId, messageId, userId, content) {
  81. await fetchNothing(
  82. chatApiUrl(`/project/${projectId}/messages/${messageId}/edit`),
  83. {
  84. method: 'POST',
  85. json: { content, userId },
  86. }
  87. )
  88. }
  89. async function deleteMessage(projectId, threadId, messageId) {
  90. await fetchNothing(
  91. chatApiUrl(
  92. `/project/${projectId}/thread/${threadId}/messages/${messageId}`
  93. ),
  94. { method: 'DELETE' }
  95. )
  96. }
  97. async function deleteUserMessage(projectId, threadId, userId, messageId) {
  98. await fetchNothing(
  99. chatApiUrl(
  100. `/project/${projectId}/thread/${threadId}/user/${userId}/messages/${messageId}`
  101. ),
  102. { method: 'DELETE' }
  103. )
  104. }
  105. async function deleteGlobalMessage(projectId, messageId) {
  106. await fetchNothing(
  107. chatApiUrl(`/project/${projectId}/messages/${messageId}`),
  108. { method: 'DELETE' }
  109. )
  110. }
  111. async function getResolvedThreadIds(projectId) {
  112. const body = await fetchJson(
  113. chatApiUrl(`/project/${projectId}/resolved-thread-ids`)
  114. )
  115. return body.resolvedThreadIds
  116. }
  117. async function duplicateCommentThreads(projectId, threads) {
  118. return await fetchJson(
  119. chatApiUrl(`/project/${projectId}/duplicate-comment-threads`),
  120. {
  121. method: 'POST',
  122. json: {
  123. threads,
  124. },
  125. }
  126. )
  127. }
  128. async function generateThreadData(projectId, threads) {
  129. return await fetchJson(
  130. chatApiUrl(`/project/${projectId}/generate-thread-data`),
  131. {
  132. method: 'POST',
  133. json: { threads },
  134. }
  135. )
  136. }
  137. function chatApiUrl(path) {
  138. return new URL(path, settings.apis.chat.internal_url)
  139. }
  140. module.exports = {
  141. getThread: callbackify(getThread),
  142. getThreads: callbackify(getThreads),
  143. destroyProject: callbackify(destroyProject),
  144. sendGlobalMessage: callbackify(sendGlobalMessage),
  145. getGlobalMessages: callbackify(getGlobalMessages),
  146. getGlobalMessage: callbackify(getGlobalMessage),
  147. sendComment: callbackify(sendComment),
  148. resolveThread: callbackify(resolveThread),
  149. reopenThread: callbackify(reopenThread),
  150. deleteThread: callbackify(deleteThread),
  151. editMessage: callbackify(editMessage),
  152. editGlobalMessage: callbackify(editGlobalMessage),
  153. deleteMessage: callbackify(deleteMessage),
  154. deleteUserMessage: callbackify(deleteUserMessage),
  155. deleteGlobalMessage: callbackify(deleteGlobalMessage),
  156. getResolvedThreadIds: callbackify(getResolvedThreadIds),
  157. duplicateCommentThreads: callbackify(duplicateCommentThreads),
  158. generateThreadData: callbackify(generateThreadData),
  159. promises: {
  160. getThread,
  161. getThreads,
  162. destroyProject,
  163. sendGlobalMessage,
  164. getGlobalMessages,
  165. getGlobalMessage,
  166. sendComment,
  167. resolveThread,
  168. reopenThread,
  169. deleteThread,
  170. editMessage,
  171. editGlobalMessage,
  172. deleteMessage,
  173. deleteUserMessage,
  174. deleteGlobalMessage,
  175. getResolvedThreadIds,
  176. duplicateCommentThreads,
  177. generateThreadData,
  178. },
  179. }