Как передать Guard с одного модуля в другой в nest?

В Nest.js, фреймворке для разработки приложений на основе Node.js, для передачи Guard с одного модуля в другой можно использовать механизмы зависимостей и инжекции.

Передача Guard из одного модуля в другой связана с созданием и использованием кастомного провайдера (provider). Provider - это класс, который предоставляет определенный объект или функцию внутри приложения. Guard может быть предоставлен как провайдер и затем использоваться в других модулях.

1. Создайте свой Guard:

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';

@Injectable()
export class MyGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    // Ваш код проверки авторизации или другой проверки
    return true; // Возможно, что вам понадобится возвращать значение false для запрета доступа
  }
}

2. Создайте модуль, который предоставит ваш Guard:

import { Module } from '@nestjs/common';
import { MyGuard } from './my.guard';

@Module({
  providers: [MyGuard], // Предоставляем ваш Guard для использования в других модулях
  exports: [MyGuard], // Экспортируем, чтобы другие модули могли его импортировать
})
export class GuardsModule {}

3. Используйте Guard в других модулях:

import { Module } from '@nestjs/common';
import { AuthModule } from './auth/auth.module';
import { SomeModule } from './some/some.module';
import { GuardsModule } from './guards/guards.module';
import { MyGuard } from './guards/my.guard';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [AuthModule, SomeModule, GuardsModule], // Импортируем GuardsModule
  controllers: [AppController],
  providers: [
    AppService,
    {
      provide: 'APP_GUARD', // Используйте ключ 'APP_GUARD', чтобы указать, что это провайдер Guard
      useClass: MyGuard, // Использовать ваш Guard в качестве провайдера
    },
  ],
})
export class AppModule {}

4. Используйте Guard в контроллерах или других местах, где вам нужно выполнить проверку:

import { Controller, Get, UseGuards } from '@nestjs/common';
import { MyGuard } from './guards/my.guard';

@Controller('example')
@UseGuards(MyGuard) // Используйте ваш Guard на уровне контроллера
export class ExampleController {
  @Get()
  example(): string {
    return 'Пример использования Guard';
  }
}

Теперь ваш Guard будет внедрен в другие модули, и вы сможете использовать его для проверки авторизации или другой логики безопасности в ваших контроллерах или других местах, где это требуется.