import { Module, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { JobExecution } from './job-execution.entity'; import { BullModule } from './bull.module'; import { CronOrchestratorService } from './cron-orchestrator.service'; import { CronWorkerService } from './cron-worker.service'; import { CronAdminController } from './cron-admin.controller'; import { TripsModule } from '../../modules/trips/trips.module'; import { RewardsModule } from '../../modules/rewards/rewards.module'; import { TariffModule } from '../../modules/tariff/tariff.module'; import { MarketingModule } from '../../modules/marketing/marketing.module'; import { BotModule } from '../../modules/bots/bot.module'; /** * وحدة المهام الدورية الموحّدة (O5). * * تسجّل كل مهمة دورية كـrepeatable job في BullMQ، وتعالجها في عملية واحدة * مع `concurrency: 1` لمنع التشغيل المزدوج. كل تنفيذ يُسجَّل في * `job_executions` — لا مهمة صامتة. * * لا تُستهلك في الـworker — الـworker يبقى مستقلاً لمفرّغ المواقع (5 ثوانٍ). */ @Module({ imports: [ TypeOrmModule.forFeature([JobExecution]), BullModule, TripsModule, RewardsModule, TariffModule, MarketingModule, BotModule, ], controllers: [CronAdminController], providers: [CronOrchestratorService, CronWorkerService], exports: [CronOrchestratorService], }) export class CronModule implements OnModuleInit, OnModuleDestroy { constructor( private readonly orchestrator: CronOrchestratorService, private readonly worker: CronWorkerService, ) {} onModuleInit(): void { this.worker.start(); } async onModuleDestroy(): Promise { await this.worker.stop(); } }