Skip to content

Commit 0d37cb2

Browse files
committed
fix(auth): traversing through users in transition
1 parent 27d04c9 commit 0d37cb2

File tree

3 files changed

+73
-50
lines changed

3 files changed

+73
-50
lines changed

packages/auth/bin/transition.ts

Lines changed: 59 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -35,70 +35,82 @@ const requestTransition = async (
3535
const startDate = new Date(startDateString)
3636
const endDate = new Date(endDateString)
3737

38-
const users = await userRepository.findAllCreatedBetween(startDate, endDate)
38+
const usersCount = await userRepository.countAllCreatedBetween(startDate, endDate)
3939

4040
const timestamp = timer.getTimestampInMicroseconds()
4141

4242
logger.info(
43-
`[TRANSITION ${timestamp}] Found ${users.length} users created between ${startDateString} and ${endDateString}`,
43+
`[TRANSITION ${timestamp}] Found ${usersCount} users created between ${startDateString} and ${endDateString}`,
4444
)
4545

4646
let itemTransitionsTriggered = 0
4747
let revisionTransitionsTriggered = 0
4848
const forceRun = forceRunParam === 'true'
49-
for (const user of users) {
50-
const itemsTransitionStatus = await transitionStatusRepository.getStatus(user.uuid, 'items')
51-
const revisionsTransitionStatus = await transitionStatusRepository.getStatus(user.uuid, 'revisions')
5249

53-
const userRoles = await user.roles
50+
const pageLimit = 100
51+
const totalPages = Math.ceil(usersCount / pageLimit)
52+
for (let currentPage = 1; currentPage <= totalPages; currentPage++) {
53+
const users = await userRepository.findAllCreatedBetween({
54+
start: startDate,
55+
end: endDate,
56+
offset: (currentPage - 1) * pageLimit,
57+
limit: pageLimit,
58+
})
5459

55-
const userHasTransitionRole = userRoles.some((role) => role.name === RoleName.NAMES.TransitionUser)
56-
const bothTransitionStatusesAreVerified =
57-
itemsTransitionStatus?.value === TransitionStatus.STATUSES.Verified &&
58-
revisionsTransitionStatus?.value === TransitionStatus.STATUSES.Verified
60+
for (const user of users) {
61+
const itemsTransitionStatus = await transitionStatusRepository.getStatus(user.uuid, 'items')
62+
const revisionsTransitionStatus = await transitionStatusRepository.getStatus(user.uuid, 'revisions')
5963

60-
if (!userHasTransitionRole && bothTransitionStatusesAreVerified) {
61-
continue
62-
}
64+
const userRoles = await user.roles
6365

64-
logger.info(
65-
`[TRANSITION ${timestamp}] Transition status for user ${user.uuid} - items status: ${itemsTransitionStatus?.value}, revisions status: ${revisionsTransitionStatus?.value}, has transition role: ${userHasTransitionRole}`,
66-
)
67-
68-
if (
69-
itemsTransitionStatus === null ||
70-
itemsTransitionStatus.value === TransitionStatus.STATUSES.Failed ||
71-
(itemsTransitionStatus.value === TransitionStatus.STATUSES.InProgress && forceRun)
72-
) {
73-
await transitionStatusRepository.remove(user.uuid, 'items')
74-
75-
await domainEventPublisher.publish(
76-
domainEventFactory.createTransitionRequestedEvent({
77-
userUuid: user.uuid,
78-
type: 'items',
79-
timestamp,
80-
}),
81-
)
66+
const userHasTransitionRole = userRoles.some((role) => role.name === RoleName.NAMES.TransitionUser)
67+
const bothTransitionStatusesAreVerified =
68+
itemsTransitionStatus?.value === TransitionStatus.STATUSES.Verified &&
69+
revisionsTransitionStatus?.value === TransitionStatus.STATUSES.Verified
8270

83-
itemTransitionsTriggered++
84-
}
71+
if (!userHasTransitionRole && bothTransitionStatusesAreVerified) {
72+
continue
73+
}
8574

86-
if (
87-
revisionsTransitionStatus === null ||
88-
revisionsTransitionStatus.value === TransitionStatus.STATUSES.Failed ||
89-
(revisionsTransitionStatus.value === TransitionStatus.STATUSES.InProgress && forceRun)
90-
) {
91-
await transitionStatusRepository.remove(user.uuid, 'revisions')
92-
93-
await domainEventPublisher.publish(
94-
domainEventFactory.createTransitionRequestedEvent({
95-
userUuid: user.uuid,
96-
type: 'revisions',
97-
timestamp,
98-
}),
75+
logger.info(
76+
`[TRANSITION ${timestamp}] Transition status for user ${user.uuid} - items status: ${itemsTransitionStatus?.value}, revisions status: ${revisionsTransitionStatus?.value}, has transition role: ${userHasTransitionRole}`,
9977
)
10078

101-
revisionTransitionsTriggered++
79+
if (
80+
itemsTransitionStatus === null ||
81+
itemsTransitionStatus.value === TransitionStatus.STATUSES.Failed ||
82+
(itemsTransitionStatus.value === TransitionStatus.STATUSES.InProgress && forceRun)
83+
) {
84+
await transitionStatusRepository.remove(user.uuid, 'items')
85+
86+
await domainEventPublisher.publish(
87+
domainEventFactory.createTransitionRequestedEvent({
88+
userUuid: user.uuid,
89+
type: 'items',
90+
timestamp,
91+
}),
92+
)
93+
94+
itemTransitionsTriggered++
95+
}
96+
97+
if (
98+
revisionsTransitionStatus === null ||
99+
revisionsTransitionStatus.value === TransitionStatus.STATUSES.Failed ||
100+
(revisionsTransitionStatus.value === TransitionStatus.STATUSES.InProgress && forceRun)
101+
) {
102+
await transitionStatusRepository.remove(user.uuid, 'revisions')
103+
104+
await domainEventPublisher.publish(
105+
domainEventFactory.createTransitionRequestedEvent({
106+
userUuid: user.uuid,
107+
type: 'revisions',
108+
timestamp,
109+
}),
110+
)
111+
112+
revisionTransitionsTriggered++
113+
}
102114
}
103115
}
104116

packages/auth/src/Domain/User/UserRepositoryInterface.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ export interface UserRepositoryInterface {
88
streamTeam(memberEmail?: Email): Promise<ReadStream>
99
findOneByUuid(uuid: Uuid): Promise<User | null>
1010
findOneByUsernameOrEmail(usernameOrEmail: Email | Username): Promise<User | null>
11-
findAllCreatedBetween(start: Date, end: Date): Promise<User[]>
11+
findAllCreatedBetween(dto: { start: Date; end: Date; offset: number; limit: number }): Promise<User[]>
12+
countAllCreatedBetween(start: Date, end: Date): Promise<number>
1213
save(user: User): Promise<User>
1314
remove(user: User): Promise<User>
1415
}

packages/auth/src/Infra/TypeORM/TypeORMUserRepository.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,23 @@ export class TypeORMUserRepository implements UserRepositoryInterface {
1414
private ormRepository: Repository<User>,
1515
) {}
1616

17-
async findAllCreatedBetween(start: Date, end: Date): Promise<User[]> {
17+
async findAllCreatedBetween(dto: { start: Date; end: Date; offset: number; limit: number }): Promise<User[]> {
1818
return this.ormRepository
1919
.createQueryBuilder('user')
20-
.where('user.created_at BETWEEN :start AND :end', { start, end })
20+
.where('user.created_at BETWEEN :start AND :end', { start: dto.start, end: dto.end })
21+
.orderBy('user.created_at', 'ASC')
22+
.take(dto.limit)
23+
.skip(dto.offset)
2124
.getMany()
2225
}
2326

27+
async countAllCreatedBetween(start: Date, end: Date): Promise<number> {
28+
return this.ormRepository
29+
.createQueryBuilder('user')
30+
.where('user.created_at BETWEEN :start AND :end', { start, end })
31+
.getCount()
32+
}
33+
2434
async save(user: User): Promise<User> {
2535
return this.ormRepository.save(user)
2636
}

0 commit comments

Comments
 (0)