import { inject, Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Router } from '@angular/router'; import { injectQuery, QueryClient } from '@tanstack/angular-query-experimental'; import { lastValueFrom } from 'rxjs'; import { handleRequest, isValidResponse } from '../helpers/http'; import { Login, LoginCredentials, SignupCredentials, UserData } from '../models/auth.models'; import { HttpPlainResponse, HttpResponse } from '../models/response.interface'; import { injectHeadersService } from './headers.service'; @Injectable({ providedIn: 'root', }) export class AuthService { private http = inject(HttpClient); private router = inject(Router); private queryClient = inject(QueryClient); private headerServ = injectHeadersService(); async requestLoginStatus(): Promise { try { const { status } = await lastValueFrom(this.http.get>('auth/login')); this.queryClient.setQueryData(['login'], isValidResponse(status)); return isValidResponse(status); } catch { this.queryClient.setQueryData(['login'], false); return false; } } loginStatus = injectQuery(() => ({ queryKey: ['login'], gcTime: 1000, queryFn: () => this.requestLoginStatus(), })); user = injectQuery(() => ({ queryKey: ['user'], refetchOnWindowFocus: false, enabled: !!this.loginStatus.data(), queryFn: async () => { const { data } = await lastValueFrom(this.http.get>(`users/me`)); return data; }, })); // Llamado para validar credenciales (login) async login(credentials: Partial) { const { data } = await handleRequest( this.http.post>(`auth/login`, credentials) ); this.headerServ.setTokenCookie(data); this.queryClient.invalidateQueries({ queryKey: ['login'] }); this.queryClient.invalidateQueries({ queryKey: ['user'] }); await this.router.navigate(['/app']); } async signup(credentials: Partial) { await handleRequest(this.http.post>(`auth/register`, credentials)); return this.login({ email: credentials.email }); } async logout() { const { status } = await lastValueFrom(this.http.get(`auth/logout`)); if (isValidResponse(status)) { this.queryClient.invalidateQueries({ queryKey: ['login'] }); this.headerServ.clearHeaders(); } return this.router.navigate(['/']); } // utils refreshUser() { this.queryClient.invalidateQueries({ queryKey: ['user'] }); } } export const injectAuthService = () => inject(AuthService);