Procházet zdrojové kódy

feat(auth): add procedure to transition users created between dates (#816)

Karol Sójko před 1 rokem
rodič
revize
e95ba61c7f

+ 66 - 0
packages/auth/bin/transition.ts

@@ -0,0 +1,66 @@
+import 'reflect-metadata'
+
+import { Logger } from 'winston'
+import * as dayjs from 'dayjs'
+import * as utc from 'dayjs/plugin/utc'
+
+import { ContainerConfigLoader } from '../src/Bootstrap/Container'
+import TYPES from '../src/Bootstrap/Types'
+import { Env } from '../src/Bootstrap/Env'
+import { DomainEventPublisherInterface } from '@standardnotes/domain-events'
+import { DomainEventFactoryInterface } from '../src/Domain/Event/DomainEventFactoryInterface'
+import { UserRepositoryInterface } from '../src/Domain/User/UserRepositoryInterface'
+
+const inputArgs = process.argv.slice(2)
+const startDateString = inputArgs[0]
+const endDateString = inputArgs[1]
+
+const requestTransition = async (
+  userRepository: UserRepositoryInterface,
+  logger: Logger,
+  domainEventFactory: DomainEventFactoryInterface,
+  domainEventPublisher: DomainEventPublisherInterface,
+): Promise<void> => {
+  const startDate = new Date(startDateString)
+  const endDate = new Date(endDateString)
+
+  const users = await userRepository.findAllCreatedBetween(startDate, endDate)
+
+  logger.info(`Found ${users.length} users created between ${startDateString} and ${endDateString}`)
+
+  for (const user of users) {
+    const transitionRequestedEvent = domainEventFactory.createTransitionRequestedEvent({ userUuid: user.uuid })
+
+    await domainEventPublisher.publish(transitionRequestedEvent)
+  }
+}
+
+const container = new ContainerConfigLoader()
+void container.load().then((container) => {
+  dayjs.extend(utc)
+
+  const env: Env = new Env()
+  env.load()
+
+  const logger: Logger = container.get(TYPES.Auth_Logger)
+
+  logger.info(`Starting transition request for users created between ${startDateString} and ${endDateString}`)
+
+  const userRepository: UserRepositoryInterface = container.get(TYPES.Auth_UserRepository)
+  const domainEventFactory: DomainEventFactoryInterface = container.get(TYPES.Auth_DomainEventFactory)
+  const domainEventPublisher: DomainEventPublisherInterface = container.get(TYPES.Auth_DomainEventPublisher)
+
+  Promise.resolve(requestTransition(userRepository, logger, domainEventFactory, domainEventPublisher))
+    .then(() => {
+      logger.info(`Finished transition request for users created between ${startDateString} and ${endDateString}`)
+
+      process.exit(0)
+    })
+    .catch((error) => {
+      logger.error(
+        `Error while requesting transition for users created between ${startDateString} and ${endDateString}: ${error}`,
+      )
+
+      process.exit(1)
+    })
+})

+ 11 - 0
packages/auth/docker/entrypoint-transition.js

@@ -0,0 +1,11 @@
+'use strict'
+
+const path = require('path')
+
+const pnp = require(path.normalize(path.resolve(__dirname, '../../..', '.pnp.cjs'))).setup()
+
+const index = require(path.normalize(path.resolve(__dirname, '../dist/bin/transition.js')))
+
+Object.defineProperty(exports, '__esModule', { value: true })
+
+exports.default = index

+ 7 - 0
packages/auth/docker/entrypoint.sh

@@ -55,6 +55,13 @@ case "$COMMAND" in
     node docker/entrypoint-backup.js one_drive daily
     ;;
 
+  'transition' )
+    START_DATE=$1 && shift 1
+    END_DATE=$1 && shift 1
+    echo "[Docker] Starting Transition..."
+    node docker/entrypoint-transition.js $START_DATE $END_DATE
+    ;;
+
    * )
     echo "[Docker] Unknown command"
     ;;

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

@@ -8,6 +8,7 @@ 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[]>
   save(user: User): Promise<User>
   remove(user: User): Promise<User>
 }

+ 7 - 0
packages/auth/src/Infra/TypeORM/TypeORMUserRepository.ts

@@ -14,6 +14,13 @@ export class TypeORMUserRepository implements UserRepositoryInterface {
     private ormRepository: Repository<User>,
   ) {}
 
+  async findAllCreatedBetween(start: Date, end: Date): Promise<User[]> {
+    return this.ormRepository
+      .createQueryBuilder('user')
+      .where('user.created_at BETWEEN :start AND :end', { start, end })
+      .getMany()
+  }
+
   async save(user: User): Promise<User> {
     return this.ormRepository.save(user)
   }