Skip to content
This repository has been archived by the owner on Apr 19, 2023. It is now read-only.

Commit

Permalink
✨ Add scheduler to delete sessions
Browse files Browse the repository at this point in the history
  • Loading branch information
AnandChowdhary committed Oct 27, 2020
1 parent 28ca0d6 commit d99de49
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 8 deletions.
4 changes: 4 additions & 0 deletions src/app.module.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
import { ScheduleModule } from '@nestjs/schedule';
import { RateLimiterInterceptor, RateLimiterModule } from 'nestjs-rate-limiter';
import { AppController } from './app.controller';
import { AppService } from './app.service';
Expand All @@ -14,14 +15,17 @@ import { EmailsModule } from './modules/emails/emails.module';
import { GroupsModule } from './modules/groups/groups.module';
import { PrismaModule } from './modules/prisma/prisma.module';
import { SessionsModule } from './modules/sessions/sessions.module';
import { TasksModule } from './modules/tasks/tasks.module';
import { UsersModule } from './modules/user/user.module';

@Module({
imports: [
ConfigModule.forRoot({
load: [configuration],
}),
ScheduleModule.forRoot(),
PrismaModule,
TasksModule,
UsersModule,
AuthModule,
RateLimiterModule.register({
Expand Down
1 change: 1 addition & 0 deletions src/config/configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export default () => ({
jwtSecret: process.env.JWT_SECRET ?? 'staart',
accessTokenExpiry: process.env.ACCESS_TOKEN_EXPIRY ?? '1h',
passwordPwnedCheck: !!process.env.PASSWORD_PWNED_CHECK,
unusedRefreshTokenExpiryDays: process.env.DELETE_EXPIRED_SESSIONS ?? 30,
},
email: {
name: process.env.EMAIL_NAME ?? 'Staart',
Expand Down
11 changes: 5 additions & 6 deletions src/modules/auth/auth.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,18 @@ import {
UnauthorizedException,
UnprocessableEntityException,
} from '@nestjs/common';
import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util';
import { ConfigService } from '@nestjs/config';
import { JwtService } from '@nestjs/jwt';
import { users } from '@prisma/client';
import { compare, hash } from 'bcrypt';
import { safeEmail } from 'src/helpers/safe-email';
import { EmailService } from '../email/email.service';
import { Expose } from '../prisma/prisma.interface';
import { PrismaService } from '../prisma/prisma.service';
import { UsersService } from '../user/user.service';
import { PwnedService } from '../pwned/pwned.service';
import { RegisterDto } from './auth.dto';
import { compare, hash } from 'bcrypt';
import { JwtService } from '@nestjs/jwt';
import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util';
import { AccessTokenClaims } from './auth.interface';
import { PwnedService } from '../pwned/pwned.service';
import { safeEmail } from 'src/helpers/safe-email';

@Injectable()
export class AuthService {
Expand Down
5 changes: 3 additions & 2 deletions src/modules/email/email.service.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Injectable } from '@nestjs/common';
import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { EmailConfig, EmailOptions } from './email.interface';
import PQueue from 'p-queue';
Expand All @@ -12,6 +12,7 @@ import { render } from '@staart/mustache-markdown';

@Injectable()
export class EmailService {
private readonly logger = new Logger(EmailService.name);
private transport: Mail;
private config: EmailConfig;
private queue = new PQueue({ concurrency: 1 });
Expand All @@ -35,7 +36,7 @@ export class EmailService {
{
retries: 3,
onFailedAttempt: error => {
console.log(
this.logger.error(
`Email to ${options.to} failed, retrying (${error.retriesLeft} attempts left)`,
error.name,
);
Expand Down
11 changes: 11 additions & 0 deletions src/modules/tasks/tasks.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { PrismaModule } from '../prisma/prisma.module';
import { TasksService } from './tasks.service';

@Module({
imports: [ConfigModule, PrismaModule],
providers: [TasksService],
exports: [TasksService],
})
export class TasksModule {}
27 changes: 27 additions & 0 deletions src/modules/tasks/tasks.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { Cron, CronExpression } from '@nestjs/schedule';
import { PrismaService } from '../prisma/prisma.service';

@Injectable()
export class TasksService {
constructor(
private prisma: PrismaService,
private configService: ConfigService,
) {}
private readonly logger = new Logger(TasksService.name);

@Cron(CronExpression.EVERY_DAY_AT_1PM)
async deleteOldSessions() {
const now = new Date();
now.setDate(
now.getDate() -
this.configService.get<number>('security.unusedRefreshTokenExpiryDays'),
);
const deleted = await this.prisma.sessions.deleteMany({
where: { updatedAt: { lte: now } },
});
if (deleted.count)
this.logger.debug(`Deleted ${deleted.count} expired sessions`);
}
}

0 comments on commit d99de49

Please sign in to comment.