Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 1x 2x 3x 3x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 3x 1x 2x 2x 2x 3x 1x 1x | import { Http, Provider, TypeOf } from '@sgrud/core';
import { Observable, of, switchMap, throwError } from 'rxjs';
import { Model } from '../model/model';
import { Querier } from './querier';
/**
* The **HttpQuerier** class implements an {@link Http} based {@link Querier},
* i.e., an extension of the abstract {@link Querier} base class, allowing for
* {@link Model} queries to be executed via HTTP. To use this class, provide it
* to the {@link Linker} by either extending it, and decorating the extending
* class with the {@link Target} decorator, or by preemptively supplying an
* instance of this class to the {@link Linker}.
*
* @example
* Provide the **HttpQuerier** to the {@link Linker}:
* ```ts
* import { Linker } from '@sgrud/core';
* import { HttpQuerier } from '@sgrud/data';
*
* new Linker<typeof HttpQuerier>([
* [HttpQuerier, new HttpQuerier('https://api.example.com')]
* ]);
* ```
*
* @see {@link Model}
* @see {@link Querier}
*/
export class HttpQuerier
extends Provider<typeof Querier>('sgrud.data.Querier') {
/**
* A set containing the {@link Querier.Type}s this {@link Querier} can handle.
* As HTTP connections are short-lived, the {@link HttpQuerier} may only
* handle one-off **types**, namely `'mutation'` and `'query'`.
*/
public override readonly types: Set<Querier.Type> = new Set<Querier.Type>([
'mutation',
'query'
]);
/**
* Public **constructor** consuming the HTTP `endpoint` {@link Model} queries
* should be {@link commit}ted against, and an dynamic or static `prioritize`
* value. The `prioritize` value may either be a mapping of {@link Model}s to
* corresponding priorities or a static priority for this {@link Querier}.
*
* @param endpoint - The HTTP `endpoint` to {@link commit} queries against.
* @param prioritize - The dynamic or static prioritization.
*/
public constructor(
/**
* The HTTP `endpoint` to {@link commit} queries against.
*/
private readonly endpoint: string,
/**
* The dynamic or static prioritization.
*
* @defaultValue `0`
*
* @see {@link priority}
*/
private readonly prioritize: number | Map<Model.Type<Model>, number> = 0
) {
super();
}
/**
* Overridden **commit** method of the {@link Querier} base class. When this
* {@link Querier} is made available via the {@link Linker}, this overridden
* **commit** method is called when this {@link Querier} claims the highest
* {@link priority} to **commit** an {@link Querier.Operation}, depending on
* the {@link Model} from which the {@link Querier.Operation} originates.
*
* @param operation - The {@link Querier.Operation} to be **commit**ted.
* @param variables - Any {@link Querier.Variables} within the `operation`.
* @returns An {@link Observable} of the committed {@link Querier.Operation}.
* @throws An {@link Observable} of an {@link AggregateError}.
*/
public override commit(
operation: Querier.Operation,
variables?: Querier.Variables
): Observable<unknown> {
return Http.post<{
data?: unknown;
errors?: string[];
}>(this.endpoint, {
query: operation,
variables
}).pipe(switchMap((next) => {
return next.response.errors?.length
? throwError(() => new AggregateError(next.response.errors!))
: of(next.response.data);
}));
}
/**
* Overridden **priority** method of the {@link Querier} base class. When an
* {@link Querier.Operation} is to be {@link commit}ted, this method is called
* with the respective `model` {@link Model.Type} and returns the claimed
* **priority** to {@link commit} this {@link Model}.
*
* @param model - The {@link Model} to be {@link commit}ted.
* @returns The numeric **priority** of this {@link Querier} implementation.
*/
public override priority(model: Model.Type<Model>): number {
if (TypeOf.number(this.prioritize)) {
return this.prioritize;
}
return this.prioritize.get(model) ?? 0;
}
}
|