@nx-ddd/firestore 19.0.0-preview.9 → 19.1.0
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 +157 -81
- package/adapters/admin/admin.adapter.d.ts +2 -5
- package/adapters/admin/admin.adapter.js +2 -9
- package/adapters/admin/admin.adapter.js.map +1 -1
- package/adapters/base/base.adapter.d.ts +4 -3
- package/adapters/base/base.adapter.js +21 -5
- package/adapters/base/base.adapter.js.map +1 -1
- package/adapters/dayjs/dayjs.adatper.d.ts +15 -0
- package/adapters/dayjs/dayjs.adatper.js +44 -0
- package/adapters/dayjs/dayjs.adatper.js.map +1 -0
- package/adapters/dayjs/index.d.ts +1 -0
- package/adapters/dayjs/index.js +2 -0
- package/adapters/dayjs/index.js.map +1 -0
- package/adapters/firebase/firebase.adapter.d.ts +1 -5
- package/adapters/firebase/firebase.adapter.js +0 -10
- package/adapters/firebase/firebase.adapter.js.map +1 -1
- package/converter/converter.d.ts +5 -0
- package/converter/converter.js +15 -12
- package/converter/converter.js.map +1 -1
- package/decorators/decorators.d.ts +23 -13
- package/decorators/decorators.js +19 -13
- package/decorators/decorators.js.map +1 -1
- package/package.json +3 -16
- package/query/v2/query.d.ts +26 -7
- package/query/v2/query.js +31 -10
- package/query/v2/query.js.map +1 -1
- package/repository/repository.d.ts +42 -22
- package/repository/repository.js +102 -47
- package/repository/repository.js.map +1 -1
- package/testing/common.d.ts +2 -2
package/README.md
CHANGED
|
@@ -1,96 +1,172 @@
|
|
|
1
|
-
# @
|
|
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.
|
|
1
|
+
# @nx-ddd/firestore
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
A Firestore adapter for @nx-ddd/core that provides seamless integration with Firebase Cloud Firestore.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @nx-ddd/firestore
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
### 1. Repository Implementation
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { FirestoreRepository } from '@nx-ddd/firestore';
|
|
17
|
+
|
|
18
|
+
@Injectable()
|
|
19
|
+
export class UserFirestoreRepository extends FirestoreRepository<User> implements UserRepository {
|
|
20
|
+
constructor(firestore: Firestore) {
|
|
21
|
+
super(firestore, 'users');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async findByEmail(email: string): Promise<User | null> {
|
|
25
|
+
const snapshot = await this.collection
|
|
26
|
+
.where('email', '==', email)
|
|
27
|
+
.limit(1)
|
|
28
|
+
.get();
|
|
29
|
+
|
|
30
|
+
return this.toEntity(snapshot.docs[0]);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 2. Entity Mapping
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
import { FirestoreEntity } from '@nx-ddd/firestore';
|
|
39
|
+
|
|
40
|
+
@FirestoreEntity({
|
|
41
|
+
collection: 'users',
|
|
42
|
+
converters: {
|
|
43
|
+
createdAt: FirestoreTimestampConverter,
|
|
44
|
+
updatedAt: FirestoreTimestampConverter
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
export class User extends Entity {
|
|
48
|
+
constructor(
|
|
49
|
+
id: ID,
|
|
50
|
+
public readonly email: string,
|
|
51
|
+
public readonly name: string,
|
|
52
|
+
public readonly createdAt: Date,
|
|
53
|
+
public readonly updatedAt: Date
|
|
54
|
+
) {
|
|
55
|
+
super(id);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 3. Transaction Support
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
import { FirestoreTransactional } from '@nx-ddd/firestore';
|
|
64
|
+
|
|
65
|
+
@Injectable()
|
|
66
|
+
export class UserService {
|
|
67
|
+
constructor(private readonly firestore: Firestore) {}
|
|
68
|
+
|
|
69
|
+
@FirestoreTransactional()
|
|
70
|
+
async createUserWithProfile(data: UserData): Promise<void> {
|
|
71
|
+
const user = new User(/* ... */);
|
|
72
|
+
const profile = new Profile(/* ... */);
|
|
73
|
+
|
|
74
|
+
await this.userRepository.save(user);
|
|
75
|
+
await this.profileRepository.save(profile);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
7
78
|
```
|
|
8
79
|
|
|
9
|
-
|
|
80
|
+
### 4. Query Building
|
|
10
81
|
|
|
11
|
-
|
|
82
|
+
```typescript
|
|
83
|
+
import { FirestoreQueryBuilder } from '@nx-ddd/firestore';
|
|
12
84
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
import { TransformToDayjs } from '@nx-ddd/common/domain/models';
|
|
17
|
-
import { bootstrap } from '@nx-ddd/core';
|
|
18
|
-
import { FirestoreRepository, Firestore, injectConverter } from '@nx-ddd/firestore';
|
|
19
|
-
import { IsDayjs } from 'class-validator-extended';
|
|
20
|
-
import dayjs from 'dayjs';
|
|
85
|
+
@Injectable()
|
|
86
|
+
export class UserQueryService {
|
|
87
|
+
constructor(private readonly builder: FirestoreQueryBuilder) {}
|
|
21
88
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
89
|
+
async findActiveUsers(): Promise<User[]> {
|
|
90
|
+
return this.builder
|
|
91
|
+
.collection('users')
|
|
92
|
+
.where('status', '==', 'active')
|
|
93
|
+
.orderBy('lastLoginAt', 'desc')
|
|
94
|
+
.limit(10)
|
|
95
|
+
.execute();
|
|
96
|
+
}
|
|
27
97
|
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Advanced Features
|
|
101
|
+
|
|
102
|
+
### 1. Batch Operations
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
import { FirestoreBatch } from '@nx-ddd/firestore';
|
|
28
106
|
|
|
29
|
-
@Injectable(
|
|
30
|
-
export class
|
|
31
|
-
readonly
|
|
32
|
-
|
|
107
|
+
@Injectable()
|
|
108
|
+
export class UserBatchService {
|
|
109
|
+
constructor(private readonly batch: FirestoreBatch) {}
|
|
110
|
+
|
|
111
|
+
async deactivateUsers(userIds: string[]): Promise<void> {
|
|
112
|
+
this.batch.begin();
|
|
113
|
+
|
|
114
|
+
for (const id of userIds) {
|
|
115
|
+
this.batch.update(`users/${id}`, { status: 'inactive' });
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
await this.batch.commit();
|
|
119
|
+
}
|
|
33
120
|
}
|
|
34
121
|
```
|
|
35
122
|
|
|
36
|
-
###
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
provideFirestoreAdapter(),
|
|
55
|
-
]).then(async (injector) => {
|
|
56
|
-
const repository = injector.get(UserRepository);
|
|
57
|
-
await repository.create({
|
|
58
|
-
id: '0001',
|
|
59
|
-
name: 'test',
|
|
60
|
-
createdAt: dayjs('2022-01-01'),
|
|
61
|
-
updatedAt: dayjs('2022-01-01'),
|
|
62
|
-
});
|
|
63
|
-
const user = await repository.get({id: '0001'});
|
|
64
|
-
console.debug('user:', user);
|
|
65
|
-
});
|
|
123
|
+
### 2. Real-time Updates
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
import { FirestoreObservable } from '@nx-ddd/firestore';
|
|
127
|
+
|
|
128
|
+
@Injectable()
|
|
129
|
+
export class UserStreamService {
|
|
130
|
+
constructor(private readonly observable: FirestoreObservable) {}
|
|
131
|
+
|
|
132
|
+
watchUserChanges(userId: string): Observable<User> {
|
|
133
|
+
return this.observable
|
|
134
|
+
.document(`users/${userId}`)
|
|
135
|
+
.valueChanges()
|
|
136
|
+
.pipe(
|
|
137
|
+
map(data => new User(data))
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
66
141
|
```
|
|
67
142
|
|
|
143
|
+
### 3. Sub-collections
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
import { FirestoreSubCollection } from '@nx-ddd/firestore';
|
|
68
147
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
import dayjs from 'dayjs';
|
|
80
|
-
|
|
81
|
-
const app = initializeApp({...});
|
|
82
|
-
|
|
83
|
-
bootstrap([
|
|
84
|
-
provideFirestoreAdapter(),
|
|
85
|
-
]).then(async (injector) => {
|
|
86
|
-
const repository = injector.get(UserRepository);
|
|
87
|
-
await repository.create({
|
|
88
|
-
id: '0001',
|
|
89
|
-
name: 'test',
|
|
90
|
-
createdAt: dayjs('2022-01-01'),
|
|
91
|
-
updatedAt: dayjs('2022-01-01'),
|
|
92
|
-
});
|
|
93
|
-
const user = await repository.get({id: '0001'});
|
|
94
|
-
console.debug('user:', user);
|
|
95
|
-
});
|
|
148
|
+
@Injectable()
|
|
149
|
+
export class UserDocumentRepository extends FirestoreRepository<UserDocument> {
|
|
150
|
+
constructor(firestore: Firestore) {
|
|
151
|
+
super(firestore, 'users/:userId/documents');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async findUserDocuments(userId: string): Promise<UserDocument[]> {
|
|
155
|
+
return this.find({ userId });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
96
158
|
```
|
|
159
|
+
|
|
160
|
+
## Best Practices
|
|
161
|
+
|
|
162
|
+
1. Use repository pattern for data access
|
|
163
|
+
2. Implement proper error handling
|
|
164
|
+
3. Use transactions for atomic operations
|
|
165
|
+
4. Leverage batch operations for bulk updates
|
|
166
|
+
5. Consider real-time updates when appropriate
|
|
167
|
+
6. Structure collections and sub-collections carefully
|
|
168
|
+
7. Implement proper security rules
|
|
169
|
+
|
|
170
|
+
## License
|
|
171
|
+
|
|
172
|
+
MIT
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import dayjs from 'dayjs';
|
|
2
1
|
import admin from 'firebase-admin';
|
|
3
2
|
import { DocumentData, Transaction } from 'firebase-admin/firestore';
|
|
4
3
|
import { DocumentReference, CollectionReference as _CollectionReference, CollectionGroup as _CollectionGroup, Query as _Query } from '../../interfaces';
|
|
@@ -12,16 +11,14 @@ type CollectionLike<AppModelType = DocumentData, DbModelType extends DocumentDat
|
|
|
12
11
|
type InferCollectionLike<O extends Origin> = O extends admin.firestore.CollectionReference<infer A, infer B> ? CollectionReference<A, B> : O extends admin.firestore.CollectionGroup<infer A, infer B> ? CollectionGroup<A, B> : O extends admin.firestore.Query<infer A, infer B> ? Query<A, B> : never;
|
|
13
12
|
export declare function wrapCollectionLike<O extends Origin>(origin: O): InferCollectionLike<O>;
|
|
14
13
|
export declare function unwrapCollectionLike<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(collection: CollectionLike<AppModelType, DbModelType>): Origin<AppModelType, DbModelType>;
|
|
15
|
-
export declare class AdminFirestoreAdapter extends FirestoreAdapter<
|
|
14
|
+
export declare class AdminFirestoreAdapter<Date> extends FirestoreAdapter<Date> {
|
|
16
15
|
protected firestore: admin.firestore.Firestore;
|
|
17
16
|
get FieldValue(): typeof admin.firestore.FieldValue;
|
|
18
17
|
get Timestamp(): typeof admin.firestore.Timestamp;
|
|
19
18
|
get FieldPath(): typeof admin.firestore.FieldPath;
|
|
20
19
|
protected isTimestamp(v: any): v is admin.firestore.Timestamp;
|
|
21
20
|
protected isFieldValue(v: any): v is admin.firestore.FieldValue;
|
|
22
|
-
|
|
23
|
-
convertDateToTimestamp(date: dayjs.Dayjs): admin.firestore.Timestamp;
|
|
24
|
-
convertTimestampToDate(timestamp: admin.firestore.Timestamp): dayjs.Dayjs;
|
|
21
|
+
convertDateToTimestamp(date: Date): admin.firestore.Timestamp;
|
|
25
22
|
doc(path: string): DocumentReference<any, admin.firestore.DocumentReference>;
|
|
26
23
|
collection<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(path: string): CollectionReference<AppModelType, DbModelType>;
|
|
27
24
|
collectionGroup<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(collectionId: string): CollectionGroup<AppModelType, DbModelType>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
import { Injectable } from '@angular/core';
|
|
3
|
-
import dayjs from 'dayjs';
|
|
4
3
|
import admin from 'firebase-admin';
|
|
5
4
|
import { Subject } from 'rxjs';
|
|
6
5
|
import { FirestoreAdapter, provideFirestoreAdapter as _provideFirestoreAdapter } from '../base';
|
|
@@ -44,18 +43,12 @@ let AdminFirestoreAdapter = class AdminFirestoreAdapter extends FirestoreAdapter
|
|
|
44
43
|
isFieldValue(v) {
|
|
45
44
|
return v instanceof this.FieldValue;
|
|
46
45
|
}
|
|
47
|
-
isDate(v) {
|
|
48
|
-
return dayjs.isDayjs(v);
|
|
49
|
-
}
|
|
50
46
|
convertDateToTimestamp(date) {
|
|
51
|
-
if (
|
|
52
|
-
return admin.firestore.Timestamp.fromDate(
|
|
47
|
+
if (this.dateAdapter.isDate(date) && this.dateAdapter.isValid(date)) {
|
|
48
|
+
return admin.firestore.Timestamp.fromDate(this.dateAdapter.getJsDate(date));
|
|
53
49
|
}
|
|
54
50
|
throw new Error(`Invalid date: ${date}`);
|
|
55
51
|
}
|
|
56
|
-
convertTimestampToDate(timestamp) {
|
|
57
|
-
return dayjs(timestamp.toDate());
|
|
58
|
-
}
|
|
59
52
|
doc(path) {
|
|
60
53
|
const docRef = this.firestore.doc(path);
|
|
61
54
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.adapter.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/admin/admin.adapter.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"admin.adapter.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/admin/admin.adapter.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAQ/B,OAAO,EAAE,gBAAgB,EAAsC,uBAAuB,IAAI,wBAAwB,EAAE,MAAM,SAAS,CAAC;AA2CpI,MAAM,UAAU,kBAAkB,CAAmB,MAAS;IAC5D,OAAO;QACL,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,GAAG,EAAE;YACjB,MAAM,OAAO,GAAG,IAAI,OAAO,EAA+B,CAAC;YAC3D,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gBAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACnD,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,EAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAC;iBAC9C,CAAC,CAAC,CAAC;gBACJ,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;YACH,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;QAChC,CAAC;QACD,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;QACvB,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;KACvB,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAIlC,UAAqD;IAErD,OAAO,UAAU,CAAC,KAAK,CAAC;AAC1B,CAAC;AAGM,IAAM,qBAAqB,GAA3B,MAAM,qBAA4B,SAAQ,gBAAsB;IAAhE;;QACK,cAAS,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAiG1C,CAAC;IA/FC,IAAI,UAAU;QACZ,OAAO,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC;IACpC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC;IACnC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC;IACnC,CAAC;IAES,WAAW,CAAC,CAAM;QAC1B,OAAO,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC;IACrC,CAAC;IAES,YAAY,CAAC,CAAM;QAC3B,OAAO,CAAC,YAAY,IAAI,CAAC,UAAU,CAAC;IACtC,CAAC;IAED,sBAAsB,CAAC,IAAU;QAC/B,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpE,OAAO,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,CAAC,IAAY;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO;YACL,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC5D,GAAG,EAAE,CAAC,IAAI,EAAE,OAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;YAClD,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;YACvB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACrC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;SAC9B,CAAC;IACJ,CAAC;IAED,UAAU,CAGR,IAAY;QACZ,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,kBAAkB,CAAC,aAAa,CAAmD,CAAC;IAC7F,CAAC;IAED,eAAe,CAGb,YAAoB;QACpB,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACnE,OAAO,kBAAkB,CAAC,aAAa,CAA+C,CAAC;IACzF,CAAC;IAED,cAAc,CAAI,cAAwD;QACxE,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAIH,UAAqD,EACrD,GAAG,YAAkD;QAErD,MAAM,GAAG,GAAG,oBAAoB,CAA4B,UAAU,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACzE,OAAO,kBAAkB,CAAC,KAAK,CAAqC,CAAC;IACvE,CAAC;IAED,KAAK,CAGH,GAAW,EAAE,UAAyB,EAAE,KAAc;QACtD,OAAO,CAAC,UAA6C,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IACrG,CAAC;IAED,OAAO,CAGL,GAAW,EAAE,QAAwB,KAAK;QAC1C,OAAO,CAAC,UAA6C,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3F,CAAC;IAED,KAAK,CAGH,CAAS;QACT,OAAO,CAAC,UAA6C,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;CACF,CAAA;AAlGY,qBAAqB;IADjC,UAAU,EAAE;GACA,qBAAqB,CAkGjC;;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,wBAAwB,CAAC,qBAAqB,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import type { CollectionReference, CollectionGroup, DocumentReference, ToFirestoreData, Timestamp, Query, FieldValue, DocumentData } from '../../interfaces';
|
|
2
|
+
import { DateAdapter } from '../dayjs';
|
|
2
3
|
export type QueryFn<AppModelType, DbModelType, R> = (collection?: any) => R;
|
|
3
4
|
export type WhereFilterOp = '<' | '<=' | '==' | '!=' | '>=' | '>' | 'array-contains' | 'in' | 'array-contains-any' | 'not-in';
|
|
4
5
|
export declare abstract class FirestoreAdapter<Date = any> {
|
|
6
|
+
protected dateAdapter: DateAdapter;
|
|
5
7
|
protected abstract isTimestamp(v: any): v is Timestamp;
|
|
6
8
|
protected abstract isFieldValue(v: any): v is FieldValue;
|
|
7
|
-
protected abstract isDate(v: any): v is Date;
|
|
8
|
-
abstract convertTimestampToDate(timestamp: Timestamp): Date;
|
|
9
|
-
abstract convertDateToTimestamp(date: Date): Timestamp;
|
|
10
9
|
abstract get Timestamp(): any;
|
|
11
10
|
abstract get FieldValue(): any;
|
|
12
11
|
abstract get FieldPath(): any;
|
|
@@ -27,6 +26,8 @@ export declare abstract class FirestoreAdapter<Date = any> {
|
|
|
27
26
|
* @description FirestoreのUpdateは通常のオブジェクトでは孫以下のプロパティが既存データとマージされないので、パスに変換する必要がある。
|
|
28
27
|
*/
|
|
29
28
|
flattenForUpdate(obj: any): any;
|
|
29
|
+
convertDateToTimestamp(date: Date): Timestamp;
|
|
30
|
+
convertTimestampToDate(timestamp: Timestamp): Date;
|
|
30
31
|
}
|
|
31
32
|
export declare function provideFirestoreAdapter(useClass: new () => FirestoreAdapter): {
|
|
32
33
|
provide: typeof FirestoreAdapter;
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
2
|
+
import { inject, Injectable } from '@angular/core';
|
|
3
3
|
import { getFirestoreAnnotations } from '../../decorators/decorators';
|
|
4
|
-
import { walkObj } from '@nx-ddd/core
|
|
4
|
+
import { walkObj } from '@nx-ddd/core';
|
|
5
5
|
import { get } from 'lodash-es';
|
|
6
|
+
import { DateAdapter } from '../dayjs';
|
|
6
7
|
let FirestoreAdapter = class FirestoreAdapter {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.dateAdapter = inject(DateAdapter);
|
|
10
|
+
}
|
|
7
11
|
//** @deprecated */
|
|
8
12
|
toFirestoreData(entity) {
|
|
9
|
-
return Object.entries(entity).reduce((pre, [k, v]) => (Object.assign(Object.assign({}, pre), { [k]: this.isDate(v) ? this.convertDateToTimestamp(v) : v })), {});
|
|
13
|
+
return Object.entries(entity).reduce((pre, [k, v]) => (Object.assign(Object.assign({}, pre), { [k]: this.dateAdapter.isDate(v) ? this.convertDateToTimestamp(v) : v })), {});
|
|
10
14
|
}
|
|
11
15
|
//** @deprecated */
|
|
12
16
|
fromFirestoreData(data) {
|
|
@@ -33,8 +37,10 @@ let FirestoreAdapter = class FirestoreAdapter {
|
|
|
33
37
|
case 'timestamp': {
|
|
34
38
|
if (typeof _value === 'undefined')
|
|
35
39
|
break;
|
|
36
|
-
if (!this.isDate(_value))
|
|
40
|
+
if (!this.dateAdapter.isDate(_value)) {
|
|
41
|
+
console.error('[FirestoreAdapter] _value:', _value);
|
|
37
42
|
throw new Error(`Invalid Date Type: ${_value}`);
|
|
43
|
+
}
|
|
38
44
|
newObj[annotation.fieldName] = this.convertDateToTimestamp(_value);
|
|
39
45
|
break;
|
|
40
46
|
}
|
|
@@ -47,7 +53,11 @@ let FirestoreAdapter = class FirestoreAdapter {
|
|
|
47
53
|
const Type = annotation.childType();
|
|
48
54
|
if (typeof _value === 'undefined')
|
|
49
55
|
break;
|
|
50
|
-
|
|
56
|
+
if (!Array.isArray(_value)) {
|
|
57
|
+
newObj[annotation.fieldName] = [];
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
const value = (_value !== null && _value !== void 0 ? _value : []).map(v => {
|
|
51
61
|
switch (Type) {
|
|
52
62
|
case String:
|
|
53
63
|
case Number:
|
|
@@ -162,6 +172,12 @@ let FirestoreAdapter = class FirestoreAdapter {
|
|
|
162
172
|
});
|
|
163
173
|
return newObj;
|
|
164
174
|
}
|
|
175
|
+
convertDateToTimestamp(date) {
|
|
176
|
+
return this.Timestamp.fromDate(date);
|
|
177
|
+
}
|
|
178
|
+
convertTimestampToDate(timestamp) {
|
|
179
|
+
return this.dateAdapter.convertToDate(timestamp.toDate());
|
|
180
|
+
}
|
|
165
181
|
};
|
|
166
182
|
FirestoreAdapter = __decorate([
|
|
167
183
|
Injectable()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.adapter.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/base/base.adapter.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
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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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
export declare class DateAdapter {
|
|
3
|
+
isDate<D>(value: any): value is D;
|
|
4
|
+
isValid(value: any): boolean;
|
|
5
|
+
getJsDate<D>(value: any): D;
|
|
6
|
+
convertToDate<D>(value: Date): D;
|
|
7
|
+
}
|
|
8
|
+
export declare class DayjsAdapter {
|
|
9
|
+
private readonly dateAdapter;
|
|
10
|
+
constructor(dateAdapter: DateAdapter);
|
|
11
|
+
isDayjs(value: any): value is dayjs.Dayjs;
|
|
12
|
+
isValid(value: any): boolean;
|
|
13
|
+
getJsDate(value: dayjs.Dayjs): Date;
|
|
14
|
+
convertToDayjs<D>(value: any): D;
|
|
15
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import dayjs from 'dayjs';
|
|
4
|
+
let DateAdapter = class DateAdapter {
|
|
5
|
+
isDate(value) {
|
|
6
|
+
return value instanceof Date || dayjs.isDayjs(value);
|
|
7
|
+
}
|
|
8
|
+
isValid(value) {
|
|
9
|
+
return this.isDate(value) && !isNaN(value.getTime());
|
|
10
|
+
}
|
|
11
|
+
getJsDate(value) {
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
convertToDate(value) {
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
DateAdapter = __decorate([
|
|
19
|
+
Injectable({ providedIn: 'root' })
|
|
20
|
+
], DateAdapter);
|
|
21
|
+
export { DateAdapter };
|
|
22
|
+
let DayjsAdapter = class DayjsAdapter {
|
|
23
|
+
constructor(dateAdapter) {
|
|
24
|
+
this.dateAdapter = dateAdapter;
|
|
25
|
+
}
|
|
26
|
+
isDayjs(value) {
|
|
27
|
+
return dayjs.isDayjs(value);
|
|
28
|
+
}
|
|
29
|
+
isValid(value) {
|
|
30
|
+
return this.isDayjs(value) && value.isValid();
|
|
31
|
+
}
|
|
32
|
+
getJsDate(value) {
|
|
33
|
+
return value.toDate();
|
|
34
|
+
}
|
|
35
|
+
convertToDayjs(value) {
|
|
36
|
+
return dayjs(value);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
DayjsAdapter = __decorate([
|
|
40
|
+
Injectable({ providedIn: 'root' }),
|
|
41
|
+
__metadata("design:paramtypes", [DateAdapter])
|
|
42
|
+
], DayjsAdapter);
|
|
43
|
+
export { DayjsAdapter };
|
|
44
|
+
//# sourceMappingURL=dayjs.adatper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dayjs.adatper.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/dayjs/dayjs.adatper.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAGnB,IAAM,WAAW,GAAjB,MAAM,WAAW;IACtB,MAAM,CAAI,KAAU;QAClB,OAAO,KAAK,YAAY,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,KAAU;QAChB,OAAO,IAAI,CAAC,MAAM,CAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,SAAS,CAAI,KAAU;QACrB,OAAO,KAAU,CAAC;IACpB,CAAC;IAED,aAAa,CAAI,KAAW;QAC1B,OAAO,KAAU,CAAC;IACpB,CAAC;CACF,CAAA;AAhBY,WAAW;IADvB,UAAU,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;GACtB,WAAW,CAgBvB;;AAGM,IAAM,YAAY,GAAlB,MAAM,YAAY;IACvB,YAA6B,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAAG,CAAC;IAEzD,OAAO,CAAC,KAAU;QAChB,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,KAAU;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;IAChD,CAAC;IAED,SAAS,CAAC,KAAkB;QAC1B,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;IACxB,CAAC;IAED,cAAc,CAAI,KAAU;QAC1B,OAAO,KAAK,CAAC,KAAK,CAAM,CAAC;IAC3B,CAAC;CACF,CAAA;AAlBY,YAAY;IADxB,UAAU,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;qCAES,WAAW;GAD1C,YAAY,CAkBxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dayjs.adatper';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/dayjs/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { FieldValue, Timestamp, FieldPath } from 'firebase/firestore';
|
|
2
|
-
import dayjs from 'dayjs';
|
|
3
2
|
import { FirestoreAdapter, QueryFn as _QueryFn, WhereFilterOp } from '../base';
|
|
4
3
|
import type firestore from 'firebase/firestore';
|
|
5
4
|
import { CollectionReference as _CollectionReference, CollectionGroup as _CollectionGroup, Query as _Query, DocumentReference, DocumentData } from '../../interfaces';
|
|
@@ -12,7 +11,7 @@ type CollectionLike<AppModelType = DocumentData, DbModelType extends DocumentDat
|
|
|
12
11
|
type InferCollectionLike<O extends Origin> = O extends firestore.CollectionReference<infer A, infer B> ? CollectionReference<A, B> : O extends firestore.Query<infer A, infer B> ? CollectionGroup<A, B> : O extends firestore.Query<infer A, infer B> ? Query<A, B> : never;
|
|
13
12
|
export declare function wrapCollectionLike<O extends Origin>(origin: O): InferCollectionLike<O>;
|
|
14
13
|
export declare function unwrapCollectionLike<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(collection: CollectionLike<AppModelType, DbModelType>): Origin<AppModelType, DbModelType>;
|
|
15
|
-
export declare class FirebaseFirestoreAdapter extends FirestoreAdapter<
|
|
14
|
+
export declare class FirebaseFirestoreAdapter<D> extends FirestoreAdapter<D> {
|
|
16
15
|
firestore: firestore.Firestore;
|
|
17
16
|
constructor(firestore?: firestore.Firestore);
|
|
18
17
|
get FieldValue(): typeof FieldValue;
|
|
@@ -20,9 +19,6 @@ export declare class FirebaseFirestoreAdapter extends FirestoreAdapter<dayjs.Day
|
|
|
20
19
|
get FieldPath(): FieldPath;
|
|
21
20
|
protected isTimestamp(v: any): v is Timestamp;
|
|
22
21
|
protected isFieldValue(v: any): v is FieldValue;
|
|
23
|
-
protected isDate(v: any): v is dayjs.Dayjs;
|
|
24
|
-
convertDateToTimestamp(date: dayjs.Dayjs): Timestamp;
|
|
25
|
-
convertTimestampToDate(timestamp: Timestamp): dayjs.Dayjs;
|
|
26
22
|
doc(path: string): DocumentReference<any>;
|
|
27
23
|
collection<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(path: string): CollectionReference<AppModelType, DbModelType>;
|
|
28
24
|
collectionGroup<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(collectionId: string): CollectionGroup<AppModelType, DbModelType>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
2
|
import { doc, collection, collectionGroup, FieldValue, Timestamp, setDoc, getDoc, getDocs, getFirestore, onSnapshot, deleteDoc, writeBatch, query, orderBy, limit, updateDoc, where, FieldPath } from 'firebase/firestore';
|
|
3
|
-
import dayjs from 'dayjs';
|
|
4
3
|
import { Subject } from 'rxjs';
|
|
5
4
|
import { FirestoreAdapter } from '../base';
|
|
6
5
|
import { Injectable } from '@angular/core';
|
|
@@ -44,15 +43,6 @@ let FirebaseFirestoreAdapter = class FirebaseFirestoreAdapter extends FirestoreA
|
|
|
44
43
|
isFieldValue(v) {
|
|
45
44
|
return v instanceof this.FieldValue;
|
|
46
45
|
}
|
|
47
|
-
isDate(v) {
|
|
48
|
-
return dayjs.isDayjs(v);
|
|
49
|
-
}
|
|
50
|
-
convertDateToTimestamp(date) {
|
|
51
|
-
return Timestamp.fromDate(date.toDate());
|
|
52
|
-
}
|
|
53
|
-
convertTimestampToDate(timestamp) {
|
|
54
|
-
return dayjs(timestamp.toDate());
|
|
55
|
-
}
|
|
56
46
|
doc(path) {
|
|
57
47
|
const docRef = doc(this.firestore, path);
|
|
58
48
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebase.adapter.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/firebase/firebase.adapter.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAsB,MAAM,oBAAoB,CAAC;AAC/O,OAAO,
|
|
1
|
+
{"version":3,"file":"firebase.adapter.js","sourceRoot":"","sources":["../../../../../../packages/@nx-ddd/firestore/src/lib/adapters/firebase/firebase.adapter.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAsB,MAAM,oBAAoB,CAAC;AAC/O,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAsC,MAAM,SAAS,CAAC;AAW/E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA2C3C,MAAM,UAAU,kBAAkB,CAAmB,MAAS;IAC5D,OAAO;QACL,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,GAAG,EAAE;YACjB,MAAM,OAAO,GAAG,IAAI,OAAO,EAA+B,CAAC;YAC3D,UAAU,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACjF,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE;oBACP,GAAG,EAAE,MAAM,CAAC,GAAG;iBAChB;aACF,CAAC,CAAC,CAAC,CAAC,CAAC;YACN,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;QAChC,CAAC;QACD,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1B,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;KAC1B,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAIlC,UAAqD;IAErD,OAAO,UAAU,CAAC,KAAK,CAAC;AAC1B,CAAC;AAGM,IAAM,wBAAwB,GAA9B,MAAM,wBAA4B,SAAQ,gBAAmB;IAElE,YAAmB,YAAY,YAAY,EAAE;QAAI,KAAK,EAAE,CAAA;QAArC,cAAS,GAAT,SAAS,CAAiB;IAAY,CAAC;IAE1D,IAAI,UAAU;QACZ,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,SAAS,EAAE,CAAC;IACzB,CAAC;IAES,WAAW,CAAC,CAAM;QAC1B,OAAO,CAAC,YAAY,SAAS,CAAC;IAChC,CAAC;IAES,YAAY,CAAC,CAAM;QAC3B,OAAO,CAAC,YAAY,IAAI,CAAC,UAAU,CAAC;IACtC,CAAC;IAED,GAAG,CAAC,IAAY;QACd,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACzC,OAAO;YACL,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACtD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;YACnC,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YACzB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC;YACzC,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC;YAC/B,YAAY,EAAE,GAAG,EAAE;gBACjB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAyB,CAAC;gBACrD,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;oBACvC,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE;oBACtB,GAAG,EAAE,CAAC,SAAiB,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;iBAC/C,CAAC,CAAC,CAAC;gBACJ,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;YAChC,CAAC;SACF,CAAA;IACH,CAAC;IAED,UAAU,CAGR,IAAY;QACZ,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC7C,OAAO,kBAAkB,CAAC,GAAG,CAAmD,CAAC;IACnF,CAAC;IAED,eAAe,CAGb,YAAoB;QACpB,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC1D,OAAO,kBAAkB,CAAC,GAAG,CAAmD,CAAC;IACnF,CAAC;IAED,KAAK,CAIH,UAA0D,EAC1D,GAAG,YAAuB;QAE1B,MAAM,GAAG,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAGH,SAAiB,EAAE,KAAoB,EAAE,KAAc;QACvD,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,CAGL,GAAW,EAAE,QAAwB,KAAK;QAC1C,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAGH,CAAS;QACT,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,cAAc;QACZ,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,KAAK;QACH,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;CACF,CAAA;AArGY,wBAAwB;IADpC,UAAU,EAAE;;GACA,wBAAwB,CAqGpC"}
|
package/converter/converter.d.ts
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
|
+
import { FirestoreAdapter } from '../adapters/base';
|
|
1
2
|
import { DocumentSnapshot } from '../interfaces';
|
|
2
3
|
export interface IFirestoreConverter<E extends {
|
|
3
4
|
id: string;
|
|
4
5
|
}> {
|
|
5
6
|
fromFirestore(doc: DocumentSnapshot<object>): E;
|
|
7
|
+
fromFirestoreMany(docs: DocumentSnapshot<object>[]): E[];
|
|
6
8
|
toFirestore(entity: Partial<E>): object;
|
|
7
9
|
fromObject?(obj: object): E;
|
|
8
10
|
toObject?(entity: E): object;
|
|
9
11
|
}
|
|
12
|
+
export declare function getConverter<Entity extends {
|
|
13
|
+
id: string;
|
|
14
|
+
}>(Entity: new () => Entity, adapter?: FirestoreAdapter): IFirestoreConverter<Entity>;
|
|
10
15
|
export declare function injectConverter<Entity extends {
|
|
11
16
|
id: string;
|
|
12
17
|
}>(Entity: new () => Entity): IFirestoreConverter<Entity>;
|
package/converter/converter.js
CHANGED
|
@@ -1,28 +1,31 @@
|
|
|
1
1
|
import { inject } from '@angular/core';
|
|
2
|
-
import { plainToInstanceWithValid } from '@nx-ddd/core
|
|
2
|
+
import { plainToInstanceWithValid } from '@nx-ddd/core';
|
|
3
3
|
import { FirestoreAdapter } from '../adapters/base';
|
|
4
|
-
|
|
4
|
+
class FirestoreHelper {
|
|
5
|
+
static fromFirestore(doc, Entity, adapter) {
|
|
6
|
+
const data = adapter.fromFirestore(Object.assign(Object.assign({}, doc.data()), { id: doc.id }), Entity);
|
|
7
|
+
return plainToInstanceWithValid(Entity, data);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
5
10
|
class BasicConverter {
|
|
6
11
|
constructor(Entity, adapter) {
|
|
7
12
|
this.Entity = Entity;
|
|
8
13
|
this.adapter = adapter;
|
|
9
14
|
}
|
|
10
15
|
fromFirestore(doc) {
|
|
11
|
-
|
|
12
|
-
|
|
16
|
+
return this.adapter.fromFirestore(Object.assign(Object.assign({}, doc.data()), { id: doc.id }), this.Entity);
|
|
17
|
+
}
|
|
18
|
+
fromFirestoreMany(docs) {
|
|
19
|
+
return docs.map(doc => this.fromFirestore(doc));
|
|
13
20
|
}
|
|
14
21
|
toFirestore(entity) {
|
|
15
22
|
return this.adapter.toFirestore(entity, this.Entity);
|
|
16
23
|
}
|
|
17
|
-
fromObject(obj) {
|
|
18
|
-
return plainToInstanceWithValid(this.Entity, obj);
|
|
19
|
-
}
|
|
20
|
-
toObject(entity) {
|
|
21
|
-
return instanceToPlain(entity);
|
|
22
|
-
}
|
|
23
24
|
}
|
|
24
|
-
export function
|
|
25
|
-
const adapter = inject(FirestoreAdapter);
|
|
25
|
+
export function getConverter(Entity, adapter = inject(FirestoreAdapter)) {
|
|
26
26
|
return new BasicConverter(Entity, adapter);
|
|
27
27
|
}
|
|
28
|
+
export function injectConverter(Entity) {
|
|
29
|
+
return getConverter(Entity, inject(FirestoreAdapter));
|
|
30
|
+
}
|
|
28
31
|
//# sourceMappingURL=converter.js.map
|