RedisTransitionStatusRepository.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import * as IORedis from 'ioredis'
  2. import { TransitionStatusRepositoryInterface } from '../../Domain/Transition/TransitionStatusRepositoryInterface'
  3. export class RedisTransitionStatusRepository implements TransitionStatusRepositoryInterface {
  4. private readonly PREFIX = 'transition'
  5. constructor(private redisClient: IORedis.Redis) {}
  6. async getStatuses(
  7. transitionType: 'items' | 'revisions',
  8. ): Promise<{ userUuid: string; status: 'STARTED' | 'IN_PROGRESS' | 'FAILED' }[]> {
  9. const keys = await this.redisClient.keys(`${this.PREFIX}:${transitionType}:*`)
  10. const statuses = await Promise.all(
  11. keys.map(async (key) => {
  12. const userUuid = key.split(':')[2]
  13. const status = (await this.redisClient.get(key)) as 'STARTED' | 'IN_PROGRESS' | 'FAILED'
  14. return { userUuid, status }
  15. }),
  16. )
  17. return statuses
  18. }
  19. async updateStatus(
  20. userUuid: string,
  21. transitionType: 'items' | 'revisions',
  22. status: 'STARTED' | 'IN_PROGRESS' | 'FAILED',
  23. ): Promise<void> {
  24. if (status === 'IN_PROGRESS') {
  25. await this.redisClient.setex(`${this.PREFIX}:${transitionType}:${userUuid}`, 7200, status)
  26. } else {
  27. await this.redisClient.set(`${this.PREFIX}:${transitionType}:${userUuid}`, status)
  28. }
  29. }
  30. async removeStatus(userUuid: string, transitionType: 'items' | 'revisions'): Promise<void> {
  31. await this.redisClient.del(`${this.PREFIX}:${transitionType}:${userUuid}`)
  32. }
  33. async getStatus(
  34. userUuid: string,
  35. transitionType: 'items' | 'revisions',
  36. ): Promise<'STARTED' | 'IN_PROGRESS' | 'FAILED' | null> {
  37. const status = (await this.redisClient.get(`${this.PREFIX}:${transitionType}:${userUuid}`)) as
  38. | 'STARTED'
  39. | 'IN_PROGRESS'
  40. | 'FAILED'
  41. | null
  42. return status
  43. }
  44. }