dbdock 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +596 -0
  3. package/dist/alerts/alert-templates.d.ts +3 -0
  4. package/dist/alerts/alert-templates.js +95 -0
  5. package/dist/alerts/alert-templates.js.map +1 -0
  6. package/dist/alerts/alert.module.d.ts +2 -0
  7. package/dist/alerts/alert.module.js +23 -0
  8. package/dist/alerts/alert.module.js.map +1 -0
  9. package/dist/alerts/alert.service.d.ts +23 -0
  10. package/dist/alerts/alert.service.js +210 -0
  11. package/dist/alerts/alert.service.js.map +1 -0
  12. package/dist/alerts/alert.types.d.ts +24 -0
  13. package/dist/alerts/alert.types.js +11 -0
  14. package/dist/alerts/alert.types.js.map +1 -0
  15. package/dist/app.module.d.ts +2 -0
  16. package/dist/app.module.js +34 -0
  17. package/dist/app.module.js.map +1 -0
  18. package/dist/backup/backup.module.d.ts +2 -0
  19. package/dist/backup/backup.module.js +26 -0
  20. package/dist/backup/backup.module.js.map +1 -0
  21. package/dist/backup/backup.service.d.ts +23 -0
  22. package/dist/backup/backup.service.js +303 -0
  23. package/dist/backup/backup.service.js.map +1 -0
  24. package/dist/backup/backup.types.d.ts +42 -0
  25. package/dist/backup/backup.types.js +16 -0
  26. package/dist/backup/backup.types.js.map +1 -0
  27. package/dist/backup/compression.service.d.ts +6 -0
  28. package/dist/backup/compression.service.js +30 -0
  29. package/dist/backup/compression.service.js.map +1 -0
  30. package/dist/cli/commands/backup.d.ts +8 -0
  31. package/dist/cli/commands/backup.js +198 -0
  32. package/dist/cli/commands/backup.js.map +1 -0
  33. package/dist/cli/commands/cleanup.d.ts +6 -0
  34. package/dist/cli/commands/cleanup.js +160 -0
  35. package/dist/cli/commands/cleanup.js.map +1 -0
  36. package/dist/cli/commands/delete.d.ts +6 -0
  37. package/dist/cli/commands/delete.js +252 -0
  38. package/dist/cli/commands/delete.js.map +1 -0
  39. package/dist/cli/commands/init.d.ts +1 -0
  40. package/dist/cli/commands/init.js +534 -0
  41. package/dist/cli/commands/init.js.map +1 -0
  42. package/dist/cli/commands/list.d.ts +8 -0
  43. package/dist/cli/commands/list.js +288 -0
  44. package/dist/cli/commands/list.js.map +1 -0
  45. package/dist/cli/commands/restore.d.ts +1 -0
  46. package/dist/cli/commands/restore.js +637 -0
  47. package/dist/cli/commands/restore.js.map +1 -0
  48. package/dist/cli/commands/schedule.d.ts +1 -0
  49. package/dist/cli/commands/schedule.js +197 -0
  50. package/dist/cli/commands/schedule.js.map +1 -0
  51. package/dist/cli/commands/start.d.ts +7 -0
  52. package/dist/cli/commands/start.js +267 -0
  53. package/dist/cli/commands/start.js.map +1 -0
  54. package/dist/cli/commands/status.d.ts +1 -0
  55. package/dist/cli/commands/status.js +46 -0
  56. package/dist/cli/commands/status.js.map +1 -0
  57. package/dist/cli/commands/test.d.ts +1 -0
  58. package/dist/cli/commands/test.js +212 -0
  59. package/dist/cli/commands/test.js.map +1 -0
  60. package/dist/cli/index.d.ts +2 -0
  61. package/dist/cli/index.js +78 -0
  62. package/dist/cli/index.js.map +1 -0
  63. package/dist/cli/utils/config.d.ts +80 -0
  64. package/dist/cli/utils/config.js +29 -0
  65. package/dist/cli/utils/config.js.map +1 -0
  66. package/dist/cli/utils/logger.d.ts +7 -0
  67. package/dist/cli/utils/logger.js +15 -0
  68. package/dist/cli/utils/logger.js.map +1 -0
  69. package/dist/cli/utils/progress.d.ts +21 -0
  70. package/dist/cli/utils/progress.js +130 -0
  71. package/dist/cli/utils/progress.js.map +1 -0
  72. package/dist/cli/utils/retention.d.ts +26 -0
  73. package/dist/cli/utils/retention.js +118 -0
  74. package/dist/cli/utils/retention.js.map +1 -0
  75. package/dist/config/config.module.d.ts +2 -0
  76. package/dist/config/config.module.js +29 -0
  77. package/dist/config/config.module.js.map +1 -0
  78. package/dist/config/config.schema.d.ts +56 -0
  79. package/dist/config/config.schema.js +219 -0
  80. package/dist/config/config.schema.js.map +1 -0
  81. package/dist/config/config.service.d.ts +13 -0
  82. package/dist/config/config.service.js +160 -0
  83. package/dist/config/config.service.js.map +1 -0
  84. package/dist/crypto/crypto.module.d.ts +2 -0
  85. package/dist/crypto/crypto.module.js +21 -0
  86. package/dist/crypto/crypto.module.js.map +1 -0
  87. package/dist/crypto/crypto.service.d.ts +22 -0
  88. package/dist/crypto/crypto.service.js +187 -0
  89. package/dist/crypto/crypto.service.js.map +1 -0
  90. package/dist/dbdock.d.ts +10 -0
  91. package/dist/dbdock.js +36 -0
  92. package/dist/dbdock.js.map +1 -0
  93. package/dist/index.d.ts +33 -0
  94. package/dist/index.js +77 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/main.d.ts +1 -0
  97. package/dist/main.js +10 -0
  98. package/dist/main.js.map +1 -0
  99. package/dist/scheduler/schedule-manager.d.ts +22 -0
  100. package/dist/scheduler/schedule-manager.js +126 -0
  101. package/dist/scheduler/schedule-manager.js.map +1 -0
  102. package/dist/scheduler/scheduler.module.d.ts +2 -0
  103. package/dist/scheduler/scheduler.module.js +25 -0
  104. package/dist/scheduler/scheduler.module.js.map +1 -0
  105. package/dist/scheduler/scheduler.service.d.ts +28 -0
  106. package/dist/scheduler/scheduler.service.js +171 -0
  107. package/dist/scheduler/scheduler.service.js.map +1 -0
  108. package/dist/standalone/backup-standalone.d.ts +14 -0
  109. package/dist/standalone/backup-standalone.js +364 -0
  110. package/dist/standalone/backup-standalone.js.map +1 -0
  111. package/dist/storage/adapters/cloudinary.adapter.d.ts +23 -0
  112. package/dist/storage/adapters/cloudinary.adapter.js +215 -0
  113. package/dist/storage/adapters/cloudinary.adapter.js.map +1 -0
  114. package/dist/storage/adapters/local.adapter.d.ts +20 -0
  115. package/dist/storage/adapters/local.adapter.js +214 -0
  116. package/dist/storage/adapters/local.adapter.js.map +1 -0
  117. package/dist/storage/adapters/r2.adapter.d.ts +10 -0
  118. package/dist/storage/adapters/r2.adapter.js +33 -0
  119. package/dist/storage/adapters/r2.adapter.js.map +1 -0
  120. package/dist/storage/adapters/s3.adapter.d.ts +26 -0
  121. package/dist/storage/adapters/s3.adapter.js +199 -0
  122. package/dist/storage/adapters/s3.adapter.js.map +1 -0
  123. package/dist/storage/storage.interface.d.ts +38 -0
  124. package/dist/storage/storage.interface.js +3 -0
  125. package/dist/storage/storage.interface.js.map +1 -0
  126. package/dist/storage/storage.module.d.ts +2 -0
  127. package/dist/storage/storage.module.js +21 -0
  128. package/dist/storage/storage.module.js.map +1 -0
  129. package/dist/storage/storage.service.d.ts +10 -0
  130. package/dist/storage/storage.service.js +89 -0
  131. package/dist/storage/storage.service.js.map +1 -0
  132. package/dist/utils/logger.d.ts +12 -0
  133. package/dist/utils/logger.js +41 -0
  134. package/dist/utils/logger.js.map +1 -0
  135. package/dist/utils/stream.pipe.d.ts +17 -0
  136. package/dist/utils/stream.pipe.js +54 -0
  137. package/dist/utils/stream.pipe.js.map +1 -0
  138. package/dist/wal/postgres-config.helper.d.ts +5 -0
  139. package/dist/wal/postgres-config.helper.js +117 -0
  140. package/dist/wal/postgres-config.helper.js.map +1 -0
  141. package/dist/wal/retention.service.d.ts +23 -0
  142. package/dist/wal/retention.service.js +158 -0
  143. package/dist/wal/retention.service.js.map +1 -0
  144. package/dist/wal/retention.types.d.ts +20 -0
  145. package/dist/wal/retention.types.js +3 -0
  146. package/dist/wal/retention.types.js.map +1 -0
  147. package/dist/wal/wal-archiver.service.d.ts +28 -0
  148. package/dist/wal/wal-archiver.service.js +263 -0
  149. package/dist/wal/wal-archiver.service.js.map +1 -0
  150. package/dist/wal/wal.module.d.ts +2 -0
  151. package/dist/wal/wal.module.js +26 -0
  152. package/dist/wal/wal.module.js.map +1 -0
  153. package/dist/wal/wal.types.d.ts +27 -0
  154. package/dist/wal/wal.types.js +11 -0
  155. package/dist/wal/wal.types.js.map +1 -0
  156. package/package.json +155 -0
