Загрузка данных
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$