diff --git a/src/modules/restaurants/crone/restaurant.crone.ts b/src/modules/restaurants/crone/restaurant.crone.ts new file mode 100644 index 0000000..b521563 --- /dev/null +++ b/src/modules/restaurants/crone/restaurant.crone.ts @@ -0,0 +1,50 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { Cron } from '@nestjs/schedule'; +import { EntityManager } from '@mikro-orm/postgresql'; +import { Restaurant } from '../entities/restaurant.entity'; + +@Injectable() +export class RestaurantCrone { + private readonly logger = new Logger(RestaurantCrone.name); + + constructor(private readonly em: EntityManager) { } + + // run every day at 03:00 (3:00 AM) + @Cron('0 3 * * *', { + name: 'deactivateExpiredSubscriptions', + timeZone: 'UTC', + }) + async handleCron() { + try { + this.logger.debug('Starting daily subscription expiration check'); + + // Get current date + const now = new Date(); + + // Find restaurants where subscription has expired and they're still active + const expiredRestaurants = await this.em.find(Restaurant, { + subscriptionEndDate: { $lt: now }, + isActive: true, + }); + + if (!expiredRestaurants || expiredRestaurants.length === 0) { + this.logger.debug('No restaurants with expired subscriptions found'); + return; + } + + this.logger.log(`Found ${expiredRestaurants.length} restaurants with expired subscriptions`); + + // Deactivate expired restaurants + for (const restaurant of expiredRestaurants) { + restaurant.isActive = false; + } + + // Persist all changes + await this.em.persistAndFlush(expiredRestaurants); + + this.logger.log(`Successfully deactivated ${expiredRestaurants.length} restaurants with expired subscriptions`); + } catch (err) { + this.logger.error(`RestaurantCrone failed: ${err?.message}`, err); + } + } +} diff --git a/src/modules/restaurants/restaurants.module.ts b/src/modules/restaurants/restaurants.module.ts index b9d9121..62a5bd4 100644 --- a/src/modules/restaurants/restaurants.module.ts +++ b/src/modules/restaurants/restaurants.module.ts @@ -8,12 +8,13 @@ import { ScheduleRepository } from './repositories/schedule.repository'; import { Schedule } from './entities/schedule.entity'; import { ScheduleService } from './providers/schedule.service'; import { ScheduleController } from './controllers/schedule.controller'; +import { RestaurantCrone } from './crone/restaurant.crone'; import { JwtModule } from '@nestjs/jwt'; import { AuthModule } from '../auth/auth.module'; @Module({ controllers: [RestaurantsController, ScheduleController], - providers: [RestaurantsService, RestRepository, ScheduleRepository, ScheduleService], + providers: [RestaurantsService, RestRepository, ScheduleRepository, ScheduleService, RestaurantCrone], imports: [MikroOrmModule.forFeature([Restaurant, Schedule]), JwtModule, forwardRef(() => AuthModule)], exports: [RestRepository, ScheduleRepository, ScheduleService], })