|
|
import { Injectable } from '@angular/core'; |
|
|
import { HttpClient } from '@angular/common/http'; |
|
|
import { BehaviorSubject, Observable, tap, catchError, throwError } from 'rxjs'; |
|
|
import { Router } from '@angular/router'; |
|
|
|
|
|
@Injectable({ |
|
|
providedIn: 'root', |
|
|
}) |
|
|
export class AuthService { |
|
|
private baseUrl = location.hostname.endsWith('hf.space') |
|
|
? 'https://pykara-py-match-backend.hf.space/api' |
|
|
: 'http://localhost:5000/api'; |
|
|
private isLoggedInSubject = new BehaviorSubject<boolean>(false); |
|
|
private currentUserId = new BehaviorSubject<number | null>(this.getUserIdFromStorage()); |
|
|
private userIdSubject = new BehaviorSubject<number | null>(this.getUserIdFromStorage()); |
|
|
|
|
|
constructor(private http: HttpClient, private router: Router) { |
|
|
|
|
|
this.initializeAuthState(); |
|
|
} |
|
|
|
|
|
|
|
|
private getUserIdFromStorage(): number | null { |
|
|
const savedUserId = sessionStorage.getItem('user_id') || localStorage.getItem('user_id'); |
|
|
return savedUserId ? Number(savedUserId) : null; |
|
|
} |
|
|
|
|
|
setUserId(userId: number): void { |
|
|
|
|
|
sessionStorage.setItem('user_id', userId.toString()); |
|
|
|
|
|
this.currentUserId.next(userId); |
|
|
this.userIdSubject.next(userId); |
|
|
this.isLoggedInSubject.next(true); |
|
|
console.log('π AuthService - User ID set via setUserId:', userId); |
|
|
} |
|
|
|
|
|
getUserId(): number | null { |
|
|
|
|
|
const userId = sessionStorage.getItem('user_id') || localStorage.getItem('user_id'); |
|
|
return userId ? parseInt(userId, 10) : null; |
|
|
} |
|
|
|
|
|
private initializeAuthState(): void { |
|
|
const savedUserId = this.getUserIdFromStorage(); |
|
|
const savedUserData = sessionStorage.getItem('user_data') || localStorage.getItem('user_data'); |
|
|
|
|
|
if (savedUserId && savedUserData) { |
|
|
this.isLoggedInSubject.next(true); |
|
|
this.currentUserId.next(savedUserId); |
|
|
this.userIdSubject.next(savedUserId); |
|
|
console.log('π AuthService initialized with user:', savedUserId); |
|
|
} else { |
|
|
console.log('π AuthService initialized - no user logged in'); |
|
|
} |
|
|
} |
|
|
|
|
|
get isAuthenticated(): boolean { |
|
|
return this.isLoggedInSubject.value; |
|
|
} |
|
|
|
|
|
get userId(): number | null { |
|
|
return this.currentUserId.value; |
|
|
} |
|
|
|
|
|
get userId$(): Observable<number | null> { |
|
|
return this.currentUserId.asObservable(); |
|
|
} |
|
|
|
|
|
|
|
|
signUp(name: string, email: string, password: string): Observable<any> { |
|
|
return this.http.post(`${this.baseUrl}/signup`, { name, email, password }).pipe( |
|
|
tap((response: any) => { |
|
|
if (response.message && response.user_id) { |
|
|
this.setUserId(response.user_id); |
|
|
|
|
|
|
|
|
const userData = { |
|
|
user_id: response.user_id, |
|
|
name: name, |
|
|
email: email |
|
|
}; |
|
|
|
|
|
sessionStorage.setItem('user_id', response.user_id.toString()); |
|
|
sessionStorage.setItem('user_data', JSON.stringify(userData)); |
|
|
|
|
|
|
|
|
localStorage.setItem('user_id', response.user_id.toString()); |
|
|
localStorage.setItem('user_name', name); |
|
|
|
|
|
console.log('β
Signup successful, user auto-logged in:', response.user_id); |
|
|
} |
|
|
}), |
|
|
catchError((error) => { |
|
|
console.error('Signup error:', error); |
|
|
return throwError(() => error); |
|
|
}) |
|
|
); |
|
|
} |
|
|
|
|
|
|
|
|
login(email: string, password: string): Observable<any> { |
|
|
return this.http.post(`${this.baseUrl}/login`, { email, password }).pipe( |
|
|
tap((response: any) => { |
|
|
if (response.message === 'Login successful.' && response.user_id) { |
|
|
this.setUserId(response.user_id); |
|
|
|
|
|
|
|
|
const userData = { |
|
|
user_id: response.user_id, |
|
|
name: response.name, |
|
|
email: response.email |
|
|
}; |
|
|
|
|
|
sessionStorage.setItem('user_id', response.user_id.toString()); |
|
|
sessionStorage.setItem('user_data', JSON.stringify(userData)); |
|
|
|
|
|
|
|
|
localStorage.setItem('user_id', response.user_id.toString()); |
|
|
if (response.name) { |
|
|
localStorage.setItem('user_name', response.name); |
|
|
localStorage.setItem('userName', response.name); |
|
|
localStorage.setItem('name', response.name); |
|
|
} |
|
|
|
|
|
console.log('β
Login successful, user ID:', response.user_id); |
|
|
} |
|
|
}), |
|
|
catchError((error) => { |
|
|
console.error('Login error:', error); |
|
|
return throwError(() => error); |
|
|
}) |
|
|
); |
|
|
} |
|
|
|
|
|
|
|
|
logout(): void { |
|
|
console.log('π AuthService - Logging out user:', this.currentUserId.value); |
|
|
|
|
|
|
|
|
this.isLoggedInSubject.next(false); |
|
|
this.currentUserId.next(null); |
|
|
this.userIdSubject.next(null); |
|
|
|
|
|
|
|
|
sessionStorage.clear(); |
|
|
|
|
|
|
|
|
localStorage.removeItem('user_id'); |
|
|
localStorage.removeItem('user_name'); |
|
|
localStorage.removeItem('userName'); |
|
|
localStorage.removeItem('name'); |
|
|
localStorage.removeItem('auth_token'); |
|
|
|
|
|
console.log('β
Logout complete - all storage cleared'); |
|
|
|
|
|
|
|
|
this.router.navigate(['/']); |
|
|
} |
|
|
|
|
|
|
|
|
logoutSilent(): void { |
|
|
console.log('π AuthService - Silent logout for user:', this.currentUserId.value); |
|
|
|
|
|
|
|
|
this.isLoggedInSubject.next(false); |
|
|
this.currentUserId.next(null); |
|
|
this.userIdSubject.next(null); |
|
|
|
|
|
|
|
|
sessionStorage.clear(); |
|
|
|
|
|
|
|
|
localStorage.removeItem('user_id'); |
|
|
localStorage.removeItem('user_name'); |
|
|
localStorage.removeItem('userName'); |
|
|
localStorage.removeItem('name'); |
|
|
localStorage.removeItem('auth_token'); |
|
|
|
|
|
console.log('β
Silent logout complete - storage cleared without navigation'); |
|
|
} |
|
|
|
|
|
|
|
|
get isLoggedIn$(): Observable<boolean> { |
|
|
return this.isLoggedInSubject.asObservable(); |
|
|
} |
|
|
} |
|
|
|