fix_collaborator_refs_null.mjs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import minimist from 'minimist'
  2. import {
  3. db,
  4. ObjectId,
  5. READ_PREFERENCE_SECONDARY,
  6. } from '../app/src/infrastructure/mongodb.mjs'
  7. import lodash from 'lodash'
  8. const args = minimist(process.argv.slice(2), {
  9. boolean: ['commit'],
  10. })
  11. const run = async () => {
  12. try {
  13. const projects = await db.projectAuditLogEntries
  14. .find(
  15. {
  16. operation: 'collaborator-limit-exceeded',
  17. timestamp: {
  18. $gte: new Date('2025-03-26'),
  19. $lt: new Date('2025-04-02'),
  20. },
  21. },
  22. {
  23. readPreference: READ_PREFERENCE_SECONDARY,
  24. projection: {
  25. _id: 1,
  26. projectId: 1,
  27. },
  28. }
  29. )
  30. .toArray()
  31. const uniqueProjectIds = lodash.uniq(
  32. projects.map(p => p.projectId.toString())
  33. )
  34. console.log(
  35. `Found ${uniqueProjectIds.length} projects where collaborator-limit-exceeded operation was logged in provided date range`
  36. )
  37. let readOnlyCount = 0
  38. let pendingReviewerCount = 0
  39. let reviewerCount = 0
  40. for (const projectId of uniqueProjectIds) {
  41. if (args.commit) {
  42. const readOnlyUpdate = await db.projects.updateOne(
  43. {
  44. _id: new ObjectId(projectId),
  45. readOnly_refs: null,
  46. },
  47. {
  48. $set: {
  49. readOnly_refs: [],
  50. },
  51. }
  52. )
  53. if (readOnlyUpdate.modifiedCount > 0) {
  54. console.log(`Updated readOnly_refs for project id ${projectId}`)
  55. }
  56. readOnlyCount += readOnlyUpdate.modifiedCount
  57. } else {
  58. const project = await db.projects.findOne(
  59. {
  60. _id: new ObjectId(projectId),
  61. readOnly_refs: null,
  62. },
  63. {
  64. projection: {
  65. _id: 1,
  66. readOnly_refs: 1,
  67. },
  68. }
  69. )
  70. if (project) {
  71. readOnlyCount++
  72. console.log(
  73. `Dry run: Would update readOnly_refs for project id ${projectId}`
  74. )
  75. }
  76. }
  77. if (args.commit) {
  78. const pendingReviewerUpdate = await db.projects.updateOne(
  79. {
  80. _id: new ObjectId(projectId),
  81. pendingReviewer_refs: null,
  82. },
  83. {
  84. $set: {
  85. pendingReviewer_refs: [],
  86. },
  87. }
  88. )
  89. if (pendingReviewerUpdate.modifiedCount > 0) {
  90. console.log(
  91. `Updated pendingReviewer_refs for project id ${projectId}`
  92. )
  93. }
  94. pendingReviewerCount += pendingReviewerUpdate.modifiedCount
  95. } else {
  96. const project = await db.projects.findOne(
  97. {
  98. _id: new ObjectId(projectId),
  99. pendingReviewer_refs: null,
  100. },
  101. {
  102. projection: {
  103. _id: 1,
  104. pendingReviewer_refs: 1,
  105. },
  106. }
  107. )
  108. if (project) {
  109. pendingReviewerCount++
  110. console.log(
  111. `Dry run: Would update pendingReviewer_refs for project id ${projectId}`
  112. )
  113. }
  114. }
  115. if (args.commit) {
  116. const reviewerUpdate = await db.projects.updateOne(
  117. {
  118. _id: new ObjectId(projectId),
  119. reviewer_refs: null,
  120. },
  121. {
  122. $set: {
  123. reviewer_refs: [],
  124. },
  125. }
  126. )
  127. reviewerCount += reviewerUpdate.modifiedCount
  128. } else {
  129. const project = await db.projects.findOne(
  130. {
  131. _id: new ObjectId(projectId),
  132. reviewer_refs: null,
  133. },
  134. {
  135. projection: {
  136. _id: 1,
  137. reviewer_refs: 1,
  138. },
  139. }
  140. )
  141. if (project) {
  142. reviewerCount++
  143. console.log(
  144. `Dry run: Would update reviewer_refs for project id ${projectId}`
  145. )
  146. }
  147. }
  148. }
  149. if (args.commit) {
  150. console.log(
  151. `Updated readOnly_refs for ${readOnlyCount} projects, pendingReviewer_refs for ${pendingReviewerCount} projects, and reviewer_refs for ${reviewerCount} projects.`
  152. )
  153. } else {
  154. console.log(
  155. `Dry run: Would update readOnly_refs for ${readOnlyCount} projects, pendingReviewer_refs for ${pendingReviewerCount} projects, and reviewer_refs for ${reviewerCount} projects.`
  156. )
  157. }
  158. process.exit(0)
  159. } catch (err) {
  160. console.error('Error while processing projects:', err)
  161. process.exit(1)
  162. }
  163. }
  164. run()