From d4caaae0f24d01e78e0b9e45e7ea2065c604634d Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Wed, 13 Jan 2021 15:40:43 +0100 Subject: [PATCH] not working --- .../angular-tour-of-heroes/package-lock.json | 146 +++++++++++++----- tools/app/angular-tour-of-heroes/package.json | 3 +- .../src/app/dashboard/dashboard.component.ts | 2 +- .../src/app/db-handle.ts | 28 ++++ .../app/hero-detail/hero-detail.component.ts | 4 +- .../src/app/hero.service.ts | 32 +++- .../src/app/heroes/heroes.component.ts | 2 +- 7 files changed, 162 insertions(+), 55 deletions(-) create mode 100644 tools/app/angular-tour-of-heroes/src/app/db-handle.ts diff --git a/tools/app/angular-tour-of-heroes/package-lock.json b/tools/app/angular-tour-of-heroes/package-lock.json index 13a7478..07d5757 100644 --- a/tools/app/angular-tour-of-heroes/package-lock.json +++ b/tools/app/angular-tour-of-heroes/package-lock.json @@ -1605,6 +1605,11 @@ "defer-to-connect": "^1.0.1" } }, + "@types/geojson": { + "version": "7946.0.7", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", + "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==" + }, "@types/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", @@ -1634,9 +1639,9 @@ "dev": true }, "@types/node": { - "version": "12.19.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz", - "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==", + "version": "12.19.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.13.tgz", + "integrity": "sha512-qdixo2f0U7z6m0UJUugTJqVF94GNDkdgQhfBtMs8t5898JE7G/D2kJYw4rc1nzjIPLVAsDkY2MdABnLAP5lM1w==", "dev": true }, "@types/parse-json": { @@ -2500,6 +2505,15 @@ "ms": "2.0.0" } }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -2880,9 +2894,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001174", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001174.tgz", - "integrity": "sha512-tqClL/4ThQq6cfFXH3oJL4rifFBeM6gTkphjao5kgwMaW9yn0tKgQLAEfKzDwj6HQWCB/aWo8kTFlSvIN8geEA==", + "version": "1.0.30001176", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001176.tgz", + "integrity": "sha512-VWdkYmqdkDLRe0lvfJlZQ43rnjKqIGKHWhWWRbkqMsJIUaYDNf/K/sdZZcVO6YKQklubokdkJY+ujArsuJ5cag==", "dev": true }, "canonical-path": { @@ -4115,6 +4129,11 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4310,9 +4329,9 @@ "dev": true }, "electron": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-11.1.1.tgz", - "integrity": "sha512-tlbex3xosJgfileN6BAQRotevPRXB/wQIq48QeQ08tUJJrXwE72c8smsM/hbHx5eDgnbfJ2G3a60PmRjHU2NhA==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-11.2.0.tgz", + "integrity": "sha512-weszOPAJPoPu6ozL7vR9enXmaDSqH+KE9iZODfbGdnFgtVfVdfyedjlvEGIUJkLMPXM1y/QWwCl2dINzr0Jq5Q==", "dev": true, "requires": { "@electron/get": "^1.0.1", @@ -4321,9 +4340,9 @@ } }, "electron-to-chromium": { - "version": "1.3.636", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.636.tgz", - "integrity": "sha512-Adcvng33sd3gTjNIDNXGD1G4H6qCImIy2euUJAQHtLNplEKU5WEz5KRJxupRNIIT8sD5oFZLTKBWAf12Bsz24A==", + "version": "1.3.637", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.637.tgz", + "integrity": "sha512-924WXYMYquYybc+7pNApGlhY2RWg3MY3he4BrZ5BUmM2n1MGBsrS+PZxrlo6UAsWuNl4NE66fqFdwsWkBUGgkA==", "dev": true }, "elliptic": { @@ -4374,17 +4393,6 @@ "dev": true, "requires": { "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } } }, "end-of-stream": { @@ -4910,6 +4918,17 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "extglob": { @@ -5996,12 +6015,11 @@ } }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "icss-utils": { @@ -7297,6 +7315,11 @@ "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", "dev": true }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -7443,6 +7466,27 @@ "object-visit": "^1.0.0" } }, + "mariadb": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-2.5.2.tgz", + "integrity": "sha512-SfaBl5/LiX2qJNNr7wCQvizVjtWxVm1CUWYKe+y4OMeyYMM6g0GhwX7/BbGtv/O3WthnGrM+Kj1imFnlescO0w==", + "requires": { + "@types/geojson": "^7946.0.7", + "@types/node": "^14.14.7", + "denque": "^1.4.1", + "iconv-lite": "^0.6.2", + "long": "^4.0.0", + "moment-timezone": "^0.5.32", + "please-upgrade-node": "^3.2.0" + }, + "dependencies": { + "@types/node": { + "version": "14.14.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz", + "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==" + } + } + }, "matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -7758,6 +7802,19 @@ "minimist": "^1.2.5" } }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, + "moment-timezone": { + "version": "0.5.32", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.32.tgz", + "integrity": "sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA==", + "requires": { + "moment": ">= 2.9.0" + } + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -8873,6 +8930,14 @@ "find-up": "^3.0.0" } }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "requires": { + "semver-compare": "^1.0.0" + } + }, "pnp-webpack-plugin": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", @@ -10115,6 +10180,15 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } } } }, @@ -10668,8 +10742,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sanitize-filename": { "version": "1.6.3", @@ -10797,9 +10870,7 @@ "semver-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true, - "optional": true + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" }, "semver-dsl": { "version": "1.0.1", @@ -11441,15 +11512,6 @@ "whatwg-mimetype": "^2.3.0" }, "dependencies": { - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, "schema-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", diff --git a/tools/app/angular-tour-of-heroes/package.json b/tools/app/angular-tour-of-heroes/package.json index 6085c73..c780c74 100644 --- a/tools/app/angular-tour-of-heroes/package.json +++ b/tools/app/angular-tour-of-heroes/package.json @@ -20,6 +20,7 @@ "@angular/platform-browser": "~11.0.6", "@angular/platform-browser-dynamic": "~11.0.6", "@angular/router": "~11.0.6", + "mariadb": "^2.5.2", "rxjs": "~6.6.0", "tslib": "^2.0.0", "zone.js": "~0.10.2" @@ -29,7 +30,7 @@ "@angular/cli": "~11.0.6", "@angular/compiler-cli": "~11.0.6", "@types/jasmine": "~3.6.0", - "@types/node": "^12.11.1", + "@types/node": "^12.19.13", "codelyzer": "^6.0.0", "electron": "^11.1.1", "jasmine-core": "~3.6.0", diff --git a/tools/app/angular-tour-of-heroes/src/app/dashboard/dashboard.component.ts b/tools/app/angular-tour-of-heroes/src/app/dashboard/dashboard.component.ts index 04434b0..26c9747 100644 --- a/tools/app/angular-tour-of-heroes/src/app/dashboard/dashboard.component.ts +++ b/tools/app/angular-tour-of-heroes/src/app/dashboard/dashboard.component.ts @@ -17,7 +17,7 @@ export class DashboardComponent implements OnInit { } getHeroes(): void { - this.heroService.getHeroes().subscribe(heroes => this.heroes = heroes.slice(1, 5)); + this.heroService.getHeroes().then(heroes => this.heroes = heroes.slice(1, 5)); } } diff --git a/tools/app/angular-tour-of-heroes/src/app/db-handle.ts b/tools/app/angular-tour-of-heroes/src/app/db-handle.ts new file mode 100644 index 0000000..0592458 --- /dev/null +++ b/tools/app/angular-tour-of-heroes/src/app/db-handle.ts @@ -0,0 +1,28 @@ +import { Connection, ConnectionConfig, createConnection } from 'mariadb' + +export class DbHandle { + private connConfig?: ConnectionConfig + private conn?: Connection + + public constructor() { + this.connConfig = { + host: '172.16.10.18', + user: 'heroes', + password: 'test123', + database: 'heroes' + } + } + + public async connect(): Promise { + this.conn = await createConnection(this.connConfig) + } + + public query(stmt: string) : Promise { + return this.conn?.query(stmt) ?? Promise.reject(new Error('Connection not ready (query)')) + } + + public close() : Promise { + return this.conn?.end() ?? Promise.reject(new Error('Connection not ready (close)')) + } + +} \ No newline at end of file diff --git a/tools/app/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.ts b/tools/app/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.ts index fb64953..89e069b 100644 --- a/tools/app/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.ts +++ b/tools/app/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.ts @@ -22,7 +22,7 @@ export class HeroDetailComponent implements OnInit { getHero(): void { const id = +this.route.snapshot.paramMap.get('id'); - this.heroService.getHero(id).subscribe(hero => this.hero = hero); + this.heroService.getHero(id).then(hero => this.hero = hero); } goBack(): void { @@ -30,6 +30,6 @@ export class HeroDetailComponent implements OnInit { } save(): void { - this.heroService.updateHero(this.hero).subscribe(() => this.goBack()); + this.heroService.updateHero(this.hero).then(() => this.goBack()); } } diff --git a/tools/app/angular-tour-of-heroes/src/app/hero.service.ts b/tools/app/angular-tour-of-heroes/src/app/hero.service.ts index 212c734..972e30f 100644 --- a/tools/app/angular-tour-of-heroes/src/app/hero.service.ts +++ b/tools/app/angular-tour-of-heroes/src/app/hero.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; + +import { DbHandle } from './db-handle'; import { Hero } from './hero'; import { HEROES } from './mock-heroes'; @@ -9,21 +10,36 @@ import { MessageService } from './message.service'; providedIn: 'root' }) export class HeroService { - constructor(private messageService: MessageService) { } - getHeroes(): Observable { + async getHeroes(): Promise { this.messageService.add('HeroService: fetched heroes'); - return of(HEROES); + const dbHandle = new DbHandle() + try { + await dbHandle.connect() + const result = await dbHandle.query('SELECT id, name FROM hero') + return result.map((row: Record) => { + return {id: row.id ?? -1, name: row.name ?? 'unknown' } + }) + } finally { + dbHandle.close() + } } - getHero(id: number): Observable { + async getHero(id: number): Promise { this.messageService.add(`HeroService: fetch hero id=${id}`); - return of(HEROES.find(hero => hero.id === id)); + const dbHandle = new DbHandle() + try { + await dbHandle.connect() + const result = await dbHandle.query(`SELECT id, name FROM hero WHERE id = ${id}`) + return { id: result[0].id ?? -1, name: result[0].name ?? 'unknown' } + } finally { + dbHandle.close() + } } - updateHero(hero: Hero): Observable { + updateHero(hero: Hero): Promise { this.messageService.add(`HeroService: save change: id=${hero.id}, name=${hero.name}`); - return of(true); + return Promise.resolve(true); } } diff --git a/tools/app/angular-tour-of-heroes/src/app/heroes/heroes.component.ts b/tools/app/angular-tour-of-heroes/src/app/heroes/heroes.component.ts index e34d720..7d67ce0 100644 --- a/tools/app/angular-tour-of-heroes/src/app/heroes/heroes.component.ts +++ b/tools/app/angular-tour-of-heroes/src/app/heroes/heroes.component.ts @@ -19,7 +19,7 @@ export class HeroesComponent implements OnInit { constructor(private heroService: HeroService, private messageService: MessageService) { } getHeroes(): void { - this.heroService.getHeroes().subscribe(heroes => this.heroes = heroes); + this.heroService.getHeroes().then(heroes => this.heroes = heroes); } ngOnInit(): void {