Загрузка данных


dmitriev-aal@VDI-Dmitriev-A:~/Desktop/rshbintech/it-corp/rprul/ecp/acquiring/backend/ms-acquiring-manage-b2c-limits$ sed -n '1,180p' src/infrastructure/auth/token.provider.ts
import { Inject, Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { CACHE_MANAGER } from '@nestjs/cache-manager';
import { Cache } from 'cache-manager';
import { DefaultLogger } from '@rshbintech.rprul.ecp/core-nodejs-starter-lib';

import { HttpService } from '../http/http.service';
import { KeycloakTokenResponse } from '../../common/interfaces/token-payload';

@Injectable()
export class TokenProvider {
  private readonly clientId: string;
  private readonly clientSecret: string;
  private readonly tokenUrl: string;
  private readonly cacheKey = 'keycloak_token';
  private readonly refresh = 30 * 1000;

  constructor(
    private readonly configService: ConfigService,
    private readonly logger: DefaultLogger,
    private readonly httpService: HttpService,
    @Inject(CACHE_MANAGER) private readonly cacheManager: Cache,
  ) {
    this.logger.setContext(TokenProvider.name);
    this.clientId =
      this.configService.get<string>('APP_KEYCLOAK_CLIENT_ID') ?? '';
    this.clientSecret =
      this.configService.get<string>('APP_KEYCLOAK_CLIENT_SECRET') ?? '';
    this.tokenUrl =
      this.configService.get<string>('APP_KEYCLOAK_TOKEN_URL') ?? '';
  }

  async getToken(): Promise<KeycloakTokenResponse> {
    const cachedToken = await this.cacheManager.get<KeycloakTokenResponse>(
      this.cacheKey,
    );
    if (cachedToken) {
      return cachedToken;
    }

    const params = new URLSearchParams({
      grant_type: 'client_credentials',
      client_id: this.clientId,
      client_secret: this.clientSecret,
    });

    const response = await this.httpService.post<KeycloakTokenResponse>(
      this.tokenUrl,
      params.toString(),
      {
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
        },
      },
    );

    await this.cacheManager.set(
      this.cacheKey,
      response.data,
      response.data.expires_in * 1000 - this.refresh,
    );

    return response.data;
  }
}
dmitriev-aal@VDI-Dmitriev-A:~/Desktop/rshbintech/it-corp/rprul/ecp/acquiring/backend/ms-acquiring-manage-b2c-limits$ sed -n '1,120p' src/infrastructure/http/http.service.ts
import { Inject, Injectable } from '@nestjs/common';
import { HttpService as AxiosHttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';
import { AxiosRequestConfig } from 'axios';
import { DefaultLogger } from '@rshbintech.rprul.ecp/core-nodejs-starter-lib';

@Injectable()
export class HttpService {
  constructor(
    private readonly httpService: AxiosHttpService,
    @Inject(DefaultLogger) private readonly logger: DefaultLogger,
  ) {
    this.logger.setContext(HttpService.name);
  }

  /**
   * Преобразует Observable в Promise
   * @param {string} url - ссылка
   * @param {AxiosRequestConfig<D>} config - конфиг
   */
  get<T = any, D = any>(url: string, config?: AxiosRequestConfig<D>) {
    return firstValueFrom(this.httpService.get<T, D>(url, config));
  }

  /**
   * Преобразует Observable в Promise для async/await
   * @param {string} url - ссылка
   * @param {D} data - входные данные
   * @param {AxiosRequestConfig<D>} config - конфиг
   */
  post<T = any, D = any>(
    url: string,
    data?: D,
    config?: AxiosRequestConfig<D>,
  ) {
    return firstValueFrom(this.httpService.post<T, D>(url, data, config));
  }
}
dmitriev-aal@VDI-Dmitriev-A:~/Desktop/rshbintech/it-corp/rprul/ecp/acquiring/backend/ms-acquiring-manage-b2c-limits$