@nx-ddd/firestore 16.1.1 → 16.3.1
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/README.md +76 -6
- package/adapters/admin/admin.adapter.d.ts +16 -12
- package/adapters/admin/admin.adapter.js +25 -23
- package/adapters/admin/admin.adapter.js.map +1 -1
- package/adapters/admin/index.js +1 -4
- package/adapters/admin/index.js.map +1 -1
- package/adapters/base/base.adapter.d.ts +8 -4
- package/adapters/base/base.adapter.js +80 -51
- package/adapters/base/base.adapter.js.map +1 -1
- package/adapters/base/index.js +1 -4
- package/adapters/base/index.js.map +1 -1
- package/adapters/firebase/firebase.adapter.d.ts +2 -2
- package/adapters/firebase/firebase.adapter.js +43 -41
- package/adapters/firebase/firebase.adapter.js.map +1 -1
- package/adapters/firebase/index.js +1 -4
- package/adapters/firebase/index.js.map +1 -1
- package/adapters/index.d.ts +0 -2
- package/adapters/index.js +1 -6
- package/adapters/index.js.map +1 -1
- package/converter/converter.d.ts +18 -12
- package/converter/converter.js +14 -28
- package/converter/converter.js.map +1 -1
- package/converter/index.js +1 -4
- package/converter/index.js.map +1 -1
- package/dao/firestore.dao.js +1 -5
- package/dao/firestore.dao.js.map +1 -1
- package/dao/index.js +1 -4
- package/dao/index.js.map +1 -1
- package/decorators/decorators.d.ts +4 -4
- package/decorators/decorators.js +26 -33
- package/decorators/decorators.js.map +1 -1
- package/decorators/index.js +1 -4
- package/decorators/index.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.js +7 -9
- package/index.js.map +1 -1
- package/interfaces/index.js +1 -4
- package/interfaces/index.js.map +1 -1
- package/interfaces/interfaces.js +1 -2
- package/interfaces/interfaces.js.map +1 -1
- package/package.json +11 -5
- package/path-builder/index.js +1 -4
- package/path-builder/index.js.map +1 -1
- package/path-builder/path-builder.js +7 -14
- package/path-builder/path-builder.js.map +1 -1
- package/query/firestore.query.d.ts +8 -3
- package/query/firestore.query.js +37 -17
- package/query/firestore.query.js.map +1 -1
- package/query/index.js +1 -4
- package/query/index.js.map +1 -1
- package/repository/index.d.ts +0 -1
- package/repository/index.js +1 -5
- package/repository/index.js.map +1 -1
- package/repository/repository.d.ts +12 -14
- package/repository/repository.js +26 -24
- package/repository/repository.js.map +1 -1
- package/testing/common.d.ts +1 -0
- package/testing/common.js +15 -15
- package/testing/common.js.map +1 -1
- package/testing/index.d.ts +0 -2
- package/testing/index.js +1 -6
- package/testing/index.js.map +1 -1
- package/repository/decorator.d.ts +0 -8
- package/repository/decorator.js +0 -41
- package/repository/decorator.js.map +0 -1
- package/testing/domain.d.ts +0 -12
- package/testing/domain.js +0 -22
- package/testing/domain.js.map +0 -1
- package/testing/repository.d.ts +0 -6
- package/testing/repository.js +0 -24
- package/testing/repository.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,11 +1,81 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @NxDDD/Firestroe
|
|
2
|
+
`@nx-ddd/firestore` is a library that wraps Firestore in the Repository pattern. It uses the Adapter pattern to enable the same codebase to work with both FirebaseAdmin and Firebase.
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
## Usage
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
### Common
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
```ts
|
|
9
|
+
// libs/common/infrastructure/repositories/user.repository
|
|
10
|
+
import 'reflect-metadata';
|
|
11
|
+
import '@angular/compiler';
|
|
12
|
+
import { inject, Injectable } from '@angular/core';
|
|
13
|
+
import { TransformToDayjs } from '@nx-ddd/common/domain/models';
|
|
14
|
+
import { IsDayjs } from 'class-validator-extended';
|
|
15
|
+
import dayjs from 'dayjs';
|
|
16
|
+
import { BaseFirestoreRepository, Firestore, injectConverter, pathBuilderFactory } from '@nx-ddd/firestore';
|
|
17
|
+
import { FirestoreAdapter } from '@nx-ddd/firestore/adapters/base';
|
|
18
|
+
import { bootstrap } from '@nx-ddd/core/v2';
|
|
8
19
|
|
|
9
|
-
|
|
20
|
+
export class User {
|
|
21
|
+
@Firestore.ID() id: string;
|
|
22
|
+
@Firestore.String() name: string;
|
|
23
|
+
@Firestore.Timestamp() @IsDayjs() @TransformToDayjs() createdAt: dayjs.Dayjs;
|
|
24
|
+
@Firestore.Timestamp() @IsDayjs() @TransformToDayjs() updatedAt: dayjs.Dayjs;
|
|
25
|
+
}
|
|
10
26
|
|
|
11
|
-
|
|
27
|
+
@Injectable({providedIn: 'root'})
|
|
28
|
+
export class UserRepository extends BaseFirestoreRepository<User> {
|
|
29
|
+
protected collectionPath = `users/:id`;
|
|
30
|
+
protected converter = injectConverter(User);
|
|
31
|
+
protected pathBuilder = pathBuilderFactory(this.collectionPath);
|
|
32
|
+
protected adapter = inject(FirestoreAdapter);
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Firebase Admin (in NodeJS)
|
|
37
|
+
Use `UserRepository` in NodeJS.
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
// apps/api/src/app/main.ts
|
|
41
|
+
import { provideFirestoreAdapter } from '@nx-ddd/firestore/adapters/admin';
|
|
42
|
+
import { UserRepository } from 'libs/common/infrastructure/repositories/user.repository';
|
|
43
|
+
|
|
44
|
+
bootstrap([
|
|
45
|
+
provideFirestoreAdapter(),
|
|
46
|
+
]).then(async (injector) => {
|
|
47
|
+
const repository = injector.get(UserRepository);
|
|
48
|
+
await repository.create({
|
|
49
|
+
id: '0001',
|
|
50
|
+
name: 'test',
|
|
51
|
+
createdAt: dayjs('2022-01-01'),
|
|
52
|
+
updatedAt: dayjs('2022-01-01'),
|
|
53
|
+
});
|
|
54
|
+
const user = await repository.get({id: '0001'});
|
|
55
|
+
console.debug('user:', user);
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
### Firebase (in Browser)
|
|
61
|
+
Use `UserRepository` in browser.
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
// apps/app/src/app/main.ts
|
|
65
|
+
import { provideFirestoreAdapter } from '@nx-ddd/firestore/adapters/firebase';
|
|
66
|
+
import { UserRepository } from 'libs/common/infrastructure/repositories/user.repository';
|
|
67
|
+
|
|
68
|
+
bootstrap([
|
|
69
|
+
provideFirestoreAdapter(),
|
|
70
|
+
]).then(async (injector) => {
|
|
71
|
+
const repository = injector.get(UserRepository);
|
|
72
|
+
await repository.create({
|
|
73
|
+
id: '0001',
|
|
74
|
+
name: 'test',
|
|
75
|
+
createdAt: dayjs('2022-01-01'),
|
|
76
|
+
updatedAt: dayjs('2022-01-01'),
|
|
77
|
+
});
|
|
78
|
+
const user = await repository.get({id: '0001'});
|
|
79
|
+
console.debug('user:', user);
|
|
80
|
+
});
|
|
81
|
+
```
|
|
@@ -1,26 +1,30 @@
|
|
|
1
1
|
import dayjs from 'dayjs';
|
|
2
|
-
import
|
|
2
|
+
import admin from 'firebase-admin';
|
|
3
3
|
import { DocumentReference, FirestoreCollection, FirestoreCollectionGroup } from '../../interfaces';
|
|
4
4
|
import { FirestoreAdapter, QueryFn, WhereFilterOp } from '../base';
|
|
5
5
|
export declare class AdminFirestoreAdapter extends FirestoreAdapter<dayjs.Dayjs> {
|
|
6
|
-
protected firestore: firestore.Firestore;
|
|
7
|
-
get FieldValue(): typeof firestore.FieldValue;
|
|
8
|
-
get Timestamp(): typeof firestore.Timestamp;
|
|
9
|
-
get FieldPath(): typeof firestore.FieldPath;
|
|
10
|
-
protected isTimestamp(v: any): v is firestore.Timestamp;
|
|
11
|
-
protected isFieldValue(v: any): v is firestore.FieldValue;
|
|
6
|
+
protected firestore: admin.firestore.Firestore;
|
|
7
|
+
get FieldValue(): typeof admin.firestore.FieldValue;
|
|
8
|
+
get Timestamp(): typeof admin.firestore.Timestamp;
|
|
9
|
+
get FieldPath(): typeof admin.firestore.FieldPath;
|
|
10
|
+
protected isTimestamp(v: any): v is admin.firestore.Timestamp;
|
|
11
|
+
protected isFieldValue(v: any): v is admin.firestore.FieldValue;
|
|
12
12
|
protected isDate(v: any): v is dayjs.Dayjs;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
doc(path: string): DocumentReference<any, firestore.DocumentReference>;
|
|
16
|
-
collection(path: string): FirestoreCollection<any, firestore.CollectionReference>;
|
|
13
|
+
convertDateToTimestamp(date: dayjs.Dayjs): admin.firestore.Timestamp;
|
|
14
|
+
convertTimestampToDate(timestamp: admin.firestore.Timestamp): dayjs.Dayjs;
|
|
15
|
+
doc(path: string): DocumentReference<any, admin.firestore.DocumentReference>;
|
|
16
|
+
collection(path: string): FirestoreCollection<any, admin.firestore.CollectionReference>;
|
|
17
17
|
collectionGroup(collectionId: string): FirestoreCollectionGroup<any>;
|
|
18
18
|
runTransaction(fn: any): Promise<unknown>;
|
|
19
19
|
query<Data>(collection: FirestoreCollection<Data>, ...queryFnArray: QueryFn<Data>[]): any;
|
|
20
20
|
where<Data>(key: string, evaluation: WhereFilterOp, value: unknown): QueryFn<Data>;
|
|
21
21
|
orderBy<Data>(key: string, order?: 'asc' | 'desc'): QueryFn<Data>;
|
|
22
22
|
limit<Data>(n: number): QueryFn<Data>;
|
|
23
|
-
batch(): firestore.WriteBatch;
|
|
23
|
+
batch(): admin.firestore.WriteBatch;
|
|
24
24
|
}
|
|
25
25
|
export declare class AdminFirestoreModule {
|
|
26
26
|
}
|
|
27
|
+
export declare function provideFirestoreAdapter(): {
|
|
28
|
+
provide: typeof FirestoreAdapter;
|
|
29
|
+
useClass: new () => FirestoreAdapter<any>;
|
|
30
|
+
};
|
|
@@ -1,24 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const base_1 = require("../base");
|
|
8
|
-
const core_1 = require("@nx-ddd/core");
|
|
9
|
-
let AdminFirestoreAdapter = exports.AdminFirestoreAdapter = class AdminFirestoreAdapter extends base_1.FirestoreAdapter {
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Injectable, NgModule } from '@angular/core';
|
|
3
|
+
import dayjs from 'dayjs';
|
|
4
|
+
import admin from 'firebase-admin';
|
|
5
|
+
import { FirestoreAdapter, provideFirestoreAdapter as _provideFirestoreAdapter } from '../base';
|
|
6
|
+
let AdminFirestoreAdapter = class AdminFirestoreAdapter extends FirestoreAdapter {
|
|
10
7
|
constructor() {
|
|
11
8
|
super(...arguments);
|
|
12
|
-
this.firestore =
|
|
9
|
+
this.firestore = admin.firestore();
|
|
13
10
|
}
|
|
14
11
|
get FieldValue() {
|
|
15
|
-
return
|
|
12
|
+
return admin.firestore.FieldValue;
|
|
16
13
|
}
|
|
17
14
|
get Timestamp() {
|
|
18
|
-
return
|
|
15
|
+
return admin.firestore.Timestamp;
|
|
19
16
|
}
|
|
20
17
|
get FieldPath() {
|
|
21
|
-
return
|
|
18
|
+
return admin.firestore.FieldPath;
|
|
22
19
|
}
|
|
23
20
|
isTimestamp(v) {
|
|
24
21
|
return v instanceof this.Timestamp;
|
|
@@ -27,16 +24,16 @@ let AdminFirestoreAdapter = exports.AdminFirestoreAdapter = class AdminFirestore
|
|
|
27
24
|
return v instanceof this.FieldValue;
|
|
28
25
|
}
|
|
29
26
|
isDate(v) {
|
|
30
|
-
return
|
|
27
|
+
return dayjs.isDayjs(v);
|
|
31
28
|
}
|
|
32
29
|
convertDateToTimestamp(date) {
|
|
33
|
-
if (
|
|
34
|
-
return
|
|
30
|
+
if (dayjs.isDayjs(date) && date.isValid()) {
|
|
31
|
+
return admin.firestore.Timestamp.fromDate(date.toDate());
|
|
35
32
|
}
|
|
36
33
|
throw new Error(`Invalid date: ${date}`);
|
|
37
34
|
}
|
|
38
35
|
convertTimestampToDate(timestamp) {
|
|
39
|
-
return (
|
|
36
|
+
return dayjs(timestamp.toDate());
|
|
40
37
|
}
|
|
41
38
|
doc(path) {
|
|
42
39
|
const docRef = this.firestore.doc(path);
|
|
@@ -74,16 +71,21 @@ let AdminFirestoreAdapter = exports.AdminFirestoreAdapter = class AdminFirestore
|
|
|
74
71
|
return this.firestore.batch();
|
|
75
72
|
}
|
|
76
73
|
};
|
|
77
|
-
|
|
78
|
-
|
|
74
|
+
AdminFirestoreAdapter = __decorate([
|
|
75
|
+
Injectable()
|
|
79
76
|
], AdminFirestoreAdapter);
|
|
80
|
-
|
|
77
|
+
export { AdminFirestoreAdapter };
|
|
78
|
+
let AdminFirestoreModule = class AdminFirestoreModule {
|
|
81
79
|
};
|
|
82
|
-
|
|
83
|
-
(
|
|
80
|
+
AdminFirestoreModule = __decorate([
|
|
81
|
+
NgModule({
|
|
84
82
|
providers: [
|
|
85
|
-
{ provide:
|
|
83
|
+
{ provide: FirestoreAdapter, useClass: AdminFirestoreAdapter },
|
|
86
84
|
],
|
|
87
85
|
})
|
|
88
86
|
], AdminFirestoreModule);
|
|
87
|
+
export { AdminFirestoreModule };
|
|
88
|
+
export function provideFirestoreAdapter() {
|
|
89
|
+
return _provideFirestoreAdapter(AdminFirestoreAdapter);
|
|
90
|
+
}
|
|
89
91
|
//# sourceMappingURL=admin.adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.adapter.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/admin/admin.adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"admin.adapter.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/admin/admin.adapter.ts"],"names":[],"mappings":"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"}
|
package/adapters/admin/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/admin/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/admin/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
|
@@ -5,8 +5,8 @@ export declare abstract class FirestoreAdapter<Date = any> {
|
|
|
5
5
|
protected abstract isTimestamp(v: any): v is Timestamp;
|
|
6
6
|
protected abstract isFieldValue(v: any): v is FieldValue;
|
|
7
7
|
protected abstract isDate(v: any): v is Date;
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
abstract convertTimestampToDate(timestamp: Timestamp): Date;
|
|
9
|
+
abstract convertDateToTimestamp(date: Date): Timestamp;
|
|
10
10
|
abstract get Timestamp(): any;
|
|
11
11
|
abstract get FieldValue(): any;
|
|
12
12
|
abstract get FieldPath(): any;
|
|
@@ -21,10 +21,14 @@ export declare abstract class FirestoreAdapter<Date = any> {
|
|
|
21
21
|
abstract limit<Data>(n: number): QueryFn<Data>;
|
|
22
22
|
toFirestoreData<Entity>(entity: Entity): ToFirestoreData<Entity, Date>;
|
|
23
23
|
fromFirestoreData<Entity>(data: ToFirestoreData<Entity, Date>): Entity;
|
|
24
|
-
toFirestore(obj: object, Entity:
|
|
25
|
-
fromFirestore(data: any, Entity:
|
|
24
|
+
toFirestore<T>(obj: object, Entity: new () => T): object;
|
|
25
|
+
fromFirestore<T = any>(data: any, Entity: new () => T): T;
|
|
26
26
|
/**
|
|
27
27
|
* @description FirestoreのUpdateは通常のオブジェクトでは孫以下のプロパティが既存データとマージされないので、パスに変換する必要がある。
|
|
28
28
|
*/
|
|
29
29
|
flattenForUpdate(obj: any): any;
|
|
30
30
|
}
|
|
31
|
+
export declare function provideFirestoreAdapter(useClass: new () => FirestoreAdapter): {
|
|
32
|
+
provide: typeof FirestoreAdapter;
|
|
33
|
+
useClass: new () => FirestoreAdapter;
|
|
34
|
+
};
|
|
@@ -1,22 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const walk_obj_1 = require("@nx-ddd/core/util/walk-obj");
|
|
9
|
-
let FirestoreAdapter = exports.FirestoreAdapter = class FirestoreAdapter {
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import { getFirestoreAnnotations } from "@nx-ddd/firestore/decorators";
|
|
4
|
+
import { walkObj } from '@nx-ddd/core/util/walk-obj';
|
|
5
|
+
import { get } from 'lodash-es';
|
|
6
|
+
let FirestoreAdapter = class FirestoreAdapter {
|
|
7
|
+
//** @deprecated */
|
|
10
8
|
toFirestoreData(entity) {
|
|
11
9
|
return Object.entries(entity).reduce((pre, [k, v]) => (Object.assign(Object.assign({}, pre), { [k]: this.isDate(v) ? this.convertDateToTimestamp(v) : v })), {});
|
|
12
10
|
}
|
|
11
|
+
//** @deprecated */
|
|
13
12
|
fromFirestoreData(data) {
|
|
14
13
|
return Object.entries(data).reduce((pre, [k, v]) => (Object.assign(Object.assign({}, pre), { [k]: this.isTimestamp(v) ? this.convertTimestampToDate(v) : v })), {});
|
|
15
14
|
}
|
|
16
15
|
toFirestore(obj, Entity) {
|
|
17
16
|
const newObj = {};
|
|
18
|
-
for (const annotation of
|
|
19
|
-
const _value = (
|
|
17
|
+
for (const annotation of getFirestoreAnnotations(Entity)) {
|
|
18
|
+
const _value = get(obj, annotation.propName);
|
|
20
19
|
if (_value === null) {
|
|
21
20
|
newObj[annotation.fieldName] = null;
|
|
22
21
|
continue;
|
|
@@ -24,7 +23,8 @@ let FirestoreAdapter = exports.FirestoreAdapter = class FirestoreAdapter {
|
|
|
24
23
|
switch (annotation.type) {
|
|
25
24
|
case 'id':
|
|
26
25
|
case 'string':
|
|
27
|
-
case 'number':
|
|
26
|
+
case 'number':
|
|
27
|
+
case 'boolean': {
|
|
28
28
|
if (typeof _value === 'undefined')
|
|
29
29
|
break;
|
|
30
30
|
newObj[annotation.fieldName] = _value;
|
|
@@ -33,33 +33,47 @@ let FirestoreAdapter = exports.FirestoreAdapter = class FirestoreAdapter {
|
|
|
33
33
|
case 'timestamp': {
|
|
34
34
|
if (typeof _value === 'undefined')
|
|
35
35
|
break;
|
|
36
|
+
if (!this.isDate(_value))
|
|
37
|
+
throw new Error(`Invalid Date Type: ${_value}`);
|
|
36
38
|
newObj[annotation.fieldName] = this.convertDateToTimestamp(_value);
|
|
37
39
|
break;
|
|
38
40
|
}
|
|
39
41
|
case 'array': {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
42
|
+
if (typeof (annotation === null || annotation === void 0 ? void 0 : annotation.childType) === 'undefined') {
|
|
43
|
+
if (_value)
|
|
44
|
+
newObj[annotation.fieldName] = _value;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const Type = annotation.childType();
|
|
48
|
+
if (typeof _value === 'undefined')
|
|
49
|
+
break;
|
|
50
|
+
const value = _value.map(v => {
|
|
51
|
+
switch (Type) {
|
|
52
|
+
case String:
|
|
53
|
+
case Number:
|
|
54
|
+
return v;
|
|
55
|
+
default:
|
|
56
|
+
return this.toFirestore(v, Type);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
if (value)
|
|
60
|
+
newObj[annotation.fieldName] = value;
|
|
61
|
+
}
|
|
54
62
|
break;
|
|
55
63
|
}
|
|
56
64
|
case 'map': {
|
|
57
|
-
const Type = annotation.childType();
|
|
58
65
|
if (typeof _value === 'undefined')
|
|
59
66
|
break;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
67
|
+
if (typeof (annotation === null || annotation === void 0 ? void 0 : annotation.childType) === 'undefined') {
|
|
68
|
+
if (_value)
|
|
69
|
+
newObj[annotation.fieldName] = _value;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
const Type = annotation.childType();
|
|
73
|
+
const value = this.toFirestore(_value, Type);
|
|
74
|
+
if (value)
|
|
75
|
+
newObj[annotation.fieldName] = value;
|
|
76
|
+
}
|
|
63
77
|
break;
|
|
64
78
|
}
|
|
65
79
|
}
|
|
@@ -68,7 +82,7 @@ let FirestoreAdapter = exports.FirestoreAdapter = class FirestoreAdapter {
|
|
|
68
82
|
}
|
|
69
83
|
fromFirestore(data, Entity) {
|
|
70
84
|
const newObj = {};
|
|
71
|
-
for (const annotation of
|
|
85
|
+
for (const annotation of getFirestoreAnnotations(Entity)) {
|
|
72
86
|
const _value = data[annotation.fieldName];
|
|
73
87
|
if (typeof _value === 'undefined')
|
|
74
88
|
continue;
|
|
@@ -79,7 +93,8 @@ let FirestoreAdapter = exports.FirestoreAdapter = class FirestoreAdapter {
|
|
|
79
93
|
switch (annotation.type) {
|
|
80
94
|
case 'id':
|
|
81
95
|
case 'string':
|
|
82
|
-
case 'number':
|
|
96
|
+
case 'number':
|
|
97
|
+
case 'boolean': {
|
|
83
98
|
newObj[annotation.propName] = _value;
|
|
84
99
|
break;
|
|
85
100
|
}
|
|
@@ -93,25 +108,35 @@ let FirestoreAdapter = exports.FirestoreAdapter = class FirestoreAdapter {
|
|
|
93
108
|
break;
|
|
94
109
|
}
|
|
95
110
|
case 'array': {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
111
|
+
if (typeof (annotation === null || annotation === void 0 ? void 0 : annotation.childType) === 'undefined') {
|
|
112
|
+
newObj[annotation.propName] = _value;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const Type = annotation.childType();
|
|
116
|
+
const value = _value.map(v => {
|
|
117
|
+
switch (Type) {
|
|
118
|
+
case String:
|
|
119
|
+
case Number:
|
|
120
|
+
return v;
|
|
121
|
+
default:
|
|
122
|
+
return this.fromFirestore(v, Type);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
if (value)
|
|
126
|
+
newObj[annotation.propName] = value;
|
|
127
|
+
}
|
|
108
128
|
break;
|
|
109
129
|
}
|
|
110
130
|
case 'map': {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
131
|
+
if (typeof (annotation === null || annotation === void 0 ? void 0 : annotation.childType) === 'undefined') {
|
|
132
|
+
newObj[annotation.propName] = _value;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const Type = annotation.childType();
|
|
136
|
+
const value = this.fromFirestore(_value, Type);
|
|
137
|
+
if (value)
|
|
138
|
+
newObj[annotation.propName] = value;
|
|
139
|
+
}
|
|
115
140
|
break;
|
|
116
141
|
}
|
|
117
142
|
}
|
|
@@ -123,7 +148,7 @@ let FirestoreAdapter = exports.FirestoreAdapter = class FirestoreAdapter {
|
|
|
123
148
|
*/
|
|
124
149
|
flattenForUpdate(obj) {
|
|
125
150
|
const newObj = {};
|
|
126
|
-
|
|
151
|
+
walkObj(obj, {
|
|
127
152
|
callback: (paths, value) => newObj[paths.join('.')] = value,
|
|
128
153
|
overwrite: (_, value) => {
|
|
129
154
|
if (Array.isArray(value))
|
|
@@ -138,7 +163,11 @@ let FirestoreAdapter = exports.FirestoreAdapter = class FirestoreAdapter {
|
|
|
138
163
|
return newObj;
|
|
139
164
|
}
|
|
140
165
|
};
|
|
141
|
-
|
|
142
|
-
|
|
166
|
+
FirestoreAdapter = __decorate([
|
|
167
|
+
Injectable()
|
|
143
168
|
], FirestoreAdapter);
|
|
169
|
+
export { FirestoreAdapter };
|
|
170
|
+
export function provideFirestoreAdapter(useClass) {
|
|
171
|
+
return { provide: FirestoreAdapter, useClass };
|
|
172
|
+
}
|
|
144
173
|
//# sourceMappingURL=base.adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.adapter.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/base/base.adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base.adapter.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/base/base.adapter.ts"],"names":[],"mappings":"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"}
|
package/adapters/base/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/base/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/base/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
|
|
@@ -11,8 +11,8 @@ export declare class FirebaseFirestoreAdapter extends FirestoreAdapter<dayjs.Day
|
|
|
11
11
|
protected isTimestamp(v: any): v is Timestamp;
|
|
12
12
|
protected isFieldValue(v: any): v is FieldValue;
|
|
13
13
|
protected isDate(v: any): v is dayjs.Dayjs;
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
convertDateToTimestamp(date: dayjs.Dayjs): Timestamp;
|
|
15
|
+
convertTimestampToDate(timestamp: Timestamp): dayjs.Dayjs;
|
|
16
16
|
doc(path: string): FirestoreDocument<any>;
|
|
17
17
|
collection(path: string): FirestoreCollection<any>;
|
|
18
18
|
collectionGroup(collectionId: string): FirestoreCollectionGroup<any>;
|