From d2677a896d5913a94da9909741a0e4d78ef4b8d0 Mon Sep 17 00:00:00 2001 From: David Lebee Date: Wed, 18 Aug 2021 01:04:22 -0400 Subject: [PATCH] for single and queries that are not dynamic queries. --- package-lock.json | 6 +- package.json | 2 +- .../ngx-data/src/lib/ListDataSourceBuilder.ts | 107 ++++++++++++++++++ .../src/lib/SingleObjectDataSourceBuilder.ts | 10 +- .../lib/http-data-source-service.service.ts | 10 ++ src/app/app.component.html | 9 +- src/app/app.component.ts | 52 ++++++++- 7 files changed, 185 insertions(+), 11 deletions(-) create mode 100644 projects/poweredsoft/ngx-data/src/lib/ListDataSourceBuilder.ts diff --git a/package-lock.json b/package-lock.json index 32e8ef8..f901e26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1927,9 +1927,9 @@ } }, "@poweredsoft/data": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/@poweredsoft/data/-/data-0.0.31.tgz", - "integrity": "sha512-J7Vl9Zk0/K3s8+n1PRUAFTDM20hi/zB8SL5ahuJVvHhc6de4fv5f19DzObwcvQeIN4PNMYD/Fhro9i0lECKlMQ==", + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@poweredsoft/data/-/data-0.0.32.tgz", + "integrity": "sha512-vBsjBjKeNvjj3R0QwhBa+eKDZR3rK5lCueYUXIMU5iVFmw1UxVM3tW/0dbWmsDYnXi+/nm53Uz2MlqX9xpCStQ==", "requires": { "tslib": "^1.9.0" } diff --git a/package.json b/package.json index f5eacea..2797778 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "@angular/platform-browser": "~8.2.4", "@angular/platform-browser-dynamic": "~8.2.4", "@angular/router": "~8.2.4", - "@poweredsoft/data": "0.0.31", + "@poweredsoft/data": "0.0.32", "apollo-angular": "^1.8.0", "apollo-angular-link-http": "^1.9.0", "apollo-cache-inmemory": "^1.6.0", diff --git a/projects/poweredsoft/ngx-data/src/lib/ListDataSourceBuilder.ts b/projects/poweredsoft/ngx-data/src/lib/ListDataSourceBuilder.ts new file mode 100644 index 0000000..dba17c5 --- /dev/null +++ b/projects/poweredsoft/ngx-data/src/lib/ListDataSourceBuilder.ts @@ -0,0 +1,107 @@ +import { HttpClient } from "@angular/common/http"; +import { IQueryCriteria, IQueryExecutionGroupResult, IQueryExecutionResult, IQueryExecutionResultPaging } from "@poweredsoft/data"; +import { Observable, of } from "rxjs"; +import { map, switchMap } from "rxjs/operators"; +import { BaseHttpDataSourceOptionsBuilder } from "./BaseHttpDataSourceOptionsBuilder"; + +export class ListDataSourceOptionsBuilder + extends BaseHttpDataSourceOptionsBuilder +{ + private _beforeRead: (query: IQueryCriteria) => Observable; + + constructor(http: HttpClient) { + super(http); + } + + public beforeRead(beforeRead: (query: IQueryCriteria) => Observable) { + this._beforeRead = beforeRead; + return this; + } + + public queryUrlWithGet(url: string) { + this._query = { + adapter: { + handle: (query: IQueryCriteria) => { + const finalBeforeRead = this._beforeRead || ((_: IQueryCriteria) => of({})); + return finalBeforeRead(query) + .pipe( + switchMap(finalQuery => { + return this.http.get(url, { + params: this.convertToParams(finalQuery) + }).pipe( + map(result => { + return & IQueryExecutionGroupResult> + { + totalRecords: result.length, + data: result + }; + }) + ) + }) + ); + } + } + } + + return this; + } + + protected convertToParams(finalQuery: TQuery) + { + return Object.keys(finalQuery).reduce((prev, key) => { + prev[key] = finalQuery[key]; + return prev; + }, {} as { [param: string]: string | string[]; }); + } + + public queryUrl(url: string) { + this._query = { + adapter: { + handle: (query: IQueryCriteria) => { + const finalBeforeRead = this._beforeRead || ((_: IQueryCriteria) => of({})); + return finalBeforeRead(query) + .pipe( + switchMap(finalQuery => { + return this.http.post(url, finalQuery).pipe( + map(result => { + return & IQueryExecutionGroupResult> + { + totalRecords: result.length, + data: result + }; + }) + ) + }) + ); + } + } + } + + return this; + } + + public queryHandler(queryHandler: (query: IQueryCriteria) => Observable) { + this._query = { + adapter: { + handle: (query: TQuery) => { + const finalBeforeRead = this._beforeRead || (t => of({})); + return finalBeforeRead(query) + .pipe( + switchMap(finalQuery => { + return queryHandler(finalQuery).pipe( + map(result => { + return & IQueryExecutionGroupResult>{ + totalRecords: result.length, + data: result + }; + }) + ) + }) + ); + } + } + } + + return this; + } +} diff --git a/projects/poweredsoft/ngx-data/src/lib/SingleObjectDataSourceBuilder.ts b/projects/poweredsoft/ngx-data/src/lib/SingleObjectDataSourceBuilder.ts index a7bbfef..d6c5646 100644 --- a/projects/poweredsoft/ngx-data/src/lib/SingleObjectDataSourceBuilder.ts +++ b/projects/poweredsoft/ngx-data/src/lib/SingleObjectDataSourceBuilder.ts @@ -1,5 +1,4 @@ -import { HttpClient, HttpResponse } from "@angular/common/http"; -import { Query } from "@angular/core"; +import { HttpClient } from "@angular/common/http"; import { IQueryCriteria, IQueryExecutionGroupResult, IQueryExecutionResult, IQueryExecutionResultPaging } from "@poweredsoft/data"; import { Observable, of } from "rxjs"; import { map, switchMap } from "rxjs/operators"; @@ -14,6 +13,11 @@ export class SingleDataSourceOptionsBuilder super(http); } + public beforeRead(beforeRead: (query: IQueryCriteria) => Observable) { + this._beforeRead = beforeRead; + return this; + } + public queryUrlWithGet(url: string) { this._query = { adapter: { @@ -50,7 +54,7 @@ export class SingleDataSourceOptionsBuilder }, {} as { [param: string]: string | string[]; }); } - public queryPostUrl(url: string) { + public queryUrl(url: string) { this._query = { adapter: { handle: (query: IQueryCriteria) => { diff --git a/projects/poweredsoft/ngx-data/src/lib/http-data-source-service.service.ts b/projects/poweredsoft/ngx-data/src/lib/http-data-source-service.service.ts index 0970088..25d33aa 100644 --- a/projects/poweredsoft/ngx-data/src/lib/http-data-source-service.service.ts +++ b/projects/poweredsoft/ngx-data/src/lib/http-data-source-service.service.ts @@ -1,6 +1,8 @@ import { Injectable } from "@angular/core"; import { HttpClient } from '@angular/common/http'; import { HttpDataSourceOptionsBuilder } from "./HttpDataSourceBuilder"; +import { SingleDataSourceOptionsBuilder } from "./SingleObjectDataSourceBuilder"; +import { ListDataSourceOptionsBuilder } from "./ListDataSourceBuilder"; @Injectable({ @@ -13,4 +15,12 @@ export class HttpDataSourceService { builder() { return new HttpDataSourceOptionsBuilder(this.http); } + + singleBuilder() { + return new SingleDataSourceOptionsBuilder(this.http); + } + + listBuilder() { + return new ListDataSourceOptionsBuilder(this.http); + } } diff --git a/src/app/app.component.html b/src/app/app.component.html index bf4b4e7..a5fee80 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -8,6 +8,9 @@

Latest Data


-
-  {{ latestData | json }}
-
\ No newline at end of file +

Standard

+
{{ latestData | json }}
+

Single

+
{{ latestSingle | json }}
+

List

+
{{ latestList | json }}
\ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 4a82a5b..d9758a3 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -11,12 +11,18 @@ import { GraphQLDataSourceService, IGraphQLAdvanceQueryInput } from 'projects/po import { TestService, ITestModel, IValidationTestCommand } from './services/test.service'; import { HttpDataSourceService} from '@poweredsoft/ngx-data'; -export class IContact +export interface IContact { id: number displayName: string } +export interface IPerson { + id: number, + firstName: string, + lastName: string +} + export interface ICreatePerson { firstName: string lastName: string @@ -32,6 +38,14 @@ export interface IMyQuery extends IQueryCriteria{ } } +export interface IOnePersonQuery { + personId: number +} + +export interface IListPersonQuery { + search?: string +} + @Component({ selector: 'app-root', templateUrl: './app.component.html', @@ -42,7 +56,33 @@ export class AppComponent implements OnInit { dataSource: IDataSource; latestData: any; + onePersonDs: IDataSource; + listPersonDs: IDataSource; + latestSingle: any; + latestList: any; + constructor(private hdss: HttpDataSourceService) { + + this.onePersonDs = hdss.singleBuilder() + .keyResolver(t => t.id) + .queryUrl('https://localhost:5001/api/query/onePerson') + .beforeRead(_ => { + return of({ + personId: 1 + }) + }) + .createDataSource(); + + this.listPersonDs = hdss.listBuilder() + .keyResolver(t => t.id) + .queryUrl('https://localhost:5001/api/query/listPerson') + .beforeRead(criteria => { + return of({ + search: "Doe" + }) + }) + .createDataSource(); + const ds = hdss .builder() .keyResolver(m => m.id) @@ -80,10 +120,20 @@ export class AppComponent implements OnInit { if (message.type == 'error') alert(message.message); }); + + this.onePersonDs.data$.subscribe(onePerson => { + this.latestSingle = onePerson; + }) + + this.listPersonDs.data$.subscribe(t => { + this.latestList = t; + }) } refresh() { this.dataSource.refresh(); + this.onePersonDs.refresh(); + this.listPersonDs.refresh(); } echoCommand() {