import { inject, Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; import { Bet, CreateBetRequest, UpdateBetRequest } from '../../models/bet.model'; import { SuccessResponse } from '../../models/api-responses.model'; import { map } from 'rxjs/operators'; import { toDate } from '../../utils/type-guards'; function mapBet(bet: any): Bet { return { ...bet, startDate: toDate(bet.startDate)!, endDate: toDate(bet.endDate) }; } @Injectable({ providedIn: 'root' }) export class BetApiService { private http = inject(HttpClient); private readonly apiUrl = 'http://localhost:3000/api/v1/bets'; getUserBets(): Observable { return this.http.get>(`${this.apiUrl}/user`).pipe( map(res => res.data.map(mapBet)) ); } getPublicBets(): Observable { return this.http.get>(`${this.apiUrl}/public`).pipe( map(res => res.data.map(mapBet)) ); } getBets(): Observable { return this.http.get>(this.apiUrl).pipe( map(res => res.data.map(mapBet)) ); } getBet(id: string): Observable { return this.http.get>(`${this.apiUrl}/${id}`).pipe( map(res => mapBet(res.data)) ); } createBet(bet: CreateBetRequest): Observable { return this.http.post>(this.apiUrl, bet).pipe( map(res => mapBet(res.data)) ); } updateBet(id: string, bet: UpdateBetRequest): Observable { return this.http.put>(`${this.apiUrl}/${id}`, bet).pipe( map(res => mapBet(res.data)) ); } deleteBet(id: string): Observable { return this.http.delete>(`${this.apiUrl}/${id}`).pipe( map(() => undefined) ); } }