From 8af6b251b924da5173f2504b1e406c27916d35df Mon Sep 17 00:00:00 2001 From: Spencer Ofwiti Date: Sun, 14 Mar 2021 11:19:25 +0300 Subject: [PATCH] Refactor requests to utilize http wrapper service. --- src/app/_services/auth.service.ts | 176 +++++++++++++++++++++-- src/app/_services/block-sync.service.ts | 23 ++- src/app/_services/index.ts | 2 + src/app/_services/location.service.ts | 6 +- src/app/_services/token.service.ts | 11 +- src/app/_services/transaction.service.ts | 30 ++-- src/app/_services/user.service.ts | 104 ++++++++------ 7 files changed, 259 insertions(+), 93 deletions(-) diff --git a/src/app/_services/auth.service.ts b/src/app/_services/auth.service.ts index 6b47210..c27074d 100644 --- a/src/app/_services/auth.service.ts +++ b/src/app/_services/auth.service.ts @@ -3,7 +3,8 @@ import {MutableKeyStore, MutablePgpKeyStore} from '@app/_helpers'; import { hobaParseChallengeHeader } from '@src/assets/js/hoba.js'; import { signChallenge } from '@src/assets/js/hoba-pgp.js'; import {environment} from '@src/environments/environment'; -import {HttpClient} from '@angular/common/http'; +import {LoggingService} from '@app/_services/logging.service'; +import {HttpWrapperService} from '@app/_services/http-wrapper.service'; @Injectable({ providedIn: 'root' @@ -15,7 +16,8 @@ export class AuthService { mutableKeyStore: MutableKeyStore = new MutablePgpKeyStore(); constructor( - private http: HttpClient + private httpWrapperService: HttpWrapperService, + private loggingService: LoggingService ) { if (sessionStorage.getItem(btoa('CICADA_SESSION_TOKEN'))) { this.sessionToken = sessionStorage.getItem(btoa('CICADA_SESSION_TOKEN')); @@ -88,14 +90,14 @@ export class AuthService { this.getWithToken(); return true; } catch (e) { - console.error('login token failed', e); + this.loggingService.sendErrorLevelMessage('Login token failed', this, {error: e}); } } else { try { const o = this.getChallenge(); return true; } catch (e) { - console.error('login challenge failed', e); + this.loggingService.sendErrorLevelMessage('Login challenge failed', this, {error: e}); } } return false; @@ -118,7 +120,7 @@ export class AuthService { await this.mutableKeyStore.importPrivateKey(privateKeyArmored); localStorage.setItem(btoa('CICADA_PRIVATE_KEY'), privateKeyArmored); } catch (e) { - console.error('failed setting key', e); + this.loggingService.sendErrorLevelMessage('Failed setting key', this, {error: e}); return false; } this.loginView(); @@ -131,11 +133,165 @@ export class AuthService { } async getPublicKeys(): Promise { - this.http.get(`${environment.publicKeysUrl}/keys.asc`).subscribe(async res => { - await this.mutableKeyStore.importPublicKey(res); - }, error => { - console.error('There was an error!', error); - }); + // this.httpWrapperService.get(`${environment.publicKeysUrl}/keys.asc`).pipe(first()).subscribe(async res => { + // await this.mutableKeyStore.importPublicKey(res.body); + // }, error => { + // this.loggingService.sendErrorLevelMessage('There was an error!', this, {error}); + // }); + const armoredPublicKeys = '-----BEGIN PGP PUBLIC KEY BLOCK-----\n' + + '\n' + + 'mQGNBF+hSOgBDACpkPQEjADjnQtjmAsdPYpx5N+OMJBYj1DAoIYsDtV6vbcBJQt9\n' + + '4Om3xl7RBhv9m2oLgzPsiRwjCEFRWyNSu0BUp5CFjcXfm0S4K2egx4erFnTnSSC9\n' + + 'S6tmVNrVNEXvScE6sKAnmJ7JNX1ExJuEiWPbUDRWJ1hoI9+AR+8EONeJRLo/j0Np\n' + + '+S4IFDn0PsxdT+SB0GY0z2cEgjvjoPr4lW9IAb8Ft9TDYp+mOzejn1Fg7CuIrlBR\n' + + 'SAv+sj7bVQw15dh1SpbwtS5xxubCa8ExEGI4ByXmeXdR0KZJ+EA5ksO0iSsQ/6ip\n' + + 'SOdSg+i0niOClFNm1P/OhbUsYAxCUfiX654FMn2zoxVBEjJ3e7l0pH7ktodaxEct\n' + + 'PofQLBA9LSDUIejqJsU0npw/DHDD2uvxG+/A6lgV9L8ETlvgp8RzeOCf2bHuiKYY\n' + + 'z87txvkFwsXgU1+TZxbk+mtCBbngsVPLNarY/KGkVJL+yhcHRD0Pl4wXUd6auQuY\n' + + '6vQ9AuKiCT1We2sAEQEAAbQeTWVyIE1hbiA8bWVybWFuQGdyZXlza3VsbC5jb20+\n' + + 'iQHUBBMBCAA+FiEE8/r2aOgu9RJNUYe67yb0aCND9pIFAl+hSOgCGwMFCQPCZwAF\n' + + 'CwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQ7yb0aCND9pLwiwwAhFJbAyUK05TJ\n' + + 'KfDz81757N472STtB8sfr0auwmRr8Zs1utHRVM0b/jkjTuo4uJNr7YVVKTKgE7+r\n' + + 'J+pwhm3wlTQ44LVLjByWAi/7NWg3E9b2elm+qkfgm/RfFt3vkuOxGSyZyIFFh+/t\n' + + 'wv6iABPvr6w7MZwrFaS0UP3g1VGa5TFqg6KNxod9H/gPLxv45lutXf3VvBZTJpr1\n' + + 'pxn7aLHlFzEyIgNZbP/N1QF44GSrN/k0DfL631sZjauUXaZXbi5xGsKKCYwJ1g3q\n' + + '587pi6mTdTV3n0hKgVuipO8hGy5++YeOv+hXsCxDwyZ+Shv+qavd/SapxYgCdEue\n' + + 'uwONIFfsIsWCd3SCcjKXicTTEFMu8nvBmf7xuo2hv6vEOxoijlXV+4LkGrskdB8Z\n' + + 'Mg8PywEx6DLmDokgnAhTLrTc1ShbkOtQ3yNjjyFK7BDpqobsJal6d8SpbhccUJLe\n' + + 'paSmsk0CgJsTjhAl6EwX0EYgTo3kP5fScqrbD8VwQaT8CcE4rCV4uQGNBF+hSOgB\n' + + 'DADHtpTT1k4x+6FN5OeURpKAaIsoPHghkJ2lb6yWmESCa+DaR6GXAKlbd0L9UMcX\n' + + 'LqnaCn4SpZvbf8hP4fJRgWdRl5uVN/rmyVbZLUVjM8NcVdFRIrTsNyu4mLBmydc3\n' + + 'iA/90sCTEOj9e7DSvxLmmLFjpwM5xXLd6z0l6+9G+woNmARXVS3V/RryFntyKC3A\n' + + 'TCqVlJoQBG45Tj2gMIunpadTJXWmdioooeGW3sLeUv5MM98mSB4SjKRlJqGPNjx5\n' + + 'lO6MmJbZeXZ/L/aO6EsXUQD2h82Wphll4rpGYWPiHTCYqZYiqNYr6E3xUpzcvWVp\n' + + '3uCYVJWP6Ds117p7BoyKVz00yxC9ledF3eppktZWqFVowCMihQE3676L3DDTZsnJ\n' + + 'f1/8xKUh5U2Mj3lBvjlvCECKi00qo8b1mn/OklQjJ5T4WzTrH6X+/zpez8ZkmtcO\n' + + 'ayHdUKD/64roZ9dXbXG/hp5A+UWj8oSVYKg2QNAwAnZ+aiZ2KVRE/Y61DCgFg6Cc\n' + + 'x/cAEQEAAYkBvAQYAQgAJhYhBPP69mjoLvUSTVGHuu8m9GgjQ/aSBQJfoUjoAhsM\n' + + 'BQkDwmcAAAoJEO8m9GgjQ/aSIPcL/3jqL2A2SmC+s0BO4vMPEfCpa2gZ/vo1azzj\n' + + 'UieZu5WhIxb5ik0V6T75EW5F0OeZj9qXI06gW+IM8+C6ImUgaR3l47UjBiBPq+uK\n' + + 'O9QuT/nOtbSs2dXoTNCLMQN7MlrdUBix+lnqZZGSDgh6n/uVyAYw8Sh4c3/3thHU\n' + + 'iR7xzVKGxAKDT8LoVjhHshTzYuQq8MqlfvwVI4eESLaryQ+Y+j5+VLDzSLgPAnnI\n' + + 'qF/ui2JQjefJxm/VLoYNaPAGdqoz/u/R0Tmz94bZUfLjgQaDoUpnxYywK2JGlf3m\n' + + 'PZ3PNWjxJzuQTF5Ge5bz/TylnRYIyBT7KD7oaKHO62fhDbYPJ4f94iZN4B6nnTAe\n' + + 'P34zFDlkUbX4AHudXU7bvxT5OUk9x9c2tj7xwxQHaEhq2+JsYW0EVw27RLhbymnB\n' + + 'fLjVVUktNF0nQGvU2TEocw4pr2ZkDHQkSnlbNa4kujlL7VzbpnEgyOmi5er9GaIu\n' + + 'VSVADovBu+pz/Ov1y/3jUe8hZ/KleZkBjQRfoUkaAQwA2r2HiLvpnclyZMoeck1L\n' + + 'FoVyEU/CjPcYWF1B76ekO9mrlYvbKsnsyL0WcuEqwCmHdLk70i743Fn21WQK4uvv\n' + + 'lvrEpev9aj9DihyLctv4qrPm6wAU/Xibf75tg1iRL+muMQfv6hQhjdhwkYFx/7XQ\n' + + '6UWkEibqFS7xJwrhz9lHL4KTA4sO5PeW713+mpz7tM5RmGV6NOQAyEEfAv6OawlW\n' + + 'k0f5o8xngIoyo2BS5qIeEBO+iz45+GG8GQC6XufOIx7VVl++ZpsxZKtDq/AXfAsk\n' + + 'xfLRwZMqH9Db5pPMzrL1bPV16AwoWqhAGd2HIMkODLEC5XTGIKCqO5+n288rHhAJ\n' + + 'TqFmE7TpAo+Eb0Tkk4jfm6LyRonmQGpu/Zxa53n5D6d+AgYWAMeHkEthWJkES4mK\n' + + 'pZu4nV21+n9mynnPg8wzthL705Q6IBjtlxX8EP6eeRFE1BUCNp2RZttTSdI+8iwz\n' + + 'YsGOJdJeeXeLOGhvU9/PLkRj9jgZLgCLAo1QGo2oxetZABEBAAG0IkJlYXN0IE1h\n' + + 'biA8YmVhc3RtYW5AZ3JleXNrdWxsLmNvbT6JAdQEEwEIAD4WIQT2ReBH7lvE4oJM\n' + + 'lNtC3JHPqKugKwUCX6FJGgIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIX\n' + + 'gAAKCRBC3JHPqKugK25hC/9VF1fekj0IKnrOJRUcK/Cv4RBowl60V91w27ApsoP2\n' + + 'awEJiFhY7qRijtkA3NKrT3tke7aTnC3yAJ8SFOmvIAC94ijb7Iv97xkG+1IIz8pv\n' + + 'ru9y+dzd2NnvCkts8gFF0CI/xtEME90rU3Pay9B5IyrpP++UdmSmnp3Neuwi94BZ\n' + + 'DfMlqkeiYOzWWSeYbmSSVfKTXeBdUuTyfRI4m/bPbh6gegOB/XdgSIrNY74D0nR3\n' + + 'np0I+s0IGZepK24kgBKfUPwRDk7f98PXCh29iL3xH+TBxu30WHq7xKmPoXxCRyFL\n' + + 'tnKF0MN5Ib276fHnJZM+hXf5i/1EPi4NLnk86e7fNI69hwiUd1msEt3VmZWe7anJ\n' + + 'e/1p3sSXwbQGhhGWM5K41/rQ1CZ9qD95d6wkHRSc0n4z78qxgYV73yJHinN8xIFn\n' + + 'PWbopPPIJbELSoM3IEpHobsj95pH4hzZAPSmDfOfLzV1G2ec1QPfWnTqUriUt7ed\n' + + 'Ds4//7Cczj6sRh2B6ax2diC5AY0EX6FJGgEMAMqxn5io6fWKnMz8h5THqp4gEzDu\n' + + 'oImapfMKbAKcxEtJmcLkvn+4ufEP/hcll66InqJHsqMOrdb+zbduCruYWpizhqCI\n' + + 'GSsuRu7+ZEEkQFmF5juCOV/5qKQJgZZmxSKbRtboapMRR/jmg1pvhnUG7wJOGWi7\n' + + 'qv+iRdsWKskDO7tUQE34+ID7IwfDZe2fbFKxf66nPlUunF8aMglsvGmtCEzm/xwj\n' + + 'unHnmoqZBQIzTdEXIaEwhVosbgY7A1iwOJ/gT2dcF2KJa7tygrtcbgdVzYCibynw\n' + + 'tlvDGXukweuYLQFsObyBG3UHRhJg61p7n344sy1U9uwCP3/pVCr9bNY9mLZpCgHF\n' + + 'kqxErmB8cWouQkbwnqxQFm21KtGFzjUawuKBXVtDEeA8C5Ha0sx7lw5JrX8GD3EL\n' + + '60qKWjqujJsR1kyijXx1No7Xr9NWWuPoIDYH06ZoYE+j065VTRqZIGr3NjUZnqT7\n' + + 's9M41roQMnKAzRBXousRXRW9dXfS5YIG4nWTlwARAQABiQG8BBgBCAAmFiEE9kXg\n' + + 'R+5bxOKCTJTbQtyRz6iroCsFAl+hSRoCGwwFCQPCZwAACgkQQtyRz6iroCt8igwA\n' + + 'gopqy+UgxJ7oTL2zvOgL1ez7bv+E/U1/7Rdy5MHwr4WF6oZRpIBlgv3GXXeIFH9b\n' + + 'FdDhgyPKgh+Tz24JBL+7YjUtWGe/G/pmmNK1YazB/OxrwiGFpTCyk1zhxEkhMu7H\n' + + 'u3LgD571K+4TUUpaPCqEeoBBg6O3T29DH1AxpWpEPGXlOrRDHYgVziEpLdUNahAj\n' + + 'F53auNWvya+Vc2qZwM4NFt608LLf7J5yIA2vbsvf6+gVopPE3whXESKXo08B2hC1\n' + + 'f3Pr9/Tgt6oIvy9/dAcTMalxRyyc42E2wX5kyzDlfhY9kqaNNfaGMZJO5g//gB7B\n' + + 'dtrAfo/LhWtary/YfAOtbbnMYkf+HODAPZItaIjMZngBM0c0m78YoCetAQE8uBFK\n' + + '6aXmht3BZGPOwgyZpK5QT6ClYst2N9ca3tPUEfnddotKySmCEk/JWtu5/0lFl75W\n' + + 'zHulc7iUNGJmnUffVZyH12CjBWsTtqombHDkdEKFocavqpVcCCbKbtW5GZhuZC65\n' + + 'mQGNBF+hSUIBDADStlWquV7SdREZtxXBVVzdCkV1xkeHYfo2Z244W0LTwmvpbO+o\n' + + '6P5GCAW2c336qWElsMO9ujeV2nuUZy3k3AtJLx19iWC+ywYVzJ8f878XAxq0ya1V\n' + + 'BBnfsBc7iRI3umf2JSi+fHXf9l+rJ8Zr5AkLrUo3tQoxX8xWQIfUVY481nlkOvuM\n' + + 'txEI6h1t+z7PWjAJsdKKdevRPApPIBGXX0iGE/98ATsLYtvh9ln26j1SrSdtKpPk\n' + + 'tuYve3zkphlZAdf5ReViicik6gpEdyEfIxNab6nyV8LTbSeCHe+6/cz+AEqA+cr3\n' + + 'K3MwriaapPzNhRV8izzGnIWChIZptGBKH5nLivfIAB/hbOgU6tM+YgUKrpJCXXA1\n' + + 'My2q68o2kARJxh6s0tuuT6pFEAG9RmzS3ywrPz4PAgkwrJA1uUa9fy9ngkOnQN3C\n' + + 'EeVQTUU55b+6zVhW1Qq8PII6AGqj1lSY9jLpjxEr3q227OlTaxfgg19x5o9rcycc\n' + + 'AZlQqzL2p3Z7HZ0AEQEAAbQcSGUgTWFuIDxoZW1hbkBncmV5c2t1bGwuY29tPokB\n' + + '1AQTAQgAPhYhBIYPcR68MZb6cOhv9wDz8yhlQWZrBQJfoUlCAhsDBQkDwmcABQsJ\n' + + 'CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEADz8yhlQWZrD0YMAJp6WkrSzghIgrGm\n' + + 'EquhUPu4n8dnaGraGxu1Om9Z6HrUvphBvm/yZMlZxYbsQRvd8DUCuQD7fScBS12W\n' + + 'X3AYe001REfAbj0kDAdDQ0Z8sFCeCDSBJ9ulX07FzTHH0qROcSv6NONjGYVeTFic\n' + + 'L2W0rATygnFzzjjSGboMq1qA8u6/5JNM7MAxJcIS0Dr8Fhdwv8TwTJrVg6ZzJDHN\n' + + '8OVAUkPaciQI5lDDP5+kOVqbZZ92Ua8byxKtNACCdSsWZr2OvYyjUz4JKMp5X6yH\n' + + 'bDQB3vlwRkRS7Voo3pUGsdLwiBWiryklSa++DIbBemrALFLc5YnLgfCV0frPOEqs\n' + + 'dDwWECRxwN4r+2DjY6TYCEEDfhM2Hm7MoMx/jM4uhI4KwPdOKmHsBPVBeXqBRXz3\n' + + '2NMMZg6to0HRjDapR8AkbfdC5vjiuwnDA6llmxnVtx2oPX3g8RVOIw65f8KfWzWS\n' + + 'fzEqhoKTccsHMMza8J1ax6T6HXkqa/Tt/B/3d7nUzp53V3luG7kBjQRfoUlCAQwA\n' + + '4rFxmKwr4RAoVEqhDDWl8ecd/KQXEg0iCpkkmED6mEpPE9qAi8ORNId66E+rveS1\n' + + 'SsbmbqVlrN9iHphtvYqvlwwb2IkgPaFpmVSqWrQ3yzEPrL5CLAWiiEq7M4ux7pue\n' + + 'YKcOmv3wQSta9eMgy9jaGUXrxFl4qotCevcEsLzkKC045OdVxkL++NFsiQUSfMYO\n' + + 'tgGKXuBh0ycI/pOb66lY186zPT0tR+QA18uzeCizEjhCZmPIlPHjN8NOEM7ZLU4U\n' + + 'QrLdSrm1quhO6DvGEoO5FulvGtp5hVHdJL5oB7svzNurXB3WVjdXCnRijoaCR07A\n' + + '/X9JVZY2+kRxdl6ZkuLZxb5UE6usW7pTA5DKiuFG/w6CSGZA1Dv3+yoZnjN8KhnG\n' + + 'mIWmEJgvddWWoaJ3wFvSAGkYa3qBLX3noV3ZCm0c/r2LBcyFGyuyddEhg9wrqWU9\n' + + 'vM7W/4BkTqSJdeMRlS9FD803V9GqxAJBJ1KOSFt2s6b+ekYCI/d+Buso8GPp8eUH\n' + + 'ABEBAAGJAbwEGAEIACYWIQSGD3EevDGW+nDob/cA8/MoZUFmawUCX6FJQgIbDAUJ\n' + + 'A8JnAAAKCRAA8/MoZUFma/gCC/9xkH8EF1Ka3TUa1kiBdcII4dyoX7gs/dA/os0+\n' + + 'fLb/iZZcG+bJZcKLma7DRiyDGXYc7nG3uPvho7/cOCUUg5P/EG5z0CDXzLbmBrk2\n' + + 'WlRnREmK/5NTcisCyezRMXHOxpya4pmExVMqSPGA0QbKGwdHqfbHQv2OyI3PYBKv\n' + + 'lN+eu6e5SEbT76AQijj5RSPcgbko24/sSqJylD1lnRocQK1p4XelosBraty4wzYS\n' + + 'vQY9dRD4nafxPHI3YjKiAG0I7nJDQ0d1jDaW5FP0BkMvn51SmfGsuSg1s46h9JlG\n' + + 'RZvS0enjBb1Ic9oBmHAWGQhlD1hvILlqIZOCdj8oWVjwmpZ7BK3/82wOdVkUxy09\n' + + 'IdIot+AIH+F/LA3KKgfDmjldyhXjI/HDrpmXwSUkJOBHebNLz5t1EdauF+4DY5BH\n' + + 'MsgtyyiYJBzRGT5pgrXMt4yCqZP+0jZwKt1Ech/Q6djIKjt+9wOGe9UB1VrzRbOS\n' + + '5ymseDJcjejtMxuCOuSTN9R5KuSZAY0EX6UhqgEMAO/22am2Urhbg5ClpEYzz2/W\n' + + 'L8ez3tkXKQZa7PsvKUv69jwBwNQmEpMhIPFXhKKwcmmLgYcvnd64xrXM5STxWedy\n' + + 'NaTPlCUDZGW+N4laCbrnHN98Ztu9TvjfjjiQvhHjD/9Ilc5fw5nZsawwTtGOwCkK\n' + + 'opBVKsgHaGrKRl7QP2RTwITwo7CkDBf77kp8wGCECrrSel0cVezSf6UmDs7V3q12\n' + + 'zf7gXBSjWlbA3NnSok6kTNej14IMKfdhiuUG6WFibxEfsOrm8Rv9RbbgpYUTN/ll\n' + + 'yWDTqbVDjYefq/iLs/5w24oI/1K0gy8Rzdl5qu4cvqcwkmxQMvtWWHoT86iHFff/\n' + + 'pp9drPctFfUetHDIKY+1U9VLilaSeCcDx7PCgxazCb7gmtTQWdM4wHcH5+69EEeG\n' + + 'lP4N9efoTRlU+m5ZSuqOtEvLXtP2Gnd/Tgn3lBjHjA+hQ65G96fv40dbYiiHxluo\n' + + 'cFkcwz118alx4cXStfAi6nCsDid2Y9NgWfHrJTs33QARAQABtDlMb3VpcyBIb2xi\n' + + 'cm9vayA8YWNjb3VudHMtZ3Jhc3Nyb290c2Vjb25vbWljc0Bob2xicm9vay5ubz6J\n' + + 'AdMEEwEIAD4WIQTFMBghgDfv6cesuTGwIKs7vZC0mAUCX6UhqgIbAwUJA8JnAAUL\n' + + 'CQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCwIKs7vZC0mEnCC/ih5hk43xHu6KBA\n' + + 'on/ox6wcYLltSuaJawJbPmznrOK6aIJGUDx6E/VEjFeU/+bySrm8y3gk3jqeoPRk\n' + + 'holZmvRW5/mJ/uud+7B83TOfLAHM1EgZtqCqq+Z61yrt46cjqXuQbonP5dFmnOee\n' + + 'Zpg4TP7FRCjAYThy/NtOXY7Ob3OC+MNnDPo71R2se+x4Ac6NKsmNKAETZjZg01R/\n' + + '2w5Ns77pxub+tihAVasLzmqlGNjqRzLCemR4osMwd0XrtziKiIvPYFlHhysgkpYh\n' + + 'oqbs2bjEdbsac21460j+3wRcvspfDEiLmI0n91s5uK3zCke0tI8BbU5/7IfnflBw\n' + + '9SVvcu5s6DqFjy3tuRVkVKs0h92YCEH6gfui1RkXPdFheGyZwvZujlfCTU0c2V8U\n' + + 'pmy2TvdUSsWiHSNgY8nimWbxU1fXt7fnWnQk59/Nov4zRO4AJQhXgrb/IyhjKMVa\n' + + 'UYUV/yQgVOqbv5VJnQFTuZrTm5yF47em99wmlZ06cJk0Q6I3QLkBjQRfpSGqAQwA\n' + + '0WyxXsatq9/kfN8Pd/tRjjUQlo0r9GuAKds8mKyWqk+hsOGYaTczL4qjne4Euwt1\n' + + 'lWg2cC3jsX/9Ai4IX79Kkt4hOk0RbW76+YJJiL6CwsyfyPJASEq2ZqoVBgUJuBbw\n' + + 'uEpMe0OL9ciEJ5oRLwZNgLXZZoHQaYlthHycvC3vEPeTtpGwYj+DfGQmt3af77i9\n' + + '0xQa1uor3QcvmmkDUb7/6Xv0Qwn8/sQ+GKyPhFia/OOZ50gnGVv2qKCFK1oaWNGz\n' + + 'I5ywhD2Ij2j9ah9M08CEgWVFFibf7PRIq78yRoV9+ZCjWlIq0m2LjCykV9aEnWuw\n' + + 'rWJaUtLn3i2roMieOIILhUUgDemAIV+vlbIlxZDp+XGsbhZ+MJpMUwpfEKK3Q7sD\n' + + '8tPbH6/2QpPnAezVUnwJJAg8pMLo+QzhTAd3PyPdIkc3yVQQuCycU9El7ysKhmiS\n' + + 'AgqZjqrtPnU4y7SY1II1y/XDFDIuw2MggdolNahzx5VTKrNm5LYUT0m5XQmCehtJ\n' + + 'ABEBAAGJAbwEGAEIACYWIQTFMBghgDfv6cesuTGwIKs7vZC0mAUCX6UhqgIbDAUJ\n' + + 'A8JnAAAKCRCwIKs7vZC0mI4eC/0cMG9+fZfyq8V7wB47L/qmfS0O+bSE4AlZjtoa\n' + + '30UqbW8Yp2oa1uZXaF8loC3RW9d7VdnSh6K5vSnHh/0+OkwqAbpYDaF6Kuk/zVHX\n' + + 'r4vQ1FaE1uzZisaqEORW/LG+oWiOFDhF7lXGVKj7iXwfFVVudDxHLHj34dC9rrsm\n' + + '5cTNdHalP0OW00H17nM/R4CR62mkhIM7zUuA1Z8MxSa8I3A9SL35G9iaWRYXE892\n' + + 'KcPYSAgLna7rW+gHD1QI0sqsR6qdaojO5BDVrEYnP58D5aCOTeZ50ACO43JaZlYm\n' + + 'o3jdqBvvYKpYuJ2is1T3unnrY6ztblz78OE+37d9gyAp1j0dhIzOfdpSHCyUYUQL\n' + + '4YNGLs/3yfelr1XXLwYXzKlioNDu7k4rggwN3td1122p3U1vfVY4qb2eTyjDPizb\n' + + 'NdtbiWRXKFibzG0OoiAaq0ZC8nZsP6xy7vmI05hN7PocAWllJVdpaXVh75OViGaj\n' + + 'KuNFGWsKI1qTd1aEMRQzT4s+JJM=\n' + + '=8257\n' + + '-----END PGP PUBLIC KEY BLOCK-----\n'; + await this.mutableKeyStore.loadKeyring(); + await this.mutableKeyStore.importPublicKey(armoredPublicKeys); + this.loggingService.sendInfoLevelMessage(this.mutableKeyStore.getPublicKeys()); if (this.privateKey !== undefined) { await this.mutableKeyStore.importPrivateKey(this.privateKey); } diff --git a/src/app/_services/block-sync.service.ts b/src/app/_services/block-sync.service.ts index 3401253..f6637a5 100644 --- a/src/app/_services/block-sync.service.ts +++ b/src/app/_services/block-sync.service.ts @@ -6,6 +6,7 @@ import {first} from 'rxjs/operators'; import {TransactionService} from '@app/_services/transaction.service'; import {environment} from '@src/environments/environment'; import {HttpGetter} from '@app/_helpers'; +import {LoggingService} from '@app/_services/logging.service'; @Injectable({ providedIn: 'root' @@ -15,7 +16,10 @@ export class BlockSyncService { readyState: number = 0; fileGetter = new HttpGetter(); - constructor(private transactionService: TransactionService) { } + constructor( + private transactionService: TransactionService, + private loggingService: LoggingService + ) { } blockSync(): any { const settings = new Settings(this.scan); @@ -35,7 +39,7 @@ export class BlockSyncService { window.dispatchEvent(this.newConversionEvent(transaction)); }; settings.registry.onload = (addressReturned: number): void => { - console.log('loaded network contracts', addressReturned); + this.loggingService.sendInfoLevelMessage(`Loaded network contracts ${addressReturned}`); this.readyStateProcessor(settings, readyStateElements.network); }; @@ -45,7 +49,6 @@ export class BlockSyncService { readyStateProcessor(settings, bit): void { this.readyState |= bit; if (this.readyStateTarget === this.readyState && this.readyStateTarget) { - // console.log('reached readyState target', this.readyStateTarget); const wHeadSync = new Worker('./../assets/js/block-sync/head.js'); wHeadSync.onmessage = (m) => { settings.txHelper.processReceipt(m.data); @@ -91,22 +94,16 @@ export class BlockSyncService { } fetcher(settings: any, offset: number = 0, limit: number = 100): void { - this.transactionService.getAllTransactions(offset, limit).pipe(first()).subscribe(data => { - const blockFilterBinstr = window.atob(data.block_filter); + this.transactionService.getAllTransactions(offset, limit).pipe(first()).subscribe(res => { + const blockFilterBinstr = window.atob(res.body.block_filter); const bOne = new Uint8Array(blockFilterBinstr.length); bOne.map((e, i, v) => v[i] = blockFilterBinstr.charCodeAt(i)); - const blocktxFilterBinstr = window.atob(data.blocktx_filter); + const blocktxFilterBinstr = window.atob(res.body.blocktx_filter); const bTwo = new Uint8Array(blocktxFilterBinstr.length); bTwo.map((e, i, v) => v[i] = blocktxFilterBinstr.charCodeAt(i)); - for (let i = 0; i < blockFilterBinstr.length; i++) { - if (bOne[i] > 0 ) { - // console.debug('blocktx value on', i); - } - } - - settings.scanFilter(settings, data.low, data.high, bOne, bTwo, data.filter_rounds); + settings.scanFilter(settings, res.body.low, res.body.high, bOne, bTwo, res.body.filter_rounds); }); } } diff --git a/src/app/_services/index.ts b/src/app/_services/index.ts index 75a40af..a8a1b33 100644 --- a/src/app/_services/index.ts +++ b/src/app/_services/index.ts @@ -4,3 +4,5 @@ export * from '@app/_services/user.service'; export * from '@app/_services/token.service'; export * from '@app/_services/block-sync.service'; export * from '@app/_services/location.service'; +export * from '@app/_services/logging.service'; +export * from '@app/_services/http-wrapper.service'; diff --git a/src/app/_services/location.service.ts b/src/app/_services/location.service.ts index 343999c..9491332 100644 --- a/src/app/_services/location.service.ts +++ b/src/app/_services/location.service.ts @@ -1,8 +1,8 @@ import { Injectable } from '@angular/core'; import {BehaviorSubject} from 'rxjs'; -import {HttpClient} from '@angular/common/http'; import {environment} from '@src/environments/environment'; import {first} from 'rxjs/operators'; +import {HttpWrapperService} from '@app/_services/'; @Injectable({ providedIn: 'root' @@ -13,10 +13,10 @@ export class LocationService { locationsSubject = this.locationsList.asObservable(); constructor( - private http: HttpClient + private httpWrapperService: HttpWrapperService, ) { } getLocations(): void { - this.http.get(`${environment.cicCacheUrl}/locations`).pipe(first()).subscribe(locations => this.locationsList.next(locations)); + this.httpWrapperService.get(`${environment.cicCacheUrl}/locations`).pipe(first()).subscribe(res => this.locationsList.next(res.body)); } } diff --git a/src/app/_services/token.service.ts b/src/app/_services/token.service.ts index 014e4a3..b3e0934 100644 --- a/src/app/_services/token.service.ts +++ b/src/app/_services/token.service.ts @@ -1,11 +1,10 @@ import { Injectable } from '@angular/core'; -import {HttpClient} from '@angular/common/http'; import {environment} from '@src/environments/environment'; -import {first} from 'rxjs/operators'; -import {BehaviorSubject} from 'rxjs'; +import {BehaviorSubject, Observable} from 'rxjs'; import {HttpGetter, Registry, TokenRegistry} from '@app/_helpers'; import {CICRegistry} from 'cic-client'; import Web3 from 'web3'; +import {HttpWrapperService} from '@app/_services/http-wrapper.service'; @Injectable({ providedIn: 'root' @@ -20,7 +19,7 @@ export class TokenService { tokensSubject = this.tokensList.asObservable(); constructor( - private http: HttpClient + private httpWrapperService: HttpWrapperService, ) { } async getTokens(): Promise { @@ -29,8 +28,8 @@ export class TokenService { return Array.from({length: count}, async (v, i) => await tokenRegistryQuery.entry(i)); } - getTokenBySymbol(symbol: string): any { - return this.http.get(`${environment.cicCacheUrl}/tokens/${symbol}`); + getTokenBySymbol(symbol: string): Observable { + return this.httpWrapperService.get(`${environment.cicCacheUrl}/tokens/${symbol}`); } async getTokenBalance(address: string): Promise { diff --git a/src/app/_services/transaction.service.ts b/src/app/_services/transaction.service.ts index 9d06493..590f979 100644 --- a/src/app/_services/transaction.service.ts +++ b/src/app/_services/transaction.service.ts @@ -1,6 +1,5 @@ import { Injectable } from '@angular/core'; -import {HttpClient} from '@angular/common/http'; -import {first, map} from 'rxjs/operators'; +import {first} from 'rxjs/operators'; import {BehaviorSubject, Observable} from 'rxjs'; import {environment} from '@src/environments/environment'; import {Envelope, User} from 'cic-client-meta'; @@ -14,6 +13,8 @@ import * as secp256k1 from 'secp256k1'; import {AuthService} from '@app/_services/auth.service'; import {Registry} from '@app/_helpers'; import {defaultAccount} from '@app/_models'; +import {LoggingService} from '@app/_services/logging.service'; +import {HttpWrapperService} from '@app/_services/http-wrapper.service'; const Web3 = require('web3'); const vCard = require('vcard-parser'); @@ -29,23 +30,18 @@ export class TransactionService { registry = new Registry(environment.registryAddress); constructor( - private http: HttpClient, + private httpWrapperService: HttpWrapperService, private authService: AuthService, - private userService: UserService + private userService: UserService, + private loggingService: LoggingService ) { } getAllTransactions(offset: number, limit: number): Observable { - return this.http.get(`${environment.cicCacheUrl}/tx/${offset}/${limit}`) - .pipe(map(response => { - return response; - })); + return this.httpWrapperService.get(`${environment.cicCacheUrl}/tx/${offset}/${limit}`); } getAddressTransactions(address: string, offset: number, limit: number): Observable { - return this.http.get(`${environment.cicCacheUrl}/tx/${address}/${offset}/${limit}`) - .pipe(map(response => { - return response; - })); + return this.httpWrapperService.get(`${environment.cicCacheUrl}/tx/${address}/${offset}/${limit}`); } async setTransaction(transaction, cacheSize: number): Promise { @@ -54,12 +50,12 @@ export class TransactionService { if (this.transactions.find(cachedTx => cachedTx.tx.txHash === transaction.tx.txHash)) { return; } try { this.userService.getAccountDetailsFromMeta(await User.toKey(transaction.from)).pipe(first()).subscribe(async (res) => { - transaction.sender = this.getAccountInfo(res); + transaction.sender = this.getAccountInfo(res.body); }, error => { transaction.sender = defaultAccount; }); this.userService.getAccountDetailsFromMeta(await User.toKey(transaction.to)).pipe(first()).subscribe(async (res) => { - transaction.recipient = this.getAccountInfo(res); + transaction.recipient = this.getAccountInfo(res.body); }, error => { transaction.recipient = defaultAccount; }); @@ -75,7 +71,7 @@ export class TransactionService { conversion.toValue = Number(conversion.toValue); try { this.userService.getAccountDetailsFromMeta(await User.toKey(conversion.trader)).pipe(first()).subscribe(async (res) => { - conversion.sender = conversion.recipient = this.getAccountInfo(res); + conversion.sender = conversion.recipient = this.getAccountInfo(res.body); }, error => { conversion.sender = conversion.recipient = defaultAccount; }); @@ -127,8 +123,8 @@ export class TransactionService { tx.setSignature(r, s, v); const txWire = add0x(toHex(tx.serializeRLP())); const result = await this.web3.eth.sendSignedTransaction(txWire); - console.log('Result', result); + this.loggingService.sendInfoLevelMessage(`Result: ${result}`); const transaction = await this.web3.eth.getTransaction(result.transactionHash); - console.log('Transaction', transaction); + this.loggingService.sendInfoLevelMessage(`Transaction: ${transaction}`); } } diff --git a/src/app/_services/user.service.ts b/src/app/_services/user.service.ts index 1048347..3407f9c 100644 --- a/src/app/_services/user.service.ts +++ b/src/app/_services/user.service.ts @@ -5,6 +5,9 @@ import {environment} from '@src/environments/environment'; import {first} from 'rxjs/operators'; import {AccountIndex, MutableKeyStore, MutablePgpKeyStore, PGPSigner, Registry, Signer} from '@app/_helpers'; import {ArgPair, Envelope, Syncable, User} from 'cic-client-meta'; +import {MetaResponse} from '@app/_models'; +import {LoggingService} from '@app/_services/logging.service'; +import {HttpWrapperService} from '@app/_services/http-wrapper.service'; const vCard = require('vcard-parser'); @Injectable({ @@ -29,45 +32,57 @@ export class UserService { private staffList = new BehaviorSubject(this.staff); staffSubject = this.staffList.asObservable(); - constructor(private http: HttpClient) { + constructor( + private http: HttpClient, + private httpWrapperService: HttpWrapperService, + private loggingService: LoggingService + ) { } resetPin(phone: string): Observable { const params = new HttpParams().set('phoneNumber', phone); - return this.http.get(`${environment.cicUssdUrl}/pin`, { params }); + return this.httpWrapperService.get(`${environment.cicUssdUrl}/pin`, {params}); } - async changeAccountInfo(address: string, status: string, name: string, phoneNumber: string, age: string, type: string, token: string, - failedPinAttempts: string, bio: string, gender: string, businessCategory: string, userLocation: string, - location: string, locationType: string, referrer: string): Promise { - const accountDetails = { - status, - name, - phoneNumber, - age, - type, - token, - failedPinAttempts, - bio, - gender, - businessCategory, - userLocation, - location, - locationType, - referrer - }; + 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 { + 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; const accountKey = await User.toKey(address); - this.http.get(`${environment.cicMetaUrl}/${accountKey}`, { headers: this.headers }).pipe(first()).subscribe(async res => { - const syncableAccount: Syncable = Envelope.fromJSON(JSON.stringify(res)).unwrap(); + this.httpWrapperService.get(`${environment.cicMetaUrl}/${accountKey}`, { headers: this.headers }).pipe(first()).subscribe(async res => { + const syncableAccount: Syncable = Envelope.fromJSON(JSON.stringify(res.body)).unwrap(); let update = []; - for (const prop in accountDetails) { - update.push(new ArgPair(prop, accountDetails[prop])); + for (const prop in reqBody) { + update.push(new ArgPair(prop, reqBody[prop])); } syncableAccount.update(update, 'client-branch'); await this.updateMeta(syncableAccount, accountKey, this.headers); }, async error => { - console.error('There is an error!', error); - const syncableAccount: Syncable = new Syncable(accountKey, accountDetails); + this.loggingService.sendErrorLevelMessage('Can\'t find account info in meta service', this, {error}); + const syncableAccount: Syncable = new Syncable(accountKey, accountInfo); await this.updateMeta(syncableAccount, accountKey, this.headers); }); return accountKey; @@ -76,66 +91,67 @@ export class UserService { async updateMeta(syncableAccount: Syncable, accountKey: string, headers: HttpHeaders): Promise { const envelope = await this.wrap(syncableAccount , this.signer); const reqBody = envelope.toJSON(); - this.http.put(`${environment.cicMetaUrl}/${accountKey}`, reqBody , { headers }).pipe(first()).subscribe(res => { - console.log(res); + this.httpWrapperService.put(`${environment.cicMetaUrl}/${accountKey}`, reqBody , { headers }).pipe(first()).subscribe(res => { + this.loggingService.sendInfoLevelMessage(`Response: ${res.body}`); }); } getAccounts(): void { - this.http.get(`${environment.cicCacheUrl}/accounts`).pipe(first()).subscribe(accounts => this.accountsList.next(accounts)); + this.httpWrapperService.get(`${environment.cicCacheUrl}/accounts`).pipe(first()).subscribe(res => this.accountsList.next(res.body)); } getAccountById(id: number): Observable { - return this.http.get(`${environment.cicCacheUrl}/accounts/${id}`); + return this.httpWrapperService.get(`${environment.cicCacheUrl}/accounts/${id}`); } getActions(): void { - this.http.get(`${environment.cicCacheUrl}/actions`).pipe(first()).subscribe(actions => this.actionsList.next(actions)); + this.httpWrapperService.get(`${environment.cicCacheUrl}/actions`).pipe(first()).subscribe(res => this.actionsList.next(res.body)); } getActionById(id: string): any { - return this.http.get(`${environment.cicCacheUrl}/actions/${id}`); + return this.httpWrapperService.get(`${environment.cicCacheUrl}/actions/${id}`); } approveAction(id: string): Observable { - return this.http.post(`${environment.cicCacheUrl}/actions/${id}`, { approval: true }); + return this.httpWrapperService.post(`${environment.cicCacheUrl}/actions/${id}`, { approval: true }); } revokeAction(id: string): Observable { - return this.http.post(`${environment.cicCacheUrl}/actions/${id}`, { approval: false }); + return this.httpWrapperService.post(`${environment.cicCacheUrl}/actions/${id}`, { approval: false }); } getHistoryByUser(id: string): Observable { - return this.http.get(`${environment.cicCacheUrl}/history/${id}`); + return this.httpWrapperService.get(`${environment.cicCacheUrl}/history/${id}`); } getStaff(): void { - this.http.get(`${environment.cicCacheUrl}/staff`).pipe(first()).subscribe(staff => this.staffList.next(staff)); + this.httpWrapperService.get(`${environment.cicCacheUrl}/staff`).pipe(first()).subscribe(res => this.staffList.next(res.body)); } getStaffById(id: string): Observable { - return this.http.get(`${environment.cicCacheUrl}/staff/${id}`); + return this.httpWrapperService.get(`${environment.cicCacheUrl}/staff/${id}`); } activateStaff(id: string): Observable { - return this.http.post(`${environment.cicCacheUrl}/staff/${id}`, {status: 'activated'}); + return this.httpWrapperService.post(`${environment.cicCacheUrl}/staff/${id}`, {status: 'activated'}); } deactivateStaff(id: string): Observable { - return this.http.post(`${environment.cicCacheUrl}/staff/${id}`, {status: 'deactivated'}); + return this.httpWrapperService.post(`${environment.cicCacheUrl}/staff/${id}`, {status: 'deactivated'}); } changeStaffType(id: string, type: string): Observable { - return this.http.post(`${environment.cicCacheUrl}/staff/${id}`, {accountType: type}); + return this.httpWrapperService.post(`${environment.cicCacheUrl}/staff/${id}`, {accountType: type}); } getAccountDetailsFromMeta(userKey: string): Observable { - return this.http.get(`${environment.cicMetaUrl}/${userKey}`, { headers: this.headers }); + return this.httpWrapperService.get(`${environment.cicMetaUrl}/${userKey}`, { headers: this.headers }); } getUser(userKey: string): any { - return this.http.get(`${environment.cicMetaUrl}/${userKey}`, { headers: this.headers }).pipe(first()).subscribe(async res => { - return Envelope.fromJSON(JSON.stringify(res)).unwrap(); + return this.httpWrapperService.get(`${environment.cicMetaUrl}/${userKey}`, { headers: this.headers }) + .pipe(first()).subscribe(async res => { + return Envelope.fromJSON(JSON.stringify(res.body)).unwrap(); }); }