ghostfolio/apps/api/src/app/symbol/symbol.service.ts

71 lines
1.9 KiB
TypeScript
Raw Normal View History

import { DataProviderService } from '@ghostfolio/api/services/data-provider.service';
import { PrismaService } from '@ghostfolio/api/services/prisma.service';
2021-04-13 21:53:58 +02:00
import { Injectable } from '@nestjs/common';
import { Currency, DataSource } from '@prisma/client';
2021-04-13 21:53:58 +02:00
import { LookupItem } from './interfaces/lookup-item.interface';
import { SymbolItem } from './interfaces/symbol-item.interface';
@Injectable()
export class SymbolService {
public constructor(
private readonly dataProviderService: DataProviderService,
private readonly prismaService: PrismaService
2021-04-13 21:53:58 +02:00
) {}
public async get(aSymbol: string): Promise<SymbolItem> {
const response = await this.dataProviderService.get([aSymbol]);
const { currency, dataSource, marketPrice } = response[aSymbol];
2021-04-13 21:53:58 +02:00
return {
dataSource,
2021-04-13 21:53:58 +02:00
marketPrice,
currency: <Currency>(<unknown>currency)
};
}
public async lookup(aQuery: string): Promise<{ items: LookupItem[] }> {
const results: { items: LookupItem[] } = { items: [] };
if (!aQuery) {
return results;
}
2021-04-13 21:53:58 +02:00
try {
const { items } = await this.dataProviderService.search(aQuery);
results.items = items;
// Add custom symbols
const ghostfolioSymbolProfiles =
await this.prismaService.symbolProfile.findMany({
select: {
currency: true,
dataSource: true,
name: true,
symbol: true
},
where: {
AND: [
{
dataSource: DataSource.GHOSTFOLIO,
name: {
startsWith: aQuery
}
}
]
}
});
for (const ghostfolioSymbolProfile of ghostfolioSymbolProfiles) {
results.items.push(ghostfolioSymbolProfile);
}
2021-04-13 21:53:58 +02:00
return results;
2021-04-13 21:53:58 +02:00
} catch (error) {
console.error(error);
throw error;
}
}
}