feat: add get me

This commit is contained in:
Sergey Krylov 2026-03-04 06:18:10 +03:00
parent 98643fee39
commit 03d4f38fb0
8 changed files with 107 additions and 3 deletions

View File

@ -4,6 +4,7 @@ import { PassportModule } from '@teacinema/passport'
import { AccountModule } from '../modules/account/account.module' import { AccountModule } from '../modules/account/account.module'
import { AuthModule } from '../modules/auth/auth.module' import { AuthModule } from '../modules/auth/auth.module'
import { UsersModule } from '../modules/users/users.module'
import { AppController } from './app.controller' import { AppController } from './app.controller'
import { AppService } from './app.service' import { AppService } from './app.service'
@ -14,6 +15,7 @@ import { getPassportConfig } from './config'
ConfigModule.forRoot({ isGlobal: true }), ConfigModule.forRoot({ isGlobal: true }),
AuthModule, AuthModule,
AccountModule, AccountModule,
UsersModule,
PassportModule.registerAsync({ PassportModule.registerAsync({
useFactory: getPassportConfig, useFactory: getPassportConfig,
inject: [ConfigService] inject: [ConfigService]

View File

@ -0,0 +1 @@
export * from './rs'

View File

@ -0,0 +1,21 @@
import { ApiProperty } from '@nestjs/swagger'
export class GetMeResponseDto {
@ApiProperty({ example: '123' })
public id: string
@ApiProperty({ example: 'Ivan' })
public name: string
@ApiProperty({ example: 'mail@mail.ru' })
public email: string
@ApiProperty({ example: '+79999999999' })
public phone: string
@ApiProperty({
example:
'https://t4.ftcdn.net/jpg/11/66/06/77/360_F_1166067709_2SooAuPWXp20XkGev7oOT7nuK1VThCsN.jpg'
})
public avatar: string
}

View File

@ -0,0 +1 @@
export * from './get-me.response.dto'

View File

@ -0,0 +1,27 @@
import { Controller, Get, HttpCode, HttpStatus } from '@nestjs/common'
import { ApiBearerAuth, ApiOkResponse, ApiOperation } from '@nestjs/swagger'
import { lastValueFrom } from 'rxjs'
import { CurrentUser, Protected } from '../../shared/decorators'
import { GetMeResponseDto } from './dto'
import { UsersClientGrpc } from './users.grpc'
@Controller('users')
export class UsersController {
constructor(private readonly client: UsersClientGrpc) {}
@ApiOperation({
summary: 'Get Me',
description: 'Get current user'
})
@ApiBearerAuth()
@ApiOkResponse({ type: GetMeResponseDto })
@Protected()
@Get('me')
@HttpCode(HttpStatus.OK)
public async getMe(@CurrentUser() userId: string) {
const { user } = await lastValueFrom(this.client.getMe({ id: userId }))
return user
}
}

View File

@ -0,0 +1,22 @@
import { Inject, Injectable, OnModuleInit } from '@nestjs/common'
import type { ClientGrpc } from '@nestjs/microservices'
import {
GetMeRequest,
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<UsersServiceClient>('UsersService')
}
public getMe(request: GetMeRequest) {
return this.usersService.getMe(request)
}
}

View File

@ -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 { UsersController } from './users.controller'
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.getOrThrow<string>('USERS_GRPC_URL')
}
}),
inject: [ConfigService]
}
])
],
controllers: [UsersController],
providers: [UsersClientGrpc],
exports: [UsersClientGrpc]
})
export class UsersModule {}

View File

@ -1221,9 +1221,9 @@
integrity sha512-q3DURJbSk3k8MNWFIYaSM4LEcBgPbWa+HJmBz/nzYT4kuYitJVSXxpZ97kr0Ea+81AZwAU3JhQKlkK0SBWUi0A== integrity sha512-q3DURJbSk3k8MNWFIYaSM4LEcBgPbWa+HJmBz/nzYT4kuYitJVSXxpZ97kr0Ea+81AZwAU3JhQKlkK0SBWUi0A==
"@teacinema/contracts@^1.0.0": "@teacinema/contracts@^1.0.0":
version "1.0.9" version "1.1.2"
resolved "https://git.ksv741.keenetic.pro/api/packages/teacinema/npm/%40teacinema%2Fcontracts/-/1.0.9/contracts-1.0.9.tgz#14b136d0c08552147b0de637a7af6d340d538527" resolved "https://git.ksv741.keenetic.pro/api/packages/teacinema/npm/%40teacinema%2Fcontracts/-/1.1.2/contracts-1.1.2.tgz#74e5ce7c95515983fd299332ef095a882dbe6665"
integrity sha512-9BwWvXaDKgRcef6+1ep9vUDWBdOndqheeTX5mXK5OOvLXbLOlzYoqAUoT0ZwaRwOCD+Je/LDrqcdti6eoss71Q== integrity sha512-LL9UqmjIX0C9kHVtyoAoNUrp0zk1u/JzNTfnU+gqTXHJhejHOSa3blVtQBO4cjTt+yYDaN89fjm5fRbL/V0dDw==
dependencies: dependencies:
"@nestjs/microservices" "^11.1.12" "@nestjs/microservices" "^11.1.12"
protoc "33.4.0" protoc "33.4.0"