2021-02-23 13:32:02 +01:00
|
|
|
import {Injectable} from '@angular/core';
|
2021-02-17 13:49:04 +01:00
|
|
|
import {BehaviorSubject, Observable} from 'rxjs';
|
2021-02-16 09:04:22 +01:00
|
|
|
import {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';
|
2021-02-17 13:49:04 +01:00
|
|
|
import {environment} from '@src/environments/environment';
|
2021-02-17 19:22:06 +01:00
|
|
|
import {first} from 'rxjs/operators';
|
2021-03-06 07:28:29 +01:00
|
|
|
import {AccountIndex, MutableKeyStore, MutablePgpKeyStore, PGPSigner, Registry, Signer} from '@app/_helpers';
|
2021-02-25 11:46:24 +01:00
|
|
|
import {ArgPair, Envelope, Syncable, User} from 'cic-client-meta';
|
2021-03-14 09:19:25 +01:00
|
|
|
import {MetaResponse} from '@app/_models';
|
|
|
|
import {LoggingService} from '@app/_services/logging.service';
|
|
|
|
import {HttpWrapperService} from '@app/_services/http-wrapper.service';
|
2021-03-02 08:29:14 +01:00
|
|
|
const vCard = require('vcard-parser');
|
2020-11-25 08:51:15 +01:00
|
|
|
|
|
|
|
@Injectable({
|
|
|
|
providedIn: 'root'
|
|
|
|
})
|
|
|
|
export class UserService {
|
2021-02-23 13:32:02 +01:00
|
|
|
headers: HttpHeaders = new HttpHeaders({'x-cic-automerge': 'client'});
|
2021-02-17 13:49:04 +01:00
|
|
|
keystore: MutableKeyStore = new MutablePgpKeyStore();
|
2021-02-17 11:00:38 +01:00
|
|
|
signer: Signer = new PGPSigner(this.keystore);
|
2021-03-06 07:28:29 +01:00
|
|
|
registry = new Registry(environment.registryAddress);
|
2021-02-17 11:00:38 +01:00
|
|
|
|
2021-03-02 08:29:14 +01:00
|
|
|
accountsMeta = [];
|
2021-03-01 09:12:49 +01:00
|
|
|
accounts: any = [];
|
2020-12-05 07:29:18 +01:00
|
|
|
private accountsList = new BehaviorSubject<any>(this.accounts);
|
|
|
|
accountsSubject = this.accountsList.asObservable();
|
|
|
|
|
|
|
|
actions: any = '';
|
|
|
|
private actionsList = new BehaviorSubject<any>(this.actions);
|
|
|
|
actionsSubject = this.actionsList.asObservable();
|
|
|
|
|
|
|
|
staff: any = '';
|
|
|
|
private staffList = new BehaviorSubject<any>(this.staff);
|
|
|
|
staffSubject = this.staffList.asObservable();
|
2020-11-25 08:51:15 +01:00
|
|
|
|
2021-03-14 09:19:25 +01:00
|
|
|
constructor(
|
|
|
|
private http: HttpClient,
|
|
|
|
private httpWrapperService: HttpWrapperService,
|
|
|
|
private loggingService: LoggingService
|
|
|
|
) {
|
2021-03-06 07:28:29 +01:00
|
|
|
}
|
2020-11-25 08:51:15 +01:00
|
|
|
|
2021-02-08 12:47:07 +01:00
|
|
|
resetPin(phone: string): Observable<any> {
|
|
|
|
const params = new HttpParams().set('phoneNumber', phone);
|
2021-03-14 09:19:25 +01:00
|
|
|
return this.httpWrapperService.get(`${environment.cicUssdUrl}/pin`, {params});
|
|
|
|
}
|
|
|
|
|
|
|
|
getAccountStatus(phone: string): any {
|
|
|
|
const params = new HttpParams().set('phoneNumber', phone);
|
|
|
|
return this.httpWrapperService.get(`${environment.cicUssdUrl}/pin`, {params});
|
|
|
|
}
|
|
|
|
|
|
|
|
getLockedAccounts(offset: number, limit: number): any {
|
|
|
|
return this.httpWrapperService.get(`${environment.cicUssdUrl}/accounts/locked/${offset}/${limit}`);
|
|
|
|
}
|
|
|
|
|
|
|
|
async changeAccountInfo(address: string, name: string, phoneNumber: string, age: string, type: string, bio: string, gender: string,
|
|
|
|
businessCategory: string, userLocation: string, location: string, locationType: string, metaAccount: MetaResponse
|
|
|
|
): Promise<any> {
|
|
|
|
let reqBody = metaAccount;
|
|
|
|
let accountInfo = reqBody.m.data;
|
|
|
|
accountInfo.vcard.fn[0].value = name;
|
|
|
|
accountInfo.vcard.n[0].value = name.split(' ');
|
|
|
|
accountInfo.vcard.tel[0].value = phoneNumber;
|
|
|
|
accountInfo.products = [bio];
|
|
|
|
accountInfo.gender = gender;
|
|
|
|
accountInfo.age = age;
|
|
|
|
accountInfo.type = type;
|
|
|
|
accountInfo.category = businessCategory;
|
|
|
|
accountInfo.location.area = location;
|
|
|
|
accountInfo.location.area_name = userLocation;
|
|
|
|
accountInfo.location.area_type = locationType;
|
|
|
|
accountInfo.vcard = vCard.generate(accountInfo.vcard);
|
|
|
|
reqBody.m.data = accountInfo;
|
2021-02-17 19:22:06 +01:00
|
|
|
const accountKey = await User.toKey(address);
|
2021-03-14 09:19:25 +01:00
|
|
|
this.httpWrapperService.get(`${environment.cicMetaUrl}/${accountKey}`, { headers: this.headers }).pipe(first()).subscribe(async res => {
|
|
|
|
const syncableAccount: Syncable = Envelope.fromJSON(JSON.stringify(res.body)).unwrap();
|
2021-02-17 11:00:38 +01:00
|
|
|
let update = [];
|
2021-03-14 09:19:25 +01:00
|
|
|
for (const prop in reqBody) {
|
|
|
|
update.push(new ArgPair(prop, reqBody[prop]));
|
2021-02-17 11:00:38 +01:00
|
|
|
}
|
2021-02-23 13:32:02 +01:00
|
|
|
syncableAccount.update(update, 'client-branch');
|
|
|
|
await this.updateMeta(syncableAccount, accountKey, this.headers);
|
2021-02-17 11:00:38 +01:00
|
|
|
}, async error => {
|
2021-03-14 09:19:25 +01:00
|
|
|
this.loggingService.sendErrorLevelMessage('Can\'t find account info in meta service', this, {error});
|
|
|
|
const syncableAccount: Syncable = new Syncable(accountKey, accountInfo);
|
2021-02-23 13:32:02 +01:00
|
|
|
await this.updateMeta(syncableAccount, accountKey, this.headers);
|
2021-02-16 09:04:22 +01:00
|
|
|
});
|
2021-02-17 19:22:06 +01:00
|
|
|
return accountKey;
|
2021-02-17 11:00:38 +01:00
|
|
|
}
|
|
|
|
|
2021-02-23 13:32:02 +01:00
|
|
|
async updateMeta(syncableAccount: Syncable, accountKey: string, headers: HttpHeaders): Promise<any> {
|
|
|
|
const envelope = await this.wrap(syncableAccount , this.signer);
|
2021-02-17 11:00:38 +01:00
|
|
|
const reqBody = envelope.toJSON();
|
2021-03-14 09:19:25 +01:00
|
|
|
this.httpWrapperService.put(`${environment.cicMetaUrl}/${accountKey}`, reqBody , { headers }).pipe(first()).subscribe(res => {
|
|
|
|
this.loggingService.sendInfoLevelMessage(`Response: ${res.body}`);
|
2021-02-16 09:04:22 +01:00
|
|
|
});
|
2021-02-08 12:47:07 +01:00
|
|
|
}
|
|
|
|
|
2020-12-05 07:29:18 +01:00
|
|
|
getAccounts(): void {
|
2021-03-14 09:19:25 +01:00
|
|
|
this.httpWrapperService.get(`${environment.cicCacheUrl}/accounts`).pipe(first()).subscribe(res => this.accountsList.next(res.body));
|
2020-11-25 08:51:15 +01:00
|
|
|
}
|
|
|
|
|
2020-12-05 07:29:18 +01:00
|
|
|
getAccountById(id: number): Observable<any> {
|
2021-03-14 09:19:25 +01:00
|
|
|
return this.httpWrapperService.get(`${environment.cicCacheUrl}/accounts/${id}`);
|
2020-12-05 07:29:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
getActions(): void {
|
2021-03-14 09:19:25 +01:00
|
|
|
this.httpWrapperService.get(`${environment.cicCacheUrl}/actions`).pipe(first()).subscribe(res => this.actionsList.next(res.body));
|
2020-11-25 08:51:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
getActionById(id: string): any {
|
2021-03-14 09:19:25 +01:00
|
|
|
return this.httpWrapperService.get(`${environment.cicCacheUrl}/actions/${id}`);
|
2020-12-05 07:29:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
approveAction(id: string): Observable<any> {
|
2021-03-14 09:19:25 +01:00
|
|
|
return this.httpWrapperService.post(`${environment.cicCacheUrl}/actions/${id}`, { approval: true });
|
2020-12-05 07:29:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
revokeAction(id: string): Observable<any> {
|
2021-03-14 09:19:25 +01:00
|
|
|
return this.httpWrapperService.post(`${environment.cicCacheUrl}/actions/${id}`, { approval: false });
|
2020-12-05 07:29:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
getHistoryByUser(id: string): Observable<any> {
|
2021-03-14 09:19:25 +01:00
|
|
|
return this.httpWrapperService.get(`${environment.cicCacheUrl}/history/${id}`);
|
2020-12-05 07:29:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
getStaff(): void {
|
2021-03-14 09:19:25 +01:00
|
|
|
this.httpWrapperService.get(`${environment.cicCacheUrl}/staff`).pipe(first()).subscribe(res => this.staffList.next(res.body));
|
2020-12-05 07:29:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
getStaffById(id: string): Observable<any> {
|
2021-03-14 09:19:25 +01:00
|
|
|
return this.httpWrapperService.get(`${environment.cicCacheUrl}/staff/${id}`);
|
2020-12-05 07:29:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
activateStaff(id: string): Observable<any> {
|
2021-03-14 09:19:25 +01:00
|
|
|
return this.httpWrapperService.post(`${environment.cicCacheUrl}/staff/${id}`, {status: 'activated'});
|
2020-11-25 08:51:15 +01:00
|
|
|
}
|
|
|
|
|
2020-12-05 07:29:18 +01:00
|
|
|
deactivateStaff(id: string): Observable<any> {
|
2021-03-14 09:19:25 +01:00
|
|
|
return this.httpWrapperService.post(`${environment.cicCacheUrl}/staff/${id}`, {status: 'deactivated'});
|
2020-11-25 08:51:15 +01:00
|
|
|
}
|
|
|
|
|
2020-12-05 07:29:18 +01:00
|
|
|
changeStaffType(id: string, type: string): Observable<any> {
|
2021-03-14 09:19:25 +01:00
|
|
|
return this.httpWrapperService.post(`${environment.cicCacheUrl}/staff/${id}`, {accountType: type});
|
2020-12-05 07:29:18 +01:00
|
|
|
}
|
|
|
|
|
2021-02-23 13:32:02 +01:00
|
|
|
getAccountDetailsFromMeta(userKey: string): Observable<any> {
|
2021-03-14 09:19:25 +01:00
|
|
|
return this.httpWrapperService.get(`${environment.cicMetaUrl}/${userKey}`, { headers: this.headers });
|
2021-02-23 13:32:02 +01:00
|
|
|
}
|
|
|
|
|
2021-02-17 19:22:06 +01:00
|
|
|
getUser(userKey: string): any {
|
2021-03-14 09:19:25 +01:00
|
|
|
return this.httpWrapperService.get(`${environment.cicMetaUrl}/${userKey}`, { headers: this.headers })
|
|
|
|
.pipe(first()).subscribe(async res => {
|
|
|
|
return Envelope.fromJSON(JSON.stringify(res.body)).unwrap();
|
2021-02-17 19:22:06 +01:00
|
|
|
});
|
2020-11-25 08:51:15 +01:00
|
|
|
}
|
2021-02-17 11:00:38 +01:00
|
|
|
|
|
|
|
wrap(syncable: Syncable, signer: Signer): Promise<Envelope> {
|
2021-02-17 19:22:06 +01:00
|
|
|
return new Promise<Envelope>(async (whohoo, doh) => {
|
2021-02-17 11:00:38 +01:00
|
|
|
syncable.setSigner(signer);
|
|
|
|
syncable.onwrap = async (env) => {
|
|
|
|
if (env === undefined) {
|
|
|
|
doh();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
whohoo(env);
|
|
|
|
};
|
2021-02-17 19:22:06 +01:00
|
|
|
await syncable.sign();
|
2021-02-17 11:00:38 +01:00
|
|
|
});
|
|
|
|
}
|
2021-03-01 09:12:49 +01:00
|
|
|
|
|
|
|
async loadAccounts(limit: number, offset: number = 0): Promise<void> {
|
2021-03-10 10:47:01 +01:00
|
|
|
this.resetAccountsList();
|
2021-03-06 07:28:29 +01:00
|
|
|
const accountIndexAddress = await this.registry.addressOf('AccountRegistry');
|
|
|
|
const accountIndexQuery = new AccountIndex(accountIndexAddress);
|
|
|
|
const accountAddresses = await accountIndexQuery.last(await accountIndexQuery.totalAccounts());
|
2021-03-01 09:12:49 +01:00
|
|
|
for (const accountAddress of accountAddresses.slice(offset, offset + limit)) {
|
|
|
|
this.getAccountDetailsFromMeta(await User.toKey(accountAddress)).pipe(first()).subscribe(res => {
|
2021-03-02 08:29:14 +01:00
|
|
|
const account = Envelope.fromJSON(JSON.stringify(res)).unwrap();
|
|
|
|
this.accountsMeta.push(account);
|
|
|
|
const accountInfo = account.m.data;
|
|
|
|
accountInfo.vcard = vCard.parse(atob(accountInfo.vcard));
|
2021-03-10 10:47:01 +01:00
|
|
|
this.accounts.unshift(accountInfo);
|
|
|
|
if (this.accounts.length > limit) {
|
|
|
|
this.accounts.length = limit;
|
|
|
|
}
|
2021-03-01 09:12:49 +01:00
|
|
|
this.accountsList.next(this.accounts);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2021-03-10 10:47:01 +01:00
|
|
|
|
|
|
|
resetAccountsList(): void {
|
|
|
|
this.accounts = [];
|
|
|
|
this.accountsList.next(this.accounts);
|
|
|
|
}
|
2020-11-25 08:51:15 +01:00
|
|
|
}
|