mirror of https://github.com/ghostfolio/ghostfolio
Thomas
4 years ago
committed by
GitHub
15 changed files with 271 additions and 11 deletions
@ -0,0 +1,103 @@ |
|||
import { getYesterday } from '@ghostfolio/helper'; |
|||
import { Injectable } from '@nestjs/common'; |
|||
import * as bent from 'bent'; |
|||
import * as cheerio from 'cheerio'; |
|||
import { format } from 'date-fns'; |
|||
|
|||
import { DataProviderInterface } from '../../interfaces/data-provider.interface'; |
|||
import { Granularity } from '../../interfaces/granularity.type'; |
|||
import { |
|||
IDataProviderHistoricalResponse, |
|||
IDataProviderResponse |
|||
} from '../../interfaces/interfaces'; |
|||
import { PrismaService } from '../../prisma.service'; |
|||
import { Currency } from '.prisma/client'; |
|||
|
|||
@Injectable() |
|||
export class GhostfolioScraperApiService implements DataProviderInterface { |
|||
public constructor(private prisma: PrismaService) {} |
|||
|
|||
public async get( |
|||
aSymbols: string[] |
|||
): Promise<{ [symbol: string]: IDataProviderResponse }> { |
|||
if (aSymbols.length <= 0) { |
|||
return {}; |
|||
} |
|||
|
|||
try { |
|||
const symbol = aSymbols[0]; |
|||
const { marketPrice } = await this.prisma.marketData.findFirst({ |
|||
orderBy: { |
|||
date: 'desc' |
|||
}, |
|||
where: { |
|||
symbol |
|||
} |
|||
}); |
|||
|
|||
return { |
|||
[symbol]: { |
|||
marketPrice, |
|||
currency: Currency.CHF, |
|||
isMarketOpen: true, |
|||
name: symbol |
|||
} |
|||
}; |
|||
} catch (error) { |
|||
console.error(error); |
|||
} |
|||
|
|||
return {}; |
|||
} |
|||
|
|||
public async getHistorical( |
|||
aSymbols: string[], |
|||
aGranularity: Granularity = 'day', |
|||
from: Date, |
|||
to: Date |
|||
): Promise<{ |
|||
[symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; |
|||
}> { |
|||
if (aSymbols.length <= 0) { |
|||
return {}; |
|||
} |
|||
|
|||
try { |
|||
const symbol = aSymbols[0]; |
|||
|
|||
const { |
|||
value: scraperConfigString |
|||
} = await this.prisma.property.findFirst({ |
|||
select: { |
|||
value: true |
|||
}, |
|||
where: { key: 'SCRAPER_CONFIG' } |
|||
}); |
|||
|
|||
const scraperConfig = JSON.parse(scraperConfigString).find((item) => { |
|||
return item.symbol === symbol; |
|||
}); |
|||
|
|||
const get = bent(scraperConfig.url, 'GET', 'string', 200, {}); |
|||
|
|||
const html = await get(); |
|||
const $ = cheerio.load(html); |
|||
|
|||
const string = $(scraperConfig.selector).text().replace('CHF', '').trim(); |
|||
|
|||
const value = parseFloat(string); |
|||
|
|||
return { |
|||
[symbol]: { |
|||
[format(getYesterday(), 'yyyy-MM-dd')]: { |
|||
marketPrice: value |
|||
} |
|||
} |
|||
}; |
|||
} catch (error) { |
|||
console.error(error); |
|||
} |
|||
|
|||
return {}; |
|||
} |
|||
} |
Loading…
Reference in new issue