import {Injectable} from '@angular/core'; import {Subject, BehaviorSubject, Observable} from 'rxjs'; import {HttpClient, HttpParams, HttpHeaders} from '@angular/common/http'; import {User} from './user.model'; import {Owner} from './owner.model'; import { Country } from './country.model'; import {Tx} from './tx.model'; var Buffer = require('buffer/').Buffer; @Injectable({providedIn: 'root'}) export class UserService{ beUrl = 'http://localhost:3000/'; private dataStore: { user: User, owner: Owner, txs: Tx[], countries: Country[]} = { user: { address: '', session: '', blocktime: 0, pin: '', validated: false }, owner: { address: '', name: '', currency: 'usd', tax: false, taxValue: 0, vat: false, vatValue: 0, first: '', last: '', email: '', street: '', city: '', state: '', postal: '', phone: '', paid: false, website: '', country: '', zats: false, invoices: false, expiration: new Date(Date.now()).toISOString() }, txs : [], countries: [] }; 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); private _txsUpdated: BehaviorSubject = new BehaviorSubject(this.dataStore.txs); private _paidUpdated: BehaviorSubject = new BehaviorSubject(this.dataStore.owner.paid); private _countriesUpdated: BehaviorSubject = new BehaviorSubject(this.dataStore.countries); public readonly uZaddrUpdate: Observable = this._uZaddrUpdated.asObservable(); public readonly ownerUpdate: Observable = this._ownerUpdated.asObservable(); public readonly userUpdate: Observable = this._userUpdated.asObservable(); public readonly txUpdate: Observable = this._txsUpdated.asObservable(); public readonly paidUpdate: Observable = this._paidUpdated.asObservable(); public readonly countriesUpdate: Observable = this._countriesUpdated.asObservable(); private reqHeaders: HttpHeaders; private apiKey = 'Le2adeic8Thah4Aeng4daem6i'; constructor(private http: HttpClient){ var auth = 'Basic ' + Buffer.from('user:superSecret').toString('base64'); this.reqHeaders = new HttpHeaders().set('Authorization', auth); //console.log('US:', this.reqHeaders); this.session = localStorage.getItem('s4z_token'); if (this.session != null) { this.findUser(); } } getCountries() { let obs = this.http.get<{message: string, countries: any}>(this.beUrl+'api/countries', { headers: this.reqHeaders, observe: 'response'}); obs.subscribe((CountryResponse) => { if (CountryResponse.status == 200) { this.dataStore.countries = CountryResponse.body!.countries; this._countriesUpdated.next(Object.assign({}, this.dataStore).countries); } }); } findUser() { this.session = localStorage.getItem('s4z_token'); if (this.session != null) { const params = new HttpParams().append('session', this.session!); let obs = this.http.get<{message: string, user: any}>(this.beUrl+'api/user', { headers: this.reqHeaders, params: params, observe: 'response'}); obs.subscribe((UserDataResponse) => { console.log(UserDataResponse.status); if (UserDataResponse.status == 200){ this.dataStore.user = UserDataResponse.body!.user; 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 { this.dataStore.user = { address: '', session: '', blocktime: 0, pin: '', validated: false }; this._uZaddrUpdated.next(Object.assign({},this.dataStore).user.address); this._userUpdated.next(Object.assign({}, this.dataStore).user); console.log('US: Did not find user'); } }); return obs; } else { console.log('No session loaded'); return null; } } validateUser(pinString:string){ const params = new HttpParams().append('session', this.dataStore.user.session).append('pin', pinString); this.http.post(this.beUrl+'api/validateuser', {}, {headers: this.reqHeaders, params: params, observe: 'response'}). subscribe((responseData) => { if (responseData.status == 202) { console.log('Pin validated!'); } else { console.log('Wrong pin!'); } }); } addOwner(owner: Owner) { owner.address = this.dataStore.user.address; let obs = this.http.post(this.beUrl+'api/owner', {payload: owner}, {headers: this.reqHeaders}); obs.subscribe((responseData) => { this.getOwner(this.dataStore.user.address); }); return obs; } updateOwner(owner: Owner) { this.http.post<{message: string, owner: Owner}>(this.beUrl+'api/updateowner', {owner: owner}, {headers: this.reqHeaders}). 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}>(this.beUrl+'api/owner', { headers: this.reqHeaders, params: ownParams, observe: 'response'}); obs.subscribe((OwnerDataResponse) => { console.log('api/getowner', OwnerDataResponse.status); if (OwnerDataResponse.status == 200) { this.dataStore.owner = OwnerDataResponse.body!.owner; //console.log('getOwner object', this.dataStore.owner); this._ownerUpdated.next(Object.assign({},this.dataStore).owner); this._paidUpdated.next(Object.assign({}, this.dataStore).owner.paid); } }); return obs; } deleteUser() { let obs = this.http.delete<{message: string}>(this.beUrl+'api/user/'+this.dataStore.user._id, {headers: this.reqHeaders }); obs.subscribe(UserResponse => { console.log('User delete request sent.'); this.findUser(); }); return obs; } }