@@ -0,0 +1,22 @@
1
+ import { DBDockConfigService } from '../config/config.service';
2
+ import { Transform } from 'stream';
3
+ export interface EncryptionMetadata {
4
+ algorithm: string;
5
+ salt: string;
6
+ iv: string;
7
+ }
8
+ export declare class CryptoService {
9
+ private configService;
10
+ private readonly logger;
11
+ private readonly enabled;
12
+ private readonly secret?;
13
+ private readonly iterations;
14
+ constructor(configService: DBDockConfigService);
15
+ isEnabled(): boolean;
16
+ createEncryptStream(): {
17
+ stream: Transform;
18
+ metadata: EncryptionMetadata;
19
+ };
20
+ createDecryptStream(metadata: EncryptionMetadata): Transform;
21
+ generateBackupKey(): string;
22
+ }
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var CryptoService_1;
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.CryptoService = void 0;
47
+ const common_1 = require("@nestjs/common");
48
+ const config_service_1 = require("../config/config.service");
49
+ const crypto = __importStar(require("crypto"));
50
+ const stream_1 = require("stream");
51
+ const ALGORITHM = 'aes-256-gcm';
52
+ const KEY_LENGTH = 32;
53
+ const IV_LENGTH = 16;
54
+ const SALT_LENGTH = 64;
55
+ const TAG_LENGTH = 16;
56
+ let CryptoService = CryptoService_1 = class CryptoService {
57
+ configService;
58
+ logger = new common_1.Logger(CryptoService_1.name);
59
+ enabled;
60
+ secret;
61
+ iterations;
62
+ constructor(configService) {
63
+ this.configService = configService;
64
+ const encryptionConfig = this.configService.get('encryption');
65
+ this.enabled = encryptionConfig.enabled;
66
+ this.secret = encryptionConfig.secret;
67
+ this.iterations = encryptionConfig.iterations || 100000;
68
+ if (this.enabled && !this.secret) {
69
+ throw new Error('Encryption is enabled but no secret provided');
70
+ }
71
+ }
72
+ isEnabled() {
73
+ return this.enabled;
74
+ }
75
+ createEncryptStream() {
76
+ if (!this.enabled || !this.secret) {
77
+ return {
78
+ stream: new stream_1.Transform({
79
+ transform(chunk, encoding, callback) {
80
+ this.push(chunk);
81
+ callback();
82
+ },
83
+ }),
84
+ metadata: { algorithm: 'none', salt: '', iv: '' },
85
+ };
86
+ }
87
+ const salt = crypto.randomBytes(SALT_LENGTH);
88
+ const iv = crypto.randomBytes(IV_LENGTH);
89
+ const key = crypto.pbkdf2Sync(this.secret, salt, this.iterations, KEY_LENGTH, 'sha512');
90
+ const cipher = crypto.createCipheriv(ALGORITHM, key, iv);
91
+ let authTag = null;
92
+ const encryptStream = new stream_1.Transform({
93
+ transform(chunk, encoding, callback) {
94
+ try {
95
+ const encrypted = cipher.update(chunk);
96
+ this.push(encrypted);
97
+ callback();
98
+ }
99
+ catch (error) {
100
+ callback(error);
101
+ }
102
+ },
103
+ flush(callback) {
104
+ try {
105
+ const final = cipher.final();
106
+ authTag = cipher.getAuthTag();
107
+ this.push(final);
108
+ this.push(authTag);
109
+ callback();
110
+ }
111
+ catch (error) {
112
+ callback(error);
113
+ }
114
+ },
115
+ });
116
+ return {
117
+ stream: encryptStream,
118
+ metadata: {
119
+ algorithm: ALGORITHM,
120
+ salt: salt.toString('base64'),
121
+ iv: iv.toString('base64'),
122
+ },
123
+ };
124
+ }
125
+ createDecryptStream(metadata) {
126
+ if (metadata.algorithm === 'none' || !this.enabled || !this.secret) {
127
+ return new stream_1.Transform({
128
+ transform(chunk, encoding, callback) {
129
+ this.push(chunk);
130
+ callback();
131
+ },
132
+ });
133
+ }
134
+ const salt = Buffer.from(metadata.salt, 'base64');
135
+ const iv = Buffer.from(metadata.iv, 'base64');
136
+ const key = crypto.pbkdf2Sync(this.secret, salt, this.iterations, KEY_LENGTH, 'sha512');
137
+ const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);
138
+ let buffer = Buffer.alloc(0);
139
+ let authTagSet = false;
140
+ return new stream_1.Transform({
141
+ transform(chunk, encoding, callback) {
142
+ try {
143
+ buffer = Buffer.concat([buffer, chunk]);
144
+ if (!authTagSet && buffer.length >= TAG_LENGTH) {
145
+ const dataLength = buffer.length - TAG_LENGTH;
146
+ const data = buffer.subarray(0, dataLength);
147
+ const tag = buffer.subarray(dataLength);
148
+ const decrypted = decipher.update(data);
149
+ this.push(decrypted);
150
+ buffer = tag;
151
+ }
152
+ else if (authTagSet) {
153
+ const decrypted = decipher.update(buffer);
154
+ this.push(decrypted);
155
+ buffer = Buffer.alloc(0);
156
+ }
157
+ callback();
158
+ }
159
+ catch (error) {
160
+ callback(error);
161
+ }
162
+ },
163
+ flush(callback) {
164
+ try {
165
+ if (buffer.length === TAG_LENGTH) {
166
+ decipher.setAuthTag(buffer);
167
+ const final = decipher.final();
168
+ this.push(final);
169
+ }
170
+ callback();
171
+ }
172
+ catch (error) {
173
+ callback(error);
174
+ }
175
+ },
176
+ });
177
+ }
178
+ generateBackupKey() {
179
+ return crypto.randomBytes(32).toString('base64');
180
+ }
181
+ };
182
+ exports.CryptoService = CryptoService;
183
+ exports.CryptoService = CryptoService = CryptoService_1 = __decorate([
184
+ (0, common_1.Injectable)(),
185
+ __metadata("design:paramtypes", [config_service_1.DBDockConfigService])
186
+ ], CryptoService);
187
+ //# sourceMappingURL=crypto.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.service.js","sourceRoot":"","sources":["../../src/crypto/crypto.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,6DAA+D;AAC/D,+CAAiC;AACjC,mCAAsD;AAEtD,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,UAAU,GAAG,EAAE,CAAC;AASf,IAAM,aAAa,qBAAnB,MAAM,aAAa;IAMJ;IALH,MAAM,GAAG,IAAI,eAAM,CAAC,eAAa,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,CAAU;IACjB,MAAM,CAAU;IAChB,UAAU,CAAS;IAEpC,YAAoB,aAAkC;QAAlC,kBAAa,GAAb,aAAa,CAAqB;QACpD,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC9D,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,UAAU,IAAI,MAAM,CAAC;QAExD,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,mBAAmB;QAIjB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO;gBACL,MAAM,EAAE,IAAI,kBAAS,CAAC;oBACpB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ;wBACjC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACjB,QAAQ,EAAE,CAAC;oBACb,CAAC;iBACF,CAAC;gBACF,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;aAClD,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAEzC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAC3B,IAAI,CAAC,MAAM,EACX,IAAI,EACJ,IAAI,CAAC,UAAU,EACf,UAAU,EACV,QAAQ,CACT,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAEzD,IAAI,OAAO,GAAkB,IAAI,CAAC;QAElC,MAAM,aAAa,GAAG,IAAI,kBAAS,CAAC;YAClC,SAAS,CAAC,KAAa,EAAE,QAAwB,EAAE,QAA2B;gBAC5E,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACrB,QAAQ,EAAE,CAAC;gBACb,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,QAAQ,CAAC,KAAc,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;YACD,KAAK,CAAC,QAA2B;gBAC/B,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;oBAC7B,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;oBAE9B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACjB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACnB,QAAQ,EAAE,CAAC;gBACb,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,QAAQ,CAAC,KAAc,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE;gBACR,SAAS,EAAE,SAAS;gBACpB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC7B,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;aAC1B;SACF,CAAC;IACJ,CAAC;IAED,mBAAmB,CAAC,QAA4B;QAC9C,IAAI,QAAQ,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACnE,OAAO,IAAI,kBAAS,CAAC;gBACnB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ;oBACjC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACjB,QAAQ,EAAE,CAAC;gBACb,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE9C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAC3B,IAAI,CAAC,MAAM,EACX,IAAI,EACJ,IAAI,CAAC,UAAU,EACf,UAAU,EACV,QAAQ,CACT,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAE7D,IAAI,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,OAAO,IAAI,kBAAS,CAAC;YACnB,SAAS,CAAC,KAAa,EAAE,QAAwB,EAAE,QAA2B;gBAC5E,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;oBAExC,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;wBAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC;wBAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;wBAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;wBAExC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;wBACxC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBAErB,MAAM,GAAG,GAAG,CAAC;oBACf,CAAC;yBAAM,IAAI,UAAU,EAAE,CAAC;wBACtB,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBAC1C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBACrB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC3B,CAAC;oBAED,QAAQ,EAAE,CAAC;gBACb,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,QAAQ,CAAC,KAAc,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;YACD,KAAK,CAAC,QAA2B;gBAC/B,IAAI,CAAC;oBACH,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;wBACjC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;wBAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;wBAC/B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACnB,CAAC;oBACD,QAAQ,EAAE,CAAC;gBACb,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,QAAQ,CAAC,KAAc,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB;QACf,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;CACF,CAAA;AA3JY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAOwB,oCAAmB;GAN3C,aAAa,CA2JzB"}
@@ -0,0 +1,10 @@
1
+ import { INestApplicationContext, LogLevel } from '@nestjs/common';
2
+ export interface DBDockOptions {
3
+ logger?: LogLevel[] | false;
4
+ }
5
+ export declare function createDBDock(options?: DBDockOptions): Promise<INestApplicationContext>;
6
+ export { AppModule } from './app.module';
7
+ export { BackupService } from './backup/backup.service';
8
+ export { WalArchiverService } from './wal/wal-archiver.service';
9
+ export { RetentionService } from './wal/retention.service';
10
+ export * from './backup/backup.types';
package/dist/dbdock.js ADDED
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.RetentionService = exports.WalArchiverService = exports.BackupService = exports.AppModule = void 0;
18
+ exports.createDBDock = createDBDock;
19
+ const core_1 = require("@nestjs/core");
20
+ const app_module_1 = require("./app.module");
21
+ async function createDBDock(options) {
22
+ const defaultLogger = ['error', 'warn'];
23
+ return core_1.NestFactory.createApplicationContext(app_module_1.AppModule, {
24
+ logger: options?.logger ?? defaultLogger,
25
+ });
26
+ }
27
+ var app_module_2 = require("./app.module");
28
+ Object.defineProperty(exports, "AppModule", { enumerable: true, get: function () { return app_module_2.AppModule; } });
29
+ var backup_service_1 = require("./backup/backup.service");
30
+ Object.defineProperty(exports, "BackupService", { enumerable: true, get: function () { return backup_service_1.BackupService; } });
31
+ var wal_archiver_service_1 = require("./wal/wal-archiver.service");
32
+ Object.defineProperty(exports, "WalArchiverService", { enumerable: true, get: function () { return wal_archiver_service_1.WalArchiverService; } });
33
+ var retention_service_1 = require("./wal/retention.service");
34
+ Object.defineProperty(exports, "RetentionService", { enumerable: true, get: function () { return retention_service_1.RetentionService; } });
35
+ __exportStar(require("./backup/backup.types"), exports);
36
+ //# sourceMappingURL=dbdock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dbdock.js","sourceRoot":"","sources":["../src/dbdock.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAQA,oCAQC;AAhBD,uCAA2C;AAE3C,6CAAyC;AAMlC,KAAK,UAAU,YAAY,CAChC,OAAuB;IAEvB,MAAM,aAAa,GAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAEpD,OAAO,kBAAW,CAAC,wBAAwB,CAAC,sBAAS,EAAE;QACrD,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,aAAa;KACzC,CAAC,CAAC;AACL,CAAC;AAED,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,0DAAwD;AAA/C,+GAAA,aAAa,OAAA;AACtB,mEAAgE;AAAvD,0HAAA,kBAAkB,OAAA;AAC3B,6DAA2D;AAAlD,qHAAA,gBAAgB,OAAA;AACzB,wDAAsC"}
@@ -0,0 +1,33 @@
1
+ export { AppModule } from './app.module';
2
+ export { createDBDock } from './dbdock';
3
+ export { BackupService } from './backup/backup.service';
4
+ export { BackupModule } from './backup/backup.module';
5
+ export { CompressionService } from './backup/compression.service';
6
+ export * from './backup/backup.types';
7
+ export { DBDockConfigService } from './config/config.service';
8
+ export { DBDockConfigModule } from './config/config.module';
9
+ export * from './config/config.schema';
10
+ export { CryptoService } from './crypto/crypto.service';
11
+ export { CryptoModule } from './crypto/crypto.module';
12
+ export { StorageService } from './storage/storage.service';
13
+ export { StorageModule } from './storage/storage.module';
14
+ export * from './storage/storage.interface';
15
+ export { LocalStorageAdapter } from './storage/adapters/local.adapter';
16
+ export { S3StorageAdapter } from './storage/adapters/s3.adapter';
17
+ export { R2StorageAdapter } from './storage/adapters/r2.adapter';
18
+ export { WalArchiverService } from './wal/wal-archiver.service';
19
+ export { RetentionService } from './wal/retention.service';
20
+ export { WalModule } from './wal/wal.module';
21
+ export * from './wal/wal.types';
22
+ export * from './wal/retention.types';
23
+ export { PostgresConfigHelper } from './wal/postgres-config.helper';
24
+ export { SchedulerService } from './scheduler/scheduler.service';
25
+ export { SchedulerModule } from './scheduler/scheduler.module';
26
+ export { ScheduleManager } from './scheduler/schedule-manager';
27
+ export type { Schedule } from './scheduler/schedule-manager';
28
+ export { DBDockLogger } from './utils/logger';
29
+ export { CounterStream, ProgressStream } from './utils/stream.pipe';
30
+ export { AlertService } from './alerts/alert.service';
31
+ export { AlertModule } from './alerts/alert.module';
32
+ export * from './alerts/alert.types';
33
+ export { DEFAULT_TEMPLATES } from './alerts/alert-templates';
package/dist/index.js ADDED
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.DEFAULT_TEMPLATES = exports.AlertModule = exports.AlertService = exports.ProgressStream = exports.CounterStream = exports.DBDockLogger = exports.ScheduleManager = exports.SchedulerModule = exports.SchedulerService = exports.PostgresConfigHelper = exports.WalModule = exports.RetentionService = exports.WalArchiverService = exports.R2StorageAdapter = exports.S3StorageAdapter = exports.LocalStorageAdapter = exports.StorageModule = exports.StorageService = exports.CryptoModule = exports.CryptoService = exports.DBDockConfigModule = exports.DBDockConfigService = exports.CompressionService = exports.BackupModule = exports.BackupService = exports.createDBDock = exports.AppModule = void 0;
18
+ var app_module_1 = require("./app.module");
19
+ Object.defineProperty(exports, "AppModule", { enumerable: true, get: function () { return app_module_1.AppModule; } });
20
+ var dbdock_1 = require("./dbdock");
21
+ Object.defineProperty(exports, "createDBDock", { enumerable: true, get: function () { return dbdock_1.createDBDock; } });
22
+ var backup_service_1 = require("./backup/backup.service");
23
+ Object.defineProperty(exports, "BackupService", { enumerable: true, get: function () { return backup_service_1.BackupService; } });
24
+ var backup_module_1 = require("./backup/backup.module");
25
+ Object.defineProperty(exports, "BackupModule", { enumerable: true, get: function () { return backup_module_1.BackupModule; } });
26
+ var compression_service_1 = require("./backup/compression.service");
27
+ Object.defineProperty(exports, "CompressionService", { enumerable: true, get: function () { return compression_service_1.CompressionService; } });
28
+ __exportStar(require("./backup/backup.types"), exports);
29
+ var config_service_1 = require("./config/config.service");
30
+ Object.defineProperty(exports, "DBDockConfigService", { enumerable: true, get: function () { return config_service_1.DBDockConfigService; } });
31
+ var config_module_1 = require("./config/config.module");
32
+ Object.defineProperty(exports, "DBDockConfigModule", { enumerable: true, get: function () { return config_module_1.DBDockConfigModule; } });
33
+ __exportStar(require("./config/config.schema"), exports);
34
+ var crypto_service_1 = require("./crypto/crypto.service");
35
+ Object.defineProperty(exports, "CryptoService", { enumerable: true, get: function () { return crypto_service_1.CryptoService; } });
36
+ var crypto_module_1 = require("./crypto/crypto.module");
37
+ Object.defineProperty(exports, "CryptoModule", { enumerable: true, get: function () { return crypto_module_1.CryptoModule; } });
38
+ var storage_service_1 = require("./storage/storage.service");
39
+ Object.defineProperty(exports, "StorageService", { enumerable: true, get: function () { return storage_service_1.StorageService; } });
40
+ var storage_module_1 = require("./storage/storage.module");
41
+ Object.defineProperty(exports, "StorageModule", { enumerable: true, get: function () { return storage_module_1.StorageModule; } });
42
+ __exportStar(require("./storage/storage.interface"), exports);
43
+ var local_adapter_1 = require("./storage/adapters/local.adapter");
44
+ Object.defineProperty(exports, "LocalStorageAdapter", { enumerable: true, get: function () { return local_adapter_1.LocalStorageAdapter; } });
45
+ var s3_adapter_1 = require("./storage/adapters/s3.adapter");
46
+ Object.defineProperty(exports, "S3StorageAdapter", { enumerable: true, get: function () { return s3_adapter_1.S3StorageAdapter; } });
47
+ var r2_adapter_1 = require("./storage/adapters/r2.adapter");
48
+ Object.defineProperty(exports, "R2StorageAdapter", { enumerable: true, get: function () { return r2_adapter_1.R2StorageAdapter; } });
49
+ var wal_archiver_service_1 = require("./wal/wal-archiver.service");
50
+ Object.defineProperty(exports, "WalArchiverService", { enumerable: true, get: function () { return wal_archiver_service_1.WalArchiverService; } });
51
+ var retention_service_1 = require("./wal/retention.service");
52
+ Object.defineProperty(exports, "RetentionService", { enumerable: true, get: function () { return retention_service_1.RetentionService; } });
53
+ var wal_module_1 = require("./wal/wal.module");
54
+ Object.defineProperty(exports, "WalModule", { enumerable: true, get: function () { return wal_module_1.WalModule; } });
55
+ __exportStar(require("./wal/wal.types"), exports);
56
+ __exportStar(require("./wal/retention.types"), exports);
57
+ var postgres_config_helper_1 = require("./wal/postgres-config.helper");
58
+ Object.defineProperty(exports, "PostgresConfigHelper", { enumerable: true, get: function () { return postgres_config_helper_1.PostgresConfigHelper; } });
59
+ var scheduler_service_1 = require("./scheduler/scheduler.service");
60
+ Object.defineProperty(exports, "SchedulerService", { enumerable: true, get: function () { return scheduler_service_1.SchedulerService; } });
61
+ var scheduler_module_1 = require("./scheduler/scheduler.module");
62
+ Object.defineProperty(exports, "SchedulerModule", { enumerable: true, get: function () { return scheduler_module_1.SchedulerModule; } });
63
+ var schedule_manager_1 = require("./scheduler/schedule-manager");
64
+ Object.defineProperty(exports, "ScheduleManager", { enumerable: true, get: function () { return schedule_manager_1.ScheduleManager; } });
65
+ var logger_1 = require("./utils/logger");
66
+ Object.defineProperty(exports, "DBDockLogger", { enumerable: true, get: function () { return logger_1.DBDockLogger; } });
67
+ var stream_pipe_1 = require("./utils/stream.pipe");
68
+ Object.defineProperty(exports, "CounterStream", { enumerable: true, get: function () { return stream_pipe_1.CounterStream; } });
69
+ Object.defineProperty(exports, "ProgressStream", { enumerable: true, get: function () { return stream_pipe_1.ProgressStream; } });
70
+ var alert_service_1 = require("./alerts/alert.service");
71
+ Object.defineProperty(exports, "AlertService", { enumerable: true, get: function () { return alert_service_1.AlertService; } });
72
+ var alert_module_1 = require("./alerts/alert.module");
73
+ Object.defineProperty(exports, "AlertModule", { enumerable: true, get: function () { return alert_module_1.AlertModule; } });
74
+ __exportStar(require("./alerts/alert.types"), exports);
75
+ var alert_templates_1 = require("./alerts/alert-templates");
76
+ Object.defineProperty(exports, "DEFAULT_TEMPLATES", { enumerable: true, get: function () { return alert_templates_1.DEFAULT_TEMPLATES; } });
77
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,mCAAwC;AAA/B,sGAAA,YAAY,OAAA;AAErB,0DAAwD;AAA/C,+GAAA,aAAa,OAAA;AACtB,wDAAsD;AAA7C,6GAAA,YAAY,OAAA;AACrB,oEAAkE;AAAzD,yHAAA,kBAAkB,OAAA;AAC3B,wDAAsC;AAEtC,0DAA8D;AAArD,qHAAA,mBAAmB,OAAA;AAC5B,wDAA4D;AAAnD,mHAAA,kBAAkB,OAAA;AAC3B,yDAAuC;AAEvC,0DAAwD;AAA/C,+GAAA,aAAa,OAAA;AACtB,wDAAsD;AAA7C,6GAAA,YAAY,OAAA;AAErB,6DAA2D;AAAlD,iHAAA,cAAc,OAAA;AACvB,2DAAyD;AAAhD,+GAAA,aAAa,OAAA;AACtB,8DAA4C;AAC5C,kEAAuE;AAA9D,oHAAA,mBAAmB,OAAA;AAC5B,4DAAiE;AAAxD,8GAAA,gBAAgB,OAAA;AACzB,4DAAiE;AAAxD,8GAAA,gBAAgB,OAAA;AAEzB,mEAAgE;AAAvD,0HAAA,kBAAkB,OAAA;AAC3B,6DAA2D;AAAlD,qHAAA,gBAAgB,OAAA;AACzB,+CAA6C;AAApC,uGAAA,SAAS,OAAA;AAClB,kDAAgC;AAChC,wDAAsC;AACtC,uEAAoE;AAA3D,8HAAA,oBAAoB,OAAA;AAE7B,mEAAiE;AAAxD,qHAAA,gBAAgB,OAAA;AACzB,iEAA+D;AAAtD,mHAAA,eAAe,OAAA;AACxB,iEAA+D;AAAtD,mHAAA,eAAe,OAAA;AAGxB,yCAA8C;AAArC,sGAAA,YAAY,OAAA;AACrB,mDAAoE;AAA3D,4GAAA,aAAa,OAAA;AAAE,6GAAA,cAAc,OAAA;AAEtC,wDAAsD;AAA7C,6GAAA,YAAY,OAAA;AACrB,sDAAoD;AAA3C,2GAAA,WAAW,OAAA;AACpB,uDAAqC;AACrC,4DAA6D;AAApD,oHAAA,iBAAiB,OAAA"}
package/dist/main.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/main.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@nestjs/core");
4
+ const app_module_1 = require("./app.module");
5
+ async function bootstrap() {
6
+ const app = await core_1.NestFactory.create(app_module_1.AppModule);
7
+ await app.listen(process.env.PORT ?? 3000);
8
+ }
9
+ bootstrap();
10
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,6CAAyC;AAEzC,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,CAAC,CAAC;IAChD,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAC7C,CAAC;AACD,SAAS,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ export interface Schedule {
2
+ name: string;
3
+ cron: string;
4
+ enabled: boolean;
5
+ }
6
+ export declare class ScheduleManager {
7
+ private configPath;
8
+ constructor(configPath?: string);
9
+ private loadConfig;
10
+ private saveConfig;
11
+ getSchedules(): Schedule[];
12
+ addSchedule(schedule: Omit<Schedule, 'enabled'> & {
13
+ enabled?: boolean;
14
+ }): void;
15
+ updateSchedule(name: string, updates: Partial<Omit<Schedule, 'name'>>): void;
16
+ removeSchedule(name: string): void;
17
+ enableSchedule(name: string): void;
18
+ disableSchedule(name: string): void;
19
+ getSchedule(name: string): Schedule | undefined;
20
+ clearAllSchedules(): void;
21
+ private validateCronExpression;
22
+ }
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScheduleManager = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ class ScheduleManager {
7
+ configPath;
8
+ constructor(configPath) {
9
+ this.configPath = configPath || (0, path_1.join)(process.cwd(), 'dbdock.config.json');
10
+ }
11
+ loadConfig() {
12
+ if (!(0, fs_1.existsSync)(this.configPath)) {
13
+ throw new Error(`Configuration file not found: ${this.configPath}. Run "npx dbdock init" first.`);
14
+ }
15
+ try {
16
+ const content = (0, fs_1.readFileSync)(this.configPath, 'utf-8');
17
+ return JSON.parse(content);
18
+ }
19
+ catch (error) {
20
+ throw new Error(`Failed to parse configuration file: ${error instanceof Error ? error.message : String(error)}`);
21
+ }
22
+ }
23
+ saveConfig(config) {
24
+ try {
25
+ (0, fs_1.writeFileSync)(this.configPath, JSON.stringify(config, null, 2));
26
+ }
27
+ catch (error) {
28
+ throw new Error(`Failed to save configuration file: ${error instanceof Error ? error.message : String(error)}`);
29
+ }
30
+ }
31
+ getSchedules() {
32
+ const config = this.loadConfig();
33
+ return config.backup?.schedules || [];
34
+ }
35
+ addSchedule(schedule) {
36
+ const config = this.loadConfig();
37
+ if (!config.backup) {
38
+ config.backup = {};
39
+ }
40
+ if (!config.backup.schedules) {
41
+ config.backup.schedules = [];
42
+ }
43
+ const existingSchedule = config.backup.schedules.find((s) => s.name === schedule.name);
44
+ if (existingSchedule) {
45
+ throw new Error(`Schedule with name "${schedule.name}" already exists. Use updateSchedule() to modify it.`);
46
+ }
47
+ this.validateCronExpression(schedule.cron);
48
+ config.backup.schedules.push({
49
+ name: schedule.name,
50
+ cron: schedule.cron,
51
+ enabled: schedule.enabled !== false,
52
+ });
53
+ this.saveConfig(config);
54
+ }
55
+ updateSchedule(name, updates) {
56
+ const config = this.loadConfig();
57
+ const schedules = config.backup?.schedules || [];
58
+ const scheduleIndex = schedules.findIndex((s) => s.name === name);
59
+ if (scheduleIndex === -1) {
60
+ throw new Error(`Schedule with name "${name}" not found`);
61
+ }
62
+ if (updates.cron) {
63
+ this.validateCronExpression(updates.cron);
64
+ }
65
+ schedules[scheduleIndex] = {
66
+ ...schedules[scheduleIndex],
67
+ ...updates,
68
+ };
69
+ this.saveConfig(config);
70
+ }
71
+ removeSchedule(name) {
72
+ const config = this.loadConfig();
73
+ const schedules = config.backup?.schedules || [];
74
+ const scheduleIndex = schedules.findIndex((s) => s.name === name);
75
+ if (scheduleIndex === -1) {
76
+ throw new Error(`Schedule with name "${name}" not found`);
77
+ }
78
+ schedules.splice(scheduleIndex, 1);
79
+ this.saveConfig(config);
80
+ }
81
+ enableSchedule(name) {
82
+ this.updateSchedule(name, { enabled: true });
83
+ }
84
+ disableSchedule(name) {
85
+ this.updateSchedule(name, { enabled: false });
86
+ }
87
+ getSchedule(name) {
88
+ const schedules = this.getSchedules();
89
+ return schedules.find((s) => s.name === name);
90
+ }
91
+ clearAllSchedules() {
92
+ const config = this.loadConfig();
93
+ if (config.backup?.schedules) {
94
+ config.backup.schedules = [];
95
+ this.saveConfig(config);
96
+ }
97
+ }
98
+ validateCronExpression(cron) {
99
+ const parts = cron.trim().split(/\s+/);
100
+ if (parts.length !== 5) {
101
+ throw new Error('Invalid cron expression. Expected format: "minute hour day month weekday" (5 parts)');
102
+ }
103
+ const validRanges = [
104
+ { name: 'minute', min: 0, max: 59 },
105
+ { name: 'hour', min: 0, max: 23 },
106
+ { name: 'day', min: 1, max: 31 },
107
+ { name: 'month', min: 1, max: 12 },
108
+ { name: 'weekday', min: 0, max: 7 },
109
+ ];
110
+ parts.forEach((part, index) => {
111
+ if (part === '*' || part.includes('-') || part.includes(',') || part.includes('/')) {
112
+ return;
113
+ }
114
+ const num = parseInt(part);
115
+ const range = validRanges[index];
116
+ if (isNaN(num)) {
117
+ throw new Error(`Invalid cron expression: "${part}" in ${range.name} field`);
118
+ }
119
+ if (num < range.min || num > range.max) {
120
+ throw new Error(`Invalid cron expression: ${range.name} must be between ${range.min} and ${range.max}`);
121
+ }
122
+ });
123
+ }
124
+ }
125
+ exports.ScheduleManager = ScheduleManager;
126
+ //# sourceMappingURL=schedule-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-manager.js","sourceRoot":"","sources":["../../src/scheduler/schedule-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare class SchedulerModule {
2
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SchedulerModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const schedule_1 = require("@nestjs/schedule");
12
+ const scheduler_service_1 = require("./scheduler.service");
13
+ const backup_module_1 = require("../backup/backup.module");
14
+ const wal_module_1 = require("../wal/wal.module");
15
+ let SchedulerModule = class SchedulerModule {
16
+ };
17
+ exports.SchedulerModule = SchedulerModule;
18
+ exports.SchedulerModule = SchedulerModule = __decorate([
19
+ (0, common_1.Module)({
20
+ imports: [schedule_1.ScheduleModule.forRoot(), backup_module_1.BackupModule, wal_module_1.WalModule],
21
+ providers: [scheduler_service_1.SchedulerService],
22
+ exports: [scheduler_service_1.SchedulerService],
23
+ })
24
+ ], SchedulerModule);
25
+ //# sourceMappingURL=scheduler.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.module.js","sourceRoot":"","sources":["../../src/scheduler/scheduler.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,+CAAkD;AAClD,2DAAuD;AACvD,2DAAuD;AACvD,kDAA8C;AAOvC,IAAM,eAAe,GAArB,MAAM,eAAe;CAAG,CAAA;AAAlB,0CAAe;0BAAf,eAAe;IAL3B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,yBAAc,CAAC,OAAO,EAAE,EAAE,4BAAY,EAAE,sBAAS,CAAC;QAC5D,SAAS,EAAE,CAAC,oCAAgB,CAAC;QAC7B,OAAO,EAAE,CAAC,oCAAgB,CAAC;KAC5B,CAAC;GACW,eAAe,CAAG"}
@@ -0,0 +1,28 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { SchedulerRegistry } from '@nestjs/schedule';
3
+ import { DBDockConfigService } from '../config/config.service';
4
+ import { BackupService } from '../backup/backup.service';
5
+ import { RetentionService } from '../wal/retention.service';
6
+ export declare class SchedulerService implements OnModuleInit {
7
+ private configService;
8
+ private backupService;
9
+ private retentionService;
10
+ private schedulerRegistry;
11
+ private readonly logger;
12
+ private scheduledBackupsEnabled;
13
+ private retentionCleanupEnabled;
14
+ private registeredJobs;
15
+ constructor(configService: DBDockConfigService, backupService: BackupService, retentionService: RetentionService, schedulerRegistry: SchedulerRegistry);
16
+ onModuleInit(): void;
17
+ private loadAndRegisterSchedules;
18
+ private registerSchedule;
19
+ private executeScheduledBackup;
20
+ reloadSchedules(): void;
21
+ handleDailyRetentionCleanup(): Promise<void>;
22
+ triggerScheduledBackup(): Promise<void>;
23
+ manualRetentionCleanup(): Promise<void>;
24
+ enableScheduledBackups(): void;
25
+ disableScheduledBackups(): void;
26
+ enableRetentionCleanup(): void;
27
+ disableRetentionCleanup(): void;
28
+ }