@umituz/react-native-firebase 2.6.2 → 2.6.4
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/index.ts +2 -34
- package/src/application/auth/use-cases/index.ts +1 -21
- package/src/domains/account-deletion/domain/index.ts +1 -8
- package/src/domains/account-deletion/index.ts +0 -42
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionExecutor.ts +79 -0
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionTypes.ts +0 -1
- package/src/domains/account-deletion/infrastructure/services/account-deletion.service.ts +2 -14
- package/src/domains/auth/index.ts +3 -12
- package/src/domains/auth/infrastructure.ts +11 -0
- package/src/domains/firestore/domain/entities/Collection.ts +0 -2
- package/src/domains/firestore/domain/index.ts +8 -12
- package/src/domains/firestore/domain/value-objects/{QueryOptions.ts.bak → QueryOptions.ts} +20 -68
- 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/WhereClause.ts +115 -0
- package/src/domains/firestore/domain/value-objects/WhereClauseFactory.ts +101 -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/presentation/hooks/useFirestoreMutation.ts +1 -1
- package/src/domains/firestore/presentation/hooks/useFirestoreQuery.ts +1 -1
- package/src/shared/infrastructure/config/base/ServiceClientSingleton.ts +29 -0
- package/src/application/auth/ports/AuthPort.ts.bak +0 -164
- package/src/application/auth/ports/AuthPort_part_aa +0 -150
- package/src/application/auth/ports/AuthPort_part_ab +0 -14
- package/src/application/auth/use-cases/SignInUseCase.ts.bak +0 -253
- 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 +0 -150
- package/src/application/auth/use-cases/SignInUseCase_part_ab +0 -103
- package/src/application/auth/use-cases/SignOutUseCase.ts.bak +0 -288
- 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 +0 -150
- package/src/application/auth/use-cases/SignOutUseCase_part_ab +0 -138
- package/src/domains/account-deletion/domain/services/UserValidationHelpers.ts.bak +0 -181
- package/src/domains/account-deletion/domain/services/UserValidationHelpers_part_aa +0 -150
- package/src/domains/account-deletion/domain/services/UserValidationHelpers_part_ab +0 -31
- package/src/domains/account-deletion/domain/services/UserValidationService.ts.bak +0 -286
- package/src/domains/account-deletion/domain/services/UserValidationService_part_aa +0 -150
- package/src/domains/account-deletion/domain/services/UserValidationService_part_ab +0 -136
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionExecutor.ts.bak +0 -230
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionExecutor_part_aa +0 -150
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionExecutor_part_ab +0 -80
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionReauthHandler.ts.bak +0 -174
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionReauthHandler_part_aa +0 -150
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionReauthHandler_part_ab +0 -24
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionRepository.ts.bak +0 -266
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionRepository_part_aa +0 -150
- package/src/domains/account-deletion/infrastructure/services/AccountDeletionRepository_part_ab +0 -116
- package/src/domains/account-deletion/infrastructure/services/reauthentication.service.ts.bak +0 -160
- package/src/domains/account-deletion/infrastructure/services/reauthentication.service_part_aa +0 -150
- package/src/domains/account-deletion/infrastructure/services/reauthentication.service_part_ab +0 -10
- package/src/domains/auth/infrastructure.ts.bak +0 -156
- package/src/domains/auth/infrastructure_part_aa +0 -150
- package/src/domains/auth/infrastructure_part_ab +0 -6
- package/src/domains/auth/presentation/hooks/GoogleOAuthHelpers.ts +0 -0
- package/src/domains/auth/presentation/hooks/GoogleOAuthHookService.ts.bak +0 -247
- package/src/domains/auth/presentation/hooks/GoogleOAuthHookService_part_aa +0 -150
- package/src/domains/auth/presentation/hooks/GoogleOAuthHookService_part_ab +0 -97
- package/src/domains/auth/presentation/hooks/GoogleOAuthService.ts +0 -0
- package/src/domains/firestore/domain/entities/Collection.ts.bak +0 -288
- package/src/domains/firestore/domain/entities/Collection_part_aa +0 -150
- package/src/domains/firestore/domain/entities/Collection_part_ab +0 -138
- package/src/domains/firestore/domain/entities/Document.ts.bak +0 -233
- 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 +0 -150
- package/src/domains/firestore/domain/entities/Document_part_ab +0 -83
- package/src/domains/firestore/domain/services/QueryService.ts.bak +0 -182
- package/src/domains/firestore/domain/services/QueryServiceAnalysis.ts.bak +0 -169
- package/src/domains/firestore/domain/services/QueryServiceAnalysis_part_aa +0 -150
- package/src/domains/firestore/domain/services/QueryServiceAnalysis_part_ab +0 -19
- package/src/domains/firestore/domain/services/QueryServiceHelpers.ts.bak +0 -151
- package/src/domains/firestore/domain/services/QueryServiceHelpers_part_aa +0 -150
- package/src/domains/firestore/domain/services/QueryServiceHelpers_part_ab +0 -1
- package/src/domains/firestore/domain/services/QueryService_part_aa +0 -150
- package/src/domains/firestore/domain/services/QueryService_part_ab +0 -32
- package/src/domains/firestore/domain/value-objects/QueryOptionsSerialization.ts.bak +0 -207
- package/src/domains/firestore/domain/value-objects/QueryOptionsSerialization_part_aa +0 -150
- package/src/domains/firestore/domain/value-objects/QueryOptionsSerialization_part_ab +0 -57
- package/src/domains/firestore/domain/value-objects/QueryOptionsValidation.ts.bak +0 -182
- package/src/domains/firestore/domain/value-objects/QueryOptionsValidation_part_aa +0 -150
- package/src/domains/firestore/domain/value-objects/QueryOptionsValidation_part_ab +0 -32
- package/src/domains/firestore/domain/value-objects/QueryOptions_part_aa +0 -150
- package/src/domains/firestore/domain/value-objects/QueryOptions_part_ab +0 -41
- package/src/domains/firestore/domain/value-objects/WhereClause.ts.bak +0 -299
- package/src/domains/firestore/domain/value-objects/WhereClauseFactory.ts.bak +0 -207
- package/src/domains/firestore/domain/value-objects/WhereClauseFactory_part_aa +0 -150
- package/src/domains/firestore/domain/value-objects/WhereClauseFactory_part_ab +0 -57
- package/src/domains/firestore/domain/value-objects/WhereClause_part_aa +0 -150
- package/src/domains/firestore/domain/value-objects/WhereClause_part_ab +0 -149
- package/src/shared/infrastructure/base/ErrorHandler.ts.bak +0 -189
- package/src/shared/infrastructure/base/ErrorHandler_part_aa +0 -150
- package/src/shared/infrastructure/base/ErrorHandler_part_ab +0 -39
- package/src/shared/infrastructure/base/ServiceBase.ts.bak +0 -220
- package/src/shared/infrastructure/base/ServiceBase_part_aa +0 -150
- package/src/shared/infrastructure/base/ServiceBase_part_ab +0 -70
- package/src/shared/infrastructure/config/base/ServiceClientSingleton.ts.bak +0 -155
- package/src/shared/infrastructure/config/base/ServiceClientSingleton_part_aa +0 -150
- package/src/shared/infrastructure/config/base/ServiceClientSingleton_part_ab +0 -5
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Query Service (Main Builder)
|
|
3
|
-
* Single Responsibility: Build and validate Firestore queries
|
|
4
|
-
*
|
|
5
|
-
* Domain service that encapsulates query building logic.
|
|
6
|
-
* Moves business logic from infrastructure to domain layer.
|
|
7
|
-
*
|
|
8
|
-
* Max lines: 150 (enforced for maintainability)
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type { Query, Firestore, WhereFilterOp } from 'firebase/firestore';
|
|
12
|
-
import { collection, query, where, orderBy, limit, startAfter, startAt } from 'firebase/firestore';
|
|
13
|
-
import { QueryOptions, createQueryOptions } from '../value-objects/QueryOptions';
|
|
14
|
-
import { WhereClause } from '../value-objects/WhereClause';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Query builder result
|
|
18
|
-
*/
|
|
19
|
-
export interface QueryBuilderResult {
|
|
20
|
-
readonly query: Query;
|
|
21
|
-
readonly options: QueryOptions;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Query service
|
|
26
|
-
* Provides query building and validation functionality
|
|
27
|
-
*/
|
|
28
|
-
export class QueryService {
|
|
29
|
-
private readonly db: Firestore;
|
|
30
|
-
|
|
31
|
-
constructor(db: Firestore) {
|
|
32
|
-
this.db = db;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Build a query from options
|
|
37
|
-
* Main method for query construction
|
|
38
|
-
*/
|
|
39
|
-
buildQuery(collectionPath: string, options: QueryOptions): QueryBuilderResult {
|
|
40
|
-
const validation = options.validate();
|
|
41
|
-
if (!validation.valid) {
|
|
42
|
-
throw new Error(`Invalid query options: ${validation.errors.join(', ')}`);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const collectionRef = collection(this.db, collectionPath);
|
|
46
|
-
let q: Query = collectionRef;
|
|
47
|
-
|
|
48
|
-
// Apply where clauses
|
|
49
|
-
for (const clause of options.whereClauses) {
|
|
50
|
-
q = query(q, where(clause.field, clause.operator, clause.value));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Apply sort options
|
|
54
|
-
for (const sort of options.sortOptions) {
|
|
55
|
-
q = query(q, orderBy(sort.field, sort.direction));
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Apply date range
|
|
59
|
-
if (options.dateRange) {
|
|
60
|
-
const { field, startDate, endDate } = options.dateRange;
|
|
61
|
-
if (startDate) {
|
|
62
|
-
q = query(q, where(field, '>=', startDate));
|
|
63
|
-
}
|
|
64
|
-
if (endDate) {
|
|
65
|
-
q = query(q, where(field, '<=', endDate));
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Apply pagination
|
|
70
|
-
if (options.pagination) {
|
|
71
|
-
const { cursor, limit: limitValue, startAfter: startAfterValue, startAt: startAtValue } = options.pagination;
|
|
72
|
-
|
|
73
|
-
if (startAfterValue !== undefined) {
|
|
74
|
-
q = query(q, startAfter(startAfterValue));
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (startAtValue !== undefined) {
|
|
78
|
-
q = query(q, startAt(startAtValue));
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (limitValue !== undefined) {
|
|
82
|
-
q = query(q, limit(limitValue));
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return { query: q, options };
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Build simple query with single where clause
|
|
91
|
-
*/
|
|
92
|
-
buildSimpleQuery(
|
|
93
|
-
collectionPath: string,
|
|
94
|
-
field: string,
|
|
95
|
-
operator: WhereFilterOp,
|
|
96
|
-
value: unknown
|
|
97
|
-
): Query {
|
|
98
|
-
const options = createQueryOptions({
|
|
99
|
-
where: [WhereClause.create(field, operator, value)],
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
return this.buildQuery(collectionPath, options).query;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Build query with equality filter
|
|
107
|
-
*/
|
|
108
|
-
buildEqualsQuery(collectionPath: string, field: string, value: unknown): Query {
|
|
109
|
-
return this.buildSimpleQuery(collectionPath, field, '==', value);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Build query with multiple equality filters
|
|
114
|
-
*/
|
|
115
|
-
buildMultiEqualsQuery(
|
|
116
|
-
collectionPath: string,
|
|
117
|
-
filters: Record<string, unknown>
|
|
118
|
-
): Query {
|
|
119
|
-
const whereClauses = Object.entries(filters).map(([field, value]) =>
|
|
120
|
-
WhereClause.equals(field, value)
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
const options = createQueryOptions({ where: whereClauses });
|
|
124
|
-
return this.buildQuery(collectionPath, options).query;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Build query with sorting
|
|
129
|
-
*/
|
|
130
|
-
buildSortedQuery(
|
|
131
|
-
collectionPath: string,
|
|
132
|
-
sortField: string,
|
|
133
|
-
direction: 'asc' | 'desc' = 'asc'
|
|
134
|
-
): Query {
|
|
135
|
-
const options = createQueryOptions({
|
|
136
|
-
sort: [{ field: sortField, direction }],
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
return this.buildQuery(collectionPath, options).query;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Build query with limit
|
|
144
|
-
*/
|
|
145
|
-
buildLimitedQuery(collectionPath: string, limitValue: number): Query {
|
|
146
|
-
const options = createQueryOptions({
|
|
147
|
-
pagination: { limit: limitValue },
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
return this.buildQuery(collectionPath, options).query;
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
}
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Build query with date range
|
|
5
|
-
*/
|
|
6
|
-
buildDateRangeQuery(
|
|
7
|
-
collectionPath: string,
|
|
8
|
-
field: string,
|
|
9
|
-
startDate?: Date,
|
|
10
|
-
endDate?: Date
|
|
11
|
-
): Query {
|
|
12
|
-
const options = createQueryOptions({
|
|
13
|
-
dateRange: { field, startDate, endDate },
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
return this.buildQuery(collectionPath, options).query;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Validate query options
|
|
21
|
-
*/
|
|
22
|
-
validateOptions(options: QueryOptions): { valid: boolean; errors: string[] } {
|
|
23
|
-
return options.validate();
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Check if query is empty (no filters)
|
|
28
|
-
*/
|
|
29
|
-
isEmptyQuery(options: QueryOptions): boolean {
|
|
30
|
-
return options.isEmpty();
|
|
31
|
-
}
|
|
32
|
-
}
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Query Options Serialization
|
|
3
|
-
* Single Responsibility: Handle serialization and conversion
|
|
4
|
-
*
|
|
5
|
-
* Serialization and conversion utilities for QueryOptions.
|
|
6
|
-
* Separated for better maintainability.
|
|
7
|
-
*
|
|
8
|
-
* Max lines: 150 (enforced for maintainability)
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { QueryOptions, createQueryOptions } from './QueryOptions';
|
|
12
|
-
import { WhereClause } from './WhereClause';
|
|
13
|
-
import type { SortOptions, DateRangeOptions, PaginationOptions } from './QueryOptions';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Convert to plain object (for serialization)
|
|
17
|
-
*/
|
|
18
|
-
export function toObject(options: QueryOptions): {
|
|
19
|
-
where: WhereClause[];
|
|
20
|
-
sort: SortOptions[];
|
|
21
|
-
dateRange: DateRangeOptions | null;
|
|
22
|
-
pagination: PaginationOptions | null;
|
|
23
|
-
} {
|
|
24
|
-
return {
|
|
25
|
-
where: [...options.whereClauses],
|
|
26
|
-
sort: [...options.sortOptions],
|
|
27
|
-
dateRange: options.dateRange,
|
|
28
|
-
pagination: options.pagination,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Create from plain object
|
|
34
|
-
*/
|
|
35
|
-
export function fromObject(obj: {
|
|
36
|
-
where?: Array<{ field: string; operator: string; value: unknown }>;
|
|
37
|
-
sort?: SortOptions[];
|
|
38
|
-
dateRange?: DateRangeOptions;
|
|
39
|
-
pagination?: PaginationOptions;
|
|
40
|
-
}): QueryOptions {
|
|
41
|
-
return QueryOptions.create({
|
|
42
|
-
where: obj.where?.map(w => WhereClause.create(w.field, w.operator as any, w.value)) || [],
|
|
43
|
-
sort: obj.sort || [],
|
|
44
|
-
dateRange: obj.dateRange || null,
|
|
45
|
-
pagination: obj.pagination || null,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Create from filters object (simplified)
|
|
51
|
-
*/
|
|
52
|
-
export function fromFilters(filters: Record<string, unknown>): QueryOptions {
|
|
53
|
-
const whereClauses = Object.entries(filters).map(([field, value]) =>
|
|
54
|
-
WhereClause.equals(field, value)
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
return QueryOptions.create({ where: whereClauses });
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Merge multiple query options
|
|
62
|
-
*/
|
|
63
|
-
export function mergeOptions(...options: QueryOptions[]): QueryOptions {
|
|
64
|
-
if (options.length === 0) {
|
|
65
|
-
return createQueryOptions();
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (options.length === 1) {
|
|
69
|
-
return options[0];
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const merged = options.reduce((acc, opt) => {
|
|
73
|
-
return QueryOptions.create({
|
|
74
|
-
where: [...acc.whereClauses, ...opt.whereClauses] as WhereClause[],
|
|
75
|
-
sort: opt.sortOptions.length > 0 ? [...opt.sortOptions] as any[] : [...acc.sortOptions] as any[],
|
|
76
|
-
dateRange: opt.dateRange ?? acc.dateRange,
|
|
77
|
-
pagination: opt.pagination ?? acc.pagination,
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
return merged ?? createQueryOptions();
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Create paginated query options
|
|
86
|
-
*/
|
|
87
|
-
export function createPaginatedOptions(limit: number, cursor?: number): QueryOptions {
|
|
88
|
-
return createQueryOptions({
|
|
89
|
-
pagination: { limit, cursor },
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Create sorted query options
|
|
95
|
-
*/
|
|
96
|
-
export function createSortedOptions(
|
|
97
|
-
field: string,
|
|
98
|
-
direction: 'asc' | 'desc' = 'asc'
|
|
99
|
-
): QueryOptions {
|
|
100
|
-
return createQueryOptions({
|
|
101
|
-
sort: [{ field, direction }],
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Create date range query options
|
|
107
|
-
*/
|
|
108
|
-
export function createDateRangeOptions(
|
|
109
|
-
field: string,
|
|
110
|
-
startDate?: Date,
|
|
111
|
-
endDate?: Date
|
|
112
|
-
): QueryOptions {
|
|
113
|
-
return createQueryOptions({
|
|
114
|
-
dateRange: { field, startDate, endDate },
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Clone query options with safety checks
|
|
120
|
-
*/
|
|
121
|
-
export function cloneSafe(options: QueryOptions, defaults?: Partial<{
|
|
122
|
-
where: WhereClause[];
|
|
123
|
-
sort: SortOptions[];
|
|
124
|
-
dateRange: DateRangeOptions;
|
|
125
|
-
pagination: PaginationOptions;
|
|
126
|
-
}>): QueryOptions {
|
|
127
|
-
return QueryOptions.create({
|
|
128
|
-
where: options.whereClauses.length > 0 ? [...options.whereClauses] as WhereClause[] : defaults?.where || [],
|
|
129
|
-
sort: options.sortOptions.length > 0 ? [...options.sortOptions] as SortOptions[] : defaults?.sort || [],
|
|
130
|
-
dateRange: options.dateRange ?? defaults?.dateRange ?? null,
|
|
131
|
-
pagination: options.pagination ?? defaults?.pagination ?? null,
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Strip pagination from options
|
|
137
|
-
*/
|
|
138
|
-
export function withoutPagination(options: QueryOptions): QueryOptions {
|
|
139
|
-
return QueryOptions.create({
|
|
140
|
-
where: [...options.whereClauses] as WhereClause[],
|
|
141
|
-
sort: [...options.sortOptions] as SortOptions[],
|
|
142
|
-
dateRange: options.dateRange,
|
|
143
|
-
pagination: null,
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Strip sort from options
|
|
149
|
-
*/
|
|
150
|
-
export function withoutSort(options: QueryOptions): QueryOptions {
|
|
151
|
-
return QueryOptions.create({
|
|
152
|
-
where: [...options.whereClauses] as WhereClause[],
|
|
153
|
-
sort: [],
|
|
154
|
-
dateRange: options.dateRange,
|
|
155
|
-
pagination: options.pagination,
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Strip date range from options
|
|
161
|
-
*/
|
|
162
|
-
export function withoutDateRange(options: QueryOptions): QueryOptions {
|
|
163
|
-
return QueryOptions.create({
|
|
164
|
-
where: [...options.whereClauses] as WhereClause[],
|
|
165
|
-
sort: [...options.sortOptions] as SortOptions[],
|
|
166
|
-
dateRange: null,
|
|
167
|
-
pagination: options.pagination,
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Strip where clauses from options
|
|
173
|
-
*/
|
|
174
|
-
export function withoutWhere(options: QueryOptions): QueryOptions {
|
|
175
|
-
return QueryOptions.create({
|
|
176
|
-
where: [],
|
|
177
|
-
sort: [...options.sortOptions] as SortOptions[],
|
|
178
|
-
dateRange: options.dateRange,
|
|
179
|
-
pagination: options.pagination,
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Add limit to existing options
|
|
185
|
-
*/
|
|
186
|
-
export function withLimit(options: QueryOptions, limit: number): QueryOptions {
|
|
187
|
-
const currentPagination = options.pagination || {};
|
|
188
|
-
return QueryOptions.create({
|
|
189
|
-
where: [...options.whereClauses] as WhereClause[],
|
|
190
|
-
sort: [...options.sortOptions] as SortOptions[],
|
|
191
|
-
dateRange: options.dateRange,
|
|
192
|
-
pagination: { ...currentPagination, limit },
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Add cursor to existing options
|
|
198
|
-
*/
|
|
199
|
-
export function withCursor(options: QueryOptions, cursor: number): QueryOptions {
|
|
200
|
-
const currentPagination = options.pagination || {};
|
|
201
|
-
return QueryOptions.create({
|
|
202
|
-
where: [...options.whereClauses] as WhereClause[],
|
|
203
|
-
sort: [...options.sortOptions] as SortOptions[],
|
|
204
|
-
dateRange: options.dateRange,
|
|
205
|
-
pagination: { ...currentPagination, cursor },
|
|
206
|
-
});
|
|
207
|
-
}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Query Options Serialization
|
|
3
|
-
* Single Responsibility: Handle serialization and conversion
|
|
4
|
-
*
|
|
5
|
-
* Serialization and conversion utilities for QueryOptions.
|
|
6
|
-
* Separated for better maintainability.
|
|
7
|
-
*
|
|
8
|
-
* Max lines: 150 (enforced for maintainability)
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { QueryOptions, createQueryOptions } from './QueryOptions';
|
|
12
|
-
import { WhereClause } from './WhereClause';
|
|
13
|
-
import type { SortOptions, DateRangeOptions, PaginationOptions } from './QueryOptions';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Convert to plain object (for serialization)
|
|
17
|
-
*/
|
|
18
|
-
export function toObject(options: QueryOptions): {
|
|
19
|
-
where: WhereClause[];
|
|
20
|
-
sort: SortOptions[];
|
|
21
|
-
dateRange: DateRangeOptions | null;
|
|
22
|
-
pagination: PaginationOptions | null;
|
|
23
|
-
} {
|
|
24
|
-
return {
|
|
25
|
-
where: [...options.whereClauses],
|
|
26
|
-
sort: [...options.sortOptions],
|
|
27
|
-
dateRange: options.dateRange,
|
|
28
|
-
pagination: options.pagination,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Create from plain object
|
|
34
|
-
*/
|
|
35
|
-
export function fromObject(obj: {
|
|
36
|
-
where?: Array<{ field: string; operator: string; value: unknown }>;
|
|
37
|
-
sort?: SortOptions[];
|
|
38
|
-
dateRange?: DateRangeOptions;
|
|
39
|
-
pagination?: PaginationOptions;
|
|
40
|
-
}): QueryOptions {
|
|
41
|
-
return QueryOptions.create({
|
|
42
|
-
where: obj.where?.map(w => WhereClause.create(w.field, w.operator as any, w.value)) || [],
|
|
43
|
-
sort: obj.sort || [],
|
|
44
|
-
dateRange: obj.dateRange || null,
|
|
45
|
-
pagination: obj.pagination || null,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Create from filters object (simplified)
|
|
51
|
-
*/
|
|
52
|
-
export function fromFilters(filters: Record<string, unknown>): QueryOptions {
|
|
53
|
-
const whereClauses = Object.entries(filters).map(([field, value]) =>
|
|
54
|
-
WhereClause.equals(field, value)
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
return QueryOptions.create({ where: whereClauses });
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Merge multiple query options
|
|
62
|
-
*/
|
|
63
|
-
export function mergeOptions(...options: QueryOptions[]): QueryOptions {
|
|
64
|
-
if (options.length === 0) {
|
|
65
|
-
return createQueryOptions();
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (options.length === 1) {
|
|
69
|
-
return options[0];
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const merged = options.reduce((acc, opt) => {
|
|
73
|
-
return QueryOptions.create({
|
|
74
|
-
where: [...acc.whereClauses, ...opt.whereClauses] as WhereClause[],
|
|
75
|
-
sort: opt.sortOptions.length > 0 ? [...opt.sortOptions] as any[] : [...acc.sortOptions] as any[],
|
|
76
|
-
dateRange: opt.dateRange ?? acc.dateRange,
|
|
77
|
-
pagination: opt.pagination ?? acc.pagination,
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
return merged ?? createQueryOptions();
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Create paginated query options
|
|
86
|
-
*/
|
|
87
|
-
export function createPaginatedOptions(limit: number, cursor?: number): QueryOptions {
|
|
88
|
-
return createQueryOptions({
|
|
89
|
-
pagination: { limit, cursor },
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Create sorted query options
|
|
95
|
-
*/
|
|
96
|
-
export function createSortedOptions(
|
|
97
|
-
field: string,
|
|
98
|
-
direction: 'asc' | 'desc' = 'asc'
|
|
99
|
-
): QueryOptions {
|
|
100
|
-
return createQueryOptions({
|
|
101
|
-
sort: [{ field, direction }],
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Create date range query options
|
|
107
|
-
*/
|
|
108
|
-
export function createDateRangeOptions(
|
|
109
|
-
field: string,
|
|
110
|
-
startDate?: Date,
|
|
111
|
-
endDate?: Date
|
|
112
|
-
): QueryOptions {
|
|
113
|
-
return createQueryOptions({
|
|
114
|
-
dateRange: { field, startDate, endDate },
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Clone query options with safety checks
|
|
120
|
-
*/
|
|
121
|
-
export function cloneSafe(options: QueryOptions, defaults?: Partial<{
|
|
122
|
-
where: WhereClause[];
|
|
123
|
-
sort: SortOptions[];
|
|
124
|
-
dateRange: DateRangeOptions;
|
|
125
|
-
pagination: PaginationOptions;
|
|
126
|
-
}>): QueryOptions {
|
|
127
|
-
return QueryOptions.create({
|
|
128
|
-
where: options.whereClauses.length > 0 ? [...options.whereClauses] as WhereClause[] : defaults?.where || [],
|
|
129
|
-
sort: options.sortOptions.length > 0 ? [...options.sortOptions] as SortOptions[] : defaults?.sort || [],
|
|
130
|
-
dateRange: options.dateRange ?? defaults?.dateRange ?? null,
|
|
131
|
-
pagination: options.pagination ?? defaults?.pagination ?? null,
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Strip pagination from options
|
|
137
|
-
*/
|
|
138
|
-
export function withoutPagination(options: QueryOptions): QueryOptions {
|
|
139
|
-
return QueryOptions.create({
|
|
140
|
-
where: [...options.whereClauses] as WhereClause[],
|
|
141
|
-
sort: [...options.sortOptions] as SortOptions[],
|
|
142
|
-
dateRange: options.dateRange,
|
|
143
|
-
pagination: null,
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Strip sort from options
|
|
149
|
-
*/
|
|
150
|
-
export function withoutSort(options: QueryOptions): QueryOptions {
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
return QueryOptions.create({
|
|
2
|
-
where: [...options.whereClauses] as WhereClause[],
|
|
3
|
-
sort: [],
|
|
4
|
-
dateRange: options.dateRange,
|
|
5
|
-
pagination: options.pagination,
|
|
6
|
-
});
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Strip date range from options
|
|
11
|
-
*/
|
|
12
|
-
export function withoutDateRange(options: QueryOptions): QueryOptions {
|
|
13
|
-
return QueryOptions.create({
|
|
14
|
-
where: [...options.whereClauses] as WhereClause[],
|
|
15
|
-
sort: [...options.sortOptions] as SortOptions[],
|
|
16
|
-
dateRange: null,
|
|
17
|
-
pagination: options.pagination,
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Strip where clauses from options
|
|
23
|
-
*/
|
|
24
|
-
export function withoutWhere(options: QueryOptions): QueryOptions {
|
|
25
|
-
return QueryOptions.create({
|
|
26
|
-
where: [],
|
|
27
|
-
sort: [...options.sortOptions] as SortOptions[],
|
|
28
|
-
dateRange: options.dateRange,
|
|
29
|
-
pagination: options.pagination,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Add limit to existing options
|
|
35
|
-
*/
|
|
36
|
-
export function withLimit(options: QueryOptions, limit: number): QueryOptions {
|
|
37
|
-
const currentPagination = options.pagination || {};
|
|
38
|
-
return QueryOptions.create({
|
|
39
|
-
where: [...options.whereClauses] as WhereClause[],
|
|
40
|
-
sort: [...options.sortOptions] as SortOptions[],
|
|
41
|
-
dateRange: options.dateRange,
|
|
42
|
-
pagination: { ...currentPagination, limit },
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Add cursor to existing options
|
|
48
|
-
*/
|
|
49
|
-
export function withCursor(options: QueryOptions, cursor: number): QueryOptions {
|
|
50
|
-
const currentPagination = options.pagination || {};
|
|
51
|
-
return QueryOptions.create({
|
|
52
|
-
where: [...options.whereClauses] as WhereClause[],
|
|
53
|
-
sort: [...options.sortOptions] as SortOptions[],
|
|
54
|
-
dateRange: options.dateRange,
|
|
55
|
-
pagination: { ...currentPagination, cursor },
|
|
56
|
-
});
|
|
57
|
-
}
|