import { Injectable, OnModuleInit } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; import { HandleExpiredItemsCommand } from '../../application/commands/handle-expired-items.command'; import { LoggerService } from '../../application/services/logger.service'; @Injectable() export class ExpiredItemsSchedulerService implements OnModuleInit { constructor( private readonly handleExpiredItemsCommand: HandleExpiredItemsCommand, private readonly logger: LoggerService, ) {} async onModuleInit(): Promise { this.logger.log('ExpiredItemsSchedulerService initialized', ExpiredItemsSchedulerService.name); // Process expired items immediately on startup try { this.logger.log('Processing expired items on startup...', ExpiredItemsSchedulerService.name); await this.handleExpiredItemsCommand.execute(); this.logger.log('Startup expired items processing completed', ExpiredItemsSchedulerService.name); } catch (error) { this.logger.error(`Failed to process expired items on startup: ${error.message}`, undefined, ExpiredItemsSchedulerService.name); } } @Cron(CronExpression.EVERY_MINUTE) async handleExpiredItemsCron(): Promise { try { this.logger.log('Starting scheduled expired items processing', ExpiredItemsSchedulerService.name); await this.handleExpiredItemsCommand.execute(); this.logger.log('Scheduled expired items processing completed', ExpiredItemsSchedulerService.name); } catch (error) { this.logger.error(`Failed to process expired items: ${error.message}`, undefined, ExpiredItemsSchedulerService.name); // Continue running despite errors - don't let one failure stop the scheduler } } @Cron('0 0 * * *') // Every day at midnight async handleExpiredItemsDaily(): Promise { try { this.logger.log('Starting daily expired items processing at midnight', ExpiredItemsSchedulerService.name); await this.handleExpiredItemsCommand.execute(); this.logger.log('Daily expired items processing completed', ExpiredItemsSchedulerService.name); } catch (error) { this.logger.error(`Failed to process expired items at midnight: ${error.message}`, undefined, ExpiredItemsSchedulerService.name); } } }