diff --git a/src/app.module.ts b/src/app.module.ts index b2d8f27..02e772b 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -17,6 +17,7 @@ import { AuthModule } from './modules/auth/auth.module' import { OtpModule } from './modules/otp/otp.module' import { TelegramModule } from './modules/telegram/telegram.module' import { TokenModule } from './modules/token/token.module' +import { UsersModule } from './modules/users/users.module' @Module({ imports: [ @@ -28,10 +29,11 @@ import { TokenModule } from './modules/token/token.module' RedisModule, AuthModule, OtpModule, + UsersModule, AccountModule, TelegramModule, TokenModule, - MessagingModule + MessagingModule, ] }) export class AppModule {} diff --git a/src/config/env/grpc.env.ts b/src/config/env/grpc.env.ts index c6cb201..ba88ebd 100644 --- a/src/config/env/grpc.env.ts +++ b/src/config/env/grpc.env.ts @@ -10,6 +10,9 @@ export const grpcEnv = registerAs('grpc', () => { return { host: process.env.GRPC_HOST, - port: parseInt(process.env.GRPC_PORT) + port: parseInt(process.env.GRPC_PORT), + clients: { + users: process.env.USERS_GRPC_URL + } } }) diff --git a/src/config/interfaces/grpc.interface.ts b/src/config/interfaces/grpc.interface.ts index 06c26a9..2271946 100644 --- a/src/config/interfaces/grpc.interface.ts +++ b/src/config/interfaces/grpc.interface.ts @@ -1,4 +1,7 @@ export interface GrpcConfig { host: string port: number + clients: { + users: string + } } diff --git a/src/config/validators/grpc.validator.ts b/src/config/validators/grpc.validator.ts index 8e91d1b..05e9e4e 100644 --- a/src/config/validators/grpc.validator.ts +++ b/src/config/validators/grpc.validator.ts @@ -6,4 +6,7 @@ export class GrpcValidator { @IsInt() public GRPC_PORT: number + + @IsString() + public USERS_GRPC_URL: string } diff --git a/src/modules/auth/auth.module.ts b/src/modules/auth/auth.module.ts index 7a4988f..c6a5679 100644 --- a/src/modules/auth/auth.module.ts +++ b/src/modules/auth/auth.module.ts @@ -2,12 +2,14 @@ import { Module } from '@nestjs/common' import { OtpService } from '@/modules/otp/otp.service' import { TokenService } from '@/modules/token/token.service' +import { UsersModule } from '@/modules/users/users.module' import { UserRepository } from '@/shared/utils/repositories' import { AuthController } from './auth.controller' import { AuthService } from './auth.service' @Module({ + imports: [UsersModule], controllers: [AuthController], providers: [AuthService, UserRepository, OtpService, TokenService] }) diff --git a/src/modules/auth/auth.service.ts b/src/modules/auth/auth.service.ts index 5bea759..de4f2a5 100644 --- a/src/modules/auth/auth.service.ts +++ b/src/modules/auth/auth.service.ts @@ -1,4 +1,5 @@ import { Injectable } from '@nestjs/common' +import { ConfigService } from '@nestjs/config' import { RpcException } from '@nestjs/microservices' import { Account } from '@prisma/generated/client' import { RpcStatus } from '@teacinema/common' @@ -16,6 +17,7 @@ import { OtpService } from '@/modules/otp/otp.service' import { UserRepository } from '@/shared/utils/repositories' import { TokenService } from '../token/token.service' +import { UsersClientGrpc } from '../users/users.grpc' @Injectable() export class AuthService { @@ -23,7 +25,9 @@ export class AuthService { private readonly userRepository: UserRepository, private readonly otpService: OtpService, private readonly tokenService: TokenService, - private readonly messagingService: MessagingService + private readonly messagingService: MessagingService, + private readonly usersClient: UsersClientGrpc, + private readonly configService: ConfigService ) {} public async sendOtp(data: SendOtpRequest): Promise { @@ -90,6 +94,8 @@ export class AuthService { }) } + this.usersClient.create({ id: account.id }).subscribe() + return this.tokenService.generateTokens(account.id) } diff --git a/src/modules/telegram/telegram.module.ts b/src/modules/telegram/telegram.module.ts index 818683c..08748dc 100644 --- a/src/modules/telegram/telegram.module.ts +++ b/src/modules/telegram/telegram.module.ts @@ -2,12 +2,14 @@ import { Module } from '@nestjs/common' import { TelegramRepository } from '@/modules/telegram/telegram.repository' import { TokenService } from '@/modules/token/token.service' +import { UsersModule } from '@/modules/users/users.module' import { UserRepository } from '@/shared/utils/repositories' import { TelegramController } from './telegram.controller' import { TelegramService } from './telegram.service' @Module({ + imports: [UsersModule], controllers: [TelegramController], providers: [TelegramService, TelegramRepository, TokenService, UserRepository] }) diff --git a/src/modules/telegram/telegram.service.ts b/src/modules/telegram/telegram.service.ts index 1e1ca8e..bc0e8f8 100644 --- a/src/modules/telegram/telegram.service.ts +++ b/src/modules/telegram/telegram.service.ts @@ -15,6 +15,7 @@ import { createHash, createHmac, randomBytes } from 'node:crypto' import { AllConfigs } from '@/config' import { RedisService } from '@/infra/redis/redis.service' import { TokenService } from '@/modules/token/token.service' +import { UsersClientGrpc } from '@/modules/users/users.grpc' import { UserRepository } from '@/shared/utils/repositories' import { TelegramRepository } from './telegram.repository' @@ -31,7 +32,8 @@ export class TelegramService { private readonly configService: ConfigService, private readonly telegramRepository: TelegramRepository, private readonly tokenService: TokenService, - private readonly userRepository: UserRepository + private readonly userRepository: UserRepository, + private readonly usersClient: UsersClientGrpc ) { this.BOT_ID = configService.get('telegram.telegramBotId', { infer: true }) this.BOT_TOKEN = configService.get('telegram.telegramBotToken', { @@ -73,6 +75,8 @@ export class TelegramService { return this.tokenService.generateTokens(exists.id) } + this.usersClient.create({ id: exists.id }).subscribe() + const sessionId = randomBytes(16).toString('hex') await this.redisService.set( diff --git a/src/modules/users/users.grpc.ts b/src/modules/users/users.grpc.ts new file mode 100644 index 0000000..5be0d86 --- /dev/null +++ b/src/modules/users/users.grpc.ts @@ -0,0 +1,22 @@ +import { Inject, Injectable, OnModuleInit } from '@nestjs/common' +import type { ClientGrpc } from '@nestjs/microservices' +import { + CreateUserRequest, + UsersServiceClient +} from '@teacinema/contracts/gen/users' + +@Injectable() +export class UsersClientGrpc implements OnModuleInit { + private usersService: UsersServiceClient + + constructor(@Inject('USERS_PACKAGE') private readonly client: ClientGrpc) {} + + onModuleInit() { + this.usersService = + this.client.getService('UsersService') + } + + public create(request: CreateUserRequest) { + return this.usersService.createUser(request) + } +} diff --git a/src/modules/users/users.module.ts b/src/modules/users/users.module.ts new file mode 100644 index 0000000..09444c1 --- /dev/null +++ b/src/modules/users/users.module.ts @@ -0,0 +1,30 @@ +import { Module } from '@nestjs/common' +import { ConfigService } from '@nestjs/config' +import { ClientsModule, Transport } from '@nestjs/microservices' +import { PROTO_PATHS } from '@teacinema/contracts' + +import { AllConfigs } from '@/config' + +import { UsersClientGrpc } from './users.grpc' + +@Module({ + imports: [ + ClientsModule.registerAsync([ + { + name: 'USERS_PACKAGE', + useFactory: (configService: ConfigService) => ({ + transport: Transport.GRPC, + options: { + package: 'users.v1', + protoPath: PROTO_PATHS.USERS, + url: configService.get('grpc.clients.users', { infer: true }) + } + }), + inject: [ConfigService] + } + ]) + ], + providers: [UsersClientGrpc], + exports: [UsersClientGrpc] +}) +export class UsersModule {} diff --git a/yarn.lock b/yarn.lock index 752006d..ff8a647 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1383,9 +1383,9 @@ integrity sha512-q3DURJbSk3k8MNWFIYaSM4LEcBgPbWa+HJmBz/nzYT4kuYitJVSXxpZ97kr0Ea+81AZwAU3JhQKlkK0SBWUi0A== "@teacinema/contracts@^1.0.0": - version "1.1.1" - resolved "https://git.ksv741.keenetic.pro/api/packages/teacinema/npm/%40teacinema%2Fcontracts/-/1.1.1/contracts-1.1.1.tgz#69fc54e0e096cad5ecc5d8bb654d982b6c70996b" - integrity sha512-yK3Th430sWumcnm2/jyEx8dtaA59hmCvCAnul+q/JbW+C2s/AyhBEBoxToDVxx/KKTDixDePJ3O3EnNnIHGgRw== + version "1.1.2" + resolved "https://git.ksv741.keenetic.pro/api/packages/teacinema/npm/%40teacinema%2Fcontracts/-/1.1.2/contracts-1.1.2.tgz#74e5ce7c95515983fd299332ef095a882dbe6665" + integrity sha512-LL9UqmjIX0C9kHVtyoAoNUrp0zk1u/JzNTfnU+gqTXHJhejHOSa3blVtQBO4cjTt+yYDaN89fjm5fRbL/V0dDw== dependencies: "@nestjs/microservices" "^11.1.12" protoc "33.4.0"