import { Injectable, inject } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { BehaviorSubject, Observable, tap } from 'rxjs'; export interface User { id: number; name: string; email: string; role: any; avatar?: string; tenantId?: string; isActive: boolean; } export interface AuthResponse { accessToken: string; user: User; } @Injectable({ providedIn: 'root', }) export class AuthService { private http = inject(HttpClient); private apiUrl = '/api/auth'; private currentUserSubject = new BehaviorSubject(null); public currentUser$ = this.currentUserSubject.asObservable(); constructor() { this.loadSession(); } get currentUser(): User | null { return this.currentUserSubject.getValue(); } setCurrentUser(user: User): void { this.currentUserSubject.next(user); } private loadSession(): void { const userJson = localStorage.getItem('user'); const token = localStorage.getItem('token'); if (userJson && token) { try { const user = JSON.parse(userJson); this.currentUserSubject.next(user); // Atualiza o tenantId no localStorage para o tenantInterceptor ler if (user.tenantId) { localStorage.setItem('tenantId', user.tenantId); } } catch { this.clearSession(); } } } login(credentials: { email: string; password: string }): Observable { return this.http.post(`${this.apiUrl}/login`, credentials).pipe( tap((res) => this.setSession(res)) ); } register(userData: any): Observable { return this.http.post(`${this.apiUrl}/register`, userData); } logout(): void { this.clearSession(); } private setSession(authResult: AuthResponse): void { localStorage.setItem('token', authResult.accessToken); localStorage.setItem('user', JSON.stringify(authResult.user)); if (authResult.user.tenantId) { localStorage.setItem('tenantId', authResult.user.tenantId); } else { localStorage.removeItem('tenantId'); } this.currentUserSubject.next(authResult.user); } private clearSession(): void { localStorage.removeItem('token'); localStorage.removeItem('user'); localStorage.removeItem('tenantId'); this.currentUserSubject.next(null); } get token(): string | null { return localStorage.getItem('token'); } get isAuthenticated(): boolean { return !!this.token; } hasPermission(permission: string): boolean { const user = this.currentUser; if (!user) return false; const roleName = typeof user.role === 'object' ? (user.role as any).name : user.role; const permissions = typeof user.role === 'object' ? (user.role as any).permissions : []; if ( roleName === 'ADMIN' || roleName === 'Administrador' || (Array.isArray(permissions) && permissions.includes('*')) ) { return true; } return Array.isArray(permissions) && permissions.includes(permission); } hasRole(role: string): boolean { const user = this.currentUser; if (!user) return false; const roleName = typeof user.role === 'object' ? (user.role as any).name : user.role; if (roleName === 'ADMIN' || roleName === 'Administrador') { return true; } return roleName === role; } }