2022-06-11 13:40:15 +02:00
|
|
|
import { HttpClient, HttpParams } from '@angular/common/http';
|
2021-04-13 21:53:58 +02:00
|
|
|
import { Injectable } from '@angular/core';
|
2021-12-19 10:57:50 +01:00
|
|
|
import { UpdateMarketDataDto } from '@ghostfolio/api/app/admin/update-market-data.dto';
|
2022-11-27 10:19:34 +01:00
|
|
|
import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto';
|
2021-12-19 10:57:50 +01:00
|
|
|
import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces';
|
2021-12-11 11:45:13 +01:00
|
|
|
import { DATE_FORMAT } from '@ghostfolio/common/helper';
|
2022-02-28 21:35:52 +01:00
|
|
|
import {
|
2022-06-05 19:00:20 +02:00
|
|
|
AdminJobs,
|
2022-02-28 21:35:52 +01:00
|
|
|
AdminMarketDataDetails,
|
2022-11-27 10:19:34 +01:00
|
|
|
EnhancedSymbolProfile,
|
2022-02-28 21:35:52 +01:00
|
|
|
UniqueAsset
|
|
|
|
} from '@ghostfolio/common/interfaces';
|
2021-12-11 11:45:13 +01:00
|
|
|
import { DataSource, MarketData } from '@prisma/client';
|
2022-06-11 13:40:15 +02:00
|
|
|
import { JobStatus } from 'bull';
|
2022-02-03 20:56:39 +01:00
|
|
|
import { format, parseISO } from 'date-fns';
|
2022-02-10 09:39:10 +01:00
|
|
|
import { Observable, map } from 'rxjs';
|
2021-04-13 21:53:58 +02:00
|
|
|
|
|
|
|
@Injectable({
|
|
|
|
providedIn: 'root'
|
|
|
|
})
|
|
|
|
export class AdminService {
|
|
|
|
public constructor(private http: HttpClient) {}
|
|
|
|
|
2022-06-11 13:40:15 +02:00
|
|
|
public deleteJob(aId: string) {
|
|
|
|
return this.http.delete<void>(`/api/v1/admin/queue/job/${aId}`);
|
|
|
|
}
|
|
|
|
|
|
|
|
public deleteJobs({ status }: { status: JobStatus[] }) {
|
|
|
|
let params = new HttpParams();
|
|
|
|
|
|
|
|
if (status?.length > 0) {
|
|
|
|
params = params.append('status', status.join(','));
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.http.delete<void>('/api/v1/admin/queue/job', {
|
|
|
|
params
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2022-02-28 21:35:52 +01:00
|
|
|
public deleteProfileData({ dataSource, symbol }: UniqueAsset) {
|
2022-02-03 20:56:39 +01:00
|
|
|
return this.http.delete<void>(
|
2022-04-02 08:46:24 +02:00
|
|
|
`/api/v1/admin/profile-data/${dataSource}/${symbol}`
|
2022-02-03 20:56:39 +01:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public fetchAdminMarketDataBySymbol({
|
|
|
|
dataSource,
|
|
|
|
symbol
|
|
|
|
}: {
|
|
|
|
dataSource: DataSource;
|
|
|
|
symbol: string;
|
|
|
|
}): Observable<AdminMarketDataDetails> {
|
|
|
|
return this.http
|
2022-04-02 08:46:24 +02:00
|
|
|
.get<any>(`/api/v1/admin/market-data/${dataSource}/${symbol}`)
|
2022-02-03 20:56:39 +01:00
|
|
|
.pipe(
|
|
|
|
map((data) => {
|
|
|
|
for (const item of data.marketData) {
|
|
|
|
item.date = parseISO(item.date);
|
|
|
|
}
|
|
|
|
return data;
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-06-11 13:40:15 +02:00
|
|
|
public fetchJobs({ status }: { status?: JobStatus[] }) {
|
|
|
|
let params = new HttpParams();
|
|
|
|
|
|
|
|
if (status?.length > 0) {
|
|
|
|
params = params.append('status', status.join(','));
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.http.get<AdminJobs>('/api/v1/admin/queue/job', {
|
|
|
|
params
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
public gather7Days() {
|
|
|
|
return this.http.post<void>('/api/v1/admin/gather', {});
|
2022-06-05 19:00:20 +02:00
|
|
|
}
|
|
|
|
|
2021-04-13 21:53:58 +02:00
|
|
|
public gatherMax() {
|
2022-06-11 13:40:15 +02:00
|
|
|
return this.http.post<void>('/api/v1/admin/gather/max', {});
|
2021-04-13 21:53:58 +02:00
|
|
|
}
|
2021-07-24 21:13:48 +02:00
|
|
|
|
|
|
|
public gatherProfileData() {
|
2022-06-11 13:40:15 +02:00
|
|
|
return this.http.post<void>('/api/v1/admin/gather/profile-data', {});
|
2021-07-24 21:13:48 +02:00
|
|
|
}
|
2022-01-01 16:18:18 +01:00
|
|
|
|
2022-02-28 21:35:52 +01:00
|
|
|
public gatherProfileDataBySymbol({ dataSource, symbol }: UniqueAsset) {
|
2022-01-01 16:18:18 +01:00
|
|
|
return this.http.post<void>(
|
2022-04-02 08:46:24 +02:00
|
|
|
`/api/v1/admin/gather/profile-data/${dataSource}/${symbol}`,
|
2022-01-01 16:18:18 +01:00
|
|
|
{}
|
|
|
|
);
|
|
|
|
}
|
2021-11-30 21:06:10 +01:00
|
|
|
|
|
|
|
public gatherSymbol({
|
|
|
|
dataSource,
|
2021-12-11 11:45:13 +01:00
|
|
|
date,
|
2021-11-30 21:06:10 +01:00
|
|
|
symbol
|
2022-02-28 21:35:52 +01:00
|
|
|
}: UniqueAsset & {
|
2021-12-11 11:45:13 +01:00
|
|
|
date?: Date;
|
2021-11-30 21:06:10 +01:00
|
|
|
}) {
|
2022-04-02 08:46:24 +02:00
|
|
|
let url = `/api/v1/admin/gather/${dataSource}/${symbol}`;
|
2021-12-11 11:45:13 +01:00
|
|
|
|
|
|
|
if (date) {
|
|
|
|
url = `${url}/${format(date, DATE_FORMAT)}`;
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.http.post<MarketData | void>(url, {});
|
2021-11-30 21:06:10 +01:00
|
|
|
}
|
2021-12-19 10:57:50 +01:00
|
|
|
|
|
|
|
public fetchSymbolForDate({
|
|
|
|
dataSource,
|
|
|
|
date,
|
|
|
|
symbol
|
|
|
|
}: {
|
|
|
|
dataSource: DataSource;
|
|
|
|
date: Date;
|
|
|
|
symbol: string;
|
|
|
|
}) {
|
2022-04-02 08:46:24 +02:00
|
|
|
const url = `/api/v1/symbol/${dataSource}/${symbol}/${format(
|
2021-12-19 10:57:50 +01:00
|
|
|
date,
|
|
|
|
DATE_FORMAT
|
|
|
|
)}`;
|
|
|
|
|
|
|
|
return this.http.get<IDataProviderHistoricalResponse>(url);
|
|
|
|
}
|
|
|
|
|
2022-11-27 10:19:34 +01:00
|
|
|
public patchAssetProfile({
|
2022-11-30 20:01:17 +01:00
|
|
|
comment,
|
2022-11-27 10:19:34 +01:00
|
|
|
dataSource,
|
|
|
|
symbol,
|
|
|
|
symbolMapping
|
|
|
|
}: UniqueAsset & UpdateAssetProfileDto) {
|
|
|
|
return this.http.patch<EnhancedSymbolProfile>(
|
|
|
|
`/api/v1/admin/profile-data/${dataSource}/${symbol}`,
|
2022-11-30 20:01:17 +01:00
|
|
|
{ comment, symbolMapping }
|
2022-11-27 10:19:34 +01:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2021-12-19 10:57:50 +01:00
|
|
|
public putMarketData({
|
|
|
|
dataSource,
|
|
|
|
date,
|
|
|
|
marketData,
|
|
|
|
symbol
|
|
|
|
}: {
|
|
|
|
dataSource: DataSource;
|
|
|
|
date: Date;
|
|
|
|
marketData: UpdateMarketDataDto;
|
|
|
|
symbol: string;
|
|
|
|
}) {
|
2022-04-02 08:46:24 +02:00
|
|
|
const url = `/api/v1/admin/market-data/${dataSource}/${symbol}/${format(
|
2021-12-19 10:57:50 +01:00
|
|
|
date,
|
|
|
|
DATE_FORMAT
|
|
|
|
)}`;
|
|
|
|
|
|
|
|
return this.http.put<MarketData>(url, marketData);
|
|
|
|
}
|
2021-04-13 21:53:58 +02:00
|
|
|
}
|