import { inject, Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { firstValueFrom, lastValueFrom, map } from 'rxjs'; import { Recipe, RecipeInfoViews, RecipeView } from '../model/Recipe.model'; import { AuthService } from './auth.service'; import { QueryClient } from '@tanstack/angular-query-experimental'; @Injectable({ providedIn: 'root', }) export class RecipeService { private readonly http = inject(HttpClient); private readonly authService = inject(AuthService); private readonly queryClient = inject(QueryClient); public getRecipes(): Promise { return firstValueFrom( this.http .get('http://localhost:8080/recipes') .pipe(map((res) => res.content)), ); } public async getRecipeView(username: string, slug: string): Promise { return firstValueFrom( this.http.get(`http://localhost:8080/recipes/${username}/${slug}`), ); } private getRecipeUrl(recipeView: RecipeView): string { return `http://localhost:8080/recipes/${recipeView.recipe.owner.username}/${recipeView.recipe.slug}`; } public async toggleStar(recipeView: RecipeView) { if (this.authService.accessToken()) { if (recipeView.isStarred) { await lastValueFrom(this.http.delete(this.getRecipeUrl(recipeView) + '/star')); } else { await lastValueFrom(this.http.post(this.getRecipeUrl(recipeView) + '/star', null)); } await this.queryClient.invalidateQueries({ queryKey: ['recipe', recipeView.recipe.owner.username, recipeView.recipe.slug], }); } else { throw new Error('Cannot star a recipe when not logged in.'); } } }