@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.
- package/lib/core/src/app.d.ts +28 -0
- package/lib/core/src/app.d.ts.map +1 -0
- package/lib/core/src/app.js +188 -0
- package/lib/core/src/app.js.map +1 -0
- package/lib/core/src/base/BaseController.d.ts +108 -0
- package/lib/core/src/base/BaseController.d.ts.map +1 -0
- package/lib/core/src/base/BaseController.js +307 -0
- package/lib/core/src/base/BaseController.js.map +1 -0
- package/lib/core/src/base/BaseEntity.d.ts +92 -0
- package/lib/core/src/base/BaseEntity.d.ts.map +1 -0
- package/lib/core/src/base/BaseEntity.js +143 -0
- package/lib/core/src/base/BaseEntity.js.map +1 -0
- package/lib/core/src/base/BaseRepository.d.ts +124 -0
- package/lib/core/src/base/BaseRepository.d.ts.map +1 -0
- package/lib/core/src/base/BaseRepository.js +414 -0
- package/lib/core/src/base/BaseRepository.js.map +1 -0
- package/lib/core/src/base/BaseService.d.ts +89 -0
- package/lib/core/src/base/BaseService.d.ts.map +1 -0
- package/lib/core/src/base/BaseService.js +342 -0
- package/lib/core/src/base/BaseService.js.map +1 -0
- package/lib/core/src/base/index.d.ts +8 -0
- package/lib/core/src/base/index.d.ts.map +1 -0
- package/lib/core/src/base/index.js +24 -0
- package/lib/core/src/base/index.js.map +1 -0
- package/lib/core/src/config/app.config.d.ts +70 -0
- package/lib/core/src/config/app.config.d.ts.map +1 -0
- package/lib/core/src/config/app.config.js +106 -0
- package/lib/core/src/config/app.config.js.map +1 -0
- package/lib/core/src/config/auth.config.d.ts +54 -0
- package/lib/core/src/config/auth.config.d.ts.map +1 -0
- package/lib/core/src/config/auth.config.js +88 -0
- package/lib/core/src/config/auth.config.js.map +1 -0
- package/lib/core/src/config/cache.config.d.ts +47 -0
- package/lib/core/src/config/cache.config.d.ts.map +1 -0
- package/lib/core/src/config/cache.config.js +225 -0
- package/lib/core/src/config/cache.config.js.map +1 -0
- package/lib/core/src/config/communications.config.d.ts +175 -0
- package/lib/core/src/config/communications.config.d.ts.map +1 -0
- package/lib/core/src/config/communications.config.js +219 -0
- package/lib/core/src/config/communications.config.js.map +1 -0
- package/lib/core/src/config/database.config.d.ts +68 -0
- package/lib/core/src/config/database.config.d.ts.map +1 -0
- package/lib/core/src/config/database.config.js +95 -0
- package/lib/core/src/config/database.config.js.map +1 -0
- package/lib/core/src/config/firebase-event-mapping.config.d.ts +41 -0
- package/lib/core/src/config/firebase-event-mapping.config.d.ts.map +1 -0
- package/lib/core/src/config/firebase-event-mapping.config.js +180 -0
- package/lib/core/src/config/firebase-event-mapping.config.js.map +1 -0
- package/lib/core/src/config/firestore.config.d.ts +61 -0
- package/lib/core/src/config/firestore.config.d.ts.map +1 -0
- package/lib/core/src/config/firestore.config.js +74 -0
- package/lib/core/src/config/firestore.config.js.map +1 -0
- package/lib/core/src/config/index.d.ts +15 -0
- package/lib/core/src/config/index.d.ts.map +1 -0
- package/lib/core/src/config/index.js +41 -0
- package/lib/core/src/config/index.js.map +1 -0
- package/lib/core/src/config/maps.config.d.ts +31 -0
- package/lib/core/src/config/maps.config.d.ts.map +1 -0
- package/lib/core/src/config/maps.config.js +50 -0
- package/lib/core/src/config/maps.config.js.map +1 -0
- package/lib/core/src/config/middleware.config.d.ts +57 -0
- package/lib/core/src/config/middleware.config.d.ts.map +1 -0
- package/lib/core/src/config/middleware.config.js +68 -0
- package/lib/core/src/config/middleware.config.js.map +1 -0
- package/lib/core/src/config/tokens.config.d.ts +53 -0
- package/lib/core/src/config/tokens.config.d.ts.map +1 -0
- package/lib/core/src/config/tokens.config.js +129 -0
- package/lib/core/src/config/tokens.config.js.map +1 -0
- package/lib/core/src/generator/generator.d.ts +38 -0
- package/lib/core/src/generator/generator.d.ts.map +1 -0
- package/lib/core/src/generator/generator.js +159 -0
- package/lib/core/src/generator/generator.js.map +1 -0
- package/lib/core/src/generator/index.d.ts +7 -0
- package/lib/core/src/generator/index.d.ts.map +1 -0
- package/lib/core/src/generator/index.js +23 -0
- package/lib/core/src/generator/index.js.map +1 -0
- package/lib/core/src/generator/parser.d.ts +10 -0
- package/lib/core/src/generator/parser.d.ts.map +1 -0
- package/lib/core/src/generator/parser.js +197 -0
- package/lib/core/src/generator/parser.js.map +1 -0
- package/lib/core/src/generator/types.d.ts +112 -0
- package/lib/core/src/generator/types.d.ts.map +1 -0
- package/lib/core/src/generator/types.js +7 -0
- package/lib/core/src/generator/types.js.map +1 -0
- package/lib/core/src/index.d.ts +19 -0
- package/lib/core/src/index.d.ts.map +1 -0
- package/lib/core/src/index.js +46 -0
- package/lib/core/src/index.js.map +1 -0
- package/lib/core/src/middleware/auth.middleware.d.ts +57 -0
- package/lib/core/src/middleware/auth.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/auth.middleware.js +256 -0
- package/lib/core/src/middleware/auth.middleware.js.map +1 -0
- package/lib/core/src/middleware/cors.middleware.d.ts +13 -0
- package/lib/core/src/middleware/cors.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/cors.middleware.js +50 -0
- package/lib/core/src/middleware/cors.middleware.js.map +1 -0
- package/lib/core/src/middleware/error.middleware.d.ts +46 -0
- package/lib/core/src/middleware/error.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/error.middleware.js +174 -0
- package/lib/core/src/middleware/error.middleware.js.map +1 -0
- package/lib/core/src/middleware/index.d.ts +11 -0
- package/lib/core/src/middleware/index.d.ts.map +1 -0
- package/lib/core/src/middleware/index.js +27 -0
- package/lib/core/src/middleware/index.js.map +1 -0
- package/lib/core/src/middleware/logging.middleware.d.ts +10 -0
- package/lib/core/src/middleware/logging.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/logging.middleware.js +87 -0
- package/lib/core/src/middleware/logging.middleware.js.map +1 -0
- package/lib/core/src/middleware/rateLimit.middleware.d.ts +26 -0
- package/lib/core/src/middleware/rateLimit.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/rateLimit.middleware.js +105 -0
- package/lib/core/src/middleware/rateLimit.middleware.js.map +1 -0
- package/lib/core/src/middleware/requestId.middleware.d.ts +11 -0
- package/lib/core/src/middleware/requestId.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/requestId.middleware.js +26 -0
- package/lib/core/src/middleware/requestId.middleware.js.map +1 -0
- package/lib/core/src/middleware/validation.middleware.d.ts +25 -0
- package/lib/core/src/middleware/validation.middleware.d.ts.map +1 -0
- package/lib/core/src/middleware/validation.middleware.js +133 -0
- package/lib/core/src/middleware/validation.middleware.js.map +1 -0
- package/lib/core/src/types/errors.d.ts +119 -0
- package/lib/core/src/types/errors.d.ts.map +1 -0
- package/lib/core/src/types/errors.js +210 -0
- package/lib/core/src/types/errors.js.map +1 -0
- package/lib/utils-cache-connector/src/cache-connector.d.ts +139 -0
- package/lib/utils-cache-connector/src/cache-connector.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/cache-connector.js +277 -0
- package/lib/utils-cache-connector/src/cache-connector.js.map +1 -0
- package/lib/utils-cache-connector/src/index.d.ts +52 -0
- package/lib/utils-cache-connector/src/index.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/index.js +103 -0
- package/lib/utils-cache-connector/src/index.js.map +1 -0
- package/lib/utils-cache-connector/src/providers/base-cache-provider.d.ts +95 -0
- package/lib/utils-cache-connector/src/providers/base-cache-provider.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/providers/base-cache-provider.js +120 -0
- package/lib/utils-cache-connector/src/providers/base-cache-provider.js.map +1 -0
- package/lib/utils-cache-connector/src/providers/firestore-cache-provider.d.ts +58 -0
- package/lib/utils-cache-connector/src/providers/firestore-cache-provider.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/providers/firestore-cache-provider.js +418 -0
- package/lib/utils-cache-connector/src/providers/firestore-cache-provider.js.map +1 -0
- package/lib/utils-cache-connector/src/providers/memory-cache-provider.d.ts +57 -0
- package/lib/utils-cache-connector/src/providers/memory-cache-provider.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/providers/memory-cache-provider.js +217 -0
- package/lib/utils-cache-connector/src/providers/memory-cache-provider.js.map +1 -0
- package/lib/utils-cache-connector/src/providers/noop-cache-provider.d.ts +21 -0
- package/lib/utils-cache-connector/src/providers/noop-cache-provider.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/providers/noop-cache-provider.js +42 -0
- package/lib/utils-cache-connector/src/providers/noop-cache-provider.js.map +1 -0
- package/lib/utils-cache-connector/src/providers/redis-cache-provider.d.ts +64 -0
- package/lib/utils-cache-connector/src/providers/redis-cache-provider.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/providers/redis-cache-provider.js +414 -0
- package/lib/utils-cache-connector/src/providers/redis-cache-provider.js.map +1 -0
- package/lib/utils-cache-connector/src/types.d.ts +342 -0
- package/lib/utils-cache-connector/src/types.d.ts.map +1 -0
- package/lib/utils-cache-connector/src/types.js +8 -0
- package/lib/utils-cache-connector/src/types.js.map +1 -0
- package/lib/utils-events/src/event-bus.d.ts +42 -0
- package/lib/utils-events/src/event-bus.d.ts.map +1 -0
- package/lib/utils-events/src/event-bus.js +93 -0
- package/lib/utils-events/src/event-bus.js.map +1 -0
- package/lib/utils-events/src/event-types.d.ts +146 -0
- package/lib/utils-events/src/event-types.d.ts.map +1 -0
- package/lib/utils-events/src/event-types.js +49 -0
- package/lib/utils-events/src/event-types.js.map +1 -0
- package/lib/utils-events/src/index.d.ts +7 -0
- package/lib/utils-events/src/index.d.ts.map +1 -0
- package/lib/utils-events/src/index.js +11 -0
- package/lib/utils-events/src/index.js.map +1 -0
- package/lib/utils-logger/src/index.d.ts +12 -0
- package/lib/utils-logger/src/index.d.ts.map +1 -0
- package/lib/utils-logger/src/index.js +29 -0
- package/lib/utils-logger/src/index.js.map +1 -0
- package/lib/utils-logger/src/logger-types.d.ts +32 -0
- package/lib/utils-logger/src/logger-types.d.ts.map +1 -0
- package/lib/utils-logger/src/logger-types.js +17 -0
- package/lib/utils-logger/src/logger-types.js.map +1 -0
- package/lib/utils-logger/src/logger.d.ts +42 -0
- package/lib/utils-logger/src/logger.d.ts.map +1 -0
- package/lib/utils-logger/src/logger.js +123 -0
- package/lib/utils-logger/src/logger.js.map +1 -0
- package/package.json +49 -0
- package/src/templates/controller.hbs +48 -0
- package/src/templates/entity.hbs +80 -0
- package/src/templates/repository.hbs +56 -0
- 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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,YAAY,EAAoB,MAAM,0BAA0B,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAqB,qBAAqB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGvH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,EAAE,CAAC;IACzD,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,iBAAiB,CAAC,aAAa,CAAC;IAC1C,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,8BAAsB,cAAc,CAAC,CAAC,SAAS,UAAU;IACvD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAC1C,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC;IAExB;;;OAGG;IACH,SAAS,CAAC,WAAW,EAAE,qBAAqB,CAE1C;gBAEU,EAAE,EAAE,SAAS;IAIzB;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,mBAAmB,CAAC,YAAY,CAAC;IAI5D;;;OAGG;IACH,SAAS,CAAC,cAAc,IAAI,OAAO;IAUnC;;OAEG;IACH,SAAS,CAAC,gBAAgB,IAAI,iBAAiB;IAI/C;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAIhD;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAKjE;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAUxE;;;OAGG;cACa,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BhE;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQxC;;OAEG;IACH,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQzC;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAmCnC;;OAEG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,kBAAkB,UAAQ,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAiCzE;;;OAGG;IACG,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAiD/E;;OAEG;IACG,OAAO,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IA+CvD;;OAEG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,QAAQ,CAAM,GACnD,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAsB/B;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAsCnC;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC3D;;OAEG;IACG,KAAK,CAAC,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,QAAQ,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA6BlF;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1C;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IA4B9C;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,CAAC;CACpE"}
|