Skip to content
This repository was archived by the owner on Apr 17, 2025. It is now read-only.

Commit f07b340

Browse files
authored
Merge pull request #10 from waterbustech/fix/chat
Fix/chat
2 parents 75f7f26 + b3be79c commit f07b340

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+3007
-1295
lines changed

bun.lockb

353 KB
Binary file not shown.

example.env

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

package.json

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,25 @@
2121
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
2222
"test:e2e": "jest --config ./test/jest-e2e.json",
2323
"migration:run": "npm run typeorm -- --dataSource=src/core/database/data-source.ts migration:run",
24+
"migration:rollback": "npm run typeorm -- --dataSource=src/core/database/data-source.ts migration:revert",
2425
"pm2": "yarn build && yarn pm2:start",
2526
"pm2:start": "pm2 start ecosystem.config.js"
2627
},
2728
"dependencies": {
2829
"@fastify/static": "^7.0.3",
2930
"@grpc/grpc-js": "^1.10.6",
3031
"@grpc/proto-loader": "^0.7.12",
31-
"@nestjs/common": "^10.3.8",
32+
"@nestjs/common": "^10.4.4",
3233
"@nestjs/config": "^3.2.2",
33-
"@nestjs/core": "^10.3.8",
34+
"@nestjs/core": "^10.4.4",
3435
"@nestjs/jwt": "^10.2.0",
35-
"@nestjs/microservices": "^10.3.8",
36+
"@nestjs/microservices": "^10.4.4",
3637
"@nestjs/passport": "^10.0.3",
37-
"@nestjs/platform-fastify": "^10.3.8",
38+
"@nestjs/platform-fastify": "^10.4.4",
39+
"@nestjs/schedule": "^4.1.1",
3840
"@nestjs/swagger": "^7.3.1",
3941
"@nestjs/typeorm": "^10.0.2",
42+
"amqplib": "^0.10.4",
4043
"aws-sdk": "^2.1603.0",
4144
"axios": "^1.7.2",
4245
"bcryptjs": "^2.4.3",
@@ -56,15 +59,15 @@
5659
"rxjs": "^7.8.1",
5760
"typeorm": "^0.3.20",
5861
"typesense": "^1.8.2",
59-
"waterbus-proto": "^1.1.5"
62+
"waterbus-proto": "^1.1.18"
6063
},
6164
"resolutions": {
6265
"inquirer": "^8.0.0"
6366
},
6467
"devDependencies": {
6568
"@nestjs/cli": "^10.3.2",
6669
"@nestjs/schematics": "^10.1.1",
67-
"@nestjs/testing": "^10.3.8",
70+
"@nestjs/testing": "^10.4.4",
6871
"@swc/cli": "^0.3.12",
6972
"@swc/core": "^1.4.16",
7073
"@types/bcryptjs": "^2.4.6",

src/app.controller.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Controller, Get } from '@nestjs/common';
2+
3+
@Controller('health')
4+
export class HealthCheckController {
5+
@Get()
6+
healthCheck(): { status: string } {
7+
return { status: 'ok' };
8+
}
9+
}

src/app.module.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import { UserModule } from './features/user/user.module';
77
import { MeetingModule } from './features/meeting/meeting.module';
88
import { ChatModule } from './features/chat/chat.module';
99
import { EnvironmentConfigModule } from './core/config/environment/environment.module';
10+
import { HealthCheckController } from './app.controller';
11+
import { NotFoundController } from './notfound.controller';
12+
import { VideoProcessingModule } from './features/video-processing/video-processing.module';
1013

1114
@Module({
1215
imports: [
@@ -21,6 +24,8 @@ import { EnvironmentConfigModule } from './core/config/environment/environment.m
2124
UserModule,
2225
MeetingModule,
2326
ChatModule,
27+
VideoProcessingModule,
2428
],
29+
controllers: [HealthCheckController, NotFoundController],
2530
})
2631
export class AppModule {}

src/core/client-proxy/client-proxy.module.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ export const getGrpcClientOptions = (
1717
case EPackage.CHAT:
1818
url = config.getWsGrpcUrl();
1919
break;
20+
case EPackage.RECORD:
21+
url = config.getRecordGrpcUrl();
22+
break;
2023
}
2124
return {
2225
transport: Transport.GRPC,
@@ -36,6 +39,7 @@ export const getGrpcClientOptions = (
3639
})
3740
export class ClientProxyModule {
3841
static chatClientProxy = 'chatClientProxy';
42+
static recordClientProxy = 'recordClientProxy';
3943
static register(): DynamicModule {
4044
return {
4145
module: ClientProxyModule,
@@ -48,8 +52,19 @@ export class ClientProxyModule {
4852
getGrpcClientOptions(config, EPackage.CHAT),
4953
),
5054
},
55+
{
56+
provide: ClientProxyModule.recordClientProxy,
57+
inject: [EnvironmentConfigService],
58+
useFactory: (config: EnvironmentConfigService) =>
59+
ClientProxyFactory.create(
60+
getGrpcClientOptions(config, EPackage.RECORD),
61+
),
62+
},
63+
],
64+
exports: [
65+
ClientProxyModule.chatClientProxy,
66+
ClientProxyModule.recordClientProxy,
5167
],
52-
exports: [ClientProxyModule.chatClientProxy],
5368
};
5469
}
5570
}

