Skip to content
This repository has been archived by the owner on Feb 26, 2022. It is now read-only.

Commit

Permalink
feat: add cron email
Browse files Browse the repository at this point in the history
  • Loading branch information
ludovicGendre committed Jan 21, 2022
1 parent ce3dcc0 commit 02c7a4e
Show file tree
Hide file tree
Showing 9 changed files with 176 additions and 2 deletions.
91 changes: 91 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,10 @@
"@nestjs/jwt": "^8.0.0",
"@nestjs/passport": "^8.0.1",
"@nestjs/platform-express": "^8.2.4",
"@nestjs/schedule": "^1.0.2",
"@nestjs/swagger": "^5.1.5",
"@prisma/client": "^3.8.1",
"@types/cron": "^1.7.3",
"@types/faker": "^5.5.9",
"@types/nodemailer": "^6.4.4",
"class-transformer": "^0.5.1",
Expand Down
4 changes: 4 additions & 0 deletions src/app.module.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
import { CityModule } from './user/city/city.module';
import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';
import { ConfigModule } from 'config/config.module';
import { AnimalModule } from './animal/animal.module';
import { BreedModule } from './animal/breed.module';
import { AuthModule } from './auth/auth.module';
import { PrismaService } from './prisma.service';
import { UserModule } from './user/user.module';
import { EmailModule } from './email/email.module';

@Module({
imports: [
PrismaService,
AuthModule,
ConfigModule,
ScheduleModule.forRoot(),
EmailModule,
CityModule,
UserModule,
AnimalModule,
Expand Down
19 changes: 19 additions & 0 deletions src/dtos/email/emailSchedule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsDateString, IsEmail, IsNotEmpty, IsString } from 'class-validator';

export class EmailScheduleDto {
@ApiProperty()
@IsEmail()
public recipient!: string;

@IsString()
@IsNotEmpty()
public subject!: string;

@IsString()
@IsNotEmpty()
public content!: string;

@IsDateString()
public date!: string;
}
1 change: 1 addition & 0 deletions src/dtos/email/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './emailSchedule';
1 change: 1 addition & 0 deletions src/dtos/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ export * from './utils';
export * from './auth';
export * from './animals';
export * from './users';
export * from './email';
6 changes: 4 additions & 2 deletions src/email/email.module.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { Module } from '@nestjs/common';
import EmailService from './email.service';
import EmailSchedulingController from './emailSchedule.controller';
import EmailSchedulingService from './emailSchedule.service';

@Module({
controllers: [],
providers: [EmailService],
controllers: [EmailSchedulingController],
providers: [EmailService, EmailSchedulingService],
exports: [EmailService],
})
export class EmailModule {}
16 changes: 16 additions & 0 deletions src/email/emailSchedule.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Body, Controller, Post } from '@nestjs/common';
import EmailSchedulingService from './emailSchedule.service';
import { EmailScheduleDto } from '../dtos';

@Controller('email-scheduling')
export default class EmailSchedulingController {
constructor(
private readonly emailSchedulingService: EmailSchedulingService,
) {}

@Post('schedule')
// @UseGuards(JwtAuthenticationGuard)
async scheduleEmail(@Body() emailSchedule: EmailScheduleDto) {
this.emailSchedulingService.scheduleEmail(emailSchedule);
}
}
38 changes: 38 additions & 0 deletions src/email/emailSchedule.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { Injectable } from '@nestjs/common';
import EmailService from '../email/email.service';
import { EmailScheduleDto } from '../dtos';
import { SchedulerRegistry } from '@nestjs/schedule';
import { CronJob } from 'cron';
import { PrismaService } from 'src/prisma.service';

@Injectable()
export default class EmailSchedulingService {
constructor(
private readonly emailService: EmailService,
private readonly schedulerRegistry: SchedulerRegistry,
private readonly prisma: PrismaService,
) {}

scheduleEmail(emailSchedule: EmailScheduleDto) {
const date = new Date(emailSchedule.date);
const job = new CronJob(date, () => {
this.emailService.sendMail({
to: emailSchedule.recipient,
subject: emailSchedule.subject,
text: emailSchedule.content,
});
});

this.schedulerRegistry.addCronJob(
`${Date.now()}-${emailSchedule.subject}`,
job,
);
job.start();
}

cancelAllScheduledEmails() {
this.schedulerRegistry.getCronJobs().forEach((job) => {
job.stop();
});
}
}

0 comments on commit 02c7a4e

Please sign in to comment.