Browse Source

Refactoring

pull/2808/head
Thomas Kaul 2 years ago
parent
commit
1b7ec2f92c
  1. 25
      apps/api/src/app/admin/admin.controller.ts
  2. 62
      apps/api/src/services/data-provider/manual/manual.service.ts
  3. 33
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
  4. 2
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
  5. 13
      apps/client/src/app/services/admin.service.ts

25
apps/api/src/app/admin/admin.controller.ts

@ -32,6 +32,7 @@ import {
Get,
HttpException,
Inject,
Logger,
Param,
Patch,
Post,
@ -218,15 +219,27 @@ export class AdminController {
}
@HasPermission(permissions.accessAdminControl)
@Post('test-scraper')
@Post('market-data/:dataSource/:symbol/test')
@UseGuards(AuthGuard('jwt'), HasPermissionGuard)
public async testScraper(
@Body() data: { config: string }
public async testMarketData(
@Body() data: { scraperConfiguration: string },
@Param('dataSource') dataSource: DataSource,
@Param('symbol') symbol: string
): Promise<{ price: number }> {
const { selector, url } = JSON.parse(data.config);
const price = await this.manualService.scrape(url, selector);
try {
const { headers, selector, url } = JSON.parse(data.scraperConfiguration);
const price = await this.manualService.test({ headers, selector, url });
if (price) {
return { price };
}
throw new Error('Could not parse the current market price');
} catch (error) {
Logger.error(error);
return { price };
throw new HttpException(error.message, StatusCodes.BAD_REQUEST);
}
}
@HasPermission(permissions.accessAdminControl)

62
apps/api/src/services/data-provider/manual/manual.service.ts

@ -97,7 +97,7 @@ export class ManualService implements DataProviderInterface {
return {};
}
const value = await this.scrape(url, selector, headers);
const value = await this.scrape({ headers, selector, url });
return {
[symbol]: {
[format(getYesterday(), DATE_FORMAT)]: {
@ -115,28 +115,6 @@ export class ManualService implements DataProviderInterface {
}
}
public async scrape(
url: string,
selector: string,
headers = {}
): Promise<number> {
const abortController = new AbortController();
setTimeout(() => {
abortController.abort();
}, this.configurationService.get('REQUEST_TIMEOUT'));
const { body } = await got(url, {
headers,
// @ts-ignore
signal: abortController.signal
});
const $ = cheerio.load(body);
return extractNumberFromString($(selector).first().text());
}
public getName(): DataSource {
return DataSource.MANUAL;
}
@ -240,4 +218,42 @@ export class ManualService implements DataProviderInterface {
return { items };
}
public async test(params: any) {
return this.scrape({
headers: params.headers,
selector: params.selector,
url: params.url
});
}
private async scrape({
headers = {},
selector,
url
}: {
headers?: any;
selector: string;
url: string;
}): Promise<number> {
try {
const abortController = new AbortController();
setTimeout(() => {
abortController.abort();
}, this.configurationService.get('REQUEST_TIMEOUT'));
const { body } = await got(url, {
headers,
// @ts-ignore
signal: abortController.signal
});
const $ = cheerio.load(body);
return extractNumberFromString($(selector).first().text());
} catch (error) {
throw error;
}
}
}

33
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts

@ -277,18 +277,31 @@ export class AssetProfileDialog implements OnDestroy, OnInit {
});
}
public onTestScraper() {
public onTestMarketData() {
this.adminService
.testScrapeConfig(
this.assetProfileForm.controls['scraperConfiguration'].value
.testMarketData({
dataSource: this.data.dataSource,
scraperConfiguration:
this.assetProfileForm.controls['scraperConfiguration'].value,
symbol: this.data.symbol
})
.pipe(
catchError(({ error }) => {
alert(`Error: ${error?.message}`);
return EMPTY;
}),
takeUntil(this.unsubscribeSubject)
)
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe((response) => {
if (response?.price) {
alert($localize`Current Market Price is:` + ' ' + response.price);
} else {
alert($localize`Please try again.`);
}
.subscribe(({ price }) => {
alert(
$localize`The current market price is` +
' ' +
price +
' ' +
(<Currency>(
(<unknown>this.assetProfileForm.controls['currency'].value)
))?.value
);
});
}

2
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html

@ -256,7 +256,7 @@
mat-flat-button
type="button"
[disabled]="assetProfileForm.controls['scraperConfiguration'].value === '{}'"
(click)="onTestScraper()"
(click)="onTestMarketData()"
>
<ng-container i18n>Test</ng-container>
</button>

13
apps/client/src/app/services/admin.service.ts

@ -260,7 +260,16 @@ export class AdminService {
return this.http.put<Tag>(`/api/v1/tag/${aTag.id}`, aTag);
}
public testScrapeConfig(config: string) {
return this.http.post<any>(`/api/v1/admin/test-scraper`, { config });
public testMarketData({
dataSource,
scraperConfiguration,
symbol
}: UniqueAsset & UpdateAssetProfileDto['scraperConfiguration']) {
return this.http.post<any>(
`/api/v1/admin/market-data/${dataSource}/${symbol}/test`,
{
scraperConfiguration
}
);
}
}

Loading…
Cancel
Save