zgo/src/app/user.service.ts

125 lines
3.9 KiB
TypeScript

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<string> = new BehaviorSubject(this.uZaddr);
private _userUpdated: BehaviorSubject<User> = new BehaviorSubject(this.dataStore.user);
private uNameUpdated = new Subject<string>();
private _ownerUpdated: BehaviorSubject<Owner> = new BehaviorSubject(this.dataStore.owner);
public readonly uZaddrUpdate: Observable<string> = this._uZaddrUpdated.asObservable();
public readonly ownerUpdate: Observable<Owner> = this._ownerUpdated.asObservable();
public readonly userUpdate: Observable<User> = 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;
}
}