src/core/config/environment/environments.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,23 @@ export class EnvironmentConfigService {
4040
return this.configService.get<string>('TYPESENSE_API_KEY');
4141
}
4242

43+
// RabbitMQ
44+
getRabbitMQHost(): string {
45+
return this.configService.get<string>('RABBITMQ_HOST');
46+
}
47+
48+
getRabbitMQPort(): number {
49+
return this.configService.get<number>('RABBITMQ_PORT');
50+
}
51+
52+
getRabbitMQUser(): string {
53+
return this.configService.get<string>('RABBITMQ_USER');
54+
}
55+
56+
getRabbitMQPassword(): string {
57+
return this.configService.get<string>('RABBITMQ_PASSWORD');
58+
}
59+
4360
// GRPC
4461
getWsGrpcUrl(): string {
4562
return this.configService.get<string>('WEBSOCKET_GRPC_ADDRESS');
@@ -49,6 +66,14 @@ export class EnvironmentConfigService {
4966
return this.configService.get<string>('AUTH_GRPC_URL');
5067
}
5168

69+
getWhiteBoardGrpcUrl(): string {
70+
return this.configService.get<string>('WHITE_BOARD_GRPC_URL');
71+
}
72+
73+
getRecordGrpcUrl(): string {
74+
return this.configService.get<string>('RECORD_GRPC_URL');
75+
}
76+
5277
getMeetingGrpcUrl(): string {
5378
return this.configService.get<string>('MEETING_GRPC_URL');
5479
}

src/core/config/typesense/typesense.config.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
// typesense.config.ts
22

3-
import { Injectable } from '@nestjs/common';
3+
import { Injectable, Logger } from '@nestjs/common';
44
import { Client } from 'typesense';
55
import { EnvironmentConfigService } from '../environment/environments';
66

77
@Injectable()
88
export class TypesenseConfig {
99
constructor(private readonly environment: EnvironmentConfigService) {}
1010

11+
private readonly logger: Logger = new Logger(TypesenseConfig.name);
12+
1113
async createSchema() {
1214
const client = this.getClient();
1315

1416
try {
1517
await client.collections('users').delete();
1618
} catch (error) {
17-
console.log();
19+
this.logger.error(error);
1820
}
1921

2022
await client.collections().create({

src/core/database/data-source.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ export const AppDataSource = new DataSource({
1616
keepConnectionAlive: true,
1717
logging: process.env.NODE_ENV !== 'production',
1818
entities: [__dirname + '/../**/*.entity{.ts,.js}'],
19-
migrations: [__dirname + '/migrations/**/*{.ts,.js}'],
19+
migrations: [__dirname + '/migrations/*{.ts,.js}'],
2020
cli: {
2121
entitiesDir: 'src',
22-
migrationsDir: 'src/database/migrations',
22+
migrationsDir: 'src/core/database/migrations',
2323
subscribersDir: 'subscriber',
2424
},
2525
extra: {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { MigrationInterface, QueryRunner } from 'typeorm';
2+
3+
export class UpdateLatestMessageCreatedAt1727342279462
4+
implements MigrationInterface
5+
{
6+
public async up(queryRunner: QueryRunner): Promise<void> {
7+
const meetings = await queryRunner.query(`
8+
SELECT "meeting"."id" AS "meeting_id", "meeting"."title" AS "meeting_title", "meeting"."password" AS "meeting_password", "meeting"."status" AS "meeting_status", "meeting"."latestMessageCreatedAt" AS "meeting_latestMessageCreatedAt", "meeting"."code" AS "meeting_code", "meeting"."createdAt" AS "meeting_createdAt", "meeting"."updatedAt" AS "meeting_updatedAt", "meeting"."deletedAt" AS "meeting_deletedAt", "latestMessage"."id" AS "latestMessage_id", "latestMessage"."data" AS "latestMessage_data", "latestMessage"."type" AS "latestMessage_type", "latestMessage"."status" AS "latestMessage_status", "latestMessage"."createdAt" AS "latestMessage_createdAt", "latestMessage"."updatedAt" AS "latestMessage_updatedAt", "latestMessage"."deletedAt" AS "latestMessage_deletedAt", "latestMessage"."createdById" AS "latestMessage_createdById", "latestMessage"."meetingId" AS "latestMessage_meetingId" FROM "meetings" "meeting" LEFT JOIN "messages" "latestMessage" ON "latestMessage"."meetingId"="meeting"."id" AND ("latestMessage"."deletedAt" IS NULL) WHERE "meeting"."deletedAt" IS NULL
9+
`);
10+
11+
for (const meeting of meetings) {
12+
const meetingId = meeting.meeting_id;
13+
14+
let latestMessageCreatedAt = meeting.latestMessage_createdAt
15+
? meeting.latestMessage_createdAt
16+
: meeting.meeting_createdAt;
17+
18+
await queryRunner.query(
19+
`UPDATE "meetings" SET "latestMessageCreatedAt" = $1 WHERE "id" = $2`,
20+
[latestMessageCreatedAt, meetingId],
21+
);
22+
}
23+
}
24+
25+
public async down(queryRunner: QueryRunner): Promise<void> {
26+
await queryRunner.query(`
27+
UPDATE "meetings"
28+
SET "latestMessageCreatedAt" = NULL
29+
WHERE "deletedAt" IS NULL
30+
`);
31+
}
32+
}

0 commit comments

Comments
 (0)