feat/superset #76

Merged
firmanr merged 3 commits from feat/superset into development 2024-08-27 02:53:06 +00:00
4 changed files with 46 additions and 19 deletions

4
env/env.development vendored
View File

@ -40,3 +40,7 @@ ASSETS="https://asset.sky.eigen.co.id/"
GOOGLE_CALENDAR_KEY="AIzaSyCSg4P3uC9Z7kD1P4f3rf1BbBaz4Q-M55o" GOOGLE_CALENDAR_KEY="AIzaSyCSg4P3uC9Z7kD1P4f3rf1BbBaz4Q-M55o"
GOOGLE_CALENDAR_ID="326464ac296874c7121825f5ef2e2799baa90b51da240f0045aae22beec10bd5@group.calendar.google.com" GOOGLE_CALENDAR_ID="326464ac296874c7121825f5ef2e2799baa90b51da240f0045aae22beec10bd5@group.calendar.google.com"
SUPERSET_URL=https://dashboard.weplayground.eigen.co.id
SUPERSET_ADMIN_USERNAME=admin
SUPERSET_ADMIN_PASSWORD=admin

4
env/env.production vendored
View File

@ -37,3 +37,7 @@ ASSETS="https://asset.sky.eigen.co.id/"
GOOGLE_CALENDAR_KEY="AIzaSyCSg4P3uC9Z7kD1P4f3rf1BbBaz4Q-M55o" GOOGLE_CALENDAR_KEY="AIzaSyCSg4P3uC9Z7kD1P4f3rf1BbBaz4Q-M55o"
GOOGLE_CALENDAR_ID="326464ac296874c7121825f5ef2e2799baa90b51da240f0045aae22beec10bd5@group.calendar.google.com" GOOGLE_CALENDAR_ID="326464ac296874c7121825f5ef2e2799baa90b51da240f0045aae22beec10bd5@group.calendar.google.com"
SUPERSET_URL=https://dashboard.weplayground.eigen.co.id
SUPERSET_ADMIN_USERNAME=admin
SUPERSET_ADMIN_PASSWORD=admin

View File

@ -1,14 +1,16 @@
import { Controller, Get, Param } from '@nestjs/common'; import { Controller, Get, Param } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
import { Public } from 'src/core/guards'; import { ExcludePrivilege, Public } from 'src/core/guards';
import { SupersetService } from './superset.service'; import { SupersetService } from './superset.service';
@ApiTags(`Superset`) @ApiTags(`Superset`)
@Controller(`v1/superset`) @Controller(`v1/superset`)
@Public(false)
@ApiBearerAuth('JWT')
export class SupersetController { export class SupersetController {
constructor(private service: SupersetService) {} constructor(private service: SupersetService) {}
@Get('token/:id') @Get('token/:id')
@Public(true) @ExcludePrivilege()
async getGuestToken(@Param('id') id: string) { async getGuestToken(@Param('id') id: string) {
return this.service.getGuestToken(id); return this.service.getGuestToken(id);
} }

View File

@ -1,20 +1,30 @@
import { HttpService } from '@nestjs/axios'; import { HttpService } from '@nestjs/axios';
import { Injectable } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { firstValueFrom } from 'rxjs'; import { firstValueFrom } from 'rxjs';
@Injectable() @Injectable()
export class SupersetService { export class SupersetService {
private SUPERSET_URL = 'https://dashboard.weplayground.eigen.co.id'; 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) {} constructor(private readonly httpService: HttpService) {}
async getLoginToken() { async getLoginToken() {
const data = { const data = {
username: 'admin', username: this.adminUsername,
password: 'admin', password: this.adminPassword,
provider: 'db', provider: 'db',
refresh: true, refresh: true,
}; };
const response = await firstValueFrom( const response = await firstValueFrom(
this.httpService.post(`${this.SUPERSET_URL}/api/v1/security/login`, data), this.httpService.request({
method: 'POST',
url: `${this.supersetURL}/v1/security/login`,
data: data,
}),
); );
return response.data.access_token; return response.data.access_token;
@ -22,9 +32,10 @@ export class SupersetService {
async getCSRFToken() { async getCSRFToken() {
const loginToken = await this.getLoginToken(); const loginToken = await this.getLoginToken();
const response = await firstValueFrom( const response = await firstValueFrom(
this.httpService.get(`${this.SUPERSET_URL}/api/v1/security/csrf_token/`, { this.httpService.request({
method: 'GET',
url: `${this.supersetURL}/v1/security/csrf_token/`,
headers: { Authorization: `Bearer ${loginToken}` }, headers: { Authorization: `Bearer ${loginToken}` },
}), }),
); );
@ -34,6 +45,7 @@ export class SupersetService {
async getGuestToken(uuid: string) { async getGuestToken(uuid: string) {
const { loginToken, csrfToken } = await this.getCSRFToken(); const { loginToken, csrfToken } = await this.getCSRFToken();
const data = { const data = {
resources: [{ type: 'dashboard', id: uuid }], resources: [{ type: 'dashboard', id: uuid }],
rls: [], rls: [],
@ -44,16 +56,21 @@ export class SupersetService {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
Authorization: `Bearer ${loginToken}`, Authorization: `Bearer ${loginToken}`,
'X-CSRFToken': `${csrfToken}`, 'X-CSRFToken': `${csrfToken}`,
Referer: `${this.SUPERSET_URL}/api/v1/security/guest_token/`, Referer: `${this.supersetURL}/v1/security/guest_token/`,
}; };
const response = await firstValueFrom( const response = await firstValueFrom(
this.httpService.post( this.httpService.request({
`${this.SUPERSET_URL}/api/v1/security/guest_token/`, method: 'POST',
data, url: `${this.supersetURL}/v1/security/guest_token/`,
{ headers, xsrfHeaderName: 'X-CSRFToken' }, data: data,
), headers: headers,
); }),
).catch((err) => {
this.logger.verbose({ loginToken, csrfToken });
this.logger.error(err.response.data);
throw err;
});
return response.data.token; return response.data.token;
} }