Add account object interface.
Add new vcard parser.
This commit is contained in:
parent
2491dc54a0
commit
0d7f4aae13
11
package-lock.json
generated
11
package-lock.json
generated
@ -35,6 +35,7 @@
|
|||||||
"popper.js": "^1.16.1",
|
"popper.js": "^1.16.1",
|
||||||
"rxjs": "~6.6.0",
|
"rxjs": "~6.6.0",
|
||||||
"tslib": "^2.0.0",
|
"tslib": "^2.0.0",
|
||||||
|
"vcard-parser": "^1.0.0",
|
||||||
"vcards-js": "^2.10.0",
|
"vcards-js": "^2.10.0",
|
||||||
"web3": "^1.3.0",
|
"web3": "^1.3.0",
|
||||||
"zone.js": "~0.10.2"
|
"zone.js": "~0.10.2"
|
||||||
@ -18089,6 +18090,11 @@
|
|||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/vcard-parser": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/vcard-parser/-/vcard-parser-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-rSEjrjBK3of4VimMR5vBjLLcN5ZCSp9yuVzyx5i4Fwx74Yd0s+DnHtSit/wAAtj1a7/T/qQc0ykwXADoD0+fTQ=="
|
||||||
|
},
|
||||||
"node_modules/vcards-js": {
|
"node_modules/vcards-js": {
|
||||||
"version": "2.10.0",
|
"version": "2.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/vcards-js/-/vcards-js-2.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/vcards-js/-/vcards-js-2.10.0.tgz",
|
||||||
@ -35411,6 +35417,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
||||||
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
|
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
|
||||||
},
|
},
|
||||||
|
"vcard-parser": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/vcard-parser/-/vcard-parser-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-rSEjrjBK3of4VimMR5vBjLLcN5ZCSp9yuVzyx5i4Fwx74Yd0s+DnHtSit/wAAtj1a7/T/qQc0ykwXADoD0+fTQ=="
|
||||||
|
},
|
||||||
"vcards-js": {
|
"vcards-js": {
|
||||||
"version": "2.10.0",
|
"version": "2.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/vcards-js/-/vcards-js-2.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/vcards-js/-/vcards-js-2.10.0.tgz",
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
"popper.js": "^1.16.1",
|
"popper.js": "^1.16.1",
|
||||||
"rxjs": "~6.6.0",
|
"rxjs": "~6.6.0",
|
||||||
"tslib": "^2.0.0",
|
"tslib": "^2.0.0",
|
||||||
|
"vcard-parser": "^1.0.0",
|
||||||
"vcards-js": "^2.10.0",
|
"vcards-js": "^2.10.0",
|
||||||
"web3": "^1.3.0",
|
"web3": "^1.3.0",
|
||||||
"zone.js": "~0.10.2"
|
"zone.js": "~0.10.2"
|
||||||
|
7
src/app/_models/account.spec.ts
Normal file
7
src/app/_models/account.spec.ts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import { Account } from './account';
|
||||||
|
|
||||||
|
describe('Account', () => {
|
||||||
|
it('should create an instance', () => {
|
||||||
|
expect(new Account()).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
52
src/app/_models/account.ts
Normal file
52
src/app/_models/account.ts
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
export interface AccountDetails {
|
||||||
|
date_registered: number;
|
||||||
|
gender: string;
|
||||||
|
identities: {
|
||||||
|
evm: {
|
||||||
|
'bloxberg:8996': string[];
|
||||||
|
'oldchain:1': string[];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
location: {
|
||||||
|
area_name: string;
|
||||||
|
};
|
||||||
|
products: string[];
|
||||||
|
vcard: {
|
||||||
|
email: [{
|
||||||
|
value: string;
|
||||||
|
}];
|
||||||
|
fn: [{
|
||||||
|
value: string;
|
||||||
|
}];
|
||||||
|
n: [{
|
||||||
|
value: string[];
|
||||||
|
}];
|
||||||
|
tel: [{
|
||||||
|
meta: {
|
||||||
|
TYP: string[];
|
||||||
|
},
|
||||||
|
value: string;
|
||||||
|
}],
|
||||||
|
version: [{
|
||||||
|
value: string;
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Signature {
|
||||||
|
algo: string;
|
||||||
|
data: string;
|
||||||
|
digest: string;
|
||||||
|
engine: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Meta {
|
||||||
|
data: AccountDetails;
|
||||||
|
id: string;
|
||||||
|
signature: Signature;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface MetaResponse {
|
||||||
|
id: string;
|
||||||
|
m: Meta;
|
||||||
|
}
|
@ -1,3 +1,4 @@
|
|||||||
export * from '@app/_models/transaction';
|
export * from '@app/_models/transaction';
|
||||||
export * from '@app/_models/settings';
|
export * from '@app/_models/settings';
|
||||||
export * from '@app/_models/user';
|
export * from '@app/_models/user';
|
||||||
|
export * from '@app/_models/account';
|
||||||
|
@ -5,7 +5,7 @@ import {environment} from '@src/environments/environment';
|
|||||||
import {first} from 'rxjs/operators';
|
import {first} from 'rxjs/operators';
|
||||||
import {AccountIndex, MutableKeyStore, MutablePgpKeyStore, PGPSigner, Signer} from '@app/_helpers';
|
import {AccountIndex, MutableKeyStore, MutablePgpKeyStore, PGPSigner, Signer} from '@app/_helpers';
|
||||||
import {ArgPair, Envelope, Syncable, User} from 'cic-client-meta';
|
import {ArgPair, Envelope, Syncable, User} from 'cic-client-meta';
|
||||||
import {parse} from '@src/assets/js/parse-vcard';
|
const vCard = require('vcard-parser');
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: 'root'
|
providedIn: 'root'
|
||||||
@ -16,6 +16,7 @@ export class UserService {
|
|||||||
signer: Signer = new PGPSigner(this.keystore);
|
signer: Signer = new PGPSigner(this.keystore);
|
||||||
accountIndexQuery = new AccountIndex(environment.contractAddress);
|
accountIndexQuery = new AccountIndex(environment.contractAddress);
|
||||||
|
|
||||||
|
accountsMeta = [];
|
||||||
accounts: any = [];
|
accounts: any = [];
|
||||||
private accountsList = new BehaviorSubject<any>(this.accounts);
|
private accountsList = new BehaviorSubject<any>(this.accounts);
|
||||||
accountsSubject = this.accountsList.asObservable();
|
accountsSubject = this.accountsList.asObservable();
|
||||||
@ -155,8 +156,10 @@ export class UserService {
|
|||||||
const accountAddresses = await this.accountIndexQuery.last(await this.accountIndexQuery.totalAccounts());
|
const accountAddresses = await this.accountIndexQuery.last(await this.accountIndexQuery.totalAccounts());
|
||||||
for (const accountAddress of accountAddresses.slice(offset, offset + limit)) {
|
for (const accountAddress of accountAddresses.slice(offset, offset + limit)) {
|
||||||
this.getAccountDetailsFromMeta(await User.toKey(accountAddress)).pipe(first()).subscribe(res => {
|
this.getAccountDetailsFromMeta(await User.toKey(accountAddress)).pipe(first()).subscribe(res => {
|
||||||
const accountInfo = Envelope.fromJSON(JSON.stringify(res)).unwrap().m.data;
|
const account = Envelope.fromJSON(JSON.stringify(res)).unwrap();
|
||||||
accountInfo.vcard = parse(atob(accountInfo.vcard));
|
this.accountsMeta.push(account);
|
||||||
|
const accountInfo = account.m.data;
|
||||||
|
accountInfo.vcard = vCard.parse(atob(accountInfo.vcard));
|
||||||
this.accounts.push(accountInfo);
|
this.accounts.push(accountInfo);
|
||||||
this.accountsList.next(this.accounts);
|
this.accountsList.next(this.accounts);
|
||||||
});
|
});
|
||||||
|
@ -54,12 +54,12 @@
|
|||||||
matSortDirection="desc" matSortDisableClear>
|
matSortDirection="desc" matSortDisableClear>
|
||||||
<ng-container matColumnDef="name">
|
<ng-container matColumnDef="name">
|
||||||
<mat-header-cell *matHeaderCellDef mat-sort-header> NAME </mat-header-cell>
|
<mat-header-cell *matHeaderCellDef mat-sort-header> NAME </mat-header-cell>
|
||||||
<mat-cell *matCellDef="let user"> {{user?.vcard.fn}} </mat-cell>
|
<mat-cell *matCellDef="let user"> {{user?.vcard.fn[0].value}} </mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="phone">
|
<ng-container matColumnDef="phone">
|
||||||
<mat-header-cell *matHeaderCellDef mat-sort-header> PHONE NUMBER </mat-header-cell>
|
<mat-header-cell *matHeaderCellDef mat-sort-header> PHONE NUMBER </mat-header-cell>
|
||||||
<mat-cell *matCellDef="let user"> {{user?.vcard.tel[0].value[0]}} </mat-cell>
|
<mat-cell *matCellDef="let user"> {{user?.vcard.tel[0].value}} </mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="created">
|
<ng-container matColumnDef="created">
|
||||||
|
@ -14,7 +14,7 @@ import {Router} from '@angular/router';
|
|||||||
export class AccountsComponent implements OnInit {
|
export class AccountsComponent implements OnInit {
|
||||||
dataSource: MatTableDataSource<any>;
|
dataSource: MatTableDataSource<any>;
|
||||||
accounts: any[] = [];
|
accounts: any[] = [];
|
||||||
displayedColumns = ['name', 'phone', 'created', 'balance', 'type', 'status', 'location', 'failedPinAttempts', 'select'];
|
displayedColumns = ['name', 'phone', 'created', 'location', 'select'];
|
||||||
initialSelection = [];
|
initialSelection = [];
|
||||||
allowMultiSelect = true;
|
allowMultiSelect = true;
|
||||||
selection: SelectionModel<any>;
|
selection: SelectionModel<any>;
|
||||||
|
@ -1,42 +0,0 @@
|
|||||||
export function parse(input) {
|
|
||||||
const Re1 = /^(version|fn|title|org):(.+)$/i;
|
|
||||||
const Re2 = /^([^:;]+);([^:]+):(.+)$/;
|
|
||||||
const ReKey = /item\d{1,2}\./;
|
|
||||||
let fields = {};
|
|
||||||
|
|
||||||
input.split(/\r\n|\r|\n/).forEach(function (line) {
|
|
||||||
let results, key;
|
|
||||||
|
|
||||||
if (Re1.test(line)) {
|
|
||||||
results = line.match(Re1);
|
|
||||||
key = results[1].toLowerCase();
|
|
||||||
fields[key] = results[2];
|
|
||||||
} else if (Re2.test(line)) {
|
|
||||||
results = line.match(Re2);
|
|
||||||
key = results[1].replace(ReKey, '').toLowerCase();
|
|
||||||
|
|
||||||
let meta = {};
|
|
||||||
results[2].split(';')
|
|
||||||
.map(function (p, i) {
|
|
||||||
const match = p.match(/([a-z]+)=(.*)/i);
|
|
||||||
if (match) {
|
|
||||||
return [match[1], match[2]];
|
|
||||||
} else {
|
|
||||||
return ["TYPE" + (i === 0 ? "" : i), p];
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.forEach(function (p) {
|
|
||||||
meta[p[0]] = p[1];
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!fields[key]) fields[key] = [];
|
|
||||||
|
|
||||||
fields[key].push({
|
|
||||||
meta: meta,
|
|
||||||
value: results[3].split(';')
|
|
||||||
})
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return fields;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user