dbnexus 0.2.0 → 0.3.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/dist/api.js CHANGED
@@ -1993,10 +1993,10 @@ var require_controller_decorator = __commonJS({
1993
1993
  "node_modules/.pnpm/@nestjs+common@10.4.22_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/controller.decorator.js"(exports2) {
1994
1994
  "use strict";
1995
1995
  Object.defineProperty(exports2, "__esModule", { value: true });
1996
- exports2.Controller = Controller10;
1996
+ exports2.Controller = Controller11;
1997
1997
  var constants_1 = require_constants2();
1998
1998
  var shared_utils_1 = require_shared_utils();
1999
- function Controller10(prefixOrOptions) {
1999
+ function Controller11(prefixOrOptions) {
2000
2000
  const defaultPath = "/";
2001
2001
  const [path5, host, scopeOptions, versionOptions] = (0, shared_utils_1.isUndefined)(prefixOrOptions) ? [defaultPath, void 0, void 0, void 0] : (0, shared_utils_1.isString)(prefixOrOptions) || Array.isArray(prefixOrOptions) ? [prefixOrOptions, void 0, void 0, void 0] : [
2002
2002
  prefixOrOptions.path || defaultPath,
@@ -2416,9 +2416,9 @@ var require_module_decorator = __commonJS({
2416
2416
  "node_modules/.pnpm/@nestjs+common@10.4.22_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/modules/module.decorator.js"(exports2) {
2417
2417
  "use strict";
2418
2418
  Object.defineProperty(exports2, "__esModule", { value: true });
2419
- exports2.Module = Module12;
2419
+ exports2.Module = Module13;
2420
2420
  var validate_module_keys_util_1 = require_validate_module_keys_util();
2421
- function Module12(metadata) {
2421
+ function Module13(metadata) {
2422
2422
  const propsKeys = Object.keys(metadata);
2423
2423
  (0, validate_module_keys_util_1.validateModuleKeys)(propsKeys);
2424
2424
  return (target) => {
@@ -2539,10 +2539,10 @@ var require_route_params_decorator = __commonJS({
2539
2539
  exports2.assignMetadata = assignMetadata;
2540
2540
  exports2.UploadedFile = UploadedFile2;
2541
2541
  exports2.UploadedFiles = UploadedFiles;
2542
- exports2.Query = Query9;
2543
- exports2.Body = Body7;
2542
+ exports2.Query = Query10;
2543
+ exports2.Body = Body8;
2544
2544
  exports2.RawBody = RawBody;
2545
- exports2.Param = Param7;
2545
+ exports2.Param = Param8;
2546
2546
  exports2.HostParam = HostParam;
2547
2547
  var constants_1 = require_constants2();
2548
2548
  var route_paramtypes_enum_1 = require_route_paramtypes_enum();
@@ -2588,16 +2588,16 @@ var require_route_params_decorator = __commonJS({
2588
2588
  return createPipesRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.FILES)(void 0, ...pipes);
2589
2589
  }
2590
2590
  exports2.Headers = createRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.HEADERS);
2591
- function Query9(property, ...pipes) {
2591
+ function Query10(property, ...pipes) {
2592
2592
  return createPipesRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.QUERY)(property, ...pipes);
2593
2593
  }
2594
- function Body7(property, ...pipes) {
2594
+ function Body8(property, ...pipes) {
2595
2595
  return createPipesRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.BODY)(property, ...pipes);
2596
2596
  }
2597
2597
  function RawBody(...pipes) {
2598
2598
  return createPipesRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.RAW_BODY)(void 0, ...pipes);
2599
2599
  }
2600
- function Param7(property, ...pipes) {
2600
+ function Param8(property, ...pipes) {
2601
2601
  return createPipesRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.PARAM)(property, ...pipes);
2602
2602
  }
2603
2603
  function HostParam(property) {
@@ -3008,7 +3008,7 @@ var require_bad_request_exception = __commonJS({
3008
3008
  exports2.BadRequestException = void 0;
3009
3009
  var http_status_enum_1 = require_http_status_enum();
3010
3010
  var http_exception_1 = require_http_exception();
3011
- var BadRequestException3 = class extends http_exception_1.HttpException {
3011
+ var BadRequestException4 = class extends http_exception_1.HttpException {
3012
3012
  /**
3013
3013
  * Instantiate a `BadRequestException` Exception.
3014
3014
  *
@@ -3038,7 +3038,7 @@ var require_bad_request_exception = __commonJS({
3038
3038
  super(http_exception_1.HttpException.createBody(objectOrError, description, http_status_enum_1.HttpStatus.BAD_REQUEST), http_status_enum_1.HttpStatus.BAD_REQUEST, httpExceptionOptions);
3039
3039
  }
3040
3040
  };
3041
- exports2.BadRequestException = BadRequestException3;
3041
+ exports2.BadRequestException = BadRequestException4;
3042
3042
  }
3043
3043
  });
3044
3044
 
@@ -20438,7 +20438,7 @@ var require_module = __commonJS({
20438
20438
  var constants_2 = require_constants4();
20439
20439
  var instance_wrapper_1 = require_instance_wrapper();
20440
20440
  var module_ref_1 = require_module_ref();
20441
- var Module12 = class {
20441
+ var Module13 = class {
20442
20442
  constructor(_metatype, container) {
20443
20443
  this._metatype = _metatype;
20444
20444
  this.container = container;
@@ -20832,7 +20832,7 @@ var require_module = __commonJS({
20832
20832
  return (0, get_class_scope_1.getClassScope)(provider) === interfaces_1.Scope.TRANSIENT;
20833
20833
  }
20834
20834
  };
20835
- exports2.Module = Module12;
20835
+ exports2.Module = Module13;
20836
20836
  }
20837
20837
  });
20838
20838
 
@@ -57071,7 +57071,7 @@ var require_serve_static_options_interface = __commonJS({
57071
57071
  var require_abstract_loader = __commonJS({
57072
57072
  "node_modules/.pnpm/@nestjs+serve-static@4.0.2_@nestjs+common@10.4.22_reflect-metadata@0.2.2_rxjs@7.8.2__@nestjs+core@10.4.22_express@4.22.1/node_modules/@nestjs/serve-static/dist/loaders/abstract.loader.js"(exports2) {
57073
57073
  "use strict";
57074
- var __decorate31 = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
57074
+ var __decorate33 = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
57075
57075
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
57076
57076
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
57077
57077
  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;
@@ -57087,7 +57087,7 @@ var require_abstract_loader = __commonJS({
57087
57087
  }
57088
57088
  };
57089
57089
  exports2.AbstractLoader = AbstractLoader;
57090
- exports2.AbstractLoader = AbstractLoader = __decorate31([
57090
+ exports2.AbstractLoader = AbstractLoader = __decorate33([
57091
57091
  (0, common_1.Injectable)()
57092
57092
  ], AbstractLoader);
57093
57093
  }
@@ -57233,7 +57233,7 @@ var require_validate_path_util = __commonJS({
57233
57233
  var require_express_loader = __commonJS({
57234
57234
  "node_modules/.pnpm/@nestjs+serve-static@4.0.2_@nestjs+common@10.4.22_reflect-metadata@0.2.2_rxjs@7.8.2__@nestjs+core@10.4.22_express@4.22.1/node_modules/@nestjs/serve-static/dist/loaders/express.loader.js"(exports2) {
57235
57235
  "use strict";
57236
- var __decorate31 = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
57236
+ var __decorate33 = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
57237
57237
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
57238
57238
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
57239
57239
  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;
@@ -57279,7 +57279,7 @@ var require_express_loader = __commonJS({
57279
57279
  }
57280
57280
  };
57281
57281
  exports2.ExpressLoader = ExpressLoader;
57282
- exports2.ExpressLoader = ExpressLoader = __decorate31([
57282
+ exports2.ExpressLoader = ExpressLoader = __decorate33([
57283
57283
  (0, common_1.Injectable)()
57284
57284
  ], ExpressLoader);
57285
57285
  }
@@ -57289,7 +57289,7 @@ var require_express_loader = __commonJS({
57289
57289
  var require_fastify_loader = __commonJS({
57290
57290
  "node_modules/.pnpm/@nestjs+serve-static@4.0.2_@nestjs+common@10.4.22_reflect-metadata@0.2.2_rxjs@7.8.2__@nestjs+core@10.4.22_express@4.22.1/node_modules/@nestjs/serve-static/dist/loaders/fastify.loader.js"(exports2) {
57291
57291
  "use strict";
57292
- var __decorate31 = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
57292
+ var __decorate33 = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
57293
57293
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
57294
57294
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
57295
57295
  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;
@@ -57342,7 +57342,7 @@ var require_fastify_loader = __commonJS({
57342
57342
  }
57343
57343
  };
57344
57344
  exports2.FastifyLoader = FastifyLoader;
57345
- exports2.FastifyLoader = FastifyLoader = __decorate31([
57345
+ exports2.FastifyLoader = FastifyLoader = __decorate33([
57346
57346
  (0, common_1.Injectable)()
57347
57347
  ], FastifyLoader);
57348
57348
  }
@@ -57352,7 +57352,7 @@ var require_fastify_loader = __commonJS({
57352
57352
  var require_noop_loader = __commonJS({
57353
57353
  "node_modules/.pnpm/@nestjs+serve-static@4.0.2_@nestjs+common@10.4.22_reflect-metadata@0.2.2_rxjs@7.8.2__@nestjs+core@10.4.22_express@4.22.1/node_modules/@nestjs/serve-static/dist/loaders/noop.loader.js"(exports2) {
57354
57354
  "use strict";
57355
- var __decorate31 = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
57355
+ var __decorate33 = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
57356
57356
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
57357
57357
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
57358
57358
  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;
@@ -57367,7 +57367,7 @@ var require_noop_loader = __commonJS({
57367
57367
  }
57368
57368
  };
57369
57369
  exports2.NoopLoader = NoopLoader;
57370
- exports2.NoopLoader = NoopLoader = __decorate31([
57370
+ exports2.NoopLoader = NoopLoader = __decorate33([
57371
57371
  (0, common_1.Injectable)()
57372
57372
  ], NoopLoader);
57373
57373
  }
@@ -57407,16 +57407,16 @@ var require_serve_static_providers = __commonJS({
57407
57407
  var require_serve_static_module = __commonJS({
57408
57408
  "node_modules/.pnpm/@nestjs+serve-static@4.0.2_@nestjs+common@10.4.22_reflect-metadata@0.2.2_rxjs@7.8.2__@nestjs+core@10.4.22_express@4.22.1/node_modules/@nestjs/serve-static/dist/serve-static.module.js"(exports2) {
57409
57409
  "use strict";
57410
- var __decorate31 = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
57410
+ var __decorate33 = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
57411
57411
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
57412
57412
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
57413
57413
  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;
57414
57414
  return c > 3 && r && Object.defineProperty(target, key, r), r;
57415
57415
  };
57416
- var __metadata18 = exports2 && exports2.__metadata || function(k, v) {
57416
+ var __metadata19 = exports2 && exports2.__metadata || function(k, v) {
57417
57417
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
57418
57418
  };
57419
- var __param10 = exports2 && exports2.__param || function(paramIndex, decorator) {
57419
+ var __param11 = exports2 && exports2.__param || function(paramIndex, decorator) {
57420
57420
  return function(target, key) {
57421
57421
  decorator(target, key, paramIndex);
57422
57422
  };
@@ -57489,12 +57489,12 @@ var require_serve_static_module = __commonJS({
57489
57489
  }
57490
57490
  };
57491
57491
  exports2.ServeStaticModule = ServeStaticModule2;
57492
- exports2.ServeStaticModule = ServeStaticModule2 = ServeStaticModule_1 = __decorate31([
57492
+ exports2.ServeStaticModule = ServeStaticModule2 = ServeStaticModule_1 = __decorate33([
57493
57493
  (0, common_1.Module)({
57494
57494
  providers: [...serve_static_providers_1.serveStaticProviders]
57495
57495
  }),
57496
- __param10(0, (0, common_1.Inject)(serve_static_constants_1.SERVE_STATIC_MODULE_OPTIONS)),
57497
- __metadata18("design:paramtypes", [
57496
+ __param11(0, (0, common_1.Inject)(serve_static_constants_1.SERVE_STATIC_MODULE_OPTIONS)),
57497
+ __metadata19("design:paramtypes", [
57498
57498
  Array,
57499
57499
  abstract_loader_1.AbstractLoader,
57500
57500
  core_1.HttpAdapterHost
@@ -59520,7 +59520,7 @@ var require_query2 = __commonJS({
59520
59520
  var { EventEmitter } = __require("events");
59521
59521
  var Result2 = require_result();
59522
59522
  var utils = require_utils10();
59523
- var Query9 = class extends EventEmitter {
59523
+ var Query10 = class extends EventEmitter {
59524
59524
  constructor(config, values, callback) {
59525
59525
  super();
59526
59526
  config = utils.normalizeQueryConfig(config, values, callback);
@@ -59706,7 +59706,7 @@ var require_query2 = __commonJS({
59706
59706
  handleCopyData(msg, connection) {
59707
59707
  }
59708
59708
  };
59709
- module2.exports = Query9;
59709
+ module2.exports = Query10;
59710
59710
  }
59711
59711
  });
59712
59712
 
@@ -61111,7 +61111,7 @@ var require_client = __commonJS({
61111
61111
  var sasl = require_sasl();
61112
61112
  var TypeOverrides2 = require_type_overrides();
61113
61113
  var ConnectionParameters = require_connection_parameters();
61114
- var Query9 = require_query2();
61114
+ var Query10 = require_query2();
61115
61115
  var defaults2 = require_defaults();
61116
61116
  var Connection2 = require_connection();
61117
61117
  var crypto3 = require_utils11();
@@ -61542,7 +61542,7 @@ var require_client = __commonJS({
61542
61542
  }
61543
61543
  } else {
61544
61544
  readTimeout = config.query_timeout || this.connectionParameters.query_timeout;
61545
- query = new Query9(config, values, callback);
61545
+ query = new Query10(config, values, callback);
61546
61546
  if (!query.callback) {
61547
61547
  result = new this._Promise((resolve, reject) => {
61548
61548
  query.callback = (err, res) => err ? reject(err) : resolve(res);
@@ -61624,7 +61624,7 @@ var require_client = __commonJS({
61624
61624
  }
61625
61625
  }
61626
61626
  };
61627
- Client2.Query = Query9;
61627
+ Client2.Query = Query10;
61628
61628
  module2.exports = Client2;
61629
61629
  }
61630
61630
  });
@@ -74578,7 +74578,7 @@ var require_query4 = __commonJS({
74578
74578
  var CommandCode = require_commands();
74579
74579
  var StringParser = require_string();
74580
74580
  var CharsetToEncoding = require_charset_encodings();
74581
- var Query9 = class {
74581
+ var Query10 = class {
74582
74582
  constructor(sql, charsetNumber) {
74583
74583
  this.query = sql;
74584
74584
  this.charsetNumber = charsetNumber;
@@ -74595,7 +74595,7 @@ var require_query4 = __commonJS({
74595
74595
  return packet;
74596
74596
  }
74597
74597
  };
74598
- module2.exports = Query9;
74598
+ module2.exports = Query10;
74599
74599
  }
74600
74600
  });
74601
74601
 
@@ -74930,7 +74930,7 @@ var require_packets = __commonJS({
74930
74930
  var HandshakeResponse = require_handshake_response();
74931
74931
  var PrepareStatement = require_prepare_statement();
74932
74932
  var PreparedStatementHeader = require_prepared_statement_header();
74933
- var Query9 = require_query4();
74933
+ var Query10 = require_query4();
74934
74934
  var RegisterSlave = require_register_slave();
74935
74935
  var ResultSetHeader = require_resultset_header();
74936
74936
  var SSLRequest = require_ssl_request();
@@ -74950,7 +74950,7 @@ var require_packets = __commonJS({
74950
74950
  HandshakeResponse,
74951
74951
  PrepareStatement,
74952
74952
  PreparedStatementHeader,
74953
- Query: Query9,
74953
+ Query: Query10,
74954
74954
  RegisterSlave,
74955
74955
  ResultSetHeader,
74956
74956
  SSLRequest,
@@ -76825,7 +76825,7 @@ var require_query5 = __commonJS({
76825
76825
  var staticParser = require_static_text_parser();
76826
76826
  var ServerStatus = require_server_status();
76827
76827
  var EmptyPacket = new Packets.Packet(0, Buffer.allocUnsafe(4), 0, 4);
76828
- var Query9 = class _Query extends Command {
76828
+ var Query10 = class _Query extends Command {
76829
76829
  constructor(options, callback) {
76830
76830
  super();
76831
76831
  this.sql = options.sql;
@@ -77125,8 +77125,8 @@ var require_query5 = __commonJS({
77125
77125
  }
77126
77126
  }
77127
77127
  };
77128
- Query9.prototype.catch = Query9.prototype.then;
77129
- module2.exports = Query9;
77128
+ Query10.prototype.catch = Query10.prototype.then;
77129
+ module2.exports = Query10;
77130
77130
  }
77131
77131
  });
77132
77132
 
@@ -77520,7 +77520,7 @@ var require_execute2 = __commonJS({
77520
77520
  "node_modules/.pnpm/mysql2@3.16.0/node_modules/mysql2/lib/commands/execute.js"(exports2, module2) {
77521
77521
  "use strict";
77522
77522
  var Command = require_command();
77523
- var Query9 = require_query5();
77523
+ var Query10 = require_query5();
77524
77524
  var Packets = require_packets();
77525
77525
  var getBinaryParser = require_binary_parser();
77526
77526
  var getStaticBinaryParser = require_static_binary_parser();
@@ -77597,15 +77597,15 @@ var require_execute2 = __commonJS({
77597
77597
  return _Execute.prototype.row;
77598
77598
  }
77599
77599
  };
77600
- Execute.prototype.done = Query9.prototype.done;
77601
- Execute.prototype.doneInsert = Query9.prototype.doneInsert;
77602
- Execute.prototype.resultsetHeader = Query9.prototype.resultsetHeader;
77603
- Execute.prototype._findOrCreateReadStream = Query9.prototype._findOrCreateReadStream;
77604
- Execute.prototype._streamLocalInfile = Query9.prototype._streamLocalInfile;
77605
- Execute.prototype._setTimeout = Query9.prototype._setTimeout;
77606
- Execute.prototype._handleTimeoutError = Query9.prototype._handleTimeoutError;
77607
- Execute.prototype.row = Query9.prototype.row;
77608
- Execute.prototype.stream = Query9.prototype.stream;
77600
+ Execute.prototype.done = Query10.prototype.done;
77601
+ Execute.prototype.doneInsert = Query10.prototype.doneInsert;
77602
+ Execute.prototype.resultsetHeader = Query10.prototype.resultsetHeader;
77603
+ Execute.prototype._findOrCreateReadStream = Query10.prototype._findOrCreateReadStream;
77604
+ Execute.prototype._streamLocalInfile = Query10.prototype._streamLocalInfile;
77605
+ Execute.prototype._setTimeout = Query10.prototype._setTimeout;
77606
+ Execute.prototype._handleTimeoutError = Query10.prototype._handleTimeoutError;
77607
+ Execute.prototype.row = Query10.prototype.row;
77608
+ Execute.prototype.stream = Query10.prototype.stream;
77609
77609
  module2.exports = Execute;
77610
77610
  }
77611
77611
  });
@@ -78104,7 +78104,7 @@ var require_commands2 = __commonJS({
78104
78104
  "use strict";
78105
78105
  var ClientHandshake = require_client_handshake();
78106
78106
  var ServerHandshake = require_server_handshake();
78107
- var Query9 = require_query5();
78107
+ var Query10 = require_query5();
78108
78108
  var Prepare = require_prepare();
78109
78109
  var CloseStatement = require_close_statement2();
78110
78110
  var Execute = require_execute2();
@@ -78116,7 +78116,7 @@ var require_commands2 = __commonJS({
78116
78116
  module2.exports = {
78117
78117
  ClientHandshake,
78118
78118
  ServerHandshake,
78119
- Query: Query9,
78119
+ Query: Query10,
78120
78120
  Prepare,
78121
78121
  CloseStatement,
78122
78122
  Execute,
@@ -80928,10 +80928,10 @@ var require_promise = __commonJS({
80928
80928
  // apps/api/dist/main.js
80929
80929
  var import_reflect_metadata = __toESM(require_Reflect(), 1);
80930
80930
  var import_core = __toESM(require_core2(), 1);
80931
- var import_common30 = __toESM(require_common(), 1);
80931
+ var import_common32 = __toESM(require_common(), 1);
80932
80932
 
80933
80933
  // apps/api/dist/app.module.js
80934
- var import_common29 = __toESM(require_common(), 1);
80934
+ var import_common31 = __toESM(require_common(), 1);
80935
80935
  var import_serve_static = __toESM(require_serve_static2(), 1);
80936
80936
  import { join as join4 } from "path";
80937
80937
  import { fileURLToPath } from "url";
@@ -80952,7 +80952,7 @@ var import_common = __toESM(require_common(), 1);
80952
80952
  import Database from "better-sqlite3";
80953
80953
 
80954
80954
  // packages/metadata/dist/schema.js
80955
- var SCHEMA_VERSION = 15;
80955
+ var SCHEMA_VERSION = 17;
80956
80956
  var MIGRATIONS = [
80957
80957
  // Version 1: Initial schema
80958
80958
  `
@@ -81299,6 +81299,37 @@ var MIGRATIONS = [
81299
81299
  CREATE INDEX IF NOT EXISTS idx_backup_logs_created_at ON backup_logs(created_at DESC);
81300
81300
 
81301
81301
  UPDATE schema_version SET version = 15;
81302
+ `,
81303
+ // Version 16: Add servers table for grouping connections by database server
81304
+ `
81305
+ -- Servers table to store database server credentials
81306
+ CREATE TABLE IF NOT EXISTS servers (
81307
+ id TEXT PRIMARY KEY,
81308
+ name TEXT NOT NULL UNIQUE,
81309
+ engine TEXT NOT NULL CHECK(engine IN ('postgres', 'mysql', 'mariadb')),
81310
+ connection_type TEXT NOT NULL DEFAULT 'local' CHECK(connection_type IN ('local', 'docker', 'remote')),
81311
+ host TEXT NOT NULL,
81312
+ port INTEGER NOT NULL,
81313
+ username TEXT NOT NULL,
81314
+ encrypted_password TEXT,
81315
+ ssl INTEGER NOT NULL DEFAULT 0,
81316
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
81317
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
81318
+ );
81319
+
81320
+ -- Add server_id to connections (nullable - SQLite connections don't have a server)
81321
+ ALTER TABLE connections ADD COLUMN server_id TEXT REFERENCES servers(id) ON DELETE SET NULL;
81322
+
81323
+ CREATE INDEX IF NOT EXISTS idx_connections_server ON connections(server_id);
81324
+ CREATE INDEX IF NOT EXISTS idx_servers_engine ON servers(engine);
81325
+
81326
+ UPDATE schema_version SET version = 16;
81327
+ `,
81328
+ // Version 17: Add tags to servers
81329
+ `
81330
+ ALTER TABLE servers ADD COLUMN tags TEXT NOT NULL DEFAULT '[]';
81331
+
81332
+ UPDATE schema_version SET version = 17;
81302
81333
  `
81303
81334
  ];
81304
81335
 
@@ -81418,9 +81449,9 @@ var ConnectionRepository = class {
81418
81449
  const encryptedPwd = input.password ? encryptPassword(input.password) : null;
81419
81450
  const connectionType = input.connectionType || this.inferConnectionType(input.host);
81420
81451
  this.db.prepare(`
81421
- INSERT INTO connections (id, name, engine, connection_type, host, port, database, username, encrypted_password, ssl, default_schema, tags, read_only, project_id, group_id, created_at, updated_at)
81422
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
81423
- `).run(id, input.name, input.engine, connectionType, input.host, input.port, input.database, input.username, encryptedPwd, input.ssl ? 1 : 0, input.defaultSchema || null, JSON.stringify(input.tags ?? []), input.readOnly ? 1 : 0, input.projectId || null, input.groupId || null, now, now);
81452
+ INSERT INTO connections (id, name, engine, connection_type, host, port, database, username, encrypted_password, ssl, default_schema, tags, read_only, server_id, project_id, group_id, created_at, updated_at)
81453
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
81454
+ `).run(id, input.name, input.engine, connectionType, input.host, input.port, input.database, input.username, encryptedPwd, input.ssl ? 1 : 0, input.defaultSchema || null, JSON.stringify(input.tags ?? []), input.readOnly ? 1 : 0, input.serverId || null, input.projectId || null, input.groupId || null, now, now);
81424
81455
  return this.findById(id);
81425
81456
  }
81426
81457
  /**
@@ -81430,9 +81461,11 @@ var ConnectionRepository = class {
81430
81461
  const row = this.db.prepare(`
81431
81462
  SELECT
81432
81463
  c.*,
81464
+ s.name as server_name,
81433
81465
  p.name as project_name,
81434
81466
  dg.name as group_name
81435
81467
  FROM connections c
81468
+ LEFT JOIN servers s ON c.server_id = s.id
81436
81469
  LEFT JOIN projects p ON c.project_id = p.id
81437
81470
  LEFT JOIN database_groups dg ON c.group_id = dg.id
81438
81471
  WHERE c.id = ?
@@ -81446,9 +81479,11 @@ var ConnectionRepository = class {
81446
81479
  const row = this.db.prepare(`
81447
81480
  SELECT
81448
81481
  c.*,
81482
+ s.name as server_name,
81449
81483
  p.name as project_name,
81450
81484
  dg.name as group_name
81451
81485
  FROM connections c
81486
+ LEFT JOIN servers s ON c.server_id = s.id
81452
81487
  LEFT JOIN projects p ON c.project_id = p.id
81453
81488
  LEFT JOIN database_groups dg ON c.group_id = dg.id
81454
81489
  WHERE c.name = ?
@@ -81462,9 +81497,11 @@ var ConnectionRepository = class {
81462
81497
  const rows = this.db.prepare(`
81463
81498
  SELECT
81464
81499
  c.*,
81500
+ s.name as server_name,
81465
81501
  p.name as project_name,
81466
81502
  dg.name as group_name
81467
81503
  FROM connections c
81504
+ LEFT JOIN servers s ON c.server_id = s.id
81468
81505
  LEFT JOIN projects p ON c.project_id = p.id
81469
81506
  LEFT JOIN database_groups dg ON c.group_id = dg.id
81470
81507
  ORDER BY p.name, dg.name, c.name
@@ -81478,9 +81515,11 @@ var ConnectionRepository = class {
81478
81515
  const rows = this.db.prepare(`
81479
81516
  SELECT
81480
81517
  c.*,
81518
+ s.name as server_name,
81481
81519
  p.name as project_name,
81482
81520
  dg.name as group_name
81483
81521
  FROM connections c
81522
+ LEFT JOIN servers s ON c.server_id = s.id
81484
81523
  LEFT JOIN projects p ON c.project_id = p.id
81485
81524
  LEFT JOIN database_groups dg ON c.group_id = dg.id
81486
81525
  WHERE c.project_id = ?
@@ -81495,9 +81534,11 @@ var ConnectionRepository = class {
81495
81534
  const rows = this.db.prepare(`
81496
81535
  SELECT
81497
81536
  c.*,
81537
+ s.name as server_name,
81498
81538
  p.name as project_name,
81499
81539
  dg.name as group_name
81500
81540
  FROM connections c
81541
+ LEFT JOIN servers s ON c.server_id = s.id
81501
81542
  LEFT JOIN projects p ON c.project_id = p.id
81502
81543
  LEFT JOIN database_groups dg ON c.group_id = dg.id
81503
81544
  WHERE c.group_id = ?
@@ -81512,9 +81553,11 @@ var ConnectionRepository = class {
81512
81553
  const rows = this.db.prepare(`
81513
81554
  SELECT
81514
81555
  c.*,
81556
+ s.name as server_name,
81515
81557
  p.name as project_name,
81516
81558
  dg.name as group_name
81517
81559
  FROM connections c
81560
+ LEFT JOIN servers s ON c.server_id = s.id
81518
81561
  LEFT JOIN projects p ON c.project_id = p.id
81519
81562
  LEFT JOIN database_groups dg ON c.group_id = dg.id
81520
81563
  WHERE c.project_id IS NULL
@@ -81526,7 +81569,18 @@ var ConnectionRepository = class {
81526
81569
  * Find connections by tag
81527
81570
  */
81528
81571
  findByTag(tag) {
81529
- const rows = this.db.prepare("SELECT * FROM connections ORDER BY name").all();
81572
+ const rows = this.db.prepare(`
81573
+ SELECT
81574
+ c.*,
81575
+ s.name as server_name,
81576
+ p.name as project_name,
81577
+ dg.name as group_name
81578
+ FROM connections c
81579
+ LEFT JOIN servers s ON c.server_id = s.id
81580
+ LEFT JOIN projects p ON c.project_id = p.id
81581
+ LEFT JOIN database_groups dg ON c.group_id = dg.id
81582
+ ORDER BY c.name
81583
+ `).all();
81530
81584
  return rows.filter((row) => {
81531
81585
  const tags = JSON.parse(row.tags);
81532
81586
  return tags.includes(tag);
@@ -81593,6 +81647,10 @@ var ConnectionRepository = class {
81593
81647
  updates.push("connection_type = ?");
81594
81648
  values.push(input.connectionType);
81595
81649
  }
81650
+ if (input.serverId !== void 0) {
81651
+ updates.push("server_id = ?");
81652
+ values.push(input.serverId);
81653
+ }
81596
81654
  if (updates.length > 0) {
81597
81655
  updates.push("updated_at = ?");
81598
81656
  values.push((/* @__PURE__ */ new Date()).toISOString());
@@ -81660,12 +81718,32 @@ var ConnectionRepository = class {
81660
81718
  readOnly: row.read_only === 1,
81661
81719
  createdAt: new Date(row.created_at),
81662
81720
  updatedAt: new Date(row.updated_at),
81721
+ serverId: row.server_id || void 0,
81663
81722
  projectId: row.project_id || void 0,
81664
81723
  groupId: row.group_id || void 0,
81724
+ serverName: row.server_name,
81665
81725
  projectName: row.project_name,
81666
81726
  groupName: row.group_name
81667
81727
  };
81668
81728
  }
81729
+ /**
81730
+ * Find connections by server ID
81731
+ */
81732
+ findByServerId(serverId) {
81733
+ const rows = this.db.prepare(`
81734
+ SELECT c.*,
81735
+ s.name as server_name,
81736
+ p.name as project_name,
81737
+ g.name as group_name
81738
+ FROM connections c
81739
+ LEFT JOIN servers s ON c.server_id = s.id
81740
+ LEFT JOIN projects p ON c.project_id = p.id
81741
+ LEFT JOIN database_groups g ON c.group_id = g.id
81742
+ WHERE c.server_id = ?
81743
+ ORDER BY c.name
81744
+ `).all(serverId);
81745
+ return rows.map((row) => this.rowToConnection(row));
81746
+ }
81669
81747
  };
81670
81748
 
81671
81749
  // packages/metadata/dist/repositories/query.repository.js
@@ -82967,6 +83045,188 @@ var BackupLogsRepository = class {
82967
83045
  }
82968
83046
  };
82969
83047
 
83048
+ // packages/metadata/dist/repositories/server.repository.js
83049
+ var ServerRepository = class {
83050
+ db;
83051
+ constructor(metadataDb) {
83052
+ this.db = metadataDb.getDb();
83053
+ }
83054
+ /**
83055
+ * Infer connection type from host
83056
+ */
83057
+ inferConnectionType(host) {
83058
+ if (!host || host === "localhost" || host === "127.0.0.1" || host === "0.0.0.0") {
83059
+ return "local";
83060
+ }
83061
+ return "remote";
83062
+ }
83063
+ /**
83064
+ * Convert database row to ServerConfig
83065
+ */
83066
+ rowToServer(row) {
83067
+ return {
83068
+ id: row.id,
83069
+ name: row.name,
83070
+ engine: row.engine,
83071
+ connectionType: row.connection_type,
83072
+ host: row.host,
83073
+ port: row.port,
83074
+ username: row.username,
83075
+ ssl: row.ssl === 1,
83076
+ tags: JSON.parse(row.tags),
83077
+ createdAt: new Date(row.created_at),
83078
+ updatedAt: new Date(row.updated_at),
83079
+ databaseCount: row.database_count
83080
+ };
83081
+ }
83082
+ /**
83083
+ * Create a new server
83084
+ */
83085
+ create(input) {
83086
+ const id = MetadataDatabase.generateId();
83087
+ const now = (/* @__PURE__ */ new Date()).toISOString();
83088
+ const encryptedPwd = input.password ? encryptPassword(input.password) : null;
83089
+ const connectionType = input.connectionType || this.inferConnectionType(input.host);
83090
+ this.db.prepare(`
83091
+ INSERT INTO servers (id, name, engine, connection_type, host, port, username, encrypted_password, ssl, tags, created_at, updated_at)
83092
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
83093
+ `).run(id, input.name, input.engine, connectionType, input.host, input.port, input.username, encryptedPwd, input.ssl ? 1 : 0, JSON.stringify(input.tags ?? []), now, now);
83094
+ return this.findById(id);
83095
+ }
83096
+ /**
83097
+ * Find a server by ID
83098
+ */
83099
+ findById(id) {
83100
+ const row = this.db.prepare(`
83101
+ SELECT s.*,
83102
+ (SELECT COUNT(*) FROM connections c WHERE c.server_id = s.id) as database_count
83103
+ FROM servers s
83104
+ WHERE s.id = ?
83105
+ `).get(id);
83106
+ return row ? this.rowToServer(row) : null;
83107
+ }
83108
+ /**
83109
+ * Find a server by name
83110
+ */
83111
+ findByName(name) {
83112
+ const row = this.db.prepare(`
83113
+ SELECT s.*,
83114
+ (SELECT COUNT(*) FROM connections c WHERE c.server_id = s.id) as database_count
83115
+ FROM servers s
83116
+ WHERE s.name = ?
83117
+ `).get(name);
83118
+ return row ? this.rowToServer(row) : null;
83119
+ }
83120
+ /**
83121
+ * Find all servers
83122
+ */
83123
+ findAll() {
83124
+ const rows = this.db.prepare(`
83125
+ SELECT s.*,
83126
+ (SELECT COUNT(*) FROM connections c WHERE c.server_id = s.id) as database_count
83127
+ FROM servers s
83128
+ ORDER BY s.name
83129
+ `).all();
83130
+ return rows.map((row) => this.rowToServer(row));
83131
+ }
83132
+ /**
83133
+ * Find servers by engine
83134
+ */
83135
+ findByEngine(engine) {
83136
+ const rows = this.db.prepare(`
83137
+ SELECT s.*,
83138
+ (SELECT COUNT(*) FROM connections c WHERE c.server_id = s.id) as database_count
83139
+ FROM servers s
83140
+ WHERE s.engine = ?
83141
+ ORDER BY s.name
83142
+ `).all(engine);
83143
+ return rows.map((row) => this.rowToServer(row));
83144
+ }
83145
+ /**
83146
+ * Update a server
83147
+ */
83148
+ update(id, input) {
83149
+ const existing = this.findById(id);
83150
+ if (!existing) {
83151
+ return null;
83152
+ }
83153
+ const updates = [];
83154
+ const values = [];
83155
+ if (input.name !== void 0) {
83156
+ updates.push("name = ?");
83157
+ values.push(input.name);
83158
+ }
83159
+ if (input.connectionType !== void 0) {
83160
+ updates.push("connection_type = ?");
83161
+ values.push(input.connectionType);
83162
+ }
83163
+ if (input.host !== void 0) {
83164
+ updates.push("host = ?");
83165
+ values.push(input.host);
83166
+ }
83167
+ if (input.port !== void 0) {
83168
+ updates.push("port = ?");
83169
+ values.push(input.port);
83170
+ }
83171
+ if (input.username !== void 0) {
83172
+ updates.push("username = ?");
83173
+ values.push(input.username);
83174
+ }
83175
+ if (input.password !== void 0) {
83176
+ updates.push("encrypted_password = ?");
83177
+ values.push(input.password ? encryptPassword(input.password) : null);
83178
+ }
83179
+ if (input.ssl !== void 0) {
83180
+ updates.push("ssl = ?");
83181
+ values.push(input.ssl ? 1 : 0);
83182
+ }
83183
+ if (input.tags !== void 0) {
83184
+ updates.push("tags = ?");
83185
+ values.push(JSON.stringify(input.tags));
83186
+ }
83187
+ if (updates.length === 0) {
83188
+ return existing;
83189
+ }
83190
+ updates.push("updated_at = ?");
83191
+ values.push((/* @__PURE__ */ new Date()).toISOString());
83192
+ values.push(id);
83193
+ this.db.prepare(`UPDATE servers SET ${updates.join(", ")} WHERE id = ?`).run(...values);
83194
+ return this.findById(id);
83195
+ }
83196
+ /**
83197
+ * Delete a server
83198
+ * Note: Connections referencing this server will have server_id set to NULL (ON DELETE SET NULL)
83199
+ */
83200
+ delete(id) {
83201
+ const result = this.db.prepare("DELETE FROM servers WHERE id = ?").run(id);
83202
+ return result.changes > 0;
83203
+ }
83204
+ /**
83205
+ * Get decrypted password for a server
83206
+ */
83207
+ getPassword(id) {
83208
+ const row = this.db.prepare("SELECT encrypted_password FROM servers WHERE id = ?").get(id);
83209
+ if (!row || !row.encrypted_password) {
83210
+ return null;
83211
+ }
83212
+ return decryptPassword(row.encrypted_password);
83213
+ }
83214
+ /**
83215
+ * Check if server has a password
83216
+ */
83217
+ hasPassword(id) {
83218
+ const row = this.db.prepare("SELECT encrypted_password FROM servers WHERE id = ?").get(id);
83219
+ return row?.encrypted_password != null;
83220
+ }
83221
+ /**
83222
+ * Get count of connections using this server
83223
+ */
83224
+ getConnectionCount(id) {
83225
+ const row = this.db.prepare("SELECT COUNT(*) as count FROM connections WHERE server_id = ?").get(id);
83226
+ return row.count;
83227
+ }
83228
+ };
83229
+
82970
83230
  // apps/api/dist/metadata/metadata.service.js
82971
83231
  import * as path from "node:path";
82972
83232
  import * as fs from "node:fs";
@@ -82990,6 +83250,7 @@ var MetadataService = MetadataService_1 = class MetadataService2 {
82990
83250
  _auditLogRepository;
82991
83251
  _backupRepository;
82992
83252
  _backupLogsRepository;
83253
+ _serverRepository;
82993
83254
  onModuleInit() {
82994
83255
  let dbnexusDir;
82995
83256
  if (process.env["DBNEXUS_DATA_DIR"]) {
@@ -83017,6 +83278,7 @@ var MetadataService = MetadataService_1 = class MetadataService2 {
83017
83278
  this._auditLogRepository = new AuditLogRepository(this.db);
83018
83279
  this._backupRepository = new BackupRepository(this.db.db);
83019
83280
  this._backupLogsRepository = new BackupLogsRepository(this.db.db);
83281
+ this._serverRepository = new ServerRepository(this.db);
83020
83282
  this.logger.log(`\u{1F4E6} Metadata database initialized at ${dbPath}`);
83021
83283
  }
83022
83284
  onModuleDestroy() {
@@ -83052,6 +83314,9 @@ var MetadataService = MetadataService_1 = class MetadataService2 {
83052
83314
  get backupLogsRepository() {
83053
83315
  return this._backupLogsRepository;
83054
83316
  }
83317
+ get serverRepository() {
83318
+ return this._serverRepository;
83319
+ }
83055
83320
  get database() {
83056
83321
  return this.db;
83057
83322
  }
@@ -88557,7 +88822,7 @@ var BackupService = BackupService_1 = class BackupService2 {
88557
88822
  async deleteBackup(id) {
88558
88823
  const backup = this.metadataService.backupRepository.getById(id);
88559
88824
  if (!backup) {
88560
- throw new Error("Backup not found");
88825
+ return { success: true, message: "Backup already deleted or does not exist" };
88561
88826
  }
88562
88827
  let fileExists = false;
88563
88828
  try {
@@ -88586,7 +88851,6 @@ var BackupService = BackupService_1 = class BackupService2 {
88586
88851
  throw new Error(`Failed to delete backup file: ${errorMessage}. The database record will not be removed.`);
88587
88852
  }
88588
88853
  }
88589
- this.metadataService.backupRepository.delete(id);
88590
88854
  this.metadataService.backupLogsRepository.create({
88591
88855
  operation: "backup_deleted",
88592
88856
  backupId: id,
@@ -88596,6 +88860,7 @@ var BackupService = BackupService_1 = class BackupService2 {
88596
88860
  fileSize: backup.fileSize,
88597
88861
  status: "success"
88598
88862
  });
88863
+ this.metadataService.backupRepository.delete(id);
88599
88864
  const message = fileExists ? "Backup deleted successfully" : "Backup record deleted (file was already removed from disk)";
88600
88865
  return { success: true, message };
88601
88866
  }
@@ -89626,18 +89891,509 @@ BackupModule = __decorate29([
89626
89891
  })
89627
89892
  ], BackupModule);
89628
89893
 
89629
- // apps/api/dist/app.module.js
89894
+ // apps/api/dist/servers/servers.module.js
89895
+ var import_common30 = __toESM(require_common(), 1);
89896
+
89897
+ // apps/api/dist/servers/servers.controller.js
89898
+ var import_common29 = __toESM(require_common(), 1);
89630
89899
  var __decorate30 = function(decorators, target, key, desc) {
89631
89900
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
89632
89901
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
89633
89902
  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;
89634
89903
  return c > 3 && r && Object.defineProperty(target, key, r), r;
89635
89904
  };
89905
+ var __metadata18 = function(k, v) {
89906
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
89907
+ };
89908
+ var __param10 = function(paramIndex, decorator) {
89909
+ return function(target, key) {
89910
+ decorator(target, key, paramIndex);
89911
+ };
89912
+ };
89913
+ var ServersController = class ServersController2 {
89914
+ metadataService;
89915
+ constructor(metadataService) {
89916
+ this.metadataService = metadataService;
89917
+ }
89918
+ getServers(engine) {
89919
+ if (engine) {
89920
+ return this.metadataService.serverRepository.findByEngine(engine);
89921
+ }
89922
+ return this.metadataService.serverRepository.findAll();
89923
+ }
89924
+ getServer(id) {
89925
+ return this.metadataService.serverRepository.findById(id);
89926
+ }
89927
+ getServerDatabases(id) {
89928
+ return this.metadataService.connectionRepository.findByServerId(id);
89929
+ }
89930
+ getServerPassword(id) {
89931
+ const password = this.metadataService.serverRepository.getPassword(id);
89932
+ return { password };
89933
+ }
89934
+ createServer(input) {
89935
+ const server = this.metadataService.serverRepository.create(input);
89936
+ this.metadataService.auditLogRepository.create({
89937
+ action: "server_created",
89938
+ entityType: "server",
89939
+ entityId: server.id,
89940
+ details: {
89941
+ name: server.name,
89942
+ engine: server.engine,
89943
+ host: server.host,
89944
+ port: server.port
89945
+ }
89946
+ });
89947
+ return server;
89948
+ }
89949
+ updateServer(id, input) {
89950
+ const server = this.metadataService.serverRepository.update(id, input);
89951
+ if (server) {
89952
+ this.metadataService.auditLogRepository.create({
89953
+ action: "server_updated",
89954
+ entityType: "server",
89955
+ entityId: id,
89956
+ details: {
89957
+ name: server.name,
89958
+ changes: input
89959
+ }
89960
+ });
89961
+ }
89962
+ return server;
89963
+ }
89964
+ deleteServer(id) {
89965
+ const server = this.metadataService.serverRepository.findById(id);
89966
+ const linkedDatabases = this.metadataService.connectionRepository.findByServerId(id);
89967
+ if (linkedDatabases.length > 0) {
89968
+ return {
89969
+ success: false,
89970
+ message: `Cannot delete server with ${linkedDatabases.length} linked database(s). Remove or reassign them first.`
89971
+ };
89972
+ }
89973
+ const success = this.metadataService.serverRepository.delete(id);
89974
+ if (success && server) {
89975
+ this.metadataService.auditLogRepository.create({
89976
+ action: "server_deleted",
89977
+ entityType: "server",
89978
+ entityId: id,
89979
+ details: {
89980
+ name: server.name,
89981
+ engine: server.engine
89982
+ }
89983
+ });
89984
+ }
89985
+ return { success };
89986
+ }
89987
+ async testServerConnection(id) {
89988
+ const server = this.metadataService.serverRepository.findById(id);
89989
+ if (!server) {
89990
+ return { success: false, message: "Server not found" };
89991
+ }
89992
+ const password = this.metadataService.serverRepository.getPassword(id);
89993
+ if (!password) {
89994
+ return { success: false, message: "Server admin credentials not configured" };
89995
+ }
89996
+ try {
89997
+ const connector = this.createServerConnector(server, password);
89998
+ const result = await connector.testConnection();
89999
+ await connector.disconnect();
90000
+ return result;
90001
+ } catch (error) {
90002
+ return {
90003
+ success: false,
90004
+ message: error instanceof Error ? error.message : "Connection failed"
90005
+ };
90006
+ }
90007
+ }
90008
+ async createDatabase(id, input) {
90009
+ const server = this.metadataService.serverRepository.findById(id);
90010
+ if (!server) {
90011
+ return { success: false, message: "Server not found" };
90012
+ }
90013
+ const adminPassword = this.metadataService.serverRepository.getPassword(id);
90014
+ if (!adminPassword || !server.username) {
90015
+ return {
90016
+ success: false,
90017
+ message: "Server admin credentials not configured. Edit the server to add admin username and password."
90018
+ };
90019
+ }
90020
+ const { databaseName, username, password } = input;
90021
+ if (!databaseName || !/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(databaseName)) {
90022
+ throw new import_common29.BadRequestException("Invalid database name. Use letters, numbers, and underscores only.");
90023
+ }
90024
+ try {
90025
+ const connector = this.createServerConnector(server, adminPassword);
90026
+ await connector.connect();
90027
+ if (server.engine === "postgres") {
90028
+ const checkResult = await connector.query(`SELECT 1 FROM pg_database WHERE datname = '${databaseName}'`);
90029
+ if (checkResult.rows.length > 0) {
90030
+ await connector.disconnect();
90031
+ return { success: false, message: `Database "${databaseName}" already exists` };
90032
+ }
90033
+ await connector.query(`CREATE DATABASE "${databaseName}"`);
90034
+ } else {
90035
+ await connector.query(`CREATE DATABASE IF NOT EXISTS \`${databaseName}\``);
90036
+ }
90037
+ if (username && password) {
90038
+ if (server.engine === "postgres") {
90039
+ await connector.query(`DO $$ BEGIN CREATE USER "${username}" WITH PASSWORD '${password}'; EXCEPTION WHEN duplicate_object THEN NULL; END $$`);
90040
+ await connector.query(`GRANT ALL PRIVILEGES ON DATABASE "${databaseName}" TO "${username}"`);
90041
+ } else {
90042
+ await connector.query(`CREATE USER IF NOT EXISTS '${username}'@'%' IDENTIFIED BY '${password}'`);
90043
+ await connector.query(`GRANT ALL PRIVILEGES ON \`${databaseName}\`.* TO '${username}'@'%'`);
90044
+ await connector.query(`FLUSH PRIVILEGES`);
90045
+ }
90046
+ }
90047
+ await connector.disconnect();
90048
+ this.metadataService.auditLogRepository.create({
90049
+ action: "database_created",
90050
+ entityType: "server",
90051
+ entityId: id,
90052
+ details: {
90053
+ serverName: server.name,
90054
+ databaseName,
90055
+ username: username || null
90056
+ }
90057
+ });
90058
+ return {
90059
+ success: true,
90060
+ message: username ? `Database "${databaseName}" created with user "${username}"` : `Database "${databaseName}" created successfully`
90061
+ };
90062
+ } catch (error) {
90063
+ return {
90064
+ success: false,
90065
+ message: error instanceof Error ? error.message : "Failed to create database"
90066
+ };
90067
+ }
90068
+ }
90069
+ async listDatabases(id) {
90070
+ const server = this.metadataService.serverRepository.findById(id);
90071
+ if (!server) {
90072
+ return { success: false, message: "Server not found" };
90073
+ }
90074
+ const password = this.metadataService.serverRepository.getPassword(id);
90075
+ if (!password || !server.username) {
90076
+ return { success: false, message: "Server admin credentials not configured" };
90077
+ }
90078
+ try {
90079
+ const connector = this.createServerConnector(server, password);
90080
+ await connector.connect();
90081
+ const trackedConnections = this.metadataService.connectionRepository.findAll().filter((c) => c.serverId === id);
90082
+ const trackedDbNames = new Set(trackedConnections.map((c) => c.database));
90083
+ let databases = [];
90084
+ if (server.engine === "postgres") {
90085
+ const result = await connector.query(`
90086
+ SELECT
90087
+ d.datname as name,
90088
+ pg_size_pretty(pg_database_size(d.datname)) as size,
90089
+ r.rolname as owner
90090
+ FROM pg_database d
90091
+ JOIN pg_roles r ON d.datdba = r.oid
90092
+ WHERE d.datistemplate = false
90093
+ AND d.datname NOT IN ('postgres')
90094
+ ORDER BY d.datname
90095
+ `);
90096
+ databases = result.rows.map((row) => {
90097
+ const name = row.name;
90098
+ const tracked = trackedDbNames.has(name);
90099
+ const connection = trackedConnections.find((c) => c.database === name);
90100
+ return {
90101
+ name,
90102
+ size: row.size,
90103
+ owner: row.owner,
90104
+ tracked,
90105
+ connectionId: connection?.id
90106
+ };
90107
+ });
90108
+ } else {
90109
+ const result = await connector.query(`
90110
+ SELECT
90111
+ table_schema as name,
90112
+ ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) as size_mb
90113
+ FROM information_schema.tables
90114
+ WHERE table_schema NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
90115
+ GROUP BY table_schema
90116
+ ORDER BY table_schema
90117
+ `);
90118
+ databases = result.rows.map((row) => {
90119
+ const name = row.name;
90120
+ const sizeMb = row.size_mb;
90121
+ const tracked = trackedDbNames.has(name);
90122
+ const connection = trackedConnections.find((c) => c.database === name);
90123
+ return {
90124
+ name,
90125
+ size: sizeMb ? `${sizeMb} MB` : "0 MB",
90126
+ tracked,
90127
+ connectionId: connection?.id
90128
+ };
90129
+ });
90130
+ }
90131
+ await connector.disconnect();
90132
+ return { success: true, databases };
90133
+ } catch (error) {
90134
+ return {
90135
+ success: false,
90136
+ message: error instanceof Error ? error.message : "Failed to list databases"
90137
+ };
90138
+ }
90139
+ }
90140
+ async getServerInfo(id) {
90141
+ const server = this.metadataService.serverRepository.findById(id);
90142
+ if (!server) {
90143
+ return { success: false, message: "Server not found" };
90144
+ }
90145
+ const password = this.metadataService.serverRepository.getPassword(id);
90146
+ if (!password || !server.username) {
90147
+ return { success: false, message: "Server admin credentials not configured" };
90148
+ }
90149
+ try {
90150
+ const connector = this.createServerConnector(server, password);
90151
+ await connector.connect();
90152
+ let info;
90153
+ if (server.engine === "postgres") {
90154
+ const versionResult = await connector.query(`SELECT version()`);
90155
+ const version = versionResult.rows[0]?.version || "Unknown";
90156
+ const uptimeResult = await connector.query(`SELECT EXTRACT(EPOCH FROM (now() - pg_postmaster_start_time()))::int as uptime_seconds`);
90157
+ const uptimeSeconds = uptimeResult.rows[0]?.uptime_seconds || 0;
90158
+ const connectionsResult = await connector.query(`SELECT count(*) as active FROM pg_stat_activity WHERE state = 'active'`);
90159
+ const activeConnections = parseInt(String(connectionsResult.rows[0]?.active || 0), 10);
90160
+ const maxConnResult = await connector.query(`SHOW max_connections`);
90161
+ const maxConnections = parseInt(String(maxConnResult.rows[0]?.max_connections || 100), 10);
90162
+ info = {
90163
+ version: version.split(",")[0] || version,
90164
+ uptime: this.formatUptime(uptimeSeconds),
90165
+ activeConnections,
90166
+ maxConnections,
90167
+ currentDatabase: "postgres"
90168
+ };
90169
+ } else {
90170
+ const versionResult = await connector.query(`SELECT VERSION() as version`);
90171
+ const version = versionResult.rows[0]?.version || "Unknown";
90172
+ const uptimeResult = await connector.query(`SHOW GLOBAL STATUS LIKE 'Uptime'`);
90173
+ const uptimeSeconds = parseInt(String(uptimeResult.rows[0]?.Value || 0), 10);
90174
+ const connectionsResult = await connector.query(`SHOW STATUS LIKE 'Threads_connected'`);
90175
+ const activeConnections = parseInt(String(connectionsResult.rows[0]?.Value || 0), 10);
90176
+ const maxConnResult = await connector.query(`SHOW VARIABLES LIKE 'max_connections'`);
90177
+ const maxConnections = parseInt(String(maxConnResult.rows[0]?.Value || 100), 10);
90178
+ info = {
90179
+ version,
90180
+ uptime: this.formatUptime(uptimeSeconds),
90181
+ activeConnections,
90182
+ maxConnections,
90183
+ currentDatabase: server.engine === "mysql" ? "MySQL" : "MariaDB"
90184
+ };
90185
+ }
90186
+ await connector.disconnect();
90187
+ return { success: true, info };
90188
+ } catch (error) {
90189
+ return {
90190
+ success: false,
90191
+ message: error instanceof Error ? error.message : "Failed to get server info"
90192
+ };
90193
+ }
90194
+ }
90195
+ async dropDatabase(id, dbName) {
90196
+ const server = this.metadataService.serverRepository.findById(id);
90197
+ if (!server) {
90198
+ return { success: false, message: "Server not found" };
90199
+ }
90200
+ const password = this.metadataService.serverRepository.getPassword(id);
90201
+ if (!password || !server.username) {
90202
+ return { success: false, message: "Server admin credentials not configured" };
90203
+ }
90204
+ if (!dbName || !/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(dbName)) {
90205
+ return { success: false, message: "Invalid database name" };
90206
+ }
90207
+ const systemDbs = server.engine === "postgres" ? ["postgres", "template0", "template1"] : ["information_schema", "mysql", "performance_schema", "sys"];
90208
+ if (systemDbs.includes(dbName.toLowerCase())) {
90209
+ return { success: false, message: "Cannot drop system database" };
90210
+ }
90211
+ try {
90212
+ const connector = this.createServerConnector(server, password);
90213
+ await connector.connect();
90214
+ if (server.engine === "postgres") {
90215
+ await connector.query(`
90216
+ SELECT pg_terminate_backend(pid)
90217
+ FROM pg_stat_activity
90218
+ WHERE datname = '${dbName}' AND pid <> pg_backend_pid()
90219
+ `);
90220
+ await connector.query(`DROP DATABASE IF EXISTS "${dbName}"`);
90221
+ } else {
90222
+ await connector.query(`DROP DATABASE IF EXISTS \`${dbName}\``);
90223
+ }
90224
+ await connector.disconnect();
90225
+ const trackedConnections = this.metadataService.connectionRepository.findAll().filter((c) => c.serverId === id && c.database === dbName);
90226
+ for (const conn of trackedConnections) {
90227
+ this.metadataService.connectionRepository.delete(conn.id);
90228
+ }
90229
+ this.metadataService.auditLogRepository.create({
90230
+ action: "database_deleted",
90231
+ entityType: "server",
90232
+ entityId: id,
90233
+ details: {
90234
+ serverName: server.name,
90235
+ databaseName: dbName
90236
+ }
90237
+ });
90238
+ return { success: true, message: `Database "${dbName}" dropped successfully` };
90239
+ } catch (error) {
90240
+ return {
90241
+ success: false,
90242
+ message: error instanceof Error ? error.message : "Failed to drop database"
90243
+ };
90244
+ }
90245
+ }
90246
+ formatUptime(seconds) {
90247
+ const days = Math.floor(seconds / 86400);
90248
+ const hours = Math.floor(seconds % 86400 / 3600);
90249
+ const minutes = Math.floor(seconds % 3600 / 60);
90250
+ if (days > 0) {
90251
+ return `${days}d ${hours}h ${minutes}m`;
90252
+ } else if (hours > 0) {
90253
+ return `${hours}h ${minutes}m`;
90254
+ } else {
90255
+ return `${minutes}m`;
90256
+ }
90257
+ }
90258
+ createServerConnector(server, password) {
90259
+ const config = {
90260
+ host: server.host,
90261
+ port: server.port,
90262
+ database: server.engine === "postgres" ? "postgres" : "",
90263
+ // Connect to maintenance DB
90264
+ username: server.username,
90265
+ password,
90266
+ ssl: server.ssl
90267
+ };
90268
+ if (server.engine === "mysql") {
90269
+ return new MysqlConnector(config, false);
90270
+ }
90271
+ if (server.engine === "mariadb") {
90272
+ return new MysqlConnector(config, true);
90273
+ }
90274
+ return new PostgresConnector(config);
90275
+ }
90276
+ };
90277
+ __decorate30([
90278
+ (0, import_common29.Get)(),
90279
+ __param10(0, (0, import_common29.Query)("engine")),
90280
+ __metadata18("design:type", Function),
90281
+ __metadata18("design:paramtypes", [String]),
90282
+ __metadata18("design:returntype", Array)
90283
+ ], ServersController.prototype, "getServers", null);
90284
+ __decorate30([
90285
+ (0, import_common29.Get)(":id"),
90286
+ __param10(0, (0, import_common29.Param)("id")),
90287
+ __metadata18("design:type", Function),
90288
+ __metadata18("design:paramtypes", [String]),
90289
+ __metadata18("design:returntype", Object)
90290
+ ], ServersController.prototype, "getServer", null);
90291
+ __decorate30([
90292
+ (0, import_common29.Get)(":id/databases"),
90293
+ __param10(0, (0, import_common29.Param)("id")),
90294
+ __metadata18("design:type", Function),
90295
+ __metadata18("design:paramtypes", [String]),
90296
+ __metadata18("design:returntype", Array)
90297
+ ], ServersController.prototype, "getServerDatabases", null);
90298
+ __decorate30([
90299
+ (0, import_common29.Get)(":id/password"),
90300
+ __param10(0, (0, import_common29.Param)("id")),
90301
+ __metadata18("design:type", Function),
90302
+ __metadata18("design:paramtypes", [String]),
90303
+ __metadata18("design:returntype", Object)
90304
+ ], ServersController.prototype, "getServerPassword", null);
90305
+ __decorate30([
90306
+ (0, import_common29.Post)(),
90307
+ __param10(0, (0, import_common29.Body)()),
90308
+ __metadata18("design:type", Function),
90309
+ __metadata18("design:paramtypes", [Object]),
90310
+ __metadata18("design:returntype", Object)
90311
+ ], ServersController.prototype, "createServer", null);
90312
+ __decorate30([
90313
+ (0, import_common29.Put)(":id"),
90314
+ __param10(0, (0, import_common29.Param)("id")),
90315
+ __param10(1, (0, import_common29.Body)()),
90316
+ __metadata18("design:type", Function),
90317
+ __metadata18("design:paramtypes", [String, Object]),
90318
+ __metadata18("design:returntype", Object)
90319
+ ], ServersController.prototype, "updateServer", null);
90320
+ __decorate30([
90321
+ (0, import_common29.Delete)(":id"),
90322
+ __param10(0, (0, import_common29.Param)("id")),
90323
+ __metadata18("design:type", Function),
90324
+ __metadata18("design:paramtypes", [String]),
90325
+ __metadata18("design:returntype", Object)
90326
+ ], ServersController.prototype, "deleteServer", null);
90327
+ __decorate30([
90328
+ (0, import_common29.Post)(":id/test"),
90329
+ __param10(0, (0, import_common29.Param)("id")),
90330
+ __metadata18("design:type", Function),
90331
+ __metadata18("design:paramtypes", [String]),
90332
+ __metadata18("design:returntype", Promise)
90333
+ ], ServersController.prototype, "testServerConnection", null);
90334
+ __decorate30([
90335
+ (0, import_common29.Post)(":id/create-database"),
90336
+ __param10(0, (0, import_common29.Param)("id")),
90337
+ __param10(1, (0, import_common29.Body)()),
90338
+ __metadata18("design:type", Function),
90339
+ __metadata18("design:paramtypes", [String, Object]),
90340
+ __metadata18("design:returntype", Promise)
90341
+ ], ServersController.prototype, "createDatabase", null);
90342
+ __decorate30([
90343
+ (0, import_common29.Get)(":id/list-databases"),
90344
+ __param10(0, (0, import_common29.Param)("id")),
90345
+ __metadata18("design:type", Function),
90346
+ __metadata18("design:paramtypes", [String]),
90347
+ __metadata18("design:returntype", Promise)
90348
+ ], ServersController.prototype, "listDatabases", null);
90349
+ __decorate30([
90350
+ (0, import_common29.Get)(":id/info"),
90351
+ __param10(0, (0, import_common29.Param)("id")),
90352
+ __metadata18("design:type", Function),
90353
+ __metadata18("design:paramtypes", [String]),
90354
+ __metadata18("design:returntype", Promise)
90355
+ ], ServersController.prototype, "getServerInfo", null);
90356
+ __decorate30([
90357
+ (0, import_common29.Delete)(":id/databases/:dbName"),
90358
+ __param10(0, (0, import_common29.Param)("id")),
90359
+ __param10(1, (0, import_common29.Param)("dbName")),
90360
+ __metadata18("design:type", Function),
90361
+ __metadata18("design:paramtypes", [String, String]),
90362
+ __metadata18("design:returntype", Promise)
90363
+ ], ServersController.prototype, "dropDatabase", null);
90364
+ ServersController = __decorate30([
90365
+ (0, import_common29.Controller)("servers"),
90366
+ __metadata18("design:paramtypes", [MetadataService])
90367
+ ], ServersController);
90368
+
90369
+ // apps/api/dist/servers/servers.module.js
90370
+ var __decorate31 = function(decorators, target, key, desc) {
90371
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
90372
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
90373
+ 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;
90374
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
90375
+ };
90376
+ var ServersModule = class ServersModule2 {
90377
+ };
90378
+ ServersModule = __decorate31([
90379
+ (0, import_common30.Module)({
90380
+ imports: [MetadataModule],
90381
+ controllers: [ServersController]
90382
+ })
90383
+ ], ServersModule);
90384
+
90385
+ // apps/api/dist/app.module.js
90386
+ var __decorate32 = function(decorators, target, key, desc) {
90387
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
90388
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
90389
+ 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;
90390
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
90391
+ };
89636
90392
  var __dirname = fileURLToPath(new URL(".", import.meta.url));
89637
90393
  var AppModule = class AppModule2 {
89638
90394
  };
89639
- AppModule = __decorate30([
89640
- (0, import_common29.Module)({
90395
+ AppModule = __decorate32([
90396
+ (0, import_common31.Module)({
89641
90397
  imports: [
89642
90398
  // Serve static files from web build in production
89643
90399
  ...true ? [
@@ -89655,7 +90411,8 @@ AppModule = __decorate30([
89655
90411
  HealthModule,
89656
90412
  ScannerModule,
89657
90413
  AuditModule,
89658
- BackupModule
90414
+ BackupModule,
90415
+ ServersModule
89659
90416
  ]
89660
90417
  })
89661
90418
  ], AppModule);
@@ -89667,7 +90424,7 @@ import * as fs6 from "node:fs";
89667
90424
  var __filename = fileURLToPath2(import.meta.url);
89668
90425
  var __dirname2 = path4.dirname(__filename);
89669
90426
  async function bootstrap() {
89670
- const logger = new import_common30.Logger("Bootstrap");
90427
+ const logger = new import_common32.Logger("Bootstrap");
89671
90428
  const app = await import_core.NestFactory.create(AppModule, {
89672
90429
  bodyParser: true
89673
90430
  });