Динамически внедрить репозиторий в универсальные сервисы с помощью nestjs - PullRequest
0 голосов
/ 16 мая 2019

Я создаю сервис авторизации для моего приложения nestjs.

Для каждого защищенного ресурса в моем приложении (Media, Game, ...) у меня есть *RoleEntity (MediaRoleEntity, GameRoleEntity, ...), который определяет, что может пользователь делать с конкретным ресурсом. Каждый из этих *RoleEntity реализует RoleEntityInterface:

export interface RoleEntityInterface<T extends ResourceEntity> {
  resource: T;
  user: UserEntity;
  role: string;
}

Каждый защищаемый объект (MediaEntity, GameEntity, ...) расширяется ResourceEntity.

Теперь я хочу создать универсального поставщика RoleService, отвечающего за взаимодействие с базой данных:

@Injectable()
export class RoleService<T extends ResourceEntity> {
  readonly roleRepository: Repository<RoleEntityInterface<T>>;

  async read(roleDto: Partial<RoleDto<T>>): Promise<RoleEntityInterface<T>> {
    return this.roleRepository.findOne({
      where: { ...roleDto },
    });
  }

  async create(roleDto: RoleDto<T> | RoleDto<T>[]): Promise<void> {
    await this.roleRepository.insert(roleDto);
  }
}

И я хочу внедрить эту услугу в охранников, перехватчиков ...

Проблема, я не знаю, как это сделать, точнее:

  • Как я могу динамически внедрить ролевый репозиторий? (Я предполагаю, что должна быть задействована какая-то фабрика.)

СЛУЧАЙ РЕАЛЬНОГО ИСПОЛЬЗОВАНИЯ

Я хочу иметь возможность защитить ресурсы с помощью охранника:

@Injectable()
export class RoleGuard<T extends ResourceEntity> implements CanActivate {
  constructor(
    private authService: AuthService,
    private roleService: RoleService<T>,
    private readonly reflector: Reflector,
  ) {}
  ...
}

Теперь в контроллере, когда я использую

@Role('Admin')
@UseGuards(RoleGuard<MediaEntity>)
Get()
...

Было бы идеально, если бы все это волшебным образом работало :), т. Е. Правильно добавлен правильный roleService с правильным roleRepository.

Я совершенно новичок в nestjs и машинописи (и никогда не играл с angular), поэтому, возможно, весь подход неверен.

...