import { inject, Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { KeycloakProfile } from 'keycloak-js'; import { BehaviorSubject, catchError, EMPTY, Observable, tap } from 'rxjs'; import { User } from '../model/User'; @Injectable({ providedIn: 'root', }) export class UserService { private http: HttpClient = inject(HttpClient); private currentUserSubject = new BehaviorSubject(null); public currentUser$ = this.currentUserSubject.asObservable(); constructor() { // Initialize with current user data this.getCurrentUser().subscribe(); } public getUser(id: string): Observable { return this.http.get(`/backend/user/${id}`).pipe( catchError(() => EMPTY), tap((user) => this.currentUserSubject.next(user)) ); } public getCurrentUser(): Observable { return this.http.get('/backend/user').pipe( catchError(() => EMPTY), tap((user) => this.currentUserSubject.next(user)) ); } public refreshCurrentUser(): void { this.getCurrentUser().subscribe(); } public createUser(id: string, username: string): Observable { return this.http .post('/backend/user', { keycloakId: id, username: username, }) .pipe(tap((user) => this.currentUserSubject.next(user))); } public async getOrCreateUser(userProfile: KeycloakProfile) { if (userProfile.id == null) { return; } return await this.getUser(userProfile.id) .toPromise() .then(async (user) => { if (user) { return user; } return await this.createUser(userProfile.id ?? '', userProfile.username ?? '').toPromise(); }); } }