|
@ -13,14 +13,11 @@ import { |
|
|
Prisma |
|
|
Prisma |
|
|
} from '@prisma/client'; |
|
|
} from '@prisma/client'; |
|
|
import { DateQueryHelper } from '@ghostfolio/api/helper/dateQueryHelper'; |
|
|
import { DateQueryHelper } from '@ghostfolio/api/helper/dateQueryHelper'; |
|
|
import AwaitLock from 'await-lock'; |
|
|
|
|
|
|
|
|
|
|
|
@Injectable() |
|
|
@Injectable() |
|
|
export class MarketDataService { |
|
|
export class MarketDataService { |
|
|
public constructor(private readonly prismaService: PrismaService) {} |
|
|
public constructor(private readonly prismaService: PrismaService) {} |
|
|
|
|
|
|
|
|
lock = new AwaitLock(); |
|
|
|
|
|
|
|
|
|
|
|
private dateQueryHelper = new DateQueryHelper(); |
|
|
private dateQueryHelper = new DateQueryHelper(); |
|
|
|
|
|
|
|
|
public async deleteMany({ dataSource, symbol }: UniqueAsset) { |
|
|
public async deleteMany({ dataSource, symbol }: UniqueAsset) { |
|
@ -132,8 +129,6 @@ export class MarketDataService { |
|
|
where: Prisma.MarketDataWhereUniqueInput; |
|
|
where: Prisma.MarketDataWhereUniqueInput; |
|
|
}): Promise<MarketData> { |
|
|
}): Promise<MarketData> { |
|
|
const { data, where } = params; |
|
|
const { data, where } = params; |
|
|
await this.lock.acquireAsync(); |
|
|
|
|
|
try { |
|
|
|
|
|
return this.prismaService.marketData.upsert({ |
|
|
return this.prismaService.marketData.upsert({ |
|
|
where, |
|
|
where, |
|
|
create: { |
|
|
create: { |
|
@ -145,9 +140,6 @@ export class MarketDataService { |
|
|
}, |
|
|
}, |
|
|
update: { marketPrice: data.marketPrice, state: data.state } |
|
|
update: { marketPrice: data.marketPrice, state: data.state } |
|
|
}); |
|
|
}); |
|
|
} finally { |
|
|
|
|
|
this.lock.release(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@ -160,9 +152,7 @@ export class MarketDataService { |
|
|
data: Prisma.MarketDataUpdateInput[]; |
|
|
data: Prisma.MarketDataUpdateInput[]; |
|
|
}): Promise<MarketData[]> { |
|
|
}): Promise<MarketData[]> { |
|
|
const upsertPromises = data.map( |
|
|
const upsertPromises = data.map( |
|
|
async ({ dataSource, date, marketPrice, symbol, state }) => { |
|
|
({ dataSource, date, marketPrice, symbol, state }) => { |
|
|
await this.lock.acquireAsync(); |
|
|
|
|
|
try { |
|
|
|
|
|
return this.prismaService.marketData.upsert({ |
|
|
return this.prismaService.marketData.upsert({ |
|
|
create: { |
|
|
create: { |
|
|
dataSource: <DataSource>dataSource, |
|
|
dataSource: <DataSource>dataSource, |
|
@ -183,11 +173,9 @@ export class MarketDataService { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
} finally { |
|
|
|
|
|
this.lock.release(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
); |
|
|
); |
|
|
return await Promise.all(upsertPromises); |
|
|
|
|
|
|
|
|
return this.prismaService.$transaction(upsertPromises); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|