zync-nest-data-module 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/README.md +672 -0
- package/dist/backup/backup.config.d.ts +4 -0
- package/dist/backup/backup.config.js +84 -0
- package/dist/backup/backup.config.js.map +1 -0
- package/dist/backup/backup.interface.d.ts +21 -0
- package/dist/backup/backup.interface.js +3 -0
- package/dist/backup/backup.interface.js.map +1 -0
- package/dist/backup/backup.module.d.ts +2 -0
- package/dist/backup/backup.module.js +24 -0
- package/dist/backup/backup.module.js.map +1 -0
- package/dist/backup/backup.service.d.ts +19 -0
- package/dist/backup/backup.service.js +229 -0
- package/dist/backup/backup.service.js.map +1 -0
- package/dist/backup/index.d.ts +4 -0
- package/dist/backup/index.js +21 -0
- package/dist/backup/index.js.map +1 -0
- package/dist/database/database.module.d.ts +2 -0
- package/dist/database/database.module.js +34 -0
- package/dist/database/database.module.js.map +1 -0
- package/dist/database/database.repository.d.ts +62 -0
- package/dist/database/database.repository.js +259 -0
- package/dist/database/database.repository.js.map +1 -0
- package/dist/database/database.scheme.d.ts +45 -0
- package/dist/database/database.scheme.js +187 -0
- package/dist/database/database.scheme.js.map +1 -0
- package/dist/database/database.service.d.ts +7 -0
- package/dist/database/database.service.js +39 -0
- package/dist/database/database.service.js.map +1 -0
- package/dist/database/database.sync.d.ts +10 -0
- package/dist/database/database.sync.js +44 -0
- package/dist/database/database.sync.js.map +1 -0
- package/dist/database/database.transaction.d.ts +17 -0
- package/dist/database/database.transaction.js +101 -0
- package/dist/database/database.transaction.js.map +1 -0
- package/dist/database/database.uniqueId.d.ts +25 -0
- package/dist/database/database.uniqueId.js +68 -0
- package/dist/database/database.uniqueId.js.map +1 -0
- package/dist/database/database.utils.d.ts +10 -0
- package/dist/database/database.utils.js +119 -0
- package/dist/database/database.utils.js.map +1 -0
- package/dist/database/index.d.ts +8 -0
- package/dist/database/index.js +25 -0
- package/dist/database/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/service/index.d.ts +1 -0
- package/dist/service/index.js +18 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/service.d.ts +40 -0
- package/dist/service/service.js +182 -0
- package/dist/service/service.js.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/libs/src/app.controller.ts +84 -0
- package/libs/src/app.module.ts +31 -0
- package/libs/src/backup/backup.config.ts +45 -0
- package/libs/src/backup/backup.interface.ts +21 -0
- package/libs/src/backup/backup.module.ts +11 -0
- package/libs/src/backup/backup.service.ts +283 -0
- package/libs/src/backup/index.ts +4 -0
- package/libs/src/database/database.module.ts +26 -0
- package/libs/src/database/database.repository.ts +358 -0
- package/libs/src/database/database.scheme.ts +128 -0
- package/libs/src/database/database.service.ts +36 -0
- package/libs/src/database/database.sync.ts +61 -0
- package/libs/src/database/database.transaction.ts +101 -0
- package/libs/src/database/database.uniqueId.ts +59 -0
- package/libs/src/database/database.utils.ts +99 -0
- package/libs/src/database/index.ts +8 -0
- package/libs/src/index.ts +3 -0
- package/libs/src/main.ts +62 -0
- package/libs/src/service/index.ts +1 -0
- package/libs/src/service/service.ts +201 -0
- package/libs/src/test/test.dto.ts +41 -0
- package/libs/src/test/test.module.ts +20 -0
- package/libs/src/test/test.repository.ts +44 -0
- package/libs/src/test/test.resolver.ts +44 -0
- package/libs/src/test/test.schema.ts +21 -0
- package/libs/src/test/test.service.ts +19 -0
- package/libs/tsconfig.lib.json +19 -0
- package/nest-cli.json +16 -0
- package/package.json +89 -0
- package/tsconfig.json +29 -0
- package/update-links.js +159 -0
|
@@ -0,0 +1,84 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.DbBackupConfigService = void 0;
|
|
43
|
+
const common_1 = require("@nestjs/common");
|
|
44
|
+
const dotenv = __importStar(require("dotenv"));
|
|
45
|
+
const Path = __importStar(require("path"));
|
|
46
|
+
dotenv.config();
|
|
47
|
+
let DbBackupConfigService = class DbBackupConfigService {
|
|
48
|
+
getBackupConfig() {
|
|
49
|
+
const isDocker = process.env.NODE_ENV === "production" || process.env.is_docker === "true";
|
|
50
|
+
return {
|
|
51
|
+
env: process.env.app_env || "",
|
|
52
|
+
mongodb: {
|
|
53
|
+
connectionStrings: process.env.mongodb_backup_connection_strings
|
|
54
|
+
? process.env.mongodb_backup_connection_strings.split(",")
|
|
55
|
+
: [process.env.mongodb_url || ""],
|
|
56
|
+
},
|
|
57
|
+
backup: {
|
|
58
|
+
enabled: process.env.db_backup_enabled === "true",
|
|
59
|
+
dir: isDocker
|
|
60
|
+
? process.env.db_backup_dir || "/app/backups"
|
|
61
|
+
: process.env.db_backup_dir
|
|
62
|
+
? Path.join(__dirname, "..", "..", "..", "..", process.env.db_backup_dir)
|
|
63
|
+
: Path.join(__dirname, "..", "..", "..", "..", "db_backups"),
|
|
64
|
+
maxBackups: parseInt(process.env.db_backup_max || "10", 10),
|
|
65
|
+
isDownload: false,
|
|
66
|
+
uploadToSpace: true,
|
|
67
|
+
},
|
|
68
|
+
spaces: {
|
|
69
|
+
name: process.env.aws_bucket || "",
|
|
70
|
+
region: process.env.aws_s3_region || "nyc3",
|
|
71
|
+
key: process.env.aws_access_key_id || "",
|
|
72
|
+
secret: process.env.aws_secret_access_key || "",
|
|
73
|
+
dir: process.env.s3_spaces_dir || "db-backups",
|
|
74
|
+
endpoint: process.env.s3_spaces_endpoint ||
|
|
75
|
+
"https://sgp1.digitaloceanspaces.com",
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
exports.DbBackupConfigService = DbBackupConfigService;
|
|
81
|
+
exports.DbBackupConfigService = DbBackupConfigService = __decorate([
|
|
82
|
+
(0, common_1.Injectable)()
|
|
83
|
+
], DbBackupConfigService);
|
|
84
|
+
//# sourceMappingURL=backup.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.config.js","sourceRoot":"","sources":["../../libs/src/backup/backup.config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4C;AAE5C,+CAAiC;AAEjC,2CAA6B;AAE7B,MAAM,CAAC,MAAM,EAAE,CAAC;AAGT,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACzB,eAAe;QACpB,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,CAAC;QAE5E,OAAO;YACL,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE;YAC9B,OAAO,EAAE;gBACP,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,iCAAiC;oBAC9D,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,KAAK,CAAC,GAAG,CAAC;oBAC1D,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;aACpC;YACD,MAAM,EAAE;gBACN,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM;gBACjD,GAAG,EAAE,QAAQ;oBACX,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,cAAc;oBAC7C,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa;wBAC3B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;wBACzE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC;gBAC9D,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,EAAE,EAAE,CAAC;gBAC3D,UAAU,EAAE,KAAK;gBACjB,aAAa,EAAE,IAAI;aACpB;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE;gBAClC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM;gBAC3C,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;gBACxC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;gBAC/C,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,YAAY;gBAC9C,QAAQ,EACN,OAAO,CAAC,GAAG,CAAC,kBAAkB;oBAC9B,qCAAqC;aACxC;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAnCY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;GACA,qBAAqB,CAmCjC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface IDbBackupConfig {
|
|
2
|
+
env: string;
|
|
3
|
+
mongodb: {
|
|
4
|
+
connectionStrings: string | string[];
|
|
5
|
+
};
|
|
6
|
+
backup: {
|
|
7
|
+
dir: string;
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
maxBackups: number;
|
|
10
|
+
isDownload: boolean;
|
|
11
|
+
uploadToSpace: boolean;
|
|
12
|
+
};
|
|
13
|
+
spaces: {
|
|
14
|
+
name: string;
|
|
15
|
+
region: string;
|
|
16
|
+
key: string;
|
|
17
|
+
secret: string;
|
|
18
|
+
endpoint: string;
|
|
19
|
+
dir?: string;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.interface.js","sourceRoot":"","sources":["../../libs/src/backup/backup.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
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.ApDbBackupModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const backup_service_1 = require("./backup.service");
|
|
12
|
+
const backup_config_1 = require("./backup.config");
|
|
13
|
+
const zync_nest_library_1 = require("zync-nest-library");
|
|
14
|
+
let ApDbBackupModule = class ApDbBackupModule {
|
|
15
|
+
};
|
|
16
|
+
exports.ApDbBackupModule = ApDbBackupModule;
|
|
17
|
+
exports.ApDbBackupModule = ApDbBackupModule = __decorate([
|
|
18
|
+
(0, common_1.Module)({
|
|
19
|
+
imports: [zync_nest_library_1.ApUploadModule],
|
|
20
|
+
providers: [backup_service_1.DbBackupService, backup_config_1.DbBackupConfigService],
|
|
21
|
+
exports: [backup_service_1.DbBackupService, backup_config_1.DbBackupConfigService],
|
|
22
|
+
})
|
|
23
|
+
], ApDbBackupModule);
|
|
24
|
+
//# sourceMappingURL=backup.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.module.js","sourceRoot":"","sources":["../../libs/src/backup/backup.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,qDAAmD;AACnD,mDAAwD;AACxD,yDAAmD;AAO5C,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAAG,CAAA;AAAnB,4CAAgB;2BAAhB,gBAAgB;IAL5B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,kCAAc,CAAC;QACzB,SAAS,EAAE,CAAC,gCAAe,EAAE,qCAAqB,CAAC;QACnD,OAAO,EAAE,CAAC,gCAAe,EAAE,qCAAqB,CAAC;KAClD,CAAC;GACW,gBAAgB,CAAG"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { UploadService } from "zync-nest-library";
|
|
2
|
+
import { DbBackupConfigService } from "./backup.config";
|
|
3
|
+
import { IDbBackupConfig } from "./backup.interface";
|
|
4
|
+
export declare class DbBackupService {
|
|
5
|
+
private readonly dbConfigService;
|
|
6
|
+
private readonly uploadService;
|
|
7
|
+
private readonly logger;
|
|
8
|
+
constructor(dbConfigService: DbBackupConfigService, uploadService: UploadService);
|
|
9
|
+
runBackup(): Promise<any>;
|
|
10
|
+
createBackup(options: IDbBackupConfig): Promise<any>;
|
|
11
|
+
private validateBackupOptions;
|
|
12
|
+
private ensureDirectoryExists;
|
|
13
|
+
private createMongoDump;
|
|
14
|
+
private compressBackup;
|
|
15
|
+
private uploadToSpaces;
|
|
16
|
+
private cleanup;
|
|
17
|
+
cleanupBackups(): Promise<void>;
|
|
18
|
+
private parseConnectionStringDatabase;
|
|
19
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
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 DbBackupService_1;
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.DbBackupService = void 0;
|
|
47
|
+
const common_1 = require("@nestjs/common");
|
|
48
|
+
const child_process_1 = require("child_process");
|
|
49
|
+
const fs_1 = require("fs");
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
const util_1 = require("util");
|
|
52
|
+
const zync_nest_library_1 = require("zync-nest-library");
|
|
53
|
+
const backup_config_1 = require("./backup.config");
|
|
54
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
55
|
+
let DbBackupService = DbBackupService_1 = class DbBackupService {
|
|
56
|
+
constructor(dbConfigService, uploadService) {
|
|
57
|
+
this.dbConfigService = dbConfigService;
|
|
58
|
+
this.uploadService = uploadService;
|
|
59
|
+
this.logger = new common_1.Logger(DbBackupService_1.name);
|
|
60
|
+
}
|
|
61
|
+
async runBackup() {
|
|
62
|
+
const config = this.dbConfigService.getBackupConfig();
|
|
63
|
+
if (!config?.backup?.enabled) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
return await this.createBackup(this.dbConfigService.getBackupConfig());
|
|
67
|
+
}
|
|
68
|
+
async createBackup(options) {
|
|
69
|
+
try {
|
|
70
|
+
this.validateBackupOptions(options);
|
|
71
|
+
await this.ensureDirectoryExists(options.backup.dir);
|
|
72
|
+
console.log("Starting backup process...", options.mongodb);
|
|
73
|
+
for (const connectionString of options.mongodb.connectionStrings) {
|
|
74
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
75
|
+
const dbName = this.parseConnectionStringDatabase(connectionString);
|
|
76
|
+
if (!dbName) {
|
|
77
|
+
this.logger.warn(`No valid database name found in connection string: ${connectionString}`);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
this.logger.log(`Creating backup for database: ${dbName}`);
|
|
81
|
+
const backupFileName = `${process.env.app_name || "dev"}_${dbName}_backup_${timestamp}.tar.gz`;
|
|
82
|
+
const localBackupPath = path.join(options.backup.dir, `${process.env.app_name || "dev"}_${dbName}_backup_${timestamp}`);
|
|
83
|
+
const localBackupFile = path.join(options.backup.dir, backupFileName);
|
|
84
|
+
await this.ensureDirectoryExists(localBackupPath);
|
|
85
|
+
await this.createMongoDump(connectionString, localBackupPath);
|
|
86
|
+
await this.compressBackup(localBackupPath, localBackupFile);
|
|
87
|
+
if (options?.backup?.isDownload) {
|
|
88
|
+
return await fs_1.promises.readFile(localBackupFile);
|
|
89
|
+
}
|
|
90
|
+
if (options?.backup?.uploadToSpace) {
|
|
91
|
+
await this.uploadToSpaces(options.spaces, backupFileName, localBackupFile);
|
|
92
|
+
}
|
|
93
|
+
await this.cleanup(localBackupPath, options.backup.dir, options.backup.maxBackups);
|
|
94
|
+
this.logger.log(`Backup for ${dbName} completed: ${backupFileName}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
this.logger.error(`Backup failed: ${error.message}`);
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
validateBackupOptions(options) {
|
|
103
|
+
if (!options.mongodb?.connectionStrings) {
|
|
104
|
+
throw new Error("MongoDB connection strings are required");
|
|
105
|
+
}
|
|
106
|
+
const connectionStrings = Array.isArray(options.mongodb.connectionStrings)
|
|
107
|
+
? options.mongodb.connectionStrings
|
|
108
|
+
: [options.mongodb.connectionStrings];
|
|
109
|
+
if (connectionStrings.length === 0 ||
|
|
110
|
+
connectionStrings.some((cs) => !cs || cs.trim() === "")) {
|
|
111
|
+
throw new Error("At least one valid MongoDB connection string is required");
|
|
112
|
+
}
|
|
113
|
+
if (options?.backup?.uploadToSpace) {
|
|
114
|
+
if (!options.spaces) {
|
|
115
|
+
throw new Error("DigitalOcean Spaces configuration is required");
|
|
116
|
+
}
|
|
117
|
+
if (!options.spaces.name ||
|
|
118
|
+
!options.spaces.key ||
|
|
119
|
+
!options.spaces.secret ||
|
|
120
|
+
!options.spaces.endpoint) {
|
|
121
|
+
throw new Error("DigitalOcean Spaces configuration is incomplete (name, key, secret, endpoint are all required)");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (!options.backup?.dir) {
|
|
125
|
+
throw new Error("Backup directory is required");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async ensureDirectoryExists(dir) {
|
|
129
|
+
try {
|
|
130
|
+
await fs_1.promises.mkdir(dir, { recursive: true });
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (error.code !== "EEXIST") {
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async createMongoDump(connectionString, outputPath) {
|
|
139
|
+
this.logger.log("Creating MongoDB dump...");
|
|
140
|
+
if (!connectionString) {
|
|
141
|
+
throw new Error("Connection string is required for MongoDB backup");
|
|
142
|
+
}
|
|
143
|
+
await execAsync(`mongodump --uri "${connectionString}" --out ${outputPath}`);
|
|
144
|
+
}
|
|
145
|
+
async compressBackup(sourcePath, destinationFile) {
|
|
146
|
+
this.logger.log("Compressing backup...");
|
|
147
|
+
await execAsync(`tar -czvf ${destinationFile} -C ${sourcePath} .`);
|
|
148
|
+
}
|
|
149
|
+
async uploadToSpaces(spacesConfig, fileName, filePath) {
|
|
150
|
+
this.logger.log("Uploading to DigitalOcean Spaces...");
|
|
151
|
+
if (!spacesConfig.name) {
|
|
152
|
+
throw new Error("DigitalOcean Spaces bucket name is required");
|
|
153
|
+
}
|
|
154
|
+
if (!spacesConfig.key) {
|
|
155
|
+
throw new Error("DigitalOcean Spaces access key is required");
|
|
156
|
+
}
|
|
157
|
+
if (!spacesConfig.secret) {
|
|
158
|
+
throw new Error("DigitalOcean Spaces secret key is required");
|
|
159
|
+
}
|
|
160
|
+
if (!spacesConfig.endpoint) {
|
|
161
|
+
throw new Error("DigitalOcean Spaces endpoint is required");
|
|
162
|
+
}
|
|
163
|
+
let endpoint = spacesConfig.endpoint;
|
|
164
|
+
if (endpoint &&
|
|
165
|
+
!endpoint.startsWith("http://") &&
|
|
166
|
+
!endpoint.startsWith("https://")) {
|
|
167
|
+
endpoint = `https://${endpoint}`;
|
|
168
|
+
}
|
|
169
|
+
const fileContent = await fs_1.promises.readFile(filePath);
|
|
170
|
+
await this.uploadService.upload.uploadBuffer({
|
|
171
|
+
file: fileContent,
|
|
172
|
+
filename: fileName,
|
|
173
|
+
disableTransformName: true,
|
|
174
|
+
filetype: "application/gzip",
|
|
175
|
+
dir: spacesConfig.dir || "db-backups",
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
async cleanup(backupPath, backupDir, maxBackups) {
|
|
179
|
+
this.logger.log("Cleaning up...");
|
|
180
|
+
await fs_1.promises.rm(backupPath, { recursive: true, force: true });
|
|
181
|
+
this.cleanupBackups();
|
|
182
|
+
}
|
|
183
|
+
async cleanupBackups() {
|
|
184
|
+
this.logger.log("Cleaning up...");
|
|
185
|
+
const { backup } = this.dbConfigService.getBackupConfig();
|
|
186
|
+
const files = await fs_1.promises.readdir(backup.dir);
|
|
187
|
+
const backupFiles = files
|
|
188
|
+
.filter((file) => file.endsWith(".tar.gz"))
|
|
189
|
+
.sort()
|
|
190
|
+
.reverse();
|
|
191
|
+
if (backupFiles.length > backup.maxBackups) {
|
|
192
|
+
const toDelete = backupFiles.slice(backup.maxBackups);
|
|
193
|
+
for (const file of toDelete) {
|
|
194
|
+
console.log(file, "files to delete");
|
|
195
|
+
console.log(file?.replace(".tar.gz", ""), "files to delete");
|
|
196
|
+
await fs_1.promises.unlink(path.join(backup.dir, file));
|
|
197
|
+
await fs_1.promises.rm(path.join(backup.dir, file?.replace(".tar.gz", "")), {
|
|
198
|
+
recursive: true,
|
|
199
|
+
force: true,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
this.logger.log(`Removed ${toDelete.length} old backup(s)`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
parseConnectionStringDatabase(connectionString) {
|
|
206
|
+
try {
|
|
207
|
+
const cleanUri = connectionString.replace(/^mongodb(\+srv)?:\/\//, "");
|
|
208
|
+
const dbMatch = cleanUri.match(/\/([^/?&]+)(\?|$)/);
|
|
209
|
+
if (dbMatch &&
|
|
210
|
+
dbMatch[1] &&
|
|
211
|
+
dbMatch[1] !== "admin" &&
|
|
212
|
+
dbMatch[1] !== "test") {
|
|
213
|
+
return dbMatch[1];
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
this.logger.warn(`Failed to parse database from connection string: ${error.message}`);
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
exports.DbBackupService = DbBackupService;
|
|
224
|
+
exports.DbBackupService = DbBackupService = DbBackupService_1 = __decorate([
|
|
225
|
+
(0, common_1.Injectable)(),
|
|
226
|
+
__metadata("design:paramtypes", [backup_config_1.DbBackupConfigService,
|
|
227
|
+
zync_nest_library_1.UploadService])
|
|
228
|
+
], DbBackupService);
|
|
229
|
+
//# sourceMappingURL=backup.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.service.js","sourceRoot":"","sources":["../../libs/src/backup/backup.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,iDAAqC;AACrC,2BAAoC;AACpC,2CAA6B;AAC7B,+BAAiC;AACjC,yDAAkD;AAClD,mDAAwD;AAGxD,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAG3B,IAAM,eAAe,uBAArB,MAAM,eAAe;IAG1B,YACmB,eAAsC,EACtC,aAA4B;QAD5B,oBAAe,GAAf,eAAe,CAAuB;QACtC,kBAAa,GAAb,aAAa,CAAe;QAJ9B,WAAM,GAAG,IAAI,eAAM,CAAC,iBAAe,CAAC,IAAI,CAAC,CAAC;IAKxD,CAAC;IAEG,KAAK,CAAC,SAAS;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC;QAEtD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC,CAAC;IACzE,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,OAAwB;QAChD,IAAI,CAAC;YAEH,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAGpC,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAErD,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAE3D,KAAK,MAAM,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBACjE,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAEjE,MAAM,MAAM,GAAG,IAAI,CAAC,6BAA6B,CAAC,gBAAgB,CAAC,CAAC;gBAEpE,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,sDAAsD,gBAAgB,EAAE,CACzE,CAAC;oBACF,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;gBAE3D,MAAM,cAAc,GAAG,GACrB,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,KAC1B,IAAI,MAAM,WAAW,SAAS,SAAS,CAAC;gBAExC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,OAAO,CAAC,MAAM,CAAC,GAAG,EAClB,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,KAAK,IAAI,MAAM,WAAW,SAAS,EAAE,CACjE,CAAC;gBACF,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;gBAEtE,MAAM,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC;gBAElD,MAAM,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;gBAE9D,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;gBAE5D,IAAI,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;oBAChC,OAAO,MAAM,aAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;gBAC5C,CAAC;gBAED,IAAI,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;oBACnC,MAAM,IAAI,CAAC,cAAc,CACvB,OAAO,CAAC,MAAM,EACd,cAAc,EACd,eAAe,CAChB,CAAC;gBACJ,CAAC;gBAGD,MAAM,IAAI,CAAC,OAAO,CAChB,eAAe,EACf,OAAO,CAAC,MAAM,CAAC,GAAG,EAClB,OAAO,CAAC,MAAM,CAAC,UAAU,CAC1B,CAAC;gBAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,MAAM,eAAe,cAAc,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACrD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,OAAwB;QACpD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;YACxE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB;YACnC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAExC,IACE,iBAAiB,CAAC,MAAM,KAAK,CAAC;YAC9B,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EACvD,CAAC;YACD,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,CAAC;YAED,IACE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;gBACpB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG;gBACnB,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;gBACtB,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EACxB,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,GAAW;QAC7C,IAAI,CAAC;YACH,MAAM,aAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,gBAAwB,EACxB,UAAkB;QAElB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAE5C,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,SAAS,CACb,oBAAoB,gBAAgB,WAAW,UAAU,EAAE,CAC5D,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,UAAkB,EAClB,eAAuB;QAEvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACzC,MAAM,SAAS,CAAC,aAAa,eAAe,OAAO,UAAU,IAAI,CAAC,CAAC;IACrE,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,YAAuC,EACvC,QAAgB,EAChB,QAAgB;QAEhB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QAGvD,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAGD,IAAI,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC;QACrC,IACE,QAAQ;YACR,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;YAC/B,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAChC,CAAC;YACD,QAAQ,GAAG,WAAW,QAAQ,EAAE,CAAC;QACnC,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEhD,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC;YAC3C,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,QAAQ;YAClB,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,kBAAkB;YAC5B,GAAG,EAAE,YAAY,CAAC,GAAG,IAAI,YAAY;SACtC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,UAAkB,EAClB,SAAiB,EACjB,UAAkB;QAElB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAGlC,MAAM,aAAE,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAG1D,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,cAAc;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAElC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC;QAG1D,MAAM,KAAK,GAAG,MAAM,aAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE3C,MAAM,WAAW,GAAG,KAAK;aACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;aAC1C,IAAI,EAAE;aACN,OAAO,EAAE,CAAC;QAEb,IAAI,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACtD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;gBAE7D,MAAM,aAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC7C,MAAM,aAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE;oBAC/D,SAAS,EAAE,IAAI;oBACf,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,MAAM,gBAAgB,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAEO,6BAA6B,CACnC,gBAAwB;QAExB,IAAI,CAAC;YAEH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;YAGvE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAEpD,IACE,OAAO;gBACP,OAAO,CAAC,CAAC,CAAC;gBACV,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO;gBACtB,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,EACrB,CAAC;gBACD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,oDAAoD,KAAK,CAAC,OAAO,EAAE,CACpE,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF,CAAA;AA9QY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;qCAKyB,qCAAqB;QACvB,iCAAa;GALpC,eAAe,CA8Q3B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
__exportStar(require("./backup.module"), exports);
|
|
18
|
+
__exportStar(require("./backup.service"), exports);
|
|
19
|
+
__exportStar(require("./backup.config"), exports);
|
|
20
|
+
__exportStar(require("./backup.interface"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../libs/src/backup/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,mDAAiC;AACjC,kDAAgC;AAChC,qDAAmC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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.ApDatabaseModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const mongoose_1 = require("@nestjs/mongoose");
|
|
12
|
+
const database_service_1 = require("./database.service");
|
|
13
|
+
const database_transaction_1 = require("./database.transaction");
|
|
14
|
+
const database_uniqueId_1 = require("./database.uniqueId");
|
|
15
|
+
const config_1 = require("@nestjs/config");
|
|
16
|
+
console.log(process.env.mongodb_url, "db url");
|
|
17
|
+
let ApDatabaseModule = class ApDatabaseModule {
|
|
18
|
+
};
|
|
19
|
+
exports.ApDatabaseModule = ApDatabaseModule;
|
|
20
|
+
exports.ApDatabaseModule = ApDatabaseModule = __decorate([
|
|
21
|
+
(0, common_1.Global)(),
|
|
22
|
+
(0, common_1.Module)({
|
|
23
|
+
imports: [
|
|
24
|
+
config_1.ConfigModule.forRoot(),
|
|
25
|
+
mongoose_1.MongooseModule.forRoot(process.env.mongodb_url),
|
|
26
|
+
mongoose_1.MongooseModule.forFeature([
|
|
27
|
+
{ name: database_uniqueId_1.UniqueId.name, schema: database_uniqueId_1.UniqueIdSchema },
|
|
28
|
+
]),
|
|
29
|
+
],
|
|
30
|
+
providers: [database_transaction_1.TransactionManager, database_uniqueId_1.ApUniqueIdGenerator, database_service_1.DatabaseService],
|
|
31
|
+
exports: [database_uniqueId_1.ApUniqueIdGenerator, database_transaction_1.TransactionManager, database_service_1.DatabaseService],
|
|
32
|
+
})
|
|
33
|
+
], ApDatabaseModule);
|
|
34
|
+
//# sourceMappingURL=database.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.module.js","sourceRoot":"","sources":["../../libs/src/database/database.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,+CAAkD;AAClD,yDAAqD;AACrD,iEAA4D;AAC5D,2DAI6B;AAC7B,2CAA8C;AAE9C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAC,QAAQ,CAAC,CAAC;AAcvC,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAAG,CAAA;AAAnB,4CAAgB;2BAAhB,gBAAgB;IAZ5B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,qBAAY,CAAC,OAAO,EAAE;YACtB,yBAAc,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;YAC/C,yBAAc,CAAC,UAAU,CAAC;gBACxB,EAAE,IAAI,EAAE,4BAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,kCAAc,EAAE;aAChD,CAAC;SACH;QACD,SAAS,EAAE,CAAC,yCAAkB,EAAE,uCAAmB,EAAE,kCAAe,CAAC;QACrE,OAAO,EAAE,CAAC,uCAAmB,EAAE,yCAAkB,EAAE,kCAAe,CAAC;KACpE,CAAC;GACW,gBAAgB,CAAG"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Document, FilterQuery, PipelineStage, Schema, Types } from "mongoose";
|
|
2
|
+
import { SoftDeleteModel } from "mongoose-delete";
|
|
3
|
+
import { IPageParams, IPageResult } from "./database.scheme";
|
|
4
|
+
import { TransactionSession } from "./database.transaction";
|
|
5
|
+
import { UniqueKeyTypes } from "./database.uniqueId";
|
|
6
|
+
export interface IRefInput<T> {
|
|
7
|
+
prefix?: string;
|
|
8
|
+
key?: UniqueKeyTypes;
|
|
9
|
+
filter?: FilterQuery<T>;
|
|
10
|
+
}
|
|
11
|
+
export declare abstract class AbstractBaseRepository<T extends Omit<Document<any, any, any>, "delete">> {
|
|
12
|
+
protected dbModel: SoftDeleteModel<T>;
|
|
13
|
+
private _session;
|
|
14
|
+
private uniqueIdGenerator;
|
|
15
|
+
constructor(dbModel: SoftDeleteModel<T>);
|
|
16
|
+
protected abstract buildQuery(query: Partial<T>): any;
|
|
17
|
+
abstract mapData(data: any, isCreate: boolean): Promise<T>;
|
|
18
|
+
set session(v: TransactionSession);
|
|
19
|
+
get session(): TransactionSession;
|
|
20
|
+
private get hasSession();
|
|
21
|
+
protected mapIds(query: Partial<T>): any;
|
|
22
|
+
create(data: Partial<T> | T): Promise<T>;
|
|
23
|
+
findById(id: string): Promise<T>;
|
|
24
|
+
findOne(query: FilterQuery<T>): Promise<T>;
|
|
25
|
+
find(query: FilterQuery<T>): Promise<T[]>;
|
|
26
|
+
update(id: string, data: Partial<T>): Promise<T>;
|
|
27
|
+
updateMany(query: Partial<T>, model: Partial<T>): Promise<void>;
|
|
28
|
+
delete(id: string): Promise<void>;
|
|
29
|
+
deleteMany(query: Partial<T>): Promise<void>;
|
|
30
|
+
aggregate(pipeline?: PipelineStage[]): Promise<T[]>;
|
|
31
|
+
page(page: IPageParams): Promise<IPageResult<T>>;
|
|
32
|
+
findLast(query: FilterQuery<T>): Promise<T>;
|
|
33
|
+
count(query?: FilterQuery<T>): Promise<number>;
|
|
34
|
+
protected _count(query: FilterQuery<T>): Promise<number>;
|
|
35
|
+
protected _create(data: Partial<T> | T): Promise<T>;
|
|
36
|
+
protected _findById(id: string): Promise<T>;
|
|
37
|
+
protected _findOne(query: FilterQuery<T>): Promise<T>;
|
|
38
|
+
protected _find(query: FilterQuery<T>): Promise<T[]>;
|
|
39
|
+
protected _update(id: string, data: Partial<T>): Promise<T>;
|
|
40
|
+
protected _updateMany(query: Partial<T>, model: Partial<T>): Promise<void>;
|
|
41
|
+
protected _delete(id: string): Promise<void>;
|
|
42
|
+
protected _deleteMany(query: Partial<T>): Promise<void>;
|
|
43
|
+
protected _findLast(query: FilterQuery<T>): Promise<T>;
|
|
44
|
+
protected _page(page: IPageParams, $lookups?: any[]): Promise<IPageResult<T>>;
|
|
45
|
+
schemaKeysQuery(schema: Schema, options: {
|
|
46
|
+
query: Partial<T & {
|
|
47
|
+
fromDate?: number;
|
|
48
|
+
toDate?: number;
|
|
49
|
+
ref?: string;
|
|
50
|
+
keyword?: string;
|
|
51
|
+
}>;
|
|
52
|
+
searchKeys?: string[];
|
|
53
|
+
ignoreKeys?: string[];
|
|
54
|
+
}, addMatchCondition: (condition: any) => void): void;
|
|
55
|
+
cleanupQuery(andConditions: any[]): {
|
|
56
|
+
$match: any;
|
|
57
|
+
};
|
|
58
|
+
getObjectId(): string;
|
|
59
|
+
toObjectId(value: string | any): Types.ObjectId;
|
|
60
|
+
generateUniqueId(key: UniqueKeyTypes): Promise<number>;
|
|
61
|
+
generateRef(ref?: IRefInput<T>): Promise<string>;
|
|
62
|
+
}
|