import { InjectRepository } from '@nestjs/typeorm'; import { Scope } from '@nestjs/common'; import { Repository, In } from 'typeorm'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; import { WorkspaceGoogleCalendarSyncService } from 'src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.service'; import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; import { MessageQueue } from 'src/engine/integrations/message-queue/message-queue.constants'; import { Processor } from 'src/engine/integrations/message-queue/decorators/processor.decorator'; import { Process } from 'src/engine/integrations/message-queue/decorators/process.decorator'; @Processor({ queueName: MessageQueue.cronQueue, scope: Scope.REQUEST, }) export class GoogleCalendarSyncCronJob { constructor( @InjectRepository(Workspace, 'core') private readonly workspaceRepository: Repository, @InjectRepository(DataSourceEntity, 'metadata') private readonly dataSourceRepository: Repository, private readonly workspaceGoogleCalendarSyncService: WorkspaceGoogleCalendarSyncService, private readonly environmentService: EnvironmentService, ) {} @Process(GoogleCalendarSyncCronJob.name) async handle(): Promise { const workspaceIds = ( await this.workspaceRepository.find({ where: this.environmentService.get('IS_BILLING_ENABLED') ? { subscriptionStatus: In(['active', 'trialing', 'past_due']), } : {}, select: ['id'], }) ).map((workspace) => workspace.id); const dataSources = await this.dataSourceRepository.find({ where: { workspaceId: In(workspaceIds), }, }); const workspaceIdsWithDataSources = new Set( dataSources.map((dataSource) => dataSource.workspaceId), ); for (const workspaceId of workspaceIdsWithDataSources) { await this.workspaceGoogleCalendarSyncService.startWorkspaceGoogleCalendarSync( workspaceId, ); } } }