@umituz/react-native-firebase 2.6.1 → 2.6.3
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/package.json +1 -1
- package/src/application/auth/ports/AuthPort_part_aa +150 -0
- package/src/application/auth/ports/AuthPort_part_ab +14 -0
- package/src/application/auth/use-cases/SignInUseCaseHelpers.ts +0 -0
- package/src/application/auth/use-cases/SignInUseCaseMain.ts +0 -0
- package/src/application/auth/use-cases/SignInUseCase_part_aa +150 -0
- package/src/application/auth/use-cases/SignInUseCase_part_ab +103 -0
- package/src/application/auth/use-cases/SignOutUseCaseCleanup.ts +0 -0
- package/src/application/auth/use-cases/SignOutUseCaseMain.ts +0 -0
- package/src/application/auth/use-cases/SignOutUseCase_part_aa +150 -0
- package/src/application/auth/use-cases/SignOutUseCase_part_ab +138 -0
- package/src/domains/account-deletion/domain/services/UserValidationHelpers.ts.bak +181 -0
- package/src/domains/account-deletion/domain/services/UserValidationHelpers_part_aa +150 -0
- package/src/domains/account-deletion/domain/services/UserValidationHelpers_part_ab +31 -0
- package/src/domains/account-deletion/domain/services/{UserValidationService.ts → UserValidationService.ts.bak} +1 -10
- package/src/domains/account-deletion/domain/services/UserValidationService_part_aa +150 -0
- package/src/domains/account-deletion/domain/services/UserValidationService_part_ab +136 -0
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionExecutor_part_aa +150 -0
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionExecutor_part_ab +80 -0
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionReauthHandler_part_aa +150 -0
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionReauthHandler_part_ab +24 -0
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionRepository_part_aa +150 -0
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionRepository_part_ab +116 -0
- package/src/domains/account-deletion/infrastructure/services/reauthentication.service_part_aa +150 -0
- package/src/domains/account-deletion/infrastructure/services/reauthentication.service_part_ab +10 -0
- package/src/domains/auth/infrastructure_part_aa +150 -0
- package/src/domains/auth/infrastructure_part_ab +6 -0
- package/src/domains/auth/presentation/hooks/GoogleOAuthHelpers.ts +0 -0
- package/src/domains/auth/presentation/hooks/GoogleOAuthHookService_part_aa +150 -0
- package/src/domains/auth/presentation/hooks/GoogleOAuthHookService_part_ab +97 -0
- package/src/domains/auth/presentation/hooks/GoogleOAuthService.ts +0 -0
- package/src/domains/firestore/domain/entities/Collection.ts +31 -191
- package/src/domains/firestore/domain/entities/Collection.ts.bak +288 -0
- package/src/domains/firestore/domain/entities/CollectionFactory.ts +55 -0
- package/src/domains/firestore/domain/entities/CollectionHelpers.ts +143 -0
- package/src/domains/firestore/domain/entities/CollectionUtils.ts +72 -0
- package/src/domains/firestore/domain/entities/CollectionValidation.ts +138 -0
- package/src/domains/firestore/domain/entities/Collection_part_aa +150 -0
- package/src/domains/firestore/domain/entities/Collection_part_ab +138 -0
- package/src/domains/firestore/domain/entities/DocumentHelpers.ts +0 -0
- package/src/domains/firestore/domain/entities/DocumentMain.ts +0 -0
- package/src/domains/firestore/domain/entities/Document_part_aa +150 -0
- package/src/domains/firestore/domain/entities/Document_part_ab +83 -0
- package/src/domains/firestore/domain/index.ts +35 -8
- package/src/domains/firestore/domain/services/QueryServiceAnalysis_part_aa +150 -0
- package/src/domains/firestore/domain/services/QueryServiceAnalysis_part_ab +19 -0
- package/src/domains/firestore/domain/services/QueryServiceHelpers_part_aa +150 -0
- package/src/domains/firestore/domain/services/QueryServiceHelpers_part_ab +1 -0
- package/src/domains/firestore/domain/services/QueryService_part_aa +150 -0
- package/src/domains/firestore/domain/services/QueryService_part_ab +32 -0
- package/src/domains/firestore/domain/value-objects/QueryOptions.ts +20 -68
- package/src/domains/firestore/domain/value-objects/QueryOptions.ts.bak +6 -135
- package/src/domains/firestore/domain/value-objects/QueryOptionsFactory.ts +95 -0
- package/src/domains/firestore/domain/value-objects/QueryOptionsHelpers.ts +110 -0
- package/src/domains/firestore/domain/value-objects/QueryOptionsSerialization_part_aa +150 -0
- package/src/domains/firestore/domain/value-objects/QueryOptionsSerialization_part_ab +57 -0
- package/src/domains/firestore/domain/value-objects/QueryOptionsValidation_part_aa +150 -0
- package/src/domains/firestore/domain/value-objects/QueryOptionsValidation_part_ab +32 -0
- package/src/domains/firestore/domain/value-objects/QueryOptions_part_aa +150 -0
- package/src/domains/firestore/domain/value-objects/QueryOptions_part_ab +41 -0
- package/src/domains/firestore/domain/value-objects/WhereClause.ts +35 -205
- package/src/domains/firestore/domain/value-objects/WhereClause.ts.bak +299 -0
- package/src/domains/firestore/domain/value-objects/WhereClauseFactory.ts +44 -150
- package/src/domains/firestore/domain/value-objects/WhereClauseFactory.ts.bak +207 -0
- package/src/domains/firestore/domain/value-objects/WhereClauseFactory_part_aa +150 -0
- package/src/domains/firestore/domain/value-objects/WhereClauseFactory_part_ab +57 -0
- package/src/domains/firestore/domain/value-objects/WhereClauseHelpers.ts +123 -0
- package/src/domains/firestore/domain/value-objects/WhereClauseValidation.ts +83 -0
- package/src/domains/firestore/domain/value-objects/WhereClause_part_aa +150 -0
- package/src/domains/firestore/domain/value-objects/WhereClause_part_ab +149 -0
- package/src/shared/infrastructure/base/ErrorHandler_part_aa +150 -0
- package/src/shared/infrastructure/base/ErrorHandler_part_ab +39 -0
- package/src/shared/infrastructure/base/ServiceBase_part_aa +150 -0
- package/src/shared/infrastructure/base/ServiceBase_part_ab +70 -0
- package/src/shared/infrastructure/config/base/ServiceClientSingleton_part_aa +150 -0
- package/src/shared/infrastructure/config/base/ServiceClientSingleton_part_ab +5 -0
- /package/src/application/auth/ports/{AuthPort.ts → AuthPort.ts.bak} +0 -0
- /package/src/application/auth/use-cases/{SignInUseCase.ts → SignInUseCase.ts.bak} +0 -0
- /package/src/application/auth/use-cases/{SignOutUseCase.ts → SignOutUseCase.ts.bak} +0 -0
- /package/src/domains/account-deletion/infrastructure/services/{AccountDeletionExecutor.ts → AccountDeletionExecutor.ts.bak} +0 -0
- /package/src/domains/account-deletion/infrastructure/services/{AccountDeletionReauthHandler.ts → AccountDeletionReauthHandler.ts.bak} +0 -0
- /package/src/domains/account-deletion/infrastructure/services/{AccountDeletionRepository.ts → AccountDeletionRepository.ts.bak} +0 -0
- /package/src/domains/account-deletion/infrastructure/services/{reauthentication.service.ts → reauthentication.service.ts.bak} +0 -0
- /package/src/domains/auth/{infrastructure.ts → infrastructure.ts.bak} +0 -0
- /package/src/domains/auth/presentation/hooks/{GoogleOAuthHookService.ts → GoogleOAuthHookService.ts.bak} +0 -0
- /package/src/domains/firestore/domain/entities/{Document.ts → Document.ts.bak} +0 -0
- /package/src/domains/firestore/domain/services/{QueryService.ts → QueryService.ts.bak} +0 -0
- /package/src/domains/firestore/domain/services/{QueryServiceAnalysis.ts → QueryServiceAnalysis.ts.bak} +0 -0
- /package/src/domains/firestore/domain/services/{QueryServiceHelpers.ts → QueryServiceHelpers.ts.bak} +0 -0
- /package/src/domains/firestore/domain/value-objects/{QueryOptionsSerialization.ts → QueryOptionsSerialization.ts.bak} +0 -0
- /package/src/domains/firestore/domain/value-objects/{QueryOptionsValidation.ts → QueryOptionsValidation.ts.bak} +0 -0
- /package/src/shared/infrastructure/base/{ErrorHandler.ts → ErrorHandler.ts.bak} +0 -0
- /package/src/shared/infrastructure/base/{ServiceBase.ts → ServiceBase.ts.bak} +0 -0
- /package/src/shared/infrastructure/config/base/{ServiceClientSingleton.ts → ServiceClientSingleton.ts.bak} +0 -0
|
@@ -1,207 +1,101 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Where Clause Factory
|
|
3
|
-
* Single Responsibility:
|
|
4
|
-
*
|
|
5
|
-
* Factory functions for creating commonly used where clauses.
|
|
6
|
-
* Separated from WhereClause for better maintainability.
|
|
3
|
+
* Single Responsibility: Create where clauses
|
|
7
4
|
*
|
|
8
5
|
* Max lines: 150 (enforced for maintainability)
|
|
9
6
|
*/
|
|
10
7
|
|
|
11
8
|
import type { WhereFilterOp } from 'firebase/firestore';
|
|
12
9
|
import { WhereClause } from './WhereClause';
|
|
13
|
-
import type { WhereOperator } from './WhereClause';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Factory function to create where clause
|
|
17
|
-
*/
|
|
18
|
-
export function createWhereClause(
|
|
19
|
-
field: string,
|
|
20
|
-
operator: WhereFilterOp,
|
|
21
|
-
value: unknown
|
|
22
|
-
): WhereClause {
|
|
23
|
-
return WhereClause.create(field, operator, value);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Factory functions for common where clauses
|
|
28
|
-
*/
|
|
29
|
-
export const where = {
|
|
30
|
-
equals: WhereClause.equals,
|
|
31
|
-
notEquals: WhereClause.notEquals,
|
|
32
|
-
lessThan: WhereClause.lessThan,
|
|
33
|
-
lessThanOrEqual: WhereClause.lessThanOrEqual,
|
|
34
|
-
greaterThan: WhereClause.greaterThan,
|
|
35
|
-
greaterThanOrEqual: WhereClause.greaterThanOrEqual,
|
|
36
|
-
arrayContains: WhereClause.arrayContains,
|
|
37
|
-
arrayContainsAny: WhereClause.arrayContainsAny,
|
|
38
|
-
in: WhereClause.in,
|
|
39
|
-
notIn: WhereClause.notIn,
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Create batch of where clauses
|
|
44
|
-
*/
|
|
45
|
-
export function createWhereBatch(
|
|
46
|
-
clauses: Array<{ field: string; operator: WhereFilterOp; value: unknown }>
|
|
47
|
-
): WhereClause[] {
|
|
48
|
-
return clauses.map(c => WhereClause.create(c.field, c.operator, c.value));
|
|
49
|
-
}
|
|
50
10
|
|
|
51
11
|
/**
|
|
52
|
-
* Create
|
|
12
|
+
* Create equals where clause
|
|
53
13
|
*/
|
|
54
|
-
export function
|
|
55
|
-
return
|
|
56
|
-
WhereClause.equals(field, value)
|
|
57
|
-
);
|
|
14
|
+
export function equals(field: string, value: unknown): WhereClause {
|
|
15
|
+
return new WhereClause(field, '==', value);
|
|
58
16
|
}
|
|
59
17
|
|
|
60
18
|
/**
|
|
61
|
-
* Create
|
|
19
|
+
* Create not-equals where clause
|
|
62
20
|
*/
|
|
63
|
-
export function
|
|
64
|
-
return WhereClause
|
|
21
|
+
export function notEquals(field: string, value: unknown): WhereClause {
|
|
22
|
+
return new WhereClause(field, '!=', value);
|
|
65
23
|
}
|
|
66
24
|
|
|
67
25
|
/**
|
|
68
|
-
* Create
|
|
26
|
+
* Create less-than where clause
|
|
69
27
|
*/
|
|
70
|
-
export function
|
|
71
|
-
return WhereClause
|
|
28
|
+
export function lessThan(field: string, value: unknown): WhereClause {
|
|
29
|
+
return new WhereClause(field, '<', value);
|
|
72
30
|
}
|
|
73
31
|
|
|
74
32
|
/**
|
|
75
|
-
* Create
|
|
33
|
+
* Create less-than-or-equal where clause
|
|
76
34
|
*/
|
|
77
|
-
export function
|
|
78
|
-
field
|
|
79
|
-
startValue: unknown,
|
|
80
|
-
endValue: unknown
|
|
81
|
-
): WhereClause[] {
|
|
82
|
-
return [
|
|
83
|
-
WhereClause.greaterThanOrEqual(field, startValue),
|
|
84
|
-
WhereClause.lessThanOrEqual(field, endValue),
|
|
85
|
-
];
|
|
35
|
+
export function lessThanOrEqual(field: string, value: unknown): WhereClause {
|
|
36
|
+
return new WhereClause(field, '<=', value);
|
|
86
37
|
}
|
|
87
38
|
|
|
88
39
|
/**
|
|
89
|
-
* Create
|
|
40
|
+
* Create greater-than where clause
|
|
90
41
|
*/
|
|
91
|
-
export function
|
|
92
|
-
field
|
|
93
|
-
startDate: Date,
|
|
94
|
-
endDate: Date
|
|
95
|
-
): WhereClause[] {
|
|
96
|
-
return createRangeClause(field, startDate, endDate);
|
|
42
|
+
export function greaterThan(field: string, value: unknown): WhereClause {
|
|
43
|
+
return new WhereClause(field, '>', value);
|
|
97
44
|
}
|
|
98
45
|
|
|
99
46
|
/**
|
|
100
|
-
* Create
|
|
101
|
-
* Note: Firestore doesn't support native contains, this is for consistency
|
|
47
|
+
* Create greater-than-or-equal where clause
|
|
102
48
|
*/
|
|
103
|
-
export function
|
|
104
|
-
return WhereClause
|
|
49
|
+
export function greaterThanOrEqual(field: string, value: unknown): WhereClause {
|
|
50
|
+
return new WhereClause(field, '>=', value);
|
|
105
51
|
}
|
|
106
52
|
|
|
107
53
|
/**
|
|
108
|
-
* Create
|
|
54
|
+
* Create array-contains where clause
|
|
109
55
|
*/
|
|
110
|
-
export function
|
|
111
|
-
return
|
|
56
|
+
export function arrayContains(field: string, value: unknown): WhereClause {
|
|
57
|
+
return new WhereClause(field, 'array-contains', value);
|
|
112
58
|
}
|
|
113
59
|
|
|
114
60
|
/**
|
|
115
|
-
* Create
|
|
61
|
+
* Create in where clause
|
|
116
62
|
*/
|
|
117
|
-
export function
|
|
118
|
-
return WhereClause
|
|
63
|
+
export function inOp(field: string, values: unknown[]): WhereClause {
|
|
64
|
+
return new WhereClause(field, 'in', values);
|
|
119
65
|
}
|
|
120
66
|
|
|
121
67
|
/**
|
|
122
|
-
* Create
|
|
68
|
+
* Create not-in where clause
|
|
123
69
|
*/
|
|
124
|
-
export function
|
|
125
|
-
return WhereClause
|
|
70
|
+
export function notIn(field: string, values: unknown[]): WhereClause {
|
|
71
|
+
return new WhereClause(field, 'not-in', values);
|
|
126
72
|
}
|
|
127
73
|
|
|
128
74
|
/**
|
|
129
|
-
* Create
|
|
75
|
+
* Create array-contains-any where clause
|
|
130
76
|
*/
|
|
131
|
-
export function
|
|
132
|
-
return WhereClause
|
|
77
|
+
export function arrayContainsAny(field: string, values: unknown[]): WhereClause {
|
|
78
|
+
return new WhereClause(field, 'array-contains-any', values);
|
|
133
79
|
}
|
|
134
80
|
|
|
135
81
|
/**
|
|
136
|
-
* Create
|
|
82
|
+
* Create where clause with custom operator
|
|
137
83
|
*/
|
|
138
|
-
export function
|
|
84
|
+
export function where(
|
|
139
85
|
field: string,
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
): WhereClause
|
|
143
|
-
return
|
|
144
|
-
WhereClause.greaterThanOrEqual(field, min),
|
|
145
|
-
WhereClause.lessThanOrEqual(field, max),
|
|
146
|
-
];
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Validate where clauses compatibility
|
|
151
|
-
*/
|
|
152
|
-
export function validateWhereClauses(clauses: WhereClause[]): {
|
|
153
|
-
valid: boolean;
|
|
154
|
-
errors: string[];
|
|
155
|
-
} {
|
|
156
|
-
const errors: string[] = [];
|
|
157
|
-
|
|
158
|
-
// Validate each clause individually
|
|
159
|
-
for (let i = 0; i < clauses.length; i++) {
|
|
160
|
-
const validation = clauses[i].validate();
|
|
161
|
-
if (!validation.valid) {
|
|
162
|
-
errors.push(`Clause ${i}: ${validation.errors.join(', ')}`);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Validate compatibility
|
|
167
|
-
for (let i = 0; i < clauses.length; i++) {
|
|
168
|
-
for (let j = i + 1; j < clauses.length; j++) {
|
|
169
|
-
if (!clauses[i].isCompatibleWith(clauses[j])) {
|
|
170
|
-
errors.push(`Clauses ${i} and ${j} are incompatible`);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return {
|
|
176
|
-
valid: errors.length === 0,
|
|
177
|
-
errors,
|
|
178
|
-
};
|
|
86
|
+
operator: WhereFilterOp,
|
|
87
|
+
value: unknown
|
|
88
|
+
): WhereClause {
|
|
89
|
+
return new WhereClause(field, operator, value);
|
|
179
90
|
}
|
|
180
91
|
|
|
181
92
|
/**
|
|
182
|
-
*
|
|
183
|
-
* Removes duplicates and incompatible clauses
|
|
93
|
+
* Create where clause from object
|
|
184
94
|
*/
|
|
185
|
-
export function
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
// Remove incompatible (keep first occurrences)
|
|
192
|
-
const compatible: WhereClause[] = [];
|
|
193
|
-
for (const clause of unique) {
|
|
194
|
-
let canAdd = true;
|
|
195
|
-
for (const existing of compatible) {
|
|
196
|
-
if (!clause.isCompatibleWith(existing)) {
|
|
197
|
-
canAdd = false;
|
|
198
|
-
break;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
if (canAdd) {
|
|
202
|
-
compatible.push(clause);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return compatible;
|
|
95
|
+
export function fromObject(obj: {
|
|
96
|
+
field: string;
|
|
97
|
+
operator: WhereFilterOp;
|
|
98
|
+
value: unknown;
|
|
99
|
+
}): WhereClause {
|
|
100
|
+
return new WhereClause(obj.field, obj.operator, obj.value);
|
|
207
101
|
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where Clause Factory
|
|
3
|
+
* Single Responsibility: Provide factory methods for common where clauses
|
|
4
|
+
*
|
|
5
|
+
* Factory functions for creating commonly used where clauses.
|
|
6
|
+
* Separated from WhereClause for better maintainability.
|
|
7
|
+
*
|
|
8
|
+
* Max lines: 150 (enforced for maintainability)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { WhereFilterOp } from 'firebase/firestore';
|
|
12
|
+
import { WhereClause } from './WhereClause';
|
|
13
|
+
import type { WhereOperator } from './WhereClause';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Factory function to create where clause
|
|
17
|
+
*/
|
|
18
|
+
export function createWhereClause(
|
|
19
|
+
field: string,
|
|
20
|
+
operator: WhereFilterOp,
|
|
21
|
+
value: unknown
|
|
22
|
+
): WhereClause {
|
|
23
|
+
return WhereClause.create(field, operator, value);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Factory functions for common where clauses
|
|
28
|
+
*/
|
|
29
|
+
export const where = {
|
|
30
|
+
equals: WhereClause.equals,
|
|
31
|
+
notEquals: WhereClause.notEquals,
|
|
32
|
+
lessThan: WhereClause.lessThan,
|
|
33
|
+
lessThanOrEqual: WhereClause.lessThanOrEqual,
|
|
34
|
+
greaterThan: WhereClause.greaterThan,
|
|
35
|
+
greaterThanOrEqual: WhereClause.greaterThanOrEqual,
|
|
36
|
+
arrayContains: WhereClause.arrayContains,
|
|
37
|
+
arrayContainsAny: WhereClause.arrayContainsAny,
|
|
38
|
+
in: WhereClause.in,
|
|
39
|
+
notIn: WhereClause.notIn,
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Create batch of where clauses
|
|
44
|
+
*/
|
|
45
|
+
export function createWhereBatch(
|
|
46
|
+
clauses: Array<{ field: string; operator: WhereFilterOp; value: unknown }>
|
|
47
|
+
): WhereClause[] {
|
|
48
|
+
return clauses.map(c => WhereClause.create(c.field, c.operator, c.value));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Create equality clauses from object
|
|
53
|
+
*/
|
|
54
|
+
export function createEqualityFilters(obj: Record<string, unknown>): WhereClause[] {
|
|
55
|
+
return Object.entries(obj).map(([field, value]) =>
|
|
56
|
+
WhereClause.equals(field, value)
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Create in clause from values
|
|
62
|
+
*/
|
|
63
|
+
export function createInClause(field: string, values: unknown[]): WhereClause {
|
|
64
|
+
return WhereClause.in(field, values);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Create not-in clause from values
|
|
69
|
+
*/
|
|
70
|
+
export function createNotInClause(field: string, values: unknown[]): WhereClause {
|
|
71
|
+
return WhereClause.notIn(field, values);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Create range clause (>= start and <= end)
|
|
76
|
+
*/
|
|
77
|
+
export function createRangeClause(
|
|
78
|
+
field: string,
|
|
79
|
+
startValue: unknown,
|
|
80
|
+
endValue: unknown
|
|
81
|
+
): WhereClause[] {
|
|
82
|
+
return [
|
|
83
|
+
WhereClause.greaterThanOrEqual(field, startValue),
|
|
84
|
+
WhereClause.lessThanOrEqual(field, endValue),
|
|
85
|
+
];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Create date range clause
|
|
90
|
+
*/
|
|
91
|
+
export function createDateRangeClause(
|
|
92
|
+
field: string,
|
|
93
|
+
startDate: Date,
|
|
94
|
+
endDate: Date
|
|
95
|
+
): WhereClause[] {
|
|
96
|
+
return createRangeClause(field, startDate, endDate);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Create text search clause (case-insensitive contains)
|
|
101
|
+
* Note: Firestore doesn't support native contains, this is for consistency
|
|
102
|
+
*/
|
|
103
|
+
export function createTextSearchClause(field: string, searchText: string): WhereClause {
|
|
104
|
+
return WhereClause.equals(field, searchText);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Create multiple equality clauses combined
|
|
109
|
+
*/
|
|
110
|
+
export function createMultiFieldFilter(filters: Record<string, unknown>): WhereClause[] {
|
|
111
|
+
return createEqualityFilters(filters);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Create not-null clause
|
|
116
|
+
*/
|
|
117
|
+
export function createNotNullClause(field: string): WhereClause {
|
|
118
|
+
return WhereClause.notEquals(field, null);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Create null clause
|
|
123
|
+
*/
|
|
124
|
+
export function createNullClause(field: string): WhereClause {
|
|
125
|
+
return WhereClause.equals(field, null);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Create boolean clause
|
|
130
|
+
*/
|
|
131
|
+
export function createBooleanClause(field: string, value: boolean): WhereClause {
|
|
132
|
+
return WhereClause.equals(field, value);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Create number range clause
|
|
137
|
+
*/
|
|
138
|
+
export function createNumberRangeClause(
|
|
139
|
+
field: string,
|
|
140
|
+
min: number,
|
|
141
|
+
max: number
|
|
142
|
+
): WhereClause[] {
|
|
143
|
+
return [
|
|
144
|
+
WhereClause.greaterThanOrEqual(field, min),
|
|
145
|
+
WhereClause.lessThanOrEqual(field, max),
|
|
146
|
+
];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Validate where clauses compatibility
|
|
151
|
+
*/
|
|
152
|
+
export function validateWhereClauses(clauses: WhereClause[]): {
|
|
153
|
+
valid: boolean;
|
|
154
|
+
errors: string[];
|
|
155
|
+
} {
|
|
156
|
+
const errors: string[] = [];
|
|
157
|
+
|
|
158
|
+
// Validate each clause individually
|
|
159
|
+
for (let i = 0; i < clauses.length; i++) {
|
|
160
|
+
const validation = clauses[i].validate();
|
|
161
|
+
if (!validation.valid) {
|
|
162
|
+
errors.push(`Clause ${i}: ${validation.errors.join(', ')}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Validate compatibility
|
|
167
|
+
for (let i = 0; i < clauses.length; i++) {
|
|
168
|
+
for (let j = i + 1; j < clauses.length; j++) {
|
|
169
|
+
if (!clauses[i].isCompatibleWith(clauses[j])) {
|
|
170
|
+
errors.push(`Clauses ${i} and ${j} are incompatible`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return {
|
|
176
|
+
valid: errors.length === 0,
|
|
177
|
+
errors,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Optimize where clauses
|
|
183
|
+
* Removes duplicates and incompatible clauses
|
|
184
|
+
*/
|
|
185
|
+
export function optimizeWhereClauses(clauses: WhereClause[]): WhereClause[] {
|
|
186
|
+
// Remove duplicates
|
|
187
|
+
const unique = clauses.filter((clause, index, self) =>
|
|
188
|
+
index === self.findIndex(c => clause.equals(c))
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
// Remove incompatible (keep first occurrences)
|
|
192
|
+
const compatible: WhereClause[] = [];
|
|
193
|
+
for (const clause of unique) {
|
|
194
|
+
let canAdd = true;
|
|
195
|
+
for (const existing of compatible) {
|
|
196
|
+
if (!clause.isCompatibleWith(existing)) {
|
|
197
|
+
canAdd = false;
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (canAdd) {
|
|
202
|
+
compatible.push(clause);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return compatible;
|
|
207
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where Clause Factory
|
|
3
|
+
* Single Responsibility: Provide factory methods for common where clauses
|
|
4
|
+
*
|
|
5
|
+
* Factory functions for creating commonly used where clauses.
|
|
6
|
+
* Separated from WhereClause for better maintainability.
|
|
7
|
+
*
|
|
8
|
+
* Max lines: 150 (enforced for maintainability)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { WhereFilterOp } from 'firebase/firestore';
|
|
12
|
+
import { WhereClause } from './WhereClause';
|
|
13
|
+
import type { WhereOperator } from './WhereClause';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Factory function to create where clause
|
|
17
|
+
*/
|
|
18
|
+
export function createWhereClause(
|
|
19
|
+
field: string,
|
|
20
|
+
operator: WhereFilterOp,
|
|
21
|
+
value: unknown
|
|
22
|
+
): WhereClause {
|
|
23
|
+
return WhereClause.create(field, operator, value);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Factory functions for common where clauses
|
|
28
|
+
*/
|
|
29
|
+
export const where = {
|
|
30
|
+
equals: WhereClause.equals,
|
|
31
|
+
notEquals: WhereClause.notEquals,
|
|
32
|
+
lessThan: WhereClause.lessThan,
|
|
33
|
+
lessThanOrEqual: WhereClause.lessThanOrEqual,
|
|
34
|
+
greaterThan: WhereClause.greaterThan,
|
|
35
|
+
greaterThanOrEqual: WhereClause.greaterThanOrEqual,
|
|
36
|
+
arrayContains: WhereClause.arrayContains,
|
|
37
|
+
arrayContainsAny: WhereClause.arrayContainsAny,
|
|
38
|
+
in: WhereClause.in,
|
|
39
|
+
notIn: WhereClause.notIn,
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Create batch of where clauses
|
|
44
|
+
*/
|
|
45
|
+
export function createWhereBatch(
|
|
46
|
+
clauses: Array<{ field: string; operator: WhereFilterOp; value: unknown }>
|
|
47
|
+
): WhereClause[] {
|
|
48
|
+
return clauses.map(c => WhereClause.create(c.field, c.operator, c.value));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Create equality clauses from object
|
|
53
|
+
*/
|
|
54
|
+
export function createEqualityFilters(obj: Record<string, unknown>): WhereClause[] {
|
|
55
|
+
return Object.entries(obj).map(([field, value]) =>
|
|
56
|
+
WhereClause.equals(field, value)
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Create in clause from values
|
|
62
|
+
*/
|
|
63
|
+
export function createInClause(field: string, values: unknown[]): WhereClause {
|
|
64
|
+
return WhereClause.in(field, values);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Create not-in clause from values
|
|
69
|
+
*/
|
|
70
|
+
export function createNotInClause(field: string, values: unknown[]): WhereClause {
|
|
71
|
+
return WhereClause.notIn(field, values);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Create range clause (>= start and <= end)
|
|
76
|
+
*/
|
|
77
|
+
export function createRangeClause(
|
|
78
|
+
field: string,
|
|
79
|
+
startValue: unknown,
|
|
80
|
+
endValue: unknown
|
|
81
|
+
): WhereClause[] {
|
|
82
|
+
return [
|
|
83
|
+
WhereClause.greaterThanOrEqual(field, startValue),
|
|
84
|
+
WhereClause.lessThanOrEqual(field, endValue),
|
|
85
|
+
];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Create date range clause
|
|
90
|
+
*/
|
|
91
|
+
export function createDateRangeClause(
|
|
92
|
+
field: string,
|
|
93
|
+
startDate: Date,
|
|
94
|
+
endDate: Date
|
|
95
|
+
): WhereClause[] {
|
|
96
|
+
return createRangeClause(field, startDate, endDate);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Create text search clause (case-insensitive contains)
|
|
101
|
+
* Note: Firestore doesn't support native contains, this is for consistency
|
|
102
|
+
*/
|
|
103
|
+
export function createTextSearchClause(field: string, searchText: string): WhereClause {
|
|
104
|
+
return WhereClause.equals(field, searchText);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Create multiple equality clauses combined
|
|
109
|
+
*/
|
|
110
|
+
export function createMultiFieldFilter(filters: Record<string, unknown>): WhereClause[] {
|
|
111
|
+
return createEqualityFilters(filters);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Create not-null clause
|
|
116
|
+
*/
|
|
117
|
+
export function createNotNullClause(field: string): WhereClause {
|
|
118
|
+
return WhereClause.notEquals(field, null);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Create null clause
|
|
123
|
+
*/
|
|
124
|
+
export function createNullClause(field: string): WhereClause {
|
|
125
|
+
return WhereClause.equals(field, null);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Create boolean clause
|
|
130
|
+
*/
|
|
131
|
+
export function createBooleanClause(field: string, value: boolean): WhereClause {
|
|
132
|
+
return WhereClause.equals(field, value);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Create number range clause
|
|
137
|
+
*/
|
|
138
|
+
export function createNumberRangeClause(
|
|
139
|
+
field: string,
|
|
140
|
+
min: number,
|
|
141
|
+
max: number
|
|
142
|
+
): WhereClause[] {
|
|
143
|
+
return [
|
|
144
|
+
WhereClause.greaterThanOrEqual(field, min),
|
|
145
|
+
WhereClause.lessThanOrEqual(field, max),
|
|
146
|
+
];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Validate where clauses compatibility
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
*/
|
|
2
|
+
export function validateWhereClauses(clauses: WhereClause[]): {
|
|
3
|
+
valid: boolean;
|
|
4
|
+
errors: string[];
|
|
5
|
+
} {
|
|
6
|
+
const errors: string[] = [];
|
|
7
|
+
|
|
8
|
+
// Validate each clause individually
|
|
9
|
+
for (let i = 0; i < clauses.length; i++) {
|
|
10
|
+
const validation = clauses[i].validate();
|
|
11
|
+
if (!validation.valid) {
|
|
12
|
+
errors.push(`Clause ${i}: ${validation.errors.join(', ')}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Validate compatibility
|
|
17
|
+
for (let i = 0; i < clauses.length; i++) {
|
|
18
|
+
for (let j = i + 1; j < clauses.length; j++) {
|
|
19
|
+
if (!clauses[i].isCompatibleWith(clauses[j])) {
|
|
20
|
+
errors.push(`Clauses ${i} and ${j} are incompatible`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
valid: errors.length === 0,
|
|
27
|
+
errors,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Optimize where clauses
|
|
33
|
+
* Removes duplicates and incompatible clauses
|
|
34
|
+
*/
|
|
35
|
+
export function optimizeWhereClauses(clauses: WhereClause[]): WhereClause[] {
|
|
36
|
+
// Remove duplicates
|
|
37
|
+
const unique = clauses.filter((clause, index, self) =>
|
|
38
|
+
index === self.findIndex(c => clause.equals(c))
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
// Remove incompatible (keep first occurrences)
|
|
42
|
+
const compatible: WhereClause[] = [];
|
|
43
|
+
for (const clause of unique) {
|
|
44
|
+
let canAdd = true;
|
|
45
|
+
for (const existing of compatible) {
|
|
46
|
+
if (!clause.isCompatibleWith(existing)) {
|
|
47
|
+
canAdd = false;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (canAdd) {
|
|
52
|
+
compatible.push(clause);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return compatible;
|
|
57
|
+
}
|