Browse Source

feat: add budget data client

pull/7140/head
Yip Shing him 3 weeks ago
parent
commit
73a9885969
  1. 83
      libs/ui/src/lib/services/data.service.spec.ts
  2. 26
      libs/ui/src/lib/services/data.service.ts

83
libs/ui/src/lib/services/data.service.spec.ts

@ -0,0 +1,83 @@
import { CreateBudgetDto, UpdateBudgetDto } from '@ghostfolio/common/dtos';
import {
provideHttpClient,
withInterceptorsFromDi
} from '@angular/common/http';
import {
HttpTestingController,
provideHttpClientTesting
} from '@angular/common/http/testing';
import { TestBed } from '@angular/core/testing';
import { DataService } from './data.service';
describe('DataService budget methods', () => {
let dataService: DataService;
let httpTestingController: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
DataService,
provideHttpClient(withInterceptorsFromDi()),
provideHttpClientTesting()
]
});
dataService = TestBed.inject(DataService);
httpTestingController = TestBed.inject(HttpTestingController);
});
afterEach(() => {
httpTestingController.verify();
});
it('fetches budgets for a month', () => {
dataService.fetchBudgets({ month: '2026-06' }).subscribe();
const request = httpTestingController.expectOne(
'/api/v1/budgets?month=2026-06'
);
expect(request.request.method).toBe('GET');
});
it('creates a budget', () => {
const budget: CreateBudgetDto = {
amount: 500,
categoryId: 'category-1',
month: '2026-06'
};
dataService.createBudget(budget).subscribe();
const request = httpTestingController.expectOne('/api/v1/budgets');
expect(request.request.method).toBe('POST');
expect(request.request.body).toEqual(budget);
});
it('updates a budget', () => {
const budget: UpdateBudgetDto = {
amount: 650,
categoryId: 'category-1',
month: '2026-06'
};
dataService.updateBudget({ budget, id: 'budget-1' }).subscribe();
const request = httpTestingController.expectOne('/api/v1/budgets/budget-1');
expect(request.request.method).toBe('PUT');
expect(request.request.body).toEqual(budget);
});
it('deletes a budget', () => {
dataService.deleteBudget('budget-1').subscribe();
const request = httpTestingController.expectOne('/api/v1/budgets/budget-1');
expect(request.request.method).toBe('DELETE');
});
});

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

@ -2,6 +2,7 @@ import {
CreateAccessDto, CreateAccessDto,
CreateAccountBalanceDto, CreateAccountBalanceDto,
CreateAccountDto, CreateAccountDto,
CreateBudgetDto,
CreateOrderDto, CreateOrderDto,
CreateTagDto, CreateTagDto,
CreateWatchlistItemDto, CreateWatchlistItemDto,
@ -9,6 +10,7 @@ import {
TransferBalanceDto, TransferBalanceDto,
UpdateAccessDto, UpdateAccessDto,
UpdateAccountDto, UpdateAccountDto,
UpdateBudgetDto,
UpdateBulkMarketDataDto, UpdateBulkMarketDataDto,
UpdateOrderDto, UpdateOrderDto,
UpdateOwnAccessTokenDto, UpdateOwnAccessTokenDto,
@ -33,6 +35,8 @@ import {
AssetResponse, AssetResponse,
BenchmarkMarketDataDetailsResponse, BenchmarkMarketDataDetailsResponse,
BenchmarkResponse, BenchmarkResponse,
BudgetResponse,
BudgetsResponse,
CreateStripeCheckoutSessionResponse, CreateStripeCheckoutSessionResponse,
DataProviderHealthResponse, DataProviderHealthResponse,
DataProviderHistoricalResponse, DataProviderHistoricalResponse,
@ -193,6 +197,14 @@ export class DataService {
); );
} }
public createBudget(budget: CreateBudgetDto) {
return this.http.post<BudgetResponse>('/api/v1/budgets', budget);
}
public deleteBudget(id: string) {
return this.http.delete<void>(`/api/v1/budgets/${id}`);
}
public fetchAccount(aAccountId: string) { public fetchAccount(aAccountId: string) {
return this.http.get<AccountResponse>(`/api/v1/account/${aAccountId}`); return this.http.get<AccountResponse>(`/api/v1/account/${aAccountId}`);
} }
@ -379,6 +391,16 @@ export class DataService {
); );
} }
public fetchBudgets({ month }: { month?: string } = {}) {
let params = new HttpParams();
if (month) {
params = params.append('month', month);
}
return this.http.get<BudgetsResponse>('/api/v1/budgets', { params });
}
public fetchAssetProfiles({ public fetchAssetProfiles({
filters, filters,
skip, skip,
@ -935,6 +957,10 @@ export class DataService {
); );
} }
public updateBudget({ budget, id }: { budget: UpdateBudgetDto; id: string }) {
return this.http.put<BudgetResponse>(`/api/v1/budgets/${id}`, budget);
}
public updateInfo() { public updateInfo() {
this.http.get<InfoItem>('/api/v1/info').subscribe((info) => { this.http.get<InfoItem>('/api/v1/info').subscribe((info) => {
const utmSource = window.localStorage.getItem('utm_source') as const utmSource = window.localStorage.getItem('utm_source') as

Loading…
Cancel
Save