sacg-cronogramas/src/app/services/auth.service.ts
luis cespedes 8fdba09449 avance interfaces e interceptor
-se simula login en el servicio
2025-05-05 11:24:49 -04:00

111 lines
2.7 KiB
TypeScript

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, BehaviorSubject, of, throwError } from 'rxjs';
import { tap, delay } from 'rxjs/operators';
interface LoginCredentials {
username?: string;
password?: string;
email?: string;
}
interface AuthResponse {
token: string;
user: {
id: number;
username: string;
name: string;
role: string;
email?: string;
};
}
@Injectable({
providedIn: 'root'
})
export class AuthService {
private apiUrl = 'api/auth';
private userSubject = new BehaviorSubject<any>(null);
public user$ = this.userSubject.asObservable();
// Usuarios de prueba para simular login
private mockUsers = [
{
email: 'admin@example.com',
password: 'admin123',
user: {
id: 1,
username: 'admin',
name: 'Administrador',
role: 'admin',
email: 'admin@example.com'
}
},
{
email: 'user@example.com',
password: 'user123',
user: {
id: 2,
username: 'user',
name: 'Usuario',
role: 'user',
email: 'user@example.com'
}
}
];
constructor(private http: HttpClient) {
// Check if user is already logged in on service initialization
const user = localStorage.getItem('user');
if (user) {
this.userSubject.next(JSON.parse(user));
}
}
login(credentials: LoginCredentials): Observable<AuthResponse> {
// Simular login con usuarios de prueba
const user = this.mockUsers.find(u =>
u.email === credentials.email && u.password === credentials.password);
if (user) {
// Generar token falso
const mockResponse: AuthResponse = {
token: 'mock-jwt-token-' + Math.random().toString(36).substring(2, 15),
user: user.user
};
return of(mockResponse).pipe(
// Simular retraso de red
delay(800),
tap(response => {
// Store token and user info
localStorage.setItem('token', response.token);
localStorage.setItem('user', JSON.stringify(response.user));
this.userSubject.next(response.user);
})
);
} else {
// Simular error de credenciales inválidas
return throwError(() => new Error('Credenciales incorrectas'));
}
}
logout(): void {
// Clear storage and update subject
localStorage.removeItem('token');
localStorage.removeItem('user');
this.userSubject.next(null);
}
isLoggedIn(): boolean {
return !!localStorage.getItem('token');
}
getToken(): string | null {
return localStorage.getItem('token');
}
getCurrentUser(): any {
return this.userSubject.value;
}
}