|
|
@ -47,6 +47,7 @@ import { AdminService } from './admin.service'; |
|
|
|
import { UpdateAssetProfileDto } from './update-asset-profile.dto'; |
|
|
|
import { UpdateBulkMarketDataDto } from './update-bulk-market-data.dto'; |
|
|
|
import { UpdateMarketDataDto } from './update-market-data.dto'; |
|
|
|
import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; |
|
|
|
|
|
|
|
@Controller('admin') |
|
|
|
export class AdminController { |
|
|
@ -60,56 +61,23 @@ export class AdminController { |
|
|
|
|
|
|
|
@Get() |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async getAdminData(): Promise<AdminData> { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
return this.adminService.get(); |
|
|
|
} |
|
|
|
|
|
|
|
@Post('gather') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async gather7Days(): Promise<void> { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
this.dataGatheringService.gather7Days(); |
|
|
|
this.dataGatheringService.gather7Days(); |
|
|
|
} |
|
|
|
|
|
|
|
@Post('gather/max') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async gatherMax(): Promise<void> { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
const uniqueAssets = await this.dataGatheringService.getUniqueAssets(); |
|
|
|
const uniqueAssets = await this.dataGatheringService.getUniqueAssets(); |
|
|
|
|
|
|
|
await this.dataGatheringService.addJobsToQueue( |
|
|
|
uniqueAssets.map(({ dataSource, symbol }) => { |
|
|
@ -132,19 +100,8 @@ export class AdminController { |
|
|
|
|
|
|
|
@Post('gather/profile-data') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async gatherProfileData(): Promise<void> { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
const uniqueAssets = await this.dataGatheringService.getUniqueAssets(); |
|
|
|
|
|
|
|
await this.dataGatheringService.addJobsToQueue( |
|
|
@ -166,22 +123,11 @@ export class AdminController { |
|
|
|
|
|
|
|
@Post('gather/profile-data/:dataSource/:symbol') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async gatherProfileDataForSymbol( |
|
|
|
@Param('dataSource') dataSource: DataSource, |
|
|
|
@Param('symbol') symbol: string |
|
|
|
): Promise<void> { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
await this.dataGatheringService.addJobToQueue({ |
|
|
|
data: { |
|
|
|
dataSource, |
|
|
@ -197,22 +143,11 @@ export class AdminController { |
|
|
|
|
|
|
|
@Post('gather/:dataSource/:symbol') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async gatherSymbol( |
|
|
|
@Param('dataSource') dataSource: DataSource, |
|
|
|
@Param('symbol') symbol: string |
|
|
|
): Promise<void> { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
this.dataGatheringService.gatherSymbol({ dataSource, symbol }); |
|
|
|
|
|
|
|
return; |
|
|
@ -220,24 +155,13 @@ export class AdminController { |
|
|
|
|
|
|
|
@Post('gather/:dataSource/:symbol/:dateString') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async gatherSymbolForDate( |
|
|
|
@Param('dataSource') dataSource: DataSource, |
|
|
|
@Param('dateString') dateString: string, |
|
|
|
@Param('symbol') symbol: string |
|
|
|
): Promise<MarketData> { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
const date = parseISO(dateString); |
|
|
|
const date = parseISO(dateString); |
|
|
|
|
|
|
|
if (!isDate(date)) { |
|
|
|
throw new HttpException( |
|
|
@ -255,6 +179,7 @@ export class AdminController { |
|
|
|
|
|
|
|
@Get('market-data') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async getMarketData( |
|
|
|
@Query('assetSubClasses') filterByAssetSubClasses?: string, |
|
|
|
@Query('presetId') presetId?: MarketDataPreset, |
|
|
@ -264,19 +189,7 @@ export class AdminController { |
|
|
|
@Query('sortDirection') sortDirection?: Prisma.SortOrder, |
|
|
|
@Query('take') take?: number |
|
|
|
): Promise<AdminMarketData> { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
const filters = this.apiService.buildFiltersFromQueryParams({ |
|
|
|
const filters = this.apiService.buildFiltersFromQueryParams({ |
|
|
|
filterByAssetSubClasses, |
|
|
|
filterBySearchQuery |
|
|
|
}); |
|
|
@ -293,45 +206,23 @@ export class AdminController { |
|
|
|
|
|
|
|
@Get('market-data/:dataSource/:symbol') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async getMarketDataBySymbol( |
|
|
|
@Param('dataSource') dataSource: DataSource, |
|
|
|
@Param('symbol') symbol: string |
|
|
|
): Promise<AdminMarketDataDetails> { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
return this.adminService.getMarketDataBySymbol({ dataSource, symbol }); |
|
|
|
} |
|
|
|
|
|
|
|
@Post('market-data/:dataSource/:symbol') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async updateMarketData( |
|
|
|
@Body() data: UpdateBulkMarketDataDto, |
|
|
|
@Param('dataSource') dataSource: DataSource, |
|
|
|
@Param('symbol') symbol: string |
|
|
|
) { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
const dataBulkUpdate: Prisma.MarketDataUpdateInput[] = data.marketData.map( |
|
|
|
const dataBulkUpdate: Prisma.MarketDataUpdateInput[] = data.marketData.map( |
|
|
|
({ date, marketPrice }) => ({ |
|
|
|
dataSource, |
|
|
|
marketPrice, |
|
|
@ -351,24 +242,13 @@ export class AdminController { |
|
|
|
*/ |
|
|
|
@Put('market-data/:dataSource/:symbol/:dateString') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async update( |
|
|
|
@Param('dataSource') dataSource: DataSource, |
|
|
|
@Param('dateString') dateString: string, |
|
|
|
@Param('symbol') symbol: string, |
|
|
|
@Body() data: UpdateMarketDataDto |
|
|
|
) { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
const date = parseISO(dateString); |
|
|
|
|
|
|
|
return this.marketDataService.updateMarketData({ |
|
|
@ -385,22 +265,12 @@ export class AdminController { |
|
|
|
|
|
|
|
@Post('profile-data/:dataSource/:symbol') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
@UseInterceptors(TransformDataSourceInRequestInterceptor) |
|
|
|
public async addProfileData( |
|
|
|
@Param('dataSource') dataSource: DataSource, |
|
|
|
@Param('symbol') symbol: string |
|
|
|
): Promise<SymbolProfile | never> { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
return this.adminService.addAssetProfile({ |
|
|
|
dataSource, |
|
|
|
symbol, |
|
|
@ -410,44 +280,22 @@ export class AdminController { |
|
|
|
|
|
|
|
@Delete('profile-data/:dataSource/:symbol') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async deleteProfileData( |
|
|
|
@Param('dataSource') dataSource: DataSource, |
|
|
|
@Param('symbol') symbol: string |
|
|
|
): Promise<void> { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
return this.adminService.deleteProfileData({ dataSource, symbol }); |
|
|
|
} |
|
|
|
|
|
|
|
@Patch('profile-data/:dataSource/:symbol') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async patchAssetProfileData( |
|
|
|
@Body() assetProfileData: UpdateAssetProfileDto, |
|
|
|
@Param('dataSource') dataSource: DataSource, |
|
|
|
@Param('symbol') symbol: string |
|
|
|
): Promise<EnhancedSymbolProfile> { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
return this.adminService.patchAssetProfileData({ |
|
|
|
...assetProfileData, |
|
|
|
dataSource, |
|
|
@ -457,22 +305,11 @@ export class AdminController { |
|
|
|
|
|
|
|
@Put('settings/:key') |
|
|
|
@UseGuards(AuthGuard('jwt')) |
|
|
|
@HasPermission(permissions.accessAdminControl) |
|
|
|
public async updateProperty( |
|
|
|
@Param('key') key: string, |
|
|
|
@Body() data: PropertyDto |
|
|
|
) { |
|
|
|
if ( |
|
|
|
!hasPermission( |
|
|
|
this.request.user.permissions, |
|
|
|
permissions.accessAdminControl |
|
|
|
) |
|
|
|
) { |
|
|
|
throw new HttpException( |
|
|
|
getReasonPhrase(StatusCodes.FORBIDDEN), |
|
|
|
StatusCodes.FORBIDDEN |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
return await this.adminService.putSetting(key, data.value); |
|
|
|
} |
|
|
|
} |
|
|
|