Skip to content

Commit 51012fb

Browse files
authored
Merge pull request #627 from dump-hr/lukazuljevic/626-auto-close-fly-talk-applications
Lukazuljevic/626 auto close fly talk applications
2 parents 097e7d0 + ef4442a commit 51012fb

File tree

15 files changed

+273
-18
lines changed

15 files changed

+273
-18
lines changed

apps/api/.eslintrc.js

Lines changed: 0 additions & 8 deletions
This file was deleted.

apps/api/eslint.config.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import js from '@eslint/js';
2+
import globals from 'globals';
3+
import reactHooks from 'eslint-plugin-react-hooks';
4+
import reactRefresh from 'eslint-plugin-react-refresh';
5+
import tseslint from 'typescript-eslint';
6+
7+
export default tseslint.config(
8+
{ ignores: ['dist'] },
9+
{
10+
extends: [js.configs.recommended, ...tseslint.configs.recommended],
11+
files: ['**/*.{ts,tsx}'],
12+
languageOptions: {
13+
ecmaVersion: 2020,
14+
globals: globals.browser,
15+
},
16+
plugins: {
17+
'react-hooks': reactHooks,
18+
'react-refresh': reactRefresh,
19+
},
20+
rules: {
21+
...reactHooks.configs.recommended.rules,
22+
'react-refresh/only-export-components': [
23+
'warn',
24+
{ allowConstantExport: true },
25+
],
26+
},
27+
},
28+
);

apps/api/package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"@nestjs/passport": "^10.0.3",
2727
"@nestjs/platform-express": "^10.0.0",
2828
"@nestjs/platform-socket.io": "^10.3.8",
29+
"@nestjs/schedule": "^6.0.1",
2930
"@nestjs/serve-static": "^4.0.0",
3031
"@nestjs/swagger": "^7.1.16",
3132
"@nestjs/websockets": "^10.3.8",
@@ -35,6 +36,7 @@
3536
"bcrypt": "^5.1.1",
3637
"class-transformer": "^0.5.1",
3738
"class-validator": "0.13.2",
39+
"cron": "^4.3.3",
3840
"dotenv": "^16.3.1",
3941
"google-auth-library": "^10.3.0",
4042
"http-proxy-middleware": "^2.0.6",
@@ -64,6 +66,7 @@
6466
"eslint-config-ddays": "*",
6567
"eslint-config-prettier": "^9.0.0",
6668
"eslint-plugin-prettier": "^5.0.0",
69+
"eslint-plugin-react-hooks": "^7.0.0",
6770
"eslint-plugin-simple-import-sort": "^12.1.1",
6871
"jest": "^29.5.0",
6972
"prettier": "^3.0.0",
@@ -73,6 +76,7 @@
7376
"ts-node": "^10.9.1",
7477
"tsconfig-paths": "^4.2.0",
7578
"tsx": "^4.2.0",
76-
"typescript": "5.8.2"
79+
"typescript": "5.8.2",
80+
"typescript-eslint": "^8.46.2"
7781
}
7882
}

apps/api/src/achievement/achievement.validator.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { BadRequestException, Injectable, PipeTransform } from '@nestjs/common';
33

