@nx-ddd/hasura 19.0.0-preview.13 → 19.0.0-preview.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{lib/apollo-multi.service.d.ts → apollo-multi.service.d.ts} +3 -0
- package/fesm2022/nx-ddd-hasura.mjs +550 -0
- package/fesm2022/nx-ddd-hasura.mjs.map +1 -0
- package/{lib/hasura.interceptor.d.ts → hasura.interceptor.d.ts} +3 -0
- package/{lib/hasura.repository.d.ts → hasura.repository.d.ts} +3 -0
- package/{lib/hasura.service.d.ts → hasura.service.d.ts} +3 -0
- package/index.d.ts +8 -1
- package/package.json +20 -6
- package/README.md +0 -11
- package/index.js +0 -5
- package/index.js.map +0 -1
- package/lib/apollo-multi.service.js +0 -52
- package/lib/apollo-multi.service.js.map +0 -1
- package/lib/decorators.js +0 -50
- package/lib/decorators.js.map +0 -1
- package/lib/hasura.config.js +0 -15
- package/lib/hasura.config.js.map +0 -1
- package/lib/hasura.converter.js +0 -82
- package/lib/hasura.converter.js.map +0 -1
- package/lib/hasura.di.js +0 -79
- package/lib/hasura.di.js.map +0 -1
- package/lib/hasura.interceptor.js +0 -24
- package/lib/hasura.interceptor.js.map +0 -1
- package/lib/hasura.repository.js +0 -261
- package/lib/hasura.repository.js.map +0 -1
- package/lib/hasura.service.js +0 -49
- package/lib/hasura.service.js.map +0 -1
- package/lib/index.d.ts +0 -8
- package/lib/index.js +0 -12
- package/lib/index.js.map +0 -1
- package/lib/links.js +0 -23
- package/lib/links.js.map +0 -1
- /package/{lib/decorators.d.ts → decorators.d.ts} +0 -0
- /package/{lib/hasura.config.d.ts → hasura.config.d.ts} +0 -0
- /package/{lib/hasura.converter.d.ts → hasura.converter.d.ts} +0 -0
- /package/{lib/hasura.di.d.ts → hasura.di.d.ts} +0 -0
- /package/{lib/links.d.ts → links.d.ts} +0 -0
|
@@ -4,11 +4,14 @@ import { HttpLink } from 'apollo-angular/http';
|
|
|
4
4
|
import { ApolloClient } from "@apollo/client/core";
|
|
5
5
|
import { Observable } from "rxjs";
|
|
6
6
|
import { GetHeaders } from "./links";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
7
8
|
export declare class ApolloMultiService {
|
|
8
9
|
readonly apollo: Apollo;
|
|
9
10
|
readonly httpLink: HttpLink;
|
|
10
11
|
protected createClient(name: string, baseUrl: string, getHeaders: GetHeaders): void;
|
|
11
12
|
getClient(endpoint: string, getHeaders: GetHeaders): ApolloBase;
|
|
13
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ApolloMultiService, never>;
|
|
14
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ApolloMultiService>;
|
|
12
15
|
}
|
|
13
16
|
export type GetApolloClient<E extends {
|
|
14
17
|
id: string;
|
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Injectable, InjectionToken, importProvidersFrom } from '@angular/core';
|
|
3
|
+
import { Apollo, APOLLO_OPTIONS, ApolloModule } from 'apollo-angular';
|
|
4
|
+
import { HttpLink } from 'apollo-angular/http';
|
|
5
|
+
import { InMemoryCache } from '@apollo/client/cache';
|
|
6
|
+
import { setContext } from '@apollo/client/link/context';
|
|
7
|
+
import { split, ApolloLink, HttpLink as HttpLink$1, InMemoryCache as InMemoryCache$1, gql } from '@apollo/client/core';
|
|
8
|
+
import { getMainDefinition } from '@apollo/client/utilities';
|
|
9
|
+
import { makeDI, makeDecoratorFactories, plainToInstanceWithValid } from '@nx-ddd/core';
|
|
10
|
+
import { WebSocketLink } from '@apollo/client/link/ws';
|
|
11
|
+
import { from, of, isObservable, firstValueFrom, filter, distinctUntilChanged, tap, switchMap, lastValueFrom, map } from 'rxjs';
|
|
12
|
+
import { camelCase, snakeCase, isObject, mapKeys, mapValues, get, omitBy, omit, pick } from 'lodash-es';
|
|
13
|
+
import { HTTP_INTERCEPTORS, HttpClient } from '@angular/common/http';
|
|
14
|
+
import dayjs from 'dayjs';
|
|
15
|
+
export { TransformToDayjs } from '@nx-ddd/common/domain';
|
|
16
|
+
export { IsDayjs } from 'class-validator-extended';
|
|
17
|
+
|
|
18
|
+
function wrap(token) {
|
|
19
|
+
return isObservable(token) ? token : token instanceof Promise ? from(token) : of(token);
|
|
20
|
+
}
|
|
21
|
+
function resolve(getHeaders) {
|
|
22
|
+
const headers$ = wrap(getHeaders());
|
|
23
|
+
return firstValueFrom(headers$.pipe(filter((headers) => !!headers), distinctUntilChanged(), tap((headers) => console.debug('[resolve] headers:', headers))));
|
|
24
|
+
}
|
|
25
|
+
function buildWebsocketLink(endpoint, getHeaders) {
|
|
26
|
+
return new WebSocketLink({
|
|
27
|
+
uri: endpoint.replace('http', 'ws'),
|
|
28
|
+
options: {
|
|
29
|
+
reconnect: true,
|
|
30
|
+
connectionParams: () => resolve(getHeaders).then((headers) => ({ headers })),
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function isSubscription(query) {
|
|
36
|
+
const definition = getMainDefinition(query);
|
|
37
|
+
return (definition.kind === 'OperationDefinition' &&
|
|
38
|
+
definition.operation === 'subscription');
|
|
39
|
+
}
|
|
40
|
+
class ApolloMultiService {
|
|
41
|
+
apollo = inject(Apollo);
|
|
42
|
+
httpLink = inject(HttpLink);
|
|
43
|
+
createClient(name, baseUrl, getHeaders) {
|
|
44
|
+
const wsLink = buildWebsocketLink(baseUrl, getHeaders);
|
|
45
|
+
const link = split(({ query }) => isSubscription(query), wsLink, ApolloLink.from([
|
|
46
|
+
setContext(async () => {
|
|
47
|
+
const headers = await resolve(getHeaders);
|
|
48
|
+
return { headers };
|
|
49
|
+
}),
|
|
50
|
+
this.httpLink.create({ uri: baseUrl, }),
|
|
51
|
+
]));
|
|
52
|
+
this.apollo.removeClient(name);
|
|
53
|
+
this.apollo.createNamed(name, { link, cache: new InMemoryCache() });
|
|
54
|
+
}
|
|
55
|
+
getClient(endpoint, getHeaders) {
|
|
56
|
+
const name = endpoint;
|
|
57
|
+
let client = this.apollo.use(name);
|
|
58
|
+
console.debug('[ApolloMultiService] getClient:', name);
|
|
59
|
+
if (!client) {
|
|
60
|
+
this.createClient(name, endpoint, getHeaders);
|
|
61
|
+
client = this.apollo.use(name);
|
|
62
|
+
}
|
|
63
|
+
return client;
|
|
64
|
+
}
|
|
65
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: ApolloMultiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
66
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: ApolloMultiService, providedIn: 'root' });
|
|
67
|
+
}
|
|
68
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: ApolloMultiService, decorators: [{
|
|
69
|
+
type: Injectable,
|
|
70
|
+
args: [{ providedIn: 'root' }]
|
|
71
|
+
}] });
|
|
72
|
+
const GET_APOLLO_CLIENT = makeDI('GET_APOLLO_CLIENT');
|
|
73
|
+
|
|
74
|
+
const { createDecorator, getAnnotations, } = makeDecoratorFactories((type, fieldName, propName, options) => ({ type, fieldName, propName, childType: options.childType }), '[@nx-ddd/hasura] annotations');
|
|
75
|
+
function getFlattenFieldAnnotations(T, prefix = '') {
|
|
76
|
+
const annotations = Hasura.getAnnotations(T);
|
|
77
|
+
return (annotations ?? []).reduce((acc, annotation) => {
|
|
78
|
+
const currentKey = prefix ? camelCase(`${prefix}_${annotation.fieldName}`) : annotation.fieldName;
|
|
79
|
+
if (annotation.childType) {
|
|
80
|
+
return {
|
|
81
|
+
...acc,
|
|
82
|
+
...getFlattenFieldAnnotations(annotation.childType(), currentKey)
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
...acc,
|
|
87
|
+
[currentKey]: annotation
|
|
88
|
+
};
|
|
89
|
+
}, {});
|
|
90
|
+
}
|
|
91
|
+
function getFields(T, options = {
|
|
92
|
+
prefix: '',
|
|
93
|
+
case: 'snake'
|
|
94
|
+
}) {
|
|
95
|
+
const annotations = Hasura.getAnnotations(T);
|
|
96
|
+
const changeCase = options?.case === 'snake' ? snakeCase : camelCase;
|
|
97
|
+
const fields = (annotations ?? []).flatMap((annotation) => {
|
|
98
|
+
const currentKey = changeCase(options?.prefix ? `${options?.prefix}_${annotation.fieldName}` : annotation.fieldName);
|
|
99
|
+
if (annotation.childType) {
|
|
100
|
+
return [
|
|
101
|
+
...getFields(annotation.childType(), {
|
|
102
|
+
prefix: currentKey,
|
|
103
|
+
case: options?.case,
|
|
104
|
+
})
|
|
105
|
+
];
|
|
106
|
+
}
|
|
107
|
+
return [currentKey];
|
|
108
|
+
});
|
|
109
|
+
return fields;
|
|
110
|
+
}
|
|
111
|
+
const Hasura = {
|
|
112
|
+
Text: createDecorator('text'),
|
|
113
|
+
Timestamp: createDecorator('timestamp'),
|
|
114
|
+
Date: createDecorator('date'),
|
|
115
|
+
Integer: createDecorator('integer'),
|
|
116
|
+
Numeric: createDecorator('numeric'),
|
|
117
|
+
Boolean: createDecorator('boolean'),
|
|
118
|
+
Map: (childType) => createDecorator('map', { childType })(),
|
|
119
|
+
JSON: createDecorator('json'),
|
|
120
|
+
getAnnotations,
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
class HasuraInterceptor {
|
|
124
|
+
config = inject(HASURA_CONFIG);
|
|
125
|
+
intercept(req, next) {
|
|
126
|
+
if (req.url.startsWith(this.config.url)) {
|
|
127
|
+
return next.handle(req.clone({
|
|
128
|
+
headers: req.headers.set('x-hasura-admin-secret', this.config.adminSecret),
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
return next.handle(req);
|
|
132
|
+
}
|
|
133
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: HasuraInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
134
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: HasuraInterceptor });
|
|
135
|
+
}
|
|
136
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: HasuraInterceptor, decorators: [{
|
|
137
|
+
type: Injectable
|
|
138
|
+
}] });
|
|
139
|
+
|
|
140
|
+
const HASURA_CONFIG = new InjectionToken('HASURA_CONFIG');
|
|
141
|
+
function provideHasuraConfig(config) {
|
|
142
|
+
return [
|
|
143
|
+
{ provide: HASURA_CONFIG, useValue: config },
|
|
144
|
+
config.adminSecret ? { provide: HTTP_INTERCEPTORS, useClass: HasuraInterceptor, multi: true } : [],
|
|
145
|
+
];
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function deepCamelToSnakeCase(obj) {
|
|
149
|
+
if (Array.isArray(obj)) {
|
|
150
|
+
return obj.map(deepCamelToSnakeCase);
|
|
151
|
+
}
|
|
152
|
+
else if (isObject(obj)) {
|
|
153
|
+
return mapKeys(mapValues(obj, deepCamelToSnakeCase), (_, key) => snakeCase(key));
|
|
154
|
+
}
|
|
155
|
+
return obj;
|
|
156
|
+
}
|
|
157
|
+
function deepSnakeToCamelCase(obj) {
|
|
158
|
+
if (Array.isArray(obj)) {
|
|
159
|
+
return obj.map(deepSnakeToCamelCase);
|
|
160
|
+
}
|
|
161
|
+
else if (isObject(obj)) {
|
|
162
|
+
return mapKeys(mapValues(obj, deepSnakeToCamelCase), (_, key) => key.replace(/_([a-z])/g, (g) => g[1].toUpperCase()));
|
|
163
|
+
}
|
|
164
|
+
return obj;
|
|
165
|
+
}
|
|
166
|
+
function fromHasura(_object, type) {
|
|
167
|
+
return HasuraUtils.fromHasura(_object, type);
|
|
168
|
+
}
|
|
169
|
+
function toHasura(object, type, { extraFunc = deepCamelToSnakeCase } = {}) {
|
|
170
|
+
return HasuraUtils.toHasura(object, type, { extraFunc });
|
|
171
|
+
}
|
|
172
|
+
function makeConverter(type) {
|
|
173
|
+
return {
|
|
174
|
+
toHasura(entity) {
|
|
175
|
+
return toHasura(entity, type);
|
|
176
|
+
},
|
|
177
|
+
toHasuraMany(entities) {
|
|
178
|
+
return entities.map((entity) => this.toHasura(entity));
|
|
179
|
+
},
|
|
180
|
+
fromHasura(entity) {
|
|
181
|
+
return fromHasura(entity, type);
|
|
182
|
+
},
|
|
183
|
+
fromHasuraMany(entities) {
|
|
184
|
+
return entities.map((entity) => this.fromHasura(entity));
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
class HasuraUtils {
|
|
189
|
+
static toTimestamp(date) {
|
|
190
|
+
if (!dayjs.isDayjs(date))
|
|
191
|
+
return null;
|
|
192
|
+
return date.toISOString();
|
|
193
|
+
}
|
|
194
|
+
static fromHasura(_object, type) {
|
|
195
|
+
const object = deepSnakeToCamelCase(_object);
|
|
196
|
+
return plainToInstanceWithValid(type, object);
|
|
197
|
+
}
|
|
198
|
+
static toHasura(object, type, { extraFunc = deepCamelToSnakeCase } = {}) {
|
|
199
|
+
const fields = getFlattenFieldAnnotations(type);
|
|
200
|
+
const obj = Object.entries(fields).reduce((acc, [key, annotation]) => {
|
|
201
|
+
const value = get(object, annotation.fieldName);
|
|
202
|
+
switch (annotation.type) {
|
|
203
|
+
case 'text': return { ...acc, [key]: value };
|
|
204
|
+
case 'timestamp': return { ...acc, [key]: this.toTimestamp(value) };
|
|
205
|
+
case 'numeric': return { ...acc, [key]: isNaN(Number(value)) ? null : Number(value) };
|
|
206
|
+
case 'integer': return { ...acc, [key]: isNaN(Number(value)) ? null : Number(value) };
|
|
207
|
+
case 'json': return { ...acc, [key]: value };
|
|
208
|
+
case 'map': return { ...acc };
|
|
209
|
+
default: return { ...acc, [key]: value };
|
|
210
|
+
}
|
|
211
|
+
}, {});
|
|
212
|
+
return extraFunc(obj);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function provideHttpLink() {
|
|
217
|
+
return {
|
|
218
|
+
provide: ApolloLink,
|
|
219
|
+
useFactory: (config) => new HttpLink$1({
|
|
220
|
+
uri: config.url,
|
|
221
|
+
headers: config?.adminSecret && { 'x-hasura-admin-secret': config.adminSecret },
|
|
222
|
+
}),
|
|
223
|
+
deps: [HASURA_CONFIG],
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
const HASURA_AUTHORIZATION = new InjectionToken('HASURA_AUTHORIZATION');
|
|
227
|
+
function provideHasuraAuthorization(useFactory) {
|
|
228
|
+
return {
|
|
229
|
+
provide: HASURA_AUTHORIZATION,
|
|
230
|
+
useFactory,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
const GRAPHQL_HEADERS = new InjectionToken('GRAPHQL_HEADERS', {
|
|
234
|
+
providedIn: 'root',
|
|
235
|
+
factory: () => () => ({}),
|
|
236
|
+
});
|
|
237
|
+
function provideGraphqlHeaders(useFactory) {
|
|
238
|
+
return [
|
|
239
|
+
{ provide: GRAPHQL_HEADERS, useFactory },
|
|
240
|
+
];
|
|
241
|
+
}
|
|
242
|
+
function provideWebsocketLink() {
|
|
243
|
+
return {
|
|
244
|
+
provide: ApolloLink,
|
|
245
|
+
useFactory: () => {
|
|
246
|
+
const config = inject(HASURA_CONFIG);
|
|
247
|
+
const _getHeaders = inject(GRAPHQL_HEADERS);
|
|
248
|
+
return buildWebsocketLink(config.url, _getHeaders);
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
function provideApolloOptions() {
|
|
253
|
+
return {
|
|
254
|
+
provide: APOLLO_OPTIONS,
|
|
255
|
+
useFactory: (link) => ({ cache: new InMemoryCache$1(), link }),
|
|
256
|
+
deps: [ApolloLink],
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
function provideHasura(config) {
|
|
260
|
+
return [
|
|
261
|
+
importProvidersFrom(ApolloModule),
|
|
262
|
+
provideHasuraConfig(config),
|
|
263
|
+
provideApolloOptions(),
|
|
264
|
+
provideHttpLink(),
|
|
265
|
+
];
|
|
266
|
+
}
|
|
267
|
+
function provideHasuraWithWebSocket(config) {
|
|
268
|
+
return [
|
|
269
|
+
importProvidersFrom(ApolloModule),
|
|
270
|
+
provideHasuraConfig(config),
|
|
271
|
+
provideApolloOptions(),
|
|
272
|
+
provideWebsocketLink(),
|
|
273
|
+
];
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
class HasuraService {
|
|
277
|
+
http = inject(HttpClient);
|
|
278
|
+
apollo = inject(Apollo);
|
|
279
|
+
config = inject(HASURA_CONFIG);
|
|
280
|
+
apolloMulti = inject(ApolloMultiService);
|
|
281
|
+
_getApolloClient = GET_APOLLO_CLIENT.inject() ?? (() => this.apollo.client);
|
|
282
|
+
getApolloClient() {
|
|
283
|
+
const clientOrObsOrPromise = this._getApolloClient(this.config);
|
|
284
|
+
if (isObservable(clientOrObsOrPromise)) {
|
|
285
|
+
return clientOrObsOrPromise;
|
|
286
|
+
}
|
|
287
|
+
else if (clientOrObsOrPromise instanceof Promise) {
|
|
288
|
+
return from(clientOrObsOrPromise);
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
return of(clientOrObsOrPromise);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
graphql(args) {
|
|
295
|
+
return this.post('/v1/graphql', {
|
|
296
|
+
query: args.query,
|
|
297
|
+
variables: args.variables,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
post(endpoint, body) {
|
|
301
|
+
return this.http.post(`${this.config.url}${endpoint}`, body, {});
|
|
302
|
+
}
|
|
303
|
+
delete(endpoint) {
|
|
304
|
+
return this.http.delete(`${this.config.url}${endpoint}`);
|
|
305
|
+
}
|
|
306
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: HasuraService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
307
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: HasuraService, providedIn: 'root' });
|
|
308
|
+
}
|
|
309
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: HasuraService, decorators: [{
|
|
310
|
+
type: Injectable,
|
|
311
|
+
args: [{ providedIn: 'root' }]
|
|
312
|
+
}] });
|
|
313
|
+
|
|
314
|
+
function makeSubscription(query) {
|
|
315
|
+
const { kind, definitions } = query;
|
|
316
|
+
const subscriptionDefinitions = definitions.map((definition) => {
|
|
317
|
+
if (definition.kind === 'OperationDefinition' && definition.operation === 'query') {
|
|
318
|
+
return {
|
|
319
|
+
...definition,
|
|
320
|
+
operation: 'subscription',
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
return definition;
|
|
324
|
+
});
|
|
325
|
+
return { kind, definitions: subscriptionDefinitions };
|
|
326
|
+
}
|
|
327
|
+
;
|
|
328
|
+
class HasuraRepository {
|
|
329
|
+
hasura = inject(HasuraService);
|
|
330
|
+
subscribe({ query, variables }) {
|
|
331
|
+
return this.hasura.getApolloClient().pipe(switchMap((client) => client.subscribe({
|
|
332
|
+
query: makeSubscription(query),
|
|
333
|
+
variables: variables,
|
|
334
|
+
})));
|
|
335
|
+
}
|
|
336
|
+
get pkey() {
|
|
337
|
+
return `${this.tableName}_pkey`;
|
|
338
|
+
}
|
|
339
|
+
async get(params) {
|
|
340
|
+
const queryName = `${this.tableName}_by_pk`;
|
|
341
|
+
return lastValueFrom(this.hasura.getApolloClient()).then((client) => client.query({
|
|
342
|
+
query: gql `query get($id: String!) {
|
|
343
|
+
${queryName}(id: $id) {
|
|
344
|
+
${this.updateColumns.join(' ')}
|
|
345
|
+
}
|
|
346
|
+
}`,
|
|
347
|
+
variables: params,
|
|
348
|
+
})).then((res => res.data[queryName])).then(data => data ? this.converter.fromHasura(data) : data);
|
|
349
|
+
}
|
|
350
|
+
get listQuery() {
|
|
351
|
+
return `query list {
|
|
352
|
+
${this.tableName} {
|
|
353
|
+
${this.updateColumns.join(' ')}
|
|
354
|
+
}
|
|
355
|
+
}`;
|
|
356
|
+
}
|
|
357
|
+
async list() {
|
|
358
|
+
const client = await lastValueFrom(this.hasura.getApolloClient());
|
|
359
|
+
return client.query({
|
|
360
|
+
query: gql `${this.listQuery}`,
|
|
361
|
+
}).then(res => this.converter.fromHasuraMany(res.data[this.tableName]));
|
|
362
|
+
}
|
|
363
|
+
listChanges() {
|
|
364
|
+
return this.subscribe({
|
|
365
|
+
query: gql `${this.listQuery}`,
|
|
366
|
+
variables: {},
|
|
367
|
+
}).pipe(map(res => this.converter.fromHasuraMany(res.data[this.tableName])));
|
|
368
|
+
}
|
|
369
|
+
async create(data) {
|
|
370
|
+
const mutationName = `insert_${this.tableName}`;
|
|
371
|
+
const mutation = gql `mutation create($object: ${this.tableName}_insert_input!) {
|
|
372
|
+
${mutationName}(objects: [$object]) {
|
|
373
|
+
affected_rows
|
|
374
|
+
returning {
|
|
375
|
+
${this.updateColumns.join(' ')}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}`;
|
|
379
|
+
const object = omitBy(omit(this.converter.toHasura(data), ['createdAt', 'updatedAt', 'created_at', 'updated_at']), value => typeof value === 'undefined');
|
|
380
|
+
const client = await lastValueFrom(this.hasura.getApolloClient());
|
|
381
|
+
return client.mutate({
|
|
382
|
+
mutation,
|
|
383
|
+
variables: { object },
|
|
384
|
+
}).then(result => {
|
|
385
|
+
return this.converter.fromHasura(result.data[mutationName].returning[0]);
|
|
386
|
+
}).catch(error => {
|
|
387
|
+
console.error(error.graphQLErrors);
|
|
388
|
+
throw error;
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
async createMany(data) {
|
|
392
|
+
const mutationName = `insert_${this.tableName}`;
|
|
393
|
+
const objects = data.map((item) => this.converter.toHasura(item));
|
|
394
|
+
const mutation = gql `
|
|
395
|
+
mutation createMany($objects: [${this.tableName}_insert_input!]!) {
|
|
396
|
+
${mutationName}(objects: $objects) {
|
|
397
|
+
returning {
|
|
398
|
+
${this.updateColumns.join(" ")}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
`;
|
|
403
|
+
const client = await lastValueFrom(this.hasura.getApolloClient());
|
|
404
|
+
return client.mutate({
|
|
405
|
+
mutation,
|
|
406
|
+
variables: { objects },
|
|
407
|
+
}).then((result) => this.converter.fromHasuraMany(result.data[mutationName].returning)).catch((error) => {
|
|
408
|
+
console.error(error.graphQLErrors);
|
|
409
|
+
throw error;
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
async update(data) {
|
|
413
|
+
const mutation = gql `mutation update($id: String!, $object: ${this.tableName}_set_input!) {
|
|
414
|
+
update_${this.tableName}(where: {id: {_eq: $id}}, _set: $object) { affected_rows }
|
|
415
|
+
}`;
|
|
416
|
+
const fields = Object.keys(data).map(snakeCase);
|
|
417
|
+
const object = omitBy(omit(pick(this.converter.toHasura(data), fields), ['createdAt', 'updatedAt', 'created_at', 'updated_at']), value => typeof value === 'undefined');
|
|
418
|
+
const client = await lastValueFrom(this.hasura.getApolloClient());
|
|
419
|
+
console.debug('[Hasura Repository] update:', object);
|
|
420
|
+
return client.mutate({
|
|
421
|
+
mutation,
|
|
422
|
+
variables: {
|
|
423
|
+
id: data.id,
|
|
424
|
+
object,
|
|
425
|
+
},
|
|
426
|
+
}).catch(error => {
|
|
427
|
+
console.error(error.graphQLErrors);
|
|
428
|
+
throw error;
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
async updateMany(data) {
|
|
432
|
+
const mutationName = `update_${this.tableName}_many`;
|
|
433
|
+
const objects = data.map((item) => {
|
|
434
|
+
const fields = Object.keys(item).map(snakeCase);
|
|
435
|
+
const object = pick(this.converter.toHasura(item), fields);
|
|
436
|
+
return { where: { id: { _eq: item.id } }, _set: object };
|
|
437
|
+
});
|
|
438
|
+
const mutation = gql `
|
|
439
|
+
mutation ${mutationName}($objects: [${this.tableName}_updates!]!) {
|
|
440
|
+
${mutationName}(updates: $objects) {
|
|
441
|
+
affected_rows
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
`;
|
|
445
|
+
const client = await lastValueFrom(this.hasura.getApolloClient());
|
|
446
|
+
return client
|
|
447
|
+
.mutate({ mutation, variables: { objects } })
|
|
448
|
+
.then((result) => result.data[mutationName].affected_rows)
|
|
449
|
+
.catch((error) => {
|
|
450
|
+
console.error(error.graphQLErrors);
|
|
451
|
+
throw error;
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
async delete(id) {
|
|
455
|
+
const client = await lastValueFrom(this.hasura.getApolloClient());
|
|
456
|
+
return client.mutate({
|
|
457
|
+
mutation: gql `mutation delete($id: String!) {
|
|
458
|
+
delete_${this.tableName}(where: {id: {_eq: $id}}) { affected_rows }
|
|
459
|
+
}`,
|
|
460
|
+
variables: { id },
|
|
461
|
+
}).catch(error => {
|
|
462
|
+
console.error(error.graphQLErrors);
|
|
463
|
+
throw error;
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
async save(data) {
|
|
467
|
+
const object = omit(this.converter.toHasura(data), ['createdAt', 'updatedAt']);
|
|
468
|
+
const query = gql `mutation upsert($object: [${this.tableName}_insert_input!]!) {
|
|
469
|
+
insert_${this.tableName}(
|
|
470
|
+
objects: $object,
|
|
471
|
+
on_conflict: {
|
|
472
|
+
constraint: ${this.pkey},
|
|
473
|
+
update_columns: [${this.updateColumns}]
|
|
474
|
+
}
|
|
475
|
+
) { affected_rows }
|
|
476
|
+
}`;
|
|
477
|
+
const client = await lastValueFrom(this.hasura.getApolloClient());
|
|
478
|
+
console.debug('[Hasura Repository] save:', client);
|
|
479
|
+
return client.mutate({
|
|
480
|
+
mutation: query,
|
|
481
|
+
variables: {
|
|
482
|
+
object: object,
|
|
483
|
+
},
|
|
484
|
+
}).catch(error => {
|
|
485
|
+
console.error(error.graphQLErrors);
|
|
486
|
+
throw error;
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
async saveMany(entities) {
|
|
490
|
+
const query = gql `mutation upsert($objects: [${this.tableName}_insert_input!]!) {
|
|
491
|
+
insert_${this.tableName}(
|
|
492
|
+
objects: $objects,
|
|
493
|
+
on_conflict: {
|
|
494
|
+
constraint: ${this.pkey},
|
|
495
|
+
update_columns: [${this.updateColumns}]
|
|
496
|
+
}
|
|
497
|
+
) { affected_rows }
|
|
498
|
+
}`;
|
|
499
|
+
const objects = entities.map(entity => this.converter.toHasura(entity));
|
|
500
|
+
console.debug('[Hasura Repository] objects:', objects);
|
|
501
|
+
const client = await lastValueFrom(this.hasura.getApolloClient());
|
|
502
|
+
return client.mutate({
|
|
503
|
+
mutation: query,
|
|
504
|
+
variables: { objects },
|
|
505
|
+
}).catch(error => {
|
|
506
|
+
console.error(error);
|
|
507
|
+
// console.error(error.graphQLErrors?.[0]?.extensions?.internal);
|
|
508
|
+
throw error;
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
async deleteMany(params) {
|
|
512
|
+
const mutationName = `delete_${this.tableName}`;
|
|
513
|
+
const mutation = gql `
|
|
514
|
+
mutation deleteMany($ids: [String!]!) {
|
|
515
|
+
${mutationName}(where: {id: {_in: $ids}}) {
|
|
516
|
+
affected_rows
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
`;
|
|
520
|
+
const client = await lastValueFrom(this.hasura.getApolloClient());
|
|
521
|
+
return client.mutate({
|
|
522
|
+
mutation,
|
|
523
|
+
variables: { ids: params.map(param => param.id) },
|
|
524
|
+
}).then((result) => result.data[mutationName].affected_rows).catch((error) => {
|
|
525
|
+
console.error(error.graphQLErrors);
|
|
526
|
+
throw error;
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
async deleteAll() {
|
|
530
|
+
const client = await lastValueFrom(this.hasura.getApolloClient());
|
|
531
|
+
return client.mutate({
|
|
532
|
+
mutation: gql `mutation delete_all {
|
|
533
|
+
delete_${this.tableName} (where: {}) { affected_rows }
|
|
534
|
+
}`,
|
|
535
|
+
variables: {},
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: HasuraRepository, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
539
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: HasuraRepository });
|
|
540
|
+
}
|
|
541
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: HasuraRepository, decorators: [{
|
|
542
|
+
type: Injectable
|
|
543
|
+
}] });
|
|
544
|
+
|
|
545
|
+
/**
|
|
546
|
+
* Generated bundle index. Do not edit.
|
|
547
|
+
*/
|
|
548
|
+
|
|
549
|
+
export { ApolloMultiService, GET_APOLLO_CLIENT, HASURA_CONFIG, Hasura, HasuraInterceptor, HasuraRepository, HasuraService, HasuraUtils, deepCamelToSnakeCase, deepSnakeToCamelCase, fromHasura, getFields, getFlattenFieldAnnotations, makeConverter, makeSubscription, provideApolloOptions, provideGraphqlHeaders, provideHasura, provideHasuraAuthorization, provideHasuraConfig, provideHasuraWithWebSocket, provideHttpLink, provideWebsocketLink, toHasura };
|
|
550
|
+
//# sourceMappingURL=nx-ddd-hasura.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nx-ddd-hasura.mjs","sources":["../../../../../packages/@nx-ddd/hasura/src/lib/links.ts","../../../../../packages/@nx-ddd/hasura/src/lib/apollo-multi.service.ts","../../../../../packages/@nx-ddd/hasura/src/lib/decorators.ts","../../../../../packages/@nx-ddd/hasura/src/lib/hasura.interceptor.ts","../../../../../packages/@nx-ddd/hasura/src/lib/hasura.config.ts","../../../../../packages/@nx-ddd/hasura/src/lib/hasura.converter.ts","../../../../../packages/@nx-ddd/hasura/src/lib/hasura.di.ts","../../../../../packages/@nx-ddd/hasura/src/lib/hasura.service.ts","../../../../../packages/@nx-ddd/hasura/src/lib/hasura.repository.ts","../../../../../packages/@nx-ddd/hasura/src/lib/nx-ddd-hasura.ts"],"sourcesContent":["import { WebSocketLink } from \"@apollo/client/link/ws\";\nimport { distinctUntilChanged, filter, firstValueFrom, from, isObservable, Observable, of, tap } from 'rxjs';\n\ntype PromiseOrObservable<T> = Promise<T> | Observable<T> | T;\nexport type GetHeaders = () => PromiseOrObservable<Record<string, string>>;\n\nfunction wrap<T>(token: Promise<T> | Observable<T> | T): Observable<T> {\n return isObservable(token) ? token : token instanceof Promise ? from(token) : of(token);\n}\n\nexport function resolve(getHeaders: GetHeaders): Promise<Record<string, string>> {\n const headers$ = wrap(getHeaders());\n return firstValueFrom(headers$.pipe(\n filter((headers) => !!headers),\n distinctUntilChanged(),\n tap((headers) => console.debug('[resolve] headers:', headers)),\n ))\n}\n\nexport function buildWebsocketLink(endpoint: string, getHeaders: GetHeaders) {\n return new WebSocketLink({\n uri: endpoint.replace('http', 'ws'),\n options: {\n reconnect: true,\n connectionParams: () => resolve(getHeaders).then((headers) => ({ headers })),\n },\n });\n}\n","import { Injectable, inject } from \"@angular/core\";\nimport { Apollo, ApolloBase } from \"apollo-angular\";\nimport { HasuraConfig } from \"./hasura.config\";\nimport { HttpLink } from 'apollo-angular/http';\nimport { InMemoryCache } from \"@apollo/client/cache\";\nimport { setContext } from '@apollo/client/link/context';\nimport { ApolloClient, ApolloLink, DocumentNode, split } from \"@apollo/client/core\";\nimport { getMainDefinition } from \"@apollo/client/utilities\";\nimport { makeDI } from \"@nx-ddd/core\";\nimport { Observable } from \"rxjs\";\nimport { buildWebsocketLink, GetHeaders, resolve } from \"./links\";\n\nfunction isSubscription(query: DocumentNode) {\n const definition = getMainDefinition(query);\n return (\n definition.kind === 'OperationDefinition' &&\n definition.operation === 'subscription'\n );\n}\n\n@Injectable({providedIn: 'root'})\nexport class ApolloMultiService {\n readonly apollo = inject(Apollo);\n readonly httpLink = inject(HttpLink);\n\n protected createClient(name: string, baseUrl: string, getHeaders: GetHeaders) {\n const wsLink = buildWebsocketLink(baseUrl, getHeaders);\n const link = split(\n ({ query }) => isSubscription(query),\n wsLink,\n ApolloLink.from([\n setContext(async () => {\n const headers = await resolve(getHeaders);\n return { headers }\n }),\n this.httpLink.create({ uri: baseUrl, }),\n ])\n );\n\n this.apollo.removeClient(name);\n this.apollo.createNamed(name, { link, cache: new InMemoryCache() });\n }\n\n getClient(endpoint: string, getHeaders: GetHeaders): ApolloBase {\n const name = endpoint;\n let client = this.apollo.use(name);\n console.debug('[ApolloMultiService] getClient:', name);\n if (!client) {\n this.createClient(name, endpoint, getHeaders);\n client = this.apollo.use(name);\n }\n return client;\n }\n}\n\n\nexport type GetApolloClient<E extends {id: string}> = (config: HasuraConfig) => ApolloClient<E> | Promise<ApolloClient<E>> | Observable<ApolloClient<E>>;\nexport const GET_APOLLO_CLIENT = makeDI<GetApolloClient<any>>('GET_APOLLO_CLIENT');","import { makeDecoratorFactories } from \"@nx-ddd/core\";\nimport { camelCase, snakeCase } from 'lodash-es';\n\nconst {\n createDecorator,\n getAnnotations,\n} = makeDecoratorFactories(\n (type, fieldName, propName, options) => ({ type, fieldName, propName, childType: options.childType }),\n '[@nx-ddd/hasura] annotations'\n);\n\nexport function getFlattenFieldAnnotations<Annotation>(T: any, prefix: string = ''): Record<string, Annotation> {\n const annotations = Hasura.getAnnotations(T);\n return (annotations ?? []).reduce((acc, annotation) => {\n const currentKey = prefix ? camelCase(`${prefix}_${annotation.fieldName}`) : annotation.fieldName;\n if (annotation.childType) {\n return {\n ...acc,\n ...getFlattenFieldAnnotations(annotation.childType(), currentKey)\n };\n }\n return {\n ...acc,\n [currentKey]: annotation\n };\n }, {});\n}\n\nexport function getFields(T: any, options: {\n prefix?: string;\n case?: 'snake' | 'camel';\n} = {\n prefix: '',\n case: 'snake'\n}): string[] {\n const annotations = Hasura.getAnnotations(T);\n const changeCase = options?.case === 'snake' ? snakeCase : camelCase;\n const fields = (annotations ?? []).flatMap((annotation) => {\n const currentKey = changeCase(options?.prefix ? `${options?.prefix}_${annotation.fieldName}` : annotation.fieldName);\n if (annotation.childType) {\n return [\n ...getFields(annotation.childType(), {\n prefix: currentKey,\n case: options?.case,\n })\n ];\n }\n return [currentKey];\n });\n return fields;\n}\n\nexport const Hasura = {\n Text: createDecorator('text'),\n Timestamp: createDecorator('timestamp'),\n Date: createDecorator('date'),\n Integer: createDecorator('integer'),\n Numeric: createDecorator('numeric'),\n Boolean: createDecorator('boolean'),\n Map: (childType: () => any) => createDecorator('map', {childType})(),\n JSON: createDecorator('json'),\n getAnnotations,\n};\n","import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from \"@angular/common/http\";\nimport { Injectable, inject } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\nimport { HASURA_CONFIG } from \"./hasura.config\";\n\n@Injectable()\nexport class HasuraInterceptor implements HttpInterceptor {\n private config = inject(HASURA_CONFIG);\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n if (req.url.startsWith(this.config.url)) {\n return next.handle(req.clone({\n headers: req.headers.set('x-hasura-admin-secret', this.config.adminSecret),\n }));\n }\n return next.handle(req);\n }\n}","import { HTTP_INTERCEPTORS } from \"@angular/common/http\";\nimport { InjectionToken } from \"@angular/core\";\nimport { Provider } from \"@angular/core\";\nimport { HasuraInterceptor } from \"./hasura.interceptor\";\n\nexport interface HasuraConfig {\n adminSecret?: string;\n url: string;\n}\n\nexport const HASURA_CONFIG = new InjectionToken<HasuraConfig>('HASURA_CONFIG');\n\nexport function provideHasuraConfig(config: HasuraConfig): Provider[] {\n return [\n { provide: HASURA_CONFIG, useValue: config },\n config.adminSecret ? { provide: HTTP_INTERCEPTORS, useClass: HasuraInterceptor, multi: true} : [],\n ];\n}\n","import { getFlattenFieldAnnotations } from './decorators';\nimport { get, isObject, mapKeys, mapValues, snakeCase } from 'lodash-es';\nimport { plainToInstanceWithValid } from '@nx-ddd/core';\nimport { ClassConstructor } from 'class-transformer';\nimport dayjs from 'dayjs';\n\nexport interface HasuraConverter<E> {\n toHasura(entity: E): object;\n toHasuraMany(entities: E[]): object[];\n fromHasura(entity: object): E;\n fromHasuraMany(entities: object[]): E[];\n}\n\nexport function deepCamelToSnakeCase(obj: any): any {\n if (Array.isArray(obj)) {\n return obj.map(deepCamelToSnakeCase);\n } else if (isObject(obj)) {\n return mapKeys(mapValues(obj, deepCamelToSnakeCase), (_, key) =>\n snakeCase(key)\n );\n }\n return obj;\n}\n\nexport function deepSnakeToCamelCase(obj: any): any {\n if (Array.isArray(obj)) {\n return obj.map(deepSnakeToCamelCase);\n } else if (isObject(obj)) {\n return mapKeys(mapValues(obj, deepSnakeToCamelCase), (_, key) =>\n key.replace(/_([a-z])/g, (g) => g[1].toUpperCase())\n );\n }\n return obj;\n}\n\nexport function fromHasura<T extends object>(_object: object, type: ClassConstructor<T>): T {\n return HasuraUtils.fromHasura(_object, type);\n}\n\nexport function toHasura(object: object, type: any, {\n extraFunc = deepCamelToSnakeCase\n}: {\n extraFunc?: (obj: any) => any;\n} = { }) {\n return HasuraUtils.toHasura(object, type, { extraFunc });\n}\n\nexport function makeConverter<T extends object>(type: {new(): T}): HasuraConverter<T> {\n return {\n toHasura(entity: T) {\n return toHasura(entity, type);\n },\n toHasuraMany(entities: T[]) {\n return entities.map((entity) => this.toHasura(entity));\n },\n fromHasura(entity: object) {\n return fromHasura(entity, type) as T;\n },\n fromHasuraMany(entities: object[]) {\n return entities.map((entity) => this.fromHasura(entity));\n },\n }\n}\n\nexport class HasuraUtils {\n static toTimestamp(date: dayjs.Dayjs | null): string | null {\n if (!dayjs.isDayjs(date)) return null;\n return date.toISOString();\n }\n\n static fromHasura<T extends object>(_object: object, type: ClassConstructor<T>): T {\n const object = deepSnakeToCamelCase(_object);\n return plainToInstanceWithValid(type, object);\n }\n \n static toHasura(object: object, type: any, {\n extraFunc = deepCamelToSnakeCase\n }: {\n extraFunc?: (obj: any) => any;\n } = { }) {\n const fields = getFlattenFieldAnnotations<{\n type: 'text' | 'timestamp' | 'numeric' | 'integer' | 'json' | 'map';\n fieldName: string;\n childType?: () => any;\n }>(type);\n const obj = Object.entries(fields).reduce((acc, [key, annotation]) => {\n const value = get(object, annotation.fieldName);\n switch (annotation.type) {\n case 'text': return { ...acc, [key]: value };\n case 'timestamp': return { ...acc, [key]: this.toTimestamp(value) };\n case 'numeric': return { ...acc, [key]: isNaN(Number(value)) ? null : Number(value) };\n case 'integer': return { ...acc, [key]: isNaN(Number(value)) ? null : Number(value) };\n case 'json': return { ...acc, [key]: value };\n case 'map': return {...acc};\n default: return { ...acc, [key]: value };\n }\n }, {});\n return extraFunc(obj);\n }\n}\n","export { DeepPartial } from '@nx-ddd/common/domain';\nexport { TransformToDayjs } from '@nx-ddd/common/domain';\nexport { IsDayjs } from 'class-validator-extended';\nimport { EnvironmentProviders, InjectionToken, Provider, importProvidersFrom, inject } from '@angular/core';\nimport { ApolloLink, HttpLink, InMemoryCache } from '@apollo/client/core';\nimport { APOLLO_OPTIONS, ApolloModule } from 'apollo-angular';\nimport { HASURA_CONFIG, HasuraConfig, provideHasuraConfig } from './hasura.config';\nimport { buildWebsocketLink, GetHeaders } from './links';\nimport { Observable } from 'rxjs';\n\nexport function provideHttpLink() {\n return {\n provide: ApolloLink,\n useFactory: (config: HasuraConfig) => new HttpLink({\n uri: config.url,\n headers: config?.adminSecret && { 'x-hasura-admin-secret': config.adminSecret },\n }),\n deps: [HASURA_CONFIG],\n };\n}\n\ntype HasuraAuthorization = Promise<string> | Observable<string> | string;\n\nconst HASURA_AUTHORIZATION = new InjectionToken<HasuraAuthorization>('HASURA_AUTHORIZATION');\n\nexport function provideHasuraAuthorization(useFactory: () => HasuraAuthorization) {\n return {\n provide: HASURA_AUTHORIZATION,\n useFactory,\n };\n}\n\ntype PromiseOrObservable<T> = Promise<T> | Observable<T> | T;\n\nconst GRAPHQL_HEADERS = new InjectionToken<GetHeaders>('GRAPHQL_HEADERS', {\n providedIn: 'root',\n factory: () => () => ({}),\n});\n\nexport function provideGraphqlHeaders(\n useFactory: () => () => PromiseOrObservable<Record<string, string>>,\n): Provider {\n return [\n { provide: GRAPHQL_HEADERS, useFactory },\n ];\n}\n\nexport function provideWebsocketLink() {\n return {\n provide: ApolloLink,\n useFactory: () => {\n const config = inject(HASURA_CONFIG);\n const _getHeaders = inject(GRAPHQL_HEADERS);\n return buildWebsocketLink(config.url, _getHeaders);\n },\n };\n}\n\nexport function provideApolloOptions() {\n return {\n provide: APOLLO_OPTIONS,\n useFactory: (link: ApolloLink) => ({ cache: new InMemoryCache(), link }),\n deps: [ApolloLink],\n };\n}\n\nexport function provideHasura(config: HasuraConfig): (Provider | EnvironmentProviders)[] {\n return [\n importProvidersFrom(ApolloModule),\n provideHasuraConfig(config),\n provideApolloOptions(),\n provideHttpLink(),\n ]\n}\n\nexport function provideHasuraWithWebSocket(config: HasuraConfig): (Provider | EnvironmentProviders)[] {\n return [\n importProvidersFrom(ApolloModule),\n provideHasuraConfig(config),\n provideApolloOptions(),\n provideWebsocketLink(),\n ]\n}\n\n","import { HttpClient } from \"@angular/common/http\";\nimport { Injectable, inject } from \"@angular/core\";\nimport { Apollo } from \"apollo-angular\";\nimport { HASURA_CONFIG } from \"./hasura.config\";\nimport { ApolloClient } from \"@apollo/client/core\";\nimport { from, isObservable, Observable, of } from \"rxjs\";\nimport { ApolloMultiService, GET_APOLLO_CLIENT } from \"./apollo-multi.service\";\n\n\n@Injectable({providedIn: 'root'})\nexport class HasuraService {\n private http = inject(HttpClient);\n readonly apollo = inject(Apollo);\n readonly config = inject(HASURA_CONFIG);\n readonly apolloMulti = inject(ApolloMultiService);\n readonly _getApolloClient = GET_APOLLO_CLIENT.inject() ?? (() => this.apollo.client);\n\n getApolloClient(): Observable<ApolloClient<any>> {\n const clientOrObsOrPromise = this._getApolloClient(this.config);\n if (isObservable(clientOrObsOrPromise)) {\n return clientOrObsOrPromise;\n } else if (clientOrObsOrPromise instanceof Promise) {\n return from(clientOrObsOrPromise);\n } else {\n return of(clientOrObsOrPromise);\n }\n }\n\n graphql<T = any>(args: {query: string, variables?: object}) {\n return this.post<T>('/v1/graphql', {\n query: args.query,\n variables: args.variables,\n });\n }\n\n post<T>(endpoint: string, body: object) {\n return this.http.post<T>(`${this.config.url}${endpoint}`, body, {});\n }\n\n delete<T>(endpoint: string) {\n return this.http.delete<T>(`${this.config.url}${endpoint}`);\n }\n}\n","import { Injectable, inject } from \"@angular/core\";\nimport { FetchResult, gql, OperationVariables } from \"@apollo/client/core\";\nimport { HasuraConverter } from \"./hasura.converter\";\nimport { HasuraService } from \"./hasura.service\";\nimport { omit, omitBy, pick, snakeCase } from \"lodash-es\";\nimport { lastValueFrom, map, Observable, switchMap, tap } from \"rxjs\";\n\nexport function makeSubscription(query: any) {\n const { kind, definitions } = query;\n const subscriptionDefinitions = definitions.map((definition: any) => {\n if (definition.kind === 'OperationDefinition' && definition.operation === 'query') {\n return {\n ...definition,\n operation: 'subscription',\n };\n }\n return definition;\n });\n return { kind, definitions: subscriptionDefinitions };\n};\n\n@Injectable()\nexport abstract class HasuraRepository<E extends {id: string}> {\n protected hasura = inject(HasuraService);\n protected abstract converter: HasuraConverter<E>;\n readonly abstract updateColumns: string[];\n readonly abstract tableName: string;\n\n protected subscribe<\n T = any,\n TVariables extends OperationVariables = OperationVariables\n >({query, variables}: {query: any, variables: any}): Observable<FetchResult<T>> {\n return this.hasura.getApolloClient().pipe(\n switchMap((client) => client.subscribe<T, TVariables>({\n query: makeSubscription(query),\n variables: variables,\n })),\n );\n }\n\n get pkey(): string {\n return `${this.tableName}_pkey`;\n }\n\n async get(params: {id: string}) {\n const queryName = `${this.tableName}_by_pk`;\n return lastValueFrom(this.hasura.getApolloClient()).then((client) => client.query({\n query: gql`query get($id: String!) {\n ${queryName}(id: $id) {\n ${this.updateColumns.join(' ')}\n }\n }`,\n variables: params,\n })).then((res => res.data[queryName])).then(data => data ? this.converter.fromHasura(data) : data);\n }\n\n get listQuery() {\n return `query list {\n ${this.tableName} {\n ${this.updateColumns.join(' ')}\n }\n }`;\n }\n\n async list(): Promise<E[]> {\n const client = await lastValueFrom(this.hasura.getApolloClient());\n return client.query({\n query: gql`${this.listQuery}`,\n }).then(res => this.converter.fromHasuraMany(res.data[this.tableName]));\n }\n\n listChanges(): Observable<E[]> {\n return this.subscribe({\n query: gql`${this.listQuery}`,\n variables: {},\n }).pipe(\n map(res => this.converter.fromHasuraMany(res.data[this.tableName])),\n );\n }\n\n async create(data: Omit<E, 'id' | 'createdAt' | 'updatedAt' | 'deletedAt'> & Partial<Pick<E, 'id'>>): Promise<E> {\n const mutationName = `insert_${this.tableName}`;\n const mutation = gql`mutation create($object: ${this.tableName}_insert_input!) {\n ${mutationName}(objects: [$object]) {\n affected_rows\n returning {\n ${this.updateColumns.join(' ')}\n }\n }\n }`;\n const object = omitBy(omit(this.converter.toHasura(data as any), ['createdAt', 'updatedAt', 'created_at', 'updated_at']), value => typeof value === 'undefined');\n const client = await lastValueFrom(this.hasura.getApolloClient());\n return client.mutate({\n mutation,\n variables: { object },\n }).then(result => {\n return this.converter.fromHasura(result.data[mutationName].returning[0]);\n }).catch(error => {\n console.error(error.graphQLErrors);\n throw error;\n });\n }\n async createMany(data: Omit<E, 'id' | 'createdAt' | 'updatedAt'>[]): Promise<E[]> {\n const mutationName = `insert_${this.tableName}`;\n const objects = data.map((item) => this.converter.toHasura(item as any))\n const mutation = gql`\n mutation createMany($objects: [${this.tableName}_insert_input!]!) {\n ${mutationName}(objects: $objects) {\n returning {\n ${this.updateColumns.join(\" \")}\n }\n }\n }\n `;\n const client = await lastValueFrom(this.hasura.getApolloClient());\n return client.mutate({\n mutation,\n variables: { objects },\n }).then((result) =>\n this.converter.fromHasuraMany(result.data[mutationName].returning)\n ).catch((error) => {\n console.error(error.graphQLErrors);\n throw error;\n });\n }\n\n async update(data: Partial<E> & {id: string}) {\n const mutation = gql`mutation update($id: String!, $object: ${this.tableName}_set_input!) {\n update_${this.tableName}(where: {id: {_eq: $id}}, _set: $object) { affected_rows }\n }`;\n const fields = Object.keys(data).map(snakeCase);\n const object = omitBy(omit(pick(this.converter.toHasura(data as any), fields), ['createdAt', 'updatedAt', 'created_at', 'updated_at']), value => typeof value === 'undefined');\n const client = await lastValueFrom(this.hasura.getApolloClient());\n console.debug('[Hasura Repository] update:', object);\n return client.mutate({\n mutation,\n variables: {\n id: data.id,\n object,\n },\n }).catch(error => {\n console.error(error.graphQLErrors);\n throw error;\n });\n }\n\n async updateMany(data: Partial<E>[]): Promise<number> {\n const mutationName = `update_${this.tableName}_many`;\n const objects = data.map((item) => {\n const fields = Object.keys(item).map(snakeCase);\n const object = pick(this.converter.toHasura(item as any), fields);\n return { where: { id: { _eq: item.id } }, _set: object };\n });\n \n const mutation = gql`\n mutation ${mutationName}($objects: [${this.tableName}_updates!]!) {\n ${mutationName}(updates: $objects) {\n affected_rows\n }\n }\n `;\n const client = await lastValueFrom(this.hasura.getApolloClient());\n return client\n .mutate({ mutation, variables: { objects } })\n .then((result) => result.data[mutationName].affected_rows)\n .catch((error) => {\n console.error(error.graphQLErrors);\n throw error;\n });\n }\n\n async delete(id: string) {\n const client = await lastValueFrom(this.hasura.getApolloClient());\n return client.mutate({\n mutation: gql`mutation delete($id: String!) {\n delete_${this.tableName}(where: {id: {_eq: $id}}) { affected_rows }\n }`,\n variables: { id },\n }).catch(error => {\n console.error(error.graphQLErrors);\n throw error;\n });\n }\n\n async save(data: Omit<E, 'createdAt' | 'updatedAt' | 'deletedAt'>) {\n const object = omit(this.converter.toHasura(data as any), ['createdAt', 'updatedAt']);\n const query = gql`mutation upsert($object: [${this.tableName}_insert_input!]!) {\n insert_${this.tableName}(\n objects: $object,\n on_conflict: {\n constraint: ${this.pkey},\n update_columns: [${this.updateColumns}]\n }\n ) { affected_rows }\n }`;\n const client = await lastValueFrom(this.hasura.getApolloClient());\n console.debug('[Hasura Repository] save:', client);\n return client.mutate({\n mutation: query,\n variables: {\n object: object,\n },\n }).catch(error => {\n console.error(error.graphQLErrors);\n throw error;\n });\n }\n\n async saveMany(entities: E[]) {\n const query = gql`mutation upsert($objects: [${this.tableName}_insert_input!]!) {\n insert_${this.tableName}(\n objects: $objects,\n on_conflict: {\n constraint: ${this.pkey},\n update_columns: [${this.updateColumns}]\n }\n ) { affected_rows }\n }`;\n const objects = entities.map(entity => this.converter.toHasura(entity));\n console.debug('[Hasura Repository] objects:', objects);\n const client = await lastValueFrom(this.hasura.getApolloClient());\n return client.mutate({\n mutation: query,\n variables: { objects },\n }).catch(error => {\n console.error(error);\n // console.error(error.graphQLErrors?.[0]?.extensions?.internal);\n throw error;\n });\n }\n\n async deleteMany(params: {id: string}[]): Promise<number> {\n const mutationName = `delete_${this.tableName}`;\n const mutation = gql`\n mutation deleteMany($ids: [String!]!) {\n ${mutationName}(where: {id: {_in: $ids}}) {\n affected_rows\n }\n }\n `;\n const client = await lastValueFrom(this.hasura.getApolloClient());\n return client.mutate({\n mutation,\n variables: { ids: params.map(param => param.id) },\n }).then((result) => result.data[mutationName].affected_rows).catch((error) => {\n console.error(error.graphQLErrors);\n throw error;\n });\n }\n\n async deleteAll() {\n const client = await lastValueFrom(this.hasura.getApolloClient());\n return client.mutate({\n mutation: gql`mutation delete_all {\n delete_${this.tableName} (where: {}) { affected_rows }\n }`,\n variables: {},\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["HttpLink","InMemoryCache"],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from "@angular/common/http";
|
|
2
2
|
import { Observable } from "rxjs";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
3
4
|
export declare class HasuraInterceptor implements HttpInterceptor {
|
|
4
5
|
private config;
|
|
5
6
|
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;
|
|
7
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HasuraInterceptor, never>;
|
|
8
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<HasuraInterceptor>;
|
|
6
9
|
}
|