You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.5 KiB

11 months ago
  1. const { DocumentSyncQueue } = require("../../models/documentSyncQueue");
  2. const { Document } = require("../../models/documents");
  3. const { EventLogs } = require("../../models/eventLogs");
  4. const { SystemSettings } = require("../../models/systemSettings");
  5. const { Telemetry } = require("../../models/telemetry");
  6. const { reqBody } = require("../../utils/http");
  7. const {
  8. featureFlagEnabled,
  9. } = require("../../utils/middleware/featureFlagEnabled");
  10. const {
  11. flexUserRoleValid,
  12. ROLES,
  13. } = require("../../utils/middleware/multiUserProtected");
  14. const { validWorkspaceSlug } = require("../../utils/middleware/validWorkspace");
  15. const { validatedRequest } = require("../../utils/middleware/validatedRequest");
  16. function liveSyncEndpoints(app) {
  17. if (!app) return;
  18. app.post(
  19. "/experimental/toggle-live-sync",
  20. [validatedRequest, flexUserRoleValid([ROLES.admin])],
  21. async (request, response) => {
  22. try {
  23. const { updatedStatus = false } = reqBody(request);
  24. const newStatus =
  25. SystemSettings.validations.experimental_live_file_sync(updatedStatus);
  26. const currentStatus =
  27. (await SystemSettings.get({ label: "experimental_live_file_sync" }))
  28. ?.value || "disabled";
  29. if (currentStatus === newStatus)
  30. return response
  31. .status(200)
  32. .json({ liveSyncEnabled: newStatus === "enabled" });
  33. // Already validated earlier - so can hot update.
  34. await SystemSettings._updateSettings({
  35. experimental_live_file_sync: newStatus,
  36. });
  37. if (newStatus === "enabled") {
  38. await Telemetry.sendTelemetry("experimental_feature_enabled", {
  39. feature: "live_file_sync",
  40. });
  41. await EventLogs.logEvent("experimental_feature_enabled", {
  42. feature: "live_file_sync",
  43. });
  44. DocumentSyncQueue.bootWorkers();
  45. } else {
  46. DocumentSyncQueue.killWorkers();
  47. }
  48. response.status(200).json({ liveSyncEnabled: newStatus === "enabled" });
  49. } catch (e) {
  50. console.error(e);
  51. response.status(500).end();
  52. }
  53. }
  54. );
  55. app.get(
  56. "/experimental/live-sync/queues",
  57. [
  58. validatedRequest,
  59. flexUserRoleValid([ROLES.admin]),
  60. featureFlagEnabled(DocumentSyncQueue.featureKey),
  61. ],
  62. async (_, response) => {
  63. const queues = await DocumentSyncQueue.where(
  64. {},
  65. null,
  66. { createdAt: "asc" },
  67. {
  68. workspaceDoc: {
  69. include: {
  70. workspace: true,
  71. },
  72. },
  73. }
  74. );
  75. response.status(200).json({ queues });
  76. }
  77. );
  78. // Should be in workspace routes, but is here for now.
  79. app.post(
  80. "/workspace/:slug/update-watch-status",
  81. [
  82. validatedRequest,
  83. flexUserRoleValid([ROLES.admin, ROLES.manager]),
  84. validWorkspaceSlug,
  85. featureFlagEnabled(DocumentSyncQueue.featureKey),
  86. ],
  87. async (request, response) => {
  88. try {
  89. const { docPath, watchStatus = false } = reqBody(request);
  90. const workspace = response.locals.workspace;
  91. const document = await Document.get({
  92. workspaceId: workspace.id,
  93. docpath: docPath,
  94. });
  95. if (!document) return response.sendStatus(404).end();
  96. await DocumentSyncQueue.toggleWatchStatus(document, watchStatus);
  97. return response.status(200).end();
  98. } catch (error) {
  99. console.error("Error processing the watch status update:", error);
  100. return response.status(500).end();
  101. }
  102. }
  103. );
  104. }
  105. module.exports = { liveSyncEndpoints };