44
@Injectable()
55
class AchievementNameValidationPipe implements PipeTransform {
6+
//eslint-disable-next-line @typescript-eslint/no-explicit-any
67
transform(value: any) {
78
const achievementNames = Object.values(AchievementNames);
89

apps/api/src/app.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ import { SponsorContractModule } from './sponsor-contract/sponsor-contract.modul
2929
import { SponsorMaterialsModule } from './sponsor-materials/sponsor-materials.module';
3030
import { SurveyQuestionModule } from './survey-question/survey-question.module';
3131
import { UserModule } from './user/user.module';
32+
import { ScheduleModule } from '@nestjs/schedule';
3233

3334
@Module({
3435
imports: [
36+
ScheduleModule.forRoot(),
3537
BlobModule,
3638
AuthModule,
3739
AchievementModule,

apps/api/src/company/company.controller.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ export class CompanyController {
105105
selected: boolean;
106106
companyId: number;
107107
},
108+
//TODO: Replace any with proper type
109+
//eslint-disable-next-line @typescript-eslint/no-explicit-any
108110
): Promise<any> {
109111
return await this.companyService.selectApplicant(
110112
body.user,

apps/api/src/event/event.module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import { PrismaService } from 'src/prisma.service';
44

55
import { EventController } from './event.controller';
66
import { EventService } from './event.service';
7+
import { EventScheduler } from './event.scheduler';
78

89
@Module({
910
controllers: [EventController],
10-
providers: [EventService, PrismaService, BlobService],
11+
providers: [EventService, PrismaService, BlobService, EventScheduler],
1112
})
1213
export class EventModule {}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { Injectable} from '@nestjs/common';
2+
import { Cron } from '@nestjs/schedule';
3+
import { EventService } from './event.service';
4+
import { FLY_TALK_APPLICATION_STATUS_CRON } from '@ddays-app/types';
5+
6+
@Injectable()
7+
export class EventScheduler {
8+
constructor(private readonly eventService: EventService) {}
9+
10+
@Cron(FLY_TALK_APPLICATION_STATUS_CRON, { timeZone: 'Europe/Zagreb' })
11+
async handleFlyTalkStatusUpdate() {
12+
console.log('Starting Fly Talk application status update job');
13+
const flyTalkEvents = await this.eventService.getAllFlyTalks();
14+
15+
for (const event of flyTalkEvents) {
16+
try {
17+
await this.eventService.updateFlyTalkApplicationStatus(event.id);
18+
} catch (error) {
19+
console.log(`Failed to update event ${event.id}`, error);
20+
}
21+
}
22+
}
23+
}

apps/api/src/event/event.service.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,37 @@ export class EventService {
603603
}));
604604
}
605605

606+
async getAllFlyTalks(): Promise<EventDto[]> {
607+
const flyTalks = await this.prisma.event.findMany({
608+
where: {
609+
type: EventType.FLY_TALK,
610+
},
611+
});
612+
613+
return flyTalks;
614+
}
615+
616+
async updateFlyTalkApplicationStatus(eventId: number): Promise<EventDto> {
617+
const event = await this.prisma.event.findUnique({
618+
where: { id: eventId },
619+
});
620+
621+
console.log(`Updating application status for event ID: ${eventId}`);
622+
623+
if (!event) {
624+
throw new NotFoundException(`Event with id ${eventId} not found`);
625+
}
626+
627+
const updatedEvent = await this.prisma.event.update({
628+
where: { id: eventId },
629+
data: {
630+
isApplicationOpen: false,
631+
},
632+
});
633+
634+
return updatedEvent;
635+
}
636+
606637
async getApplicationStatus(
607638
userId: number,
608639
flyTalkId: number,

apps/api/src/speaker/speaker.service.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
SpeakerModifyDto,
44
SpeakerWithCompanyDto,
55
} from '@ddays-app/types';
6-
import { Injectable } from '@nestjs/common';
6+
import { Injectable, NotFoundException } from '@nestjs/common';
77
import { BlobService } from 'src/blob/blob.service';
88
import { PrismaService } from 'src/prisma.service';
99

@@ -38,7 +38,7 @@ export class SpeakerService {
3838
});
3939

4040
if (!foundSpeaker) {
41-
throw new Error('Speaker not found');
41+
throw new NotFoundException('Speaker not found');
4242
}
4343

4444
return foundSpeaker;
@@ -74,7 +74,7 @@ export class SpeakerService {
7474

7575
return deletedSpeaker;
7676
} catch (error) {
77-
throw new Error('Speaker not found');
77+
throw new Error(error as string);
7878
}
7979
}
8080

0 commit comments

Comments
 (0)