@xbg.solutions/backend-core 1.0.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.
Files changed (185) hide show
  1. package/lib/core/src/app.d.ts +28 -0
  2. package/lib/core/src/app.d.ts.map +1 -0
  3. package/lib/core/src/app.js +188 -0
  4. package/lib/core/src/app.js.map +1 -0
  5. package/lib/core/src/base/BaseController.d.ts +108 -0
  6. package/lib/core/src/base/BaseController.d.ts.map +1 -0
  7. package/lib/core/src/base/BaseController.js +307 -0
  8. package/lib/core/src/base/BaseController.js.map +1 -0
  9. package/lib/core/src/base/BaseEntity.d.ts +92 -0
  10. package/lib/core/src/base/BaseEntity.d.ts.map +1 -0
  11. package/lib/core/src/base/BaseEntity.js +143 -0
  12. package/lib/core/src/base/BaseEntity.js.map +1 -0
  13. package/lib/core/src/base/BaseRepository.d.ts +124 -0
  14. package/lib/core/src/base/BaseRepository.d.ts.map +1 -0
  15. package/lib/core/src/base/BaseRepository.js +414 -0
  16. package/lib/core/src/base/BaseRepository.js.map +1 -0
  17. package/lib/core/src/base/BaseService.d.ts +89 -0
  18. package/lib/core/src/base/BaseService.d.ts.map +1 -0
  19. package/lib/core/src/base/BaseService.js +342 -0
  20. package/lib/core/src/base/BaseService.js.map +1 -0
  21. package/lib/core/src/base/index.d.ts +8 -0
  22. package/lib/core/src/base/index.d.ts.map +1 -0
  23. package/lib/core/src/base/index.js +24 -0
  24. package/lib/core/src/base/index.js.map +1 -0
  25. package/lib/core/src/config/app.config.d.ts +70 -0
  26. package/lib/core/src/config/app.config.d.ts.map +1 -0
  27. package/lib/core/src/config/app.config.js +106 -0
  28. package/lib/core/src/config/app.config.js.map +1 -0
  29. package/lib/core/src/config/auth.config.d.ts +54 -0
  30. package/lib/core/src/config/auth.config.d.ts.map +1 -0
  31. package/lib/core/src/config/auth.config.js +88 -0
  32. package/lib/core/src/config/auth.config.js.map +1 -0
  33. package/lib/core/src/config/cache.config.d.ts +47 -0
  34. package/lib/core/src/config/cache.config.d.ts.map +1 -0
  35. package/lib/core/src/config/cache.config.js +225 -0
  36. package/lib/core/src/config/cache.config.js.map +1 -0
  37. package/lib/core/src/config/communications.config.d.ts +175 -0
  38. package/lib/core/src/config/communications.config.d.ts.map +1 -0
  39. package/lib/core/src/config/communications.config.js +219 -0
  40. package/lib/core/src/config/communications.config.js.map +1 -0
  41. package/lib/core/src/config/database.config.d.ts +68 -0
  42. package/lib/core/src/config/database.config.d.ts.map +1 -0
  43. package/lib/core/src/config/database.config.js +95 -0
  44. package/lib/core/src/config/database.config.js.map +1 -0
  45. package/lib/core/src/config/firebase-event-mapping.config.d.ts +41 -0
  46. package/lib/core/src/config/firebase-event-mapping.config.d.ts.map +1 -0
  47. package/lib/core/src/config/firebase-event-mapping.config.js +180 -0
  48. package/lib/core/src/config/firebase-event-mapping.config.js.map +1 -0
  49. package/lib/core/src/config/firestore.config.d.ts +61 -0
  50. package/lib/core/src/config/firestore.config.d.ts.map +1 -0
  51. package/lib/core/src/config/firestore.config.js +74 -0
  52. package/lib/core/src/config/firestore.config.js.map +1 -0
  53. package/lib/core/src/config/index.d.ts +15 -0
  54. package/lib/core/src/config/index.d.ts.map +1 -0
  55. package/lib/core/src/config/index.js +41 -0
  56. package/lib/core/src/config/index.js.map +1 -0
  57. package/lib/core/src/config/maps.config.d.ts +31 -0
  58. package/lib/core/src/config/maps.config.d.ts.map +1 -0
  59. package/lib/core/src/config/maps.config.js +50 -0
  60. package/lib/core/src/config/maps.config.js.map +1 -0
  61. package/lib/core/src/config/middleware.config.d.ts +57 -0
  62. package/lib/core/src/config/middleware.config.d.ts.map +1 -0
  63. package/lib/core/src/config/middleware.config.js +68 -0
  64. package/lib/core/src/config/middleware.config.js.map +1 -0
  65. package/lib/core/src/config/tokens.config.d.ts +53 -0
  66. package/lib/core/src/config/tokens.config.d.ts.map +1 -0
  67. package/lib/core/src/config/tokens.config.js +129 -0
  68. package/lib/core/src/config/tokens.config.js.map +1 -0
  69. package/lib/core/src/generator/generator.d.ts +38 -0
  70. package/lib/core/src/generator/generator.d.ts.map +1 -0
  71. package/lib/core/src/generator/generator.js +159 -0
  72. package/lib/core/src/generator/generator.js.map +1 -0
  73. package/lib/core/src/generator/index.d.ts +7 -0
  74. package/lib/core/src/generator/index.d.ts.map +1 -0
  75. package/lib/core/src/generator/index.js +23 -0
  76. package/lib/core/src/generator/index.js.map +1 -0
  77. package/lib/core/src/generator/parser.d.ts +10 -0
  78. package/lib/core/src/generator/parser.d.ts.map +1 -0
  79. package/lib/core/src/generator/parser.js +197 -0
  80. package/lib/core/src/generator/parser.js.map +1 -0
  81. package/lib/core/src/generator/types.d.ts +112 -0
  82. package/lib/core/src/generator/types.d.ts.map +1 -0
  83. package/lib/core/src/generator/types.js +7 -0
  84. package/lib/core/src/generator/types.js.map +1 -0
  85. package/lib/core/src/index.d.ts +19 -0
  86. package/lib/core/src/index.d.ts.map +1 -0
  87. package/lib/core/src/index.js +46 -0
  88. package/lib/core/src/index.js.map +1 -0
  89. package/lib/core/src/middleware/auth.middleware.d.ts +57 -0
  90. package/lib/core/src/middleware/auth.middleware.d.ts.map +1 -0
  91. package/lib/core/src/middleware/auth.middleware.js +256 -0
  92. package/lib/core/src/middleware/auth.middleware.js.map +1 -0
  93. package/lib/core/src/middleware/cors.middleware.d.ts +13 -0
  94. package/lib/core/src/middleware/cors.middleware.d.ts.map +1 -0
  95. package/lib/core/src/middleware/cors.middleware.js +50 -0
  96. package/lib/core/src/middleware/cors.middleware.js.map +1 -0
  97. package/lib/core/src/middleware/error.middleware.d.ts +46 -0
  98. package/lib/core/src/middleware/error.middleware.d.ts.map +1 -0
  99. package/lib/core/src/middleware/error.middleware.js +174 -0
  100. package/lib/core/src/middleware/error.middleware.js.map +1 -0
  101. package/lib/core/src/middleware/index.d.ts +11 -0
  102. package/lib/core/src/middleware/index.d.ts.map +1 -0
  103. package/lib/core/src/middleware/index.js +27 -0
  104. package/lib/core/src/middleware/index.js.map +1 -0
  105. package/lib/core/src/middleware/logging.middleware.d.ts +10 -0
  106. package/lib/core/src/middleware/logging.middleware.d.ts.map +1 -0
  107. package/lib/core/src/middleware/logging.middleware.js +87 -0
  108. package/lib/core/src/middleware/logging.middleware.js.map +1 -0
  109. package/lib/core/src/middleware/rateLimit.middleware.d.ts +26 -0
  110. package/lib/core/src/middleware/rateLimit.middleware.d.ts.map +1 -0
  111. package/lib/core/src/middleware/rateLimit.middleware.js +105 -0
  112. package/lib/core/src/middleware/rateLimit.middleware.js.map +1 -0
  113. package/lib/core/src/middleware/requestId.middleware.d.ts +11 -0
  114. package/lib/core/src/middleware/requestId.middleware.d.ts.map +1 -0
  115. package/lib/core/src/middleware/requestId.middleware.js +26 -0
  116. package/lib/core/src/middleware/requestId.middleware.js.map +1 -0
  117. package/lib/core/src/middleware/validation.middleware.d.ts +25 -0
  118. package/lib/core/src/middleware/validation.middleware.d.ts.map +1 -0
  119. package/lib/core/src/middleware/validation.middleware.js +133 -0
  120. package/lib/core/src/middleware/validation.middleware.js.map +1 -0
  121. package/lib/core/src/types/errors.d.ts +119 -0
  122. package/lib/core/src/types/errors.d.ts.map +1 -0
  123. package/lib/core/src/types/errors.js +210 -0
  124. package/lib/core/src/types/errors.js.map +1 -0
  125. package/lib/utils-cache-connector/src/cache-connector.d.ts +139 -0
  126. package/lib/utils-cache-connector/src/cache-connector.d.ts.map +1 -0
  127. package/lib/utils-cache-connector/src/cache-connector.js +277 -0
  128. package/lib/utils-cache-connector/src/cache-connector.js.map +1 -0
  129. package/lib/utils-cache-connector/src/index.d.ts +52 -0
  130. package/lib/utils-cache-connector/src/index.d.ts.map +1 -0
  131. package/lib/utils-cache-connector/src/index.js +103 -0
  132. package/lib/utils-cache-connector/src/index.js.map +1 -0
  133. package/lib/utils-cache-connector/src/providers/base-cache-provider.d.ts +95 -0
  134. package/lib/utils-cache-connector/src/providers/base-cache-provider.d.ts.map +1 -0
  135. package/lib/utils-cache-connector/src/providers/base-cache-provider.js +120 -0
  136. package/lib/utils-cache-connector/src/providers/base-cache-provider.js.map +1 -0
  137. package/lib/utils-cache-connector/src/providers/firestore-cache-provider.d.ts +58 -0
  138. package/lib/utils-cache-connector/src/providers/firestore-cache-provider.d.ts.map +1 -0
  139. package/lib/utils-cache-connector/src/providers/firestore-cache-provider.js +418 -0
  140. package/lib/utils-cache-connector/src/providers/firestore-cache-provider.js.map +1 -0
  141. package/lib/utils-cache-connector/src/providers/memory-cache-provider.d.ts +57 -0
  142. package/lib/utils-cache-connector/src/providers/memory-cache-provider.d.ts.map +1 -0
  143. package/lib/utils-cache-connector/src/providers/memory-cache-provider.js +217 -0
  144. package/lib/utils-cache-connector/src/providers/memory-cache-provider.js.map +1 -0
  145. package/lib/utils-cache-connector/src/providers/noop-cache-provider.d.ts +21 -0
  146. package/lib/utils-cache-connector/src/providers/noop-cache-provider.d.ts.map +1 -0
  147. package/lib/utils-cache-connector/src/providers/noop-cache-provider.js +42 -0
  148. package/lib/utils-cache-connector/src/providers/noop-cache-provider.js.map +1 -0
  149. package/lib/utils-cache-connector/src/providers/redis-cache-provider.d.ts +64 -0
  150. package/lib/utils-cache-connector/src/providers/redis-cache-provider.d.ts.map +1 -0
  151. package/lib/utils-cache-connector/src/providers/redis-cache-provider.js +414 -0
  152. package/lib/utils-cache-connector/src/providers/redis-cache-provider.js.map +1 -0
  153. package/lib/utils-cache-connector/src/types.d.ts +342 -0
  154. package/lib/utils-cache-connector/src/types.d.ts.map +1 -0
  155. package/lib/utils-cache-connector/src/types.js +8 -0
  156. package/lib/utils-cache-connector/src/types.js.map +1 -0
  157. package/lib/utils-events/src/event-bus.d.ts +42 -0
  158. package/lib/utils-events/src/event-bus.d.ts.map +1 -0
  159. package/lib/utils-events/src/event-bus.js +93 -0
  160. package/lib/utils-events/src/event-bus.js.map +1 -0
  161. package/lib/utils-events/src/event-types.d.ts +146 -0
  162. package/lib/utils-events/src/event-types.d.ts.map +1 -0
  163. package/lib/utils-events/src/event-types.js +49 -0
  164. package/lib/utils-events/src/event-types.js.map +1 -0
  165. package/lib/utils-events/src/index.d.ts +7 -0
  166. package/lib/utils-events/src/index.d.ts.map +1 -0
  167. package/lib/utils-events/src/index.js +11 -0
  168. package/lib/utils-events/src/index.js.map +1 -0
  169. package/lib/utils-logger/src/index.d.ts +12 -0
  170. package/lib/utils-logger/src/index.d.ts.map +1 -0
  171. package/lib/utils-logger/src/index.js +29 -0
  172. package/lib/utils-logger/src/index.js.map +1 -0
  173. package/lib/utils-logger/src/logger-types.d.ts +32 -0
  174. package/lib/utils-logger/src/logger-types.d.ts.map +1 -0
  175. package/lib/utils-logger/src/logger-types.js +17 -0
  176. package/lib/utils-logger/src/logger-types.js.map +1 -0
  177. package/lib/utils-logger/src/logger.d.ts +42 -0
  178. package/lib/utils-logger/src/logger.d.ts.map +1 -0
  179. package/lib/utils-logger/src/logger.js +123 -0
  180. package/lib/utils-logger/src/logger.js.map +1 -0
  181. package/package.json +49 -0
  182. package/src/templates/controller.hbs +48 -0
  183. package/src/templates/entity.hbs +80 -0
  184. package/src/templates/repository.hbs +56 -0
  185. package/src/templates/service.hbs +108 -0
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Base Entity Class
3
+ * All domain entities should extend this class
4
+ * Provides common fields and validation patterns
5
+ */
6
+ import { FieldValue, Timestamp } from 'firebase-admin/firestore';
7
+ export interface EntityMetadata {
8
+ createdAt: Timestamp;
9
+ updatedAt: Timestamp;
10
+ deletedAt?: Timestamp | null;
11
+ version: number;
12
+ }
13
+ export interface BaseEntityData {
14
+ id?: string;
15
+ createdAt?: Timestamp | FieldValue;
16
+ updatedAt?: Timestamp | FieldValue;
17
+ deletedAt?: Timestamp | FieldValue | null;
18
+ version?: number;
19
+ }
20
+ export declare abstract class BaseEntity {
21
+ id?: string;
22
+ createdAt: Timestamp | FieldValue;
23
+ updatedAt: Timestamp | FieldValue;
24
+ deletedAt?: Timestamp | FieldValue | null;
25
+ version: number;
26
+ constructor(data?: BaseEntityData);
27
+ /**
28
+ * Convert entity to plain object for Firestore
29
+ */
30
+ toFirestore(): Record<string, any>;
31
+ /**
32
+ * Get entity-specific data (override in subclasses)
33
+ */
34
+ protected abstract getEntityData(): Record<string, any>;
35
+ /**
36
+ * Create entity from Firestore document
37
+ */
38
+ static fromFirestore<T extends BaseEntity>(this: new (data: any) => T, id: string, data: Record<string, any>): T;
39
+ /**
40
+ * Mark entity as deleted (soft delete)
41
+ */
42
+ softDelete(): void;
43
+ /**
44
+ * Check if entity is deleted
45
+ */
46
+ isDeleted(): boolean;
47
+ /**
48
+ * Increment version for optimistic locking
49
+ */
50
+ incrementVersion(): void;
51
+ /**
52
+ * Validate entity (override in subclasses)
53
+ */
54
+ abstract validate(): ValidationResult;
55
+ /**
56
+ * Get entity identifier
57
+ */
58
+ getId(): string | undefined;
59
+ /**
60
+ * Check if entity is new (not persisted)
61
+ */
62
+ isNew(): boolean;
63
+ /**
64
+ * Clone entity
65
+ */
66
+ clone(): this;
67
+ }
68
+ export interface ValidationResult {
69
+ valid: boolean;
70
+ errors: FieldValidationError[];
71
+ }
72
+ export interface FieldValidationError {
73
+ field: string;
74
+ message: string;
75
+ code: string;
76
+ }
77
+ /**
78
+ * Validation helper functions
79
+ */
80
+ export declare class ValidationHelper {
81
+ static createError(field: string, message: string, code: string): FieldValidationError;
82
+ static isValidResult(errors: FieldValidationError[]): ValidationResult;
83
+ static required(value: any, field: string): FieldValidationError | null;
84
+ static minLength(value: string, minLen: number, field: string): FieldValidationError | null;
85
+ static maxLength(value: string, maxLen: number, field: string): FieldValidationError | null;
86
+ static email(value: string, field: string): FieldValidationError | null;
87
+ static pattern(value: string, pattern: RegExp, field: string, message?: string): FieldValidationError | null;
88
+ static range(value: number, min: number, max: number, field: string): FieldValidationError | null;
89
+ static oneOf(value: any, allowedValues: any[], field: string): FieldValidationError | null;
90
+ static collectErrors(...errors: (FieldValidationError | null)[]): FieldValidationError[];
91
+ }
92
+ //# sourceMappingURL=BaseEntity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseEntity.d.ts","sourceRoot":"","sources":["../../../../src/base/BaseEntity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ /**
3
+ * Base Entity Class
4
+ * All domain entities should extend this class
5
+ * Provides common fields and validation patterns
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ValidationHelper = exports.BaseEntity = void 0;
9
+ const firestore_1 = require("firebase-admin/firestore");
10
+ class BaseEntity {
11
+ constructor(data = {}) {
12
+ this.id = data.id;
13
+ this.createdAt = data.createdAt || firestore_1.FieldValue.serverTimestamp();
14
+ this.updatedAt = data.updatedAt || firestore_1.FieldValue.serverTimestamp();
15
+ this.deletedAt = data.deletedAt || null;
16
+ this.version = data.version || 1;
17
+ }
18
+ /**
19
+ * Convert entity to plain object for Firestore
20
+ */
21
+ toFirestore() {
22
+ const data = Object.assign(Object.assign({}, this.getEntityData()), { createdAt: this.createdAt, updatedAt: firestore_1.FieldValue.serverTimestamp(), version: this.version });
23
+ // Only include deletedAt if it's set
24
+ if (this.deletedAt) {
25
+ data.deletedAt = this.deletedAt;
26
+ }
27
+ // Remove undefined values
28
+ Object.keys(data).forEach((key) => {
29
+ if (data[key] === undefined) {
30
+ delete data[key];
31
+ }
32
+ });
33
+ return data;
34
+ }
35
+ /**
36
+ * Create entity from Firestore document
37
+ */
38
+ static fromFirestore(id, data) {
39
+ return new this(Object.assign({ id }, data));
40
+ }
41
+ /**
42
+ * Mark entity as deleted (soft delete)
43
+ */
44
+ softDelete() {
45
+ this.deletedAt = firestore_1.FieldValue.serverTimestamp();
46
+ this.updatedAt = firestore_1.FieldValue.serverTimestamp();
47
+ }
48
+ /**
49
+ * Check if entity is deleted
50
+ */
51
+ isDeleted() {
52
+ return !!this.deletedAt && this.deletedAt !== null;
53
+ }
54
+ /**
55
+ * Increment version for optimistic locking
56
+ */
57
+ incrementVersion() {
58
+ this.version += 1;
59
+ this.updatedAt = firestore_1.FieldValue.serverTimestamp();
60
+ }
61
+ /**
62
+ * Get entity identifier
63
+ */
64
+ getId() {
65
+ return this.id;
66
+ }
67
+ /**
68
+ * Check if entity is new (not persisted)
69
+ */
70
+ isNew() {
71
+ return !this.id;
72
+ }
73
+ /**
74
+ * Clone entity
75
+ */
76
+ clone() {
77
+ const constructor = this.constructor;
78
+ return new constructor(Object.assign(Object.assign({}, this.toFirestore()), { id: this.id }));
79
+ }
80
+ }
81
+ exports.BaseEntity = BaseEntity;
82
+ /**
83
+ * Validation helper functions
84
+ */
85
+ class ValidationHelper {
86
+ static createError(field, message, code) {
87
+ return { field, message, code };
88
+ }
89
+ static isValidResult(errors) {
90
+ return {
91
+ valid: errors.length === 0,
92
+ errors,
93
+ };
94
+ }
95
+ static required(value, field) {
96
+ if (value === undefined || value === null || value === '') {
97
+ return this.createError(field, `${field} is required`, 'REQUIRED');
98
+ }
99
+ return null;
100
+ }
101
+ static minLength(value, minLen, field) {
102
+ if (value && value.length < minLen) {
103
+ return this.createError(field, `${field} must be at least ${minLen} characters`, 'MIN_LENGTH');
104
+ }
105
+ return null;
106
+ }
107
+ static maxLength(value, maxLen, field) {
108
+ if (value && value.length > maxLen) {
109
+ return this.createError(field, `${field} must be at most ${maxLen} characters`, 'MAX_LENGTH');
110
+ }
111
+ return null;
112
+ }
113
+ static email(value, field) {
114
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
115
+ if (value && !emailRegex.test(value)) {
116
+ return this.createError(field, `${field} must be a valid email`, 'INVALID_EMAIL');
117
+ }
118
+ return null;
119
+ }
120
+ static pattern(value, pattern, field, message) {
121
+ if (value && !pattern.test(value)) {
122
+ return this.createError(field, message || `${field} has invalid format`, 'INVALID_FORMAT');
123
+ }
124
+ return null;
125
+ }
126
+ static range(value, min, max, field) {
127
+ if (value !== undefined && (value < min || value > max)) {
128
+ return this.createError(field, `${field} must be between ${min} and ${max}`, 'OUT_OF_RANGE');
129
+ }
130
+ return null;
131
+ }
132
+ static oneOf(value, allowedValues, field) {
133
+ if (value !== undefined && !allowedValues.includes(value)) {
134
+ return this.createError(field, `${field} must be one of: ${allowedValues.join(', ')}`, 'INVALID_VALUE');
135
+ }
136
+ return null;
137
+ }
138
+ static collectErrors(...errors) {
139
+ return errors.filter((e) => e !== null);
140
+ }
141
+ }
142
+ exports.ValidationHelper = ValidationHelper;
143
+ //# sourceMappingURL=BaseEntity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseEntity.js","sourceRoot":"","sources":["../../../../src/base/BaseEntity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Base Repository Class
3
+ * Provides common CRUD operations with Firestore
4
+ * All repositories should extend this class
5
+ */
6
+ import { Firestore, CollectionReference, DocumentData } from 'firebase-admin/firestore';
7
+ import { BaseEntity } from './BaseEntity';
8
+ import { RepositoryCacheConfig, CacheOptions, CacheProviderType } from '@xbg/utils-cache-connector';
9
+ export interface QueryOptions {
10
+ limit?: number;
11
+ offset?: number;
12
+ orderBy?: {
13
+ field: string;
14
+ direction: 'asc' | 'desc';
15
+ }[];
16
+ where?: WhereClause[];
17
+ includeSoftDeleted?: boolean;
18
+ }
19
+ export interface WhereClause {
20
+ field: string;
21
+ operator: FirebaseFirestore.WhereFilterOp;
22
+ value: any;
23
+ }
24
+ export interface PaginationResult<T> {
25
+ data: T[];
26
+ total: number;
27
+ page: number;
28
+ pageSize: number;
29
+ hasMore: boolean;
30
+ }
31
+ export declare abstract class BaseRepository<T extends BaseEntity> {
32
+ protected abstract collectionName: string;
33
+ protected db: Firestore;
34
+ /**
35
+ * Cache configuration for this repository
36
+ * Override in subclasses to enable caching
37
+ */
38
+ protected cacheConfig: RepositoryCacheConfig;
39
+ constructor(db: Firestore);
40
+ /**
41
+ * Get collection reference
42
+ */
43
+ protected getCollection(): CollectionReference<DocumentData>;
44
+ /**
45
+ * Check if caching is enabled for this repository
46
+ * Respects both global and repository-level settings
47
+ */
48
+ protected isCacheEnabled(): boolean;
49
+ /**
50
+ * Get effective cache provider for this repository
51
+ */
52
+ protected getCacheProvider(): CacheProviderType;
53
+ /**
54
+ * Get effective TTL for this repository
55
+ */
56
+ protected getCacheTTL(override?: number): number;
57
+ /**
58
+ * Build cache key with repository prefix
59
+ */
60
+ protected buildCacheKey(type: string, identifier: string): string;
61
+ /**
62
+ * Build cache tags for invalidation
63
+ */
64
+ protected buildCacheTags(entity: T, additionalTags?: string[]): string[];
65
+ /**
66
+ * Invalidate cache for a specific entity
67
+ * Called automatically on update/delete
68
+ */
69
+ protected invalidateEntityCache(id: string): Promise<void>;
70
+ /**
71
+ * Log cache hit
72
+ */
73
+ protected logCacheHit(key: string): void;
74
+ /**
75
+ * Log cache miss
76
+ */
77
+ protected logCacheMiss(key: string): void;
78
+ /**
79
+ * Create a new entity
80
+ */
81
+ create(entity: T): Promise<T>;
82
+ /**
83
+ * Find entity by ID
84
+ */
85
+ findById(id: string, includeSoftDeleted?: boolean): Promise<T | null>;
86
+ /**
87
+ * Find entity by ID with caching
88
+ * Only uses cache if enabled at both global and repository levels
89
+ */
90
+ findByIdCached(id: string, options?: CacheOptions): Promise<T | null>;
91
+ /**
92
+ * Find all entities with optional filtering
93
+ */
94
+ findAll(options?: QueryOptions): Promise<T[]>;
95
+ /**
96
+ * Find with pagination
97
+ */
98
+ findPaginated(page: number, pageSize: number, options?: Omit<QueryOptions, 'limit' | 'offset'>): Promise<PaginationResult<T>>;
99
+ /**
100
+ * Update an entity
101
+ */
102
+ update(entity: T): Promise<T>;
103
+ /**
104
+ * Delete an entity (soft delete by default)
105
+ */
106
+ delete(id: string, hardDelete?: boolean): Promise<void>;
107
+ /**
108
+ * Count entities
109
+ */
110
+ count(options?: Omit<QueryOptions, 'limit' | 'offset'>): Promise<number>;
111
+ /**
112
+ * Check if entity exists
113
+ */
114
+ exists(id: string): Promise<boolean>;
115
+ /**
116
+ * Batch create entities
117
+ */
118
+ batchCreate(entities: T[]): Promise<T[]>;
119
+ /**
120
+ * Convert Firestore document to entity (must be implemented by subclasses)
121
+ */
122
+ protected abstract fromFirestore(id: string, data: DocumentData): T;
123
+ }
124
+ //# sourceMappingURL=BaseRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseRepository.d.ts","sourceRoot":"","sources":["../../../../src/base/BaseRepository.ts"],"names":[],"mappings":"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"}