import {Injectable} from '@angular/core'; import {Subject, BehaviorSubject, Observable} from 'rxjs'; import {HttpClient, HttpParams} from '@angular/common/http'; import {User} from './user.model'; import {Owner} from './owner.model'; @Injectable({providedIn: 'root'}) export class UserService{ private dataStore: { user: User, owner: Owner} = { user: { address: '', session: '', blocktime: 0 }, owner: { address: '', name: '' } }; private uZaddr = ''; private oZaddr = ''; private uName = ''; private session: string | null = ''; private _uZaddrUpdated: BehaviorSubject = new BehaviorSubject(this.uZaddr); private _userUpdated: BehaviorSubject = new BehaviorSubject(this.dataStore.user); private uNameUpdated = new Subject(); private _ownerUpdated: BehaviorSubject = new BehaviorSubject(this.dataStore.owner); public readonly uZaddrUpdate: Observable = this._uZaddrUpdated.asObservable(); public readonly ownerUpdate: Observable = this._ownerUpdated.asObservable(); public readonly userUpdate: Observable = this._userUpdated.asObservable(); constructor(private http: HttpClient){ this.session = localStorage.getItem('s4z_token'); if (this.session != null) { this.findUser(this.session); } } findUser(session: string) { const params = new HttpParams().append('session', session); let obs = this.http.get<{message: string, user: any}>('http://localhost:3000/api/getuser', { headers:{}, params: params, observe: 'response'}); obs.subscribe((UserDataResponse) => { console.log(UserDataResponse.status); if (UserDataResponse.status == 200){ this.dataStore.user = UserDataResponse.body!.user[0]; console.log(`US: Found user, returning it`); this._uZaddrUpdated.next(Object.assign({},this.dataStore).user.address); this._userUpdated.next(Object.assign({}, this.dataStore).user); this.getOwner(Object.assign({},this.dataStore.user).address); } else { console.log('US: Did not find user'); } }); return obs; } addUser(address: string, session: string, blocktime: number) { const user: User={_id: '', address: address, session: session, blocktime: blocktime}; let obs = this.http.post<{message: string}>('http://localhost:3000/api/users', user); obs.subscribe((responseData) => { console.log(responseData.message); this.getOwner(address).subscribe((response) => { console.log('addUser, checking owner', response); }); }); return obs; } addOwner(address: string) { const owner: Owner={_id: '', address: address, name: 'Zgo-'.concat(address.substring(0,5))}; let obs = this.http.post<{message: string}>('http://localhost:3000/api/addowner', {address: owner.address, name: owner.name}); obs.subscribe((responseData) => { console.log(responseData.message); }); return obs; } updateOwner(owner: Owner) { this.http.post<{message: string, owner: Owner}>('http://localhost:3000/api/updateowner', {owner: owner}). subscribe((responseData) => { console.log(responseData.message); //this.dataStore.owner = responseData.owner; //this._ownerUpdated.next(Object.assign({},this.dataStore).owner); }); } getOwner(address: string) { console.log('getOwner', address); const ownParams = new HttpParams().append('address', address); let obs = this.http.get<{message:string, owner: any}>('http://localhost:3000/api/getowner', {params: ownParams, observe: 'response'}); obs.subscribe((OwnerDataResponse) => { console.log('api/getowner', OwnerDataResponse.status); if (OwnerDataResponse.status == 200) { this.dataStore.owner = OwnerDataResponse.body!.owner[0]; //console.log('getOwner object', this.dataStore.owner); this._ownerUpdated.next(Object.assign({},this.dataStore).owner); } else { console.log("No owner found, adding"); this.addOwner(address); } }); return obs; } hasOwner() { return this.uZaddr === this.oZaddr; } getNameUpdateListener() { return this.uNameUpdated; } }