78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
import { HttpService } from '@nestjs/axios';
|
|
import { Injectable, Logger } from '@nestjs/common';
|
|
import { firstValueFrom } from 'rxjs';
|
|
|
|
@Injectable()
|
|
export class SupersetService {
|
|
private readonly logger = new Logger(SupersetService.name);
|
|
private supersetURL = process.env.SUPERSET_URL + '/api';
|
|
private adminUsername = process.env.SUPERSET_ADMIN_USERNAME;
|
|
private adminPassword = process.env.SUPERSET_ADMIN_PASSWORD;
|
|
|
|
constructor(private readonly httpService: HttpService) {}
|
|
|
|
async getLoginToken() {
|
|
const data = {
|
|
username: this.adminUsername,
|
|
password: this.adminPassword,
|
|
provider: 'db',
|
|
refresh: true,
|
|
};
|
|
|
|
const response = await firstValueFrom(
|
|
this.httpService.request({
|
|
method: 'POST',
|
|
url: `${this.supersetURL}/v1/security/login`,
|
|
data: data,
|
|
}),
|
|
);
|
|
|
|
return response.data.access_token;
|
|
}
|
|
|
|
async getCSRFToken() {
|
|
const loginToken = await this.getLoginToken();
|
|
const response = await firstValueFrom(
|
|
this.httpService.request({
|
|
method: 'GET',
|
|
url: `${this.supersetURL}/v1/security/csrf_token/`,
|
|
headers: { Authorization: `Bearer ${loginToken}` },
|
|
}),
|
|
);
|
|
|
|
return { loginToken, csrfToken: response.data.result };
|
|
}
|
|
|
|
async getGuestToken(uuid: string) {
|
|
const { loginToken, csrfToken } = await this.getCSRFToken();
|
|
|
|
const data = {
|
|
resources: [{ type: 'dashboard', id: uuid }],
|
|
rls: [],
|
|
user: { username: 'pos_embed', first_name: 'pos', last_name: 'embed' },
|
|
};
|
|
|
|
const headers = {
|
|
'Content-Type': 'application/json',
|
|
Authorization: `Bearer ${loginToken}`,
|
|
'X-CSRFToken': `${csrfToken}`,
|
|
Referer: `${this.supersetURL}/v1/security/guest_token/`,
|
|
};
|
|
|
|
const response = await firstValueFrom(
|
|
this.httpService.request({
|
|
method: 'POST',
|
|
url: `${this.supersetURL}/v1/security/guest_token/`,
|
|
data: data,
|
|
headers: headers,
|
|
}),
|
|
).catch((err) => {
|
|
this.logger.verbose({ loginToken, csrfToken });
|
|
this.logger.error(err.response.data);
|
|
throw err;
|
|
});
|
|
|
|
return response.data.token;
|
|
}
|
|
}
|