Skip to content

Commit 0755dc0

Browse files
committed
Add session-cleanup cronjob
1 parent 57def0f commit 0755dc0

File tree

6 files changed

+102
-8
lines changed

6 files changed

+102
-8
lines changed

apps/backend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
"@nestjs/common": "^11.1.6",
2626
"@nestjs/core": "^11.1.6",
2727
"@nestjs/platform-express": "^11.1.6",
28+
"@nestjs/schedule": "^6.0.1",
2829
"@nestjs/swagger": "^11.2.0",
2930
"@nestjs/throttler": "^6.4.0",
3031
"@prisma/client": "6.17.1",
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- CreateIndex
2+
CREATE INDEX "sessions_expiresAt_idx" ON "sessions"("expiresAt");

apps/backend/prisma/schema.prisma

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ model Session {
5252
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
5353
5454
@@index([userId])
55+
@@index([expiresAt])
5556
@@map("sessions")
5657
}
5758

apps/backend/src/app.module.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
22
import { APP_GUARD } from '@nestjs/core';
3+
import { ScheduleModule } from '@nestjs/schedule';
34
import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler';
45

56
import { AppController } from '@/app.controller';
@@ -8,6 +9,7 @@ import { AuthModule } from '@/auth/auth.module';
89
import { LoggerModule } from '@/common/logger.module';
910
import { LoggerMiddleware } from '@/common/middleware/logger.middleware';
1011
import { RequestIdMiddleware } from '@/common/middleware/request-id.middleware';
12+
import { SessionCleanupTask } from '@/common/tasks/session-cleanup.task';
1113
import { PrismaModule } from '@/database/prisma/prisma.module';
1214
import { UsersModule } from '@/modules/users/users.module';
1315

@@ -20,6 +22,7 @@ import { UsersModule } from '@/modules/users/users.module';
2022
limit: 30,
2123
},
2224
]),
25+
ScheduleModule.forRoot(),
2326
LoggerModule,
2427
PrismaModule,
2528
AuthModule,
@@ -28,6 +31,7 @@ import { UsersModule } from '@/modules/users/users.module';
2831
controllers: [AppController],
2932
providers: [
3033
AppService,
34+
SessionCleanupTask,
3135
{
3236
provide: APP_GUARD,
3337
useClass: ThrottlerGuard,
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { Cron, CronExpression } from '@nestjs/schedule';
3+
4+
import { LoggerService } from '@/common/logger.service';
5+
import { PrismaService } from '@/database/prisma/prisma.service';
6+
7+
@Injectable()
8+
export class SessionCleanupTask {
9+
constructor(
10+
private readonly prisma: PrismaService,
11+
private readonly logger: LoggerService
12+
) {
13+
this.logger.setContext('SessionCleanupTask');
14+
}
15+
16+
@Cron(CronExpression.EVERY_DAY_AT_3AM)
17+
async cleanupExpiredSessions() {
18+
this.logger.info('Starting expired session cleanup');
19+
20+
try {
21+
const result = await this.prisma.session.deleteMany({
22+
where: {
23+
expiresAt: {
24+
lt: new Date(),
25+
},
26+
},
27+
});
28+
29+
this.logger.info('Expired sessions cleaned up successfully', {
30+
deletedCount: result.count,
31+
});
32+
} catch (error) {
33+
this.logger.error(
34+
'Failed to cleanup expired sessions',
35+
error instanceof Error ? error : new Error(String(error))
36+
);
37+
}
38+
}
39+
}

pnpm-lock.yaml

Lines changed: 55 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)