|
@ -2,6 +2,9 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.in |
|
|
import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; |
|
|
import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; |
|
|
import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; |
|
|
import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; |
|
|
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; |
|
|
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; |
|
|
|
|
|
import { PropertyService } from '@ghostfolio/api/services/property/property.service'; |
|
|
|
|
|
import { PROPERTY_DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS } from '@ghostfolio/common/config'; |
|
|
|
|
|
import { DataProviderGhostfolioStatusResponse } from '@ghostfolio/common/interfaces'; |
|
|
import { permissions } from '@ghostfolio/common/permissions'; |
|
|
import { permissions } from '@ghostfolio/common/permissions'; |
|
|
import { RequestWithUser } from '@ghostfolio/common/types'; |
|
|
import { RequestWithUser } from '@ghostfolio/common/types'; |
|
|
|
|
|
|
|
@ -24,6 +27,7 @@ export class GhostfolioController { |
|
|
public constructor( |
|
|
public constructor( |
|
|
private readonly ghostfolioService: GhostfolioService, |
|
|
private readonly ghostfolioService: GhostfolioService, |
|
|
private readonly prismaService: PrismaService, |
|
|
private readonly prismaService: PrismaService, |
|
|
|
|
|
private readonly propertyService: PropertyService, |
|
|
@Inject(REQUEST) private readonly request: RequestWithUser |
|
|
@Inject(REQUEST) private readonly request: RequestWithUser |
|
|
) {} |
|
|
) {} |
|
|
|
|
|
|
|
@ -35,6 +39,16 @@ export class GhostfolioController { |
|
|
@Query('query') query = '' |
|
|
@Query('query') query = '' |
|
|
): Promise<{ items: LookupItem[] }> { |
|
|
): Promise<{ items: LookupItem[] }> { |
|
|
const includeIndices = includeIndicesParam === 'true'; |
|
|
const includeIndices = includeIndicesParam === 'true'; |
|
|
|
|
|
const maxDailyRequests = await this.getMaxDailyRequests(); |
|
|
|
|
|
|
|
|
|
|
|
if ( |
|
|
|
|
|
this.request.user.dataProviderGhostfolioDailyRequests > maxDailyRequests |
|
|
|
|
|
) { |
|
|
|
|
|
throw new HttpException( |
|
|
|
|
|
getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), |
|
|
|
|
|
StatusCodes.TOO_MANY_REQUESTS |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
try { |
|
|
try { |
|
|
const result = await this.ghostfolioService.lookup({ |
|
|
const result = await this.ghostfolioService.lookup({ |
|
@ -55,6 +69,25 @@ export class GhostfolioController { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Get('status') |
|
|
|
|
|
@HasPermission(permissions.enableDataProviderGhostfolio) |
|
|
|
|
|
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) |
|
|
|
|
|
public async getStatus(): Promise<DataProviderGhostfolioStatusResponse> { |
|
|
|
|
|
return { |
|
|
|
|
|
dailyRequests: this.request.user.dataProviderGhostfolioDailyRequests, |
|
|
|
|
|
dailyRequestsMax: await this.getMaxDailyRequests() |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private async getMaxDailyRequests() { |
|
|
|
|
|
return parseInt( |
|
|
|
|
|
((await this.propertyService.getByKey( |
|
|
|
|
|
PROPERTY_DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS |
|
|
|
|
|
)) as string) || '0', |
|
|
|
|
|
10 |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
private async incrementDailyRequests({ userId }: { userId: string }) { |
|
|
private async incrementDailyRequests({ userId }: { userId: string }) { |
|
|
await this.prismaService.analytics.update({ |
|
|
await this.prismaService.analytics.update({ |
|
|
data: { |
|
|
data: { |
|
|