Browse Source

Task/improve type safety of admin and data services (#6557)

* Improve type safety
pull/6575/head^2
Kenrick Tandrian 7 days ago
committed by GitHub
parent
commit
a0424147d4
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 24
      libs/ui/src/lib/services/admin.service.ts
  2. 35
      libs/ui/src/lib/services/data.service.ts

24
libs/ui/src/lib/services/admin.service.ts

@ -21,24 +21,23 @@ import {
Filter Filter
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { DateRange } from '@ghostfolio/common/types'; import { DateRange } from '@ghostfolio/common/types';
import { GF_ENVIRONMENT, GfEnvironment } from '@ghostfolio/ui/environment'; import { GF_ENVIRONMENT } from '@ghostfolio/ui/environment';
import { DataService } from '@ghostfolio/ui/services'; import { DataService } from '@ghostfolio/ui/services';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
import { Inject, Injectable } from '@angular/core'; import { Injectable, inject } from '@angular/core';
import { SortDirection } from '@angular/material/sort'; import { SortDirection } from '@angular/material/sort';
import { DataSource, MarketData, Platform } from '@prisma/client'; import { DataSource, MarketData, Platform } from '@prisma/client';
import { JobStatus } from 'bull'; import { JobStatus } from 'bull';
import { isNumber } from 'lodash';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
export class AdminService { export class AdminService {
public constructor( private readonly dataService = inject(DataService);
private dataService: DataService, private readonly environment = inject(GF_ENVIRONMENT);
@Inject(GF_ENVIRONMENT) private environment: GfEnvironment, private readonly http = inject(HttpClient);
private http: HttpClient
) {}
public addAssetProfile({ dataSource, symbol }: AssetProfileIdentifier) { public addAssetProfile({ dataSource, symbol }: AssetProfileIdentifier) {
return this.http.post<void>( return this.http.post<void>(
@ -132,7 +131,7 @@ export class AdminService {
public fetchJobs({ status }: { status?: JobStatus[] }) { public fetchJobs({ status }: { status?: JobStatus[] }) {
let params = new HttpParams(); let params = new HttpParams();
if (status?.length > 0) { if (status && status.length > 0) {
params = params.append('status', status.join(',')); params = params.append('status', status.join(','));
} }
@ -158,8 +157,13 @@ export class AdminService {
}) { }) {
let params = new HttpParams(); let params = new HttpParams();
params = params.append('skip', skip); if (isNumber(skip)) {
params = params.append('take', take); params = params.append('skip', skip);
}
if (isNumber(take)) {
params = params.append('take', take);
}
return this.http.get<AdminUsersResponse>('/api/v1/admin/user', { params }); return this.http.get<AdminUsersResponse>('/api/v1/admin/user', { params });
} }

35
libs/ui/src/lib/services/data.service.ts

@ -65,16 +65,19 @@ import type {
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { HttpClient, HttpParams } from '@angular/common/http'; import { HttpClient, HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core'; import { Injectable, inject } from '@angular/core';
import { SortDirection } from '@angular/material/sort'; import { SortDirection } from '@angular/material/sort';
import { utc } from '@date-fns/utc'; import { utc } from '@date-fns/utc';
import { import {
Access as AccessModel,
Account, Account,
AccountBalance, AccountBalance,
DataSource, DataSource,
MarketData, MarketData,
Order, Order,
Tag SymbolProfile,
Tag,
User as UserModel
} from '@prisma/client'; } from '@prisma/client';
import { format, parseISO } from 'date-fns'; import { format, parseISO } from 'date-fns';
import { cloneDeep, groupBy, isNumber } from 'lodash'; import { cloneDeep, groupBy, isNumber } from 'lodash';
@ -85,12 +88,12 @@ import { map } from 'rxjs/operators';
providedIn: 'root' providedIn: 'root'
}) })
export class DataService { export class DataService {
public constructor(private http: HttpClient) {} private readonly http = inject(HttpClient);
public buildFiltersAsQueryParams({ filters }: { filters?: Filter[] }) { public buildFiltersAsQueryParams({ filters }: { filters?: Filter[] }) {
let params = new HttpParams(); let params = new HttpParams();
if (filters?.length > 0) { if (filters && filters.length > 0) {
const { const {
ACCOUNT: filtersByAccount, ACCOUNT: filtersByAccount,
ASSET_CLASS: filtersByAssetClass, ASSET_CLASS: filtersByAssetClass,
@ -308,45 +311,47 @@ export class DataService {
} }
public deleteAccess(aId: string) { public deleteAccess(aId: string) {
return this.http.delete<any>(`/api/v1/access/${aId}`); return this.http.delete<AccessModel>(`/api/v1/access/${aId}`);
} }
public deleteAccount(aId: string) { public deleteAccount(aId: string) {
return this.http.delete<any>(`/api/v1/account/${aId}`); return this.http.delete<Account>(`/api/v1/account/${aId}`);
} }
public deleteAccountBalance(aId: string) { public deleteAccountBalance(aId: string) {
return this.http.delete<any>(`/api/v1/account-balance/${aId}`); return this.http.delete<AccountBalance>(`/api/v1/account-balance/${aId}`);
} }
public deleteActivities({ filters }) { public deleteActivities({ filters }: { filters?: Filter[] }) {
const params = this.buildFiltersAsQueryParams({ filters }); const params = this.buildFiltersAsQueryParams({ filters });
return this.http.delete<any>('/api/v1/activities', { params }); return this.http.delete<number>('/api/v1/activities', { params });
} }
public deleteActivity(aId: string) { public deleteActivity(aId: string) {
return this.http.delete<any>(`/api/v1/activities/${aId}`); return this.http.delete<Order>(`/api/v1/activities/${aId}`);
} }
public deleteBenchmark({ dataSource, symbol }: AssetProfileIdentifier) { public deleteBenchmark({ dataSource, symbol }: AssetProfileIdentifier) {
return this.http.delete<any>(`/api/v1/benchmarks/${dataSource}/${symbol}`); return this.http.delete<Partial<SymbolProfile>>(
`/api/v1/benchmarks/${dataSource}/${symbol}`
);
} }
public deleteOwnUser(aData: DeleteOwnUserDto) { public deleteOwnUser(aData: DeleteOwnUserDto) {
return this.http.delete<any>(`/api/v1/user`, { body: aData }); return this.http.delete<UserModel>(`/api/v1/user`, { body: aData });
} }
public deleteTag(aId: string) { public deleteTag(aId: string) {
return this.http.delete<void>(`/api/v1/tags/${aId}`); return this.http.delete<Tag>(`/api/v1/tags/${aId}`);
} }
public deleteUser(aId: string) { public deleteUser(aId: string) {
return this.http.delete<any>(`/api/v1/user/${aId}`); return this.http.delete<UserModel>(`/api/v1/user/${aId}`);
} }
public deleteWatchlistItem({ dataSource, symbol }: AssetProfileIdentifier) { public deleteWatchlistItem({ dataSource, symbol }: AssetProfileIdentifier) {
return this.http.delete<any>(`/api/v1/watchlist/${dataSource}/${symbol}`); return this.http.delete<void>(`/api/v1/watchlist/${dataSource}/${symbol}`);
} }
public fetchAccesses() { public fetchAccesses() {

Loading…
Cancel
Save