Bläddra i källkod

fix(auth): traversing through users in transition

Karol Sójko 1 år sedan
förälder
incheckning
0d37cb293c

+ 59 - 47
packages/auth/bin/transition.ts

@@ -35,70 +35,82 @@ const requestTransition = async (
   const startDate = new Date(startDateString)
   const endDate = new Date(endDateString)
 
-  const users = await userRepository.findAllCreatedBetween(startDate, endDate)
+  const usersCount = await userRepository.countAllCreatedBetween(startDate, endDate)
 
   const timestamp = timer.getTimestampInMicroseconds()
 
   logger.info(
-    `[TRANSITION ${timestamp}] Found ${users.length} users created between ${startDateString} and ${endDateString}`,
+    `[TRANSITION ${timestamp}] Found ${usersCount} users created between ${startDateString} and ${endDateString}`,
   )
 
   let itemTransitionsTriggered = 0
   let revisionTransitionsTriggered = 0
   const forceRun = forceRunParam === 'true'
-  for (const user of users) {
-    const itemsTransitionStatus = await transitionStatusRepository.getStatus(user.uuid, 'items')
-    const revisionsTransitionStatus = await transitionStatusRepository.getStatus(user.uuid, 'revisions')
 
-    const userRoles = await user.roles
+  const pageLimit = 100
+  const totalPages = Math.ceil(usersCount / pageLimit)
+  for (let currentPage = 1; currentPage <= totalPages; currentPage++) {
+    const users = await userRepository.findAllCreatedBetween({
+      start: startDate,
+      end: endDate,
+      offset: (currentPage - 1) * pageLimit,
+      limit: pageLimit,
+    })
 
-    const userHasTransitionRole = userRoles.some((role) => role.name === RoleName.NAMES.TransitionUser)
-    const bothTransitionStatusesAreVerified =
-      itemsTransitionStatus?.value === TransitionStatus.STATUSES.Verified &&
-      revisionsTransitionStatus?.value === TransitionStatus.STATUSES.Verified
+    for (const user of users) {
+      const itemsTransitionStatus = await transitionStatusRepository.getStatus(user.uuid, 'items')
+      const revisionsTransitionStatus = await transitionStatusRepository.getStatus(user.uuid, 'revisions')
 
-    if (!userHasTransitionRole && bothTransitionStatusesAreVerified) {
-      continue
-    }
+      const userRoles = await user.roles
 
-    logger.info(
-      `[TRANSITION ${timestamp}] Transition status for user ${user.uuid} - items status: ${itemsTransitionStatus?.value}, revisions status: ${revisionsTransitionStatus?.value}, has transition role: ${userHasTransitionRole}`,
-    )
-
-    if (
-      itemsTransitionStatus === null ||
-      itemsTransitionStatus.value === TransitionStatus.STATUSES.Failed ||
-      (itemsTransitionStatus.value === TransitionStatus.STATUSES.InProgress && forceRun)
-    ) {
-      await transitionStatusRepository.remove(user.uuid, 'items')
-
-      await domainEventPublisher.publish(
-        domainEventFactory.createTransitionRequestedEvent({
-          userUuid: user.uuid,
-          type: 'items',
-          timestamp,
-        }),
-      )
+      const userHasTransitionRole = userRoles.some((role) => role.name === RoleName.NAMES.TransitionUser)
+      const bothTransitionStatusesAreVerified =
+        itemsTransitionStatus?.value === TransitionStatus.STATUSES.Verified &&
+        revisionsTransitionStatus?.value === TransitionStatus.STATUSES.Verified
 
-      itemTransitionsTriggered++
-    }
+      if (!userHasTransitionRole && bothTransitionStatusesAreVerified) {
+        continue
+      }
 
-    if (
-      revisionsTransitionStatus === null ||
-      revisionsTransitionStatus.value === TransitionStatus.STATUSES.Failed ||
-      (revisionsTransitionStatus.value === TransitionStatus.STATUSES.InProgress && forceRun)
-    ) {
-      await transitionStatusRepository.remove(user.uuid, 'revisions')
-
-      await domainEventPublisher.publish(
-        domainEventFactory.createTransitionRequestedEvent({
-          userUuid: user.uuid,
-          type: 'revisions',
-          timestamp,
-        }),
+      logger.info(
+        `[TRANSITION ${timestamp}] Transition status for user ${user.uuid} - items status: ${itemsTransitionStatus?.value}, revisions status: ${revisionsTransitionStatus?.value}, has transition role: ${userHasTransitionRole}`,
       )
 
-      revisionTransitionsTriggered++
+      if (
+        itemsTransitionStatus === null ||
+        itemsTransitionStatus.value === TransitionStatus.STATUSES.Failed ||
+        (itemsTransitionStatus.value === TransitionStatus.STATUSES.InProgress && forceRun)
+      ) {
+        await transitionStatusRepository.remove(user.uuid, 'items')
+
+        await domainEventPublisher.publish(
+          domainEventFactory.createTransitionRequestedEvent({
+            userUuid: user.uuid,
+            type: 'items',
+            timestamp,
+          }),
+        )
+
+        itemTransitionsTriggered++
+      }
+
+      if (
+        revisionsTransitionStatus === null ||
+        revisionsTransitionStatus.value === TransitionStatus.STATUSES.Failed ||
+        (revisionsTransitionStatus.value === TransitionStatus.STATUSES.InProgress && forceRun)
+      ) {
+        await transitionStatusRepository.remove(user.uuid, 'revisions')
+
+        await domainEventPublisher.publish(
+          domainEventFactory.createTransitionRequestedEvent({
+            userUuid: user.uuid,
+            type: 'revisions',
+            timestamp,
+          }),
+        )
+
+        revisionTransitionsTriggered++
+      }
     }
   }
 

+ 2 - 1
packages/auth/src/Domain/User/UserRepositoryInterface.ts

@@ -8,7 +8,8 @@ export interface UserRepositoryInterface {
   streamTeam(memberEmail?: Email): Promise<ReadStream>
   findOneByUuid(uuid: Uuid): Promise<User | null>
   findOneByUsernameOrEmail(usernameOrEmail: Email | Username): Promise<User | null>
-  findAllCreatedBetween(start: Date, end: Date): Promise<User[]>
+  findAllCreatedBetween(dto: { start: Date; end: Date; offset: number; limit: number }): Promise<User[]>
+  countAllCreatedBetween(start: Date, end: Date): Promise<number>
   save(user: User): Promise<User>
   remove(user: User): Promise<User>
 }

+ 12 - 2
packages/auth/src/Infra/TypeORM/TypeORMUserRepository.ts

@@ -14,13 +14,23 @@ export class TypeORMUserRepository implements UserRepositoryInterface {
     private ormRepository: Repository<User>,
   ) {}
 
-  async findAllCreatedBetween(start: Date, end: Date): Promise<User[]> {
+  async findAllCreatedBetween(dto: { start: Date; end: Date; offset: number; limit: number }): Promise<User[]> {
     return this.ormRepository
       .createQueryBuilder('user')
-      .where('user.created_at BETWEEN :start AND :end', { start, end })
+      .where('user.created_at BETWEEN :start AND :end', { start: dto.start, end: dto.end })
+      .orderBy('user.created_at', 'ASC')
+      .take(dto.limit)
+      .skip(dto.offset)
       .getMany()
   }
 
+  async countAllCreatedBetween(start: Date, end: Date): Promise<number> {
+    return this.ormRepository
+      .createQueryBuilder('user')
+      .where('user.created_at BETWEEN :start AND :end', { start, end })
+      .getCount()
+  }
+
   async save(user: User): Promise<User> {
     return this.ormRepository.save(user)
   }