90dc-core 1.16.16 → 1.16.18

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/index.d.ts CHANGED
@@ -16,6 +16,7 @@ export { Log } from "./lib/utils/Logger.js";
16
16
  export { SecretManager } from "./lib/utils/SecretManager.js";
17
17
  export { initializeSentry, isSentryEnabled, scrubObject, captureRequestBody, extractUserContext, buildRequestContext, buildResponseContext, reportErrorToSentry, reportMessageToSentry, type ErrorReportOptions, type SeverityLevel, } from "./lib/utils/SentryUtil.js";
18
18
  export { createMockContext, createMockUser, createAuthenticatedContext, mockDatabase, flushPromises, assertions, executeRoute, type BaseContext, type AuthenticatedContext, type RouterContext, type RouterMiddleware, type RouterLayer, type RouterLike, type SequelizeModelMethods, } from "./lib/testing/testHelpers.js";
19
+ export { TEST_UUIDS, TEST_DATES, TEST_DATA, isValidUUID, generateTestEmail, createTestUser, createTestCoach, createTestHeadCoach, createTestFinanceUser, createTestAdmin, createTestClient, wait, freezeTime, testAssertions, mockResponses, isObject, isArray, } from "./lib/testing/testFixtures.js";
19
20
  export { ConfigValidator, BaseConfigSchema, CommonSchemas, createConfig, ConfigurationError, type BaseConfig } from "./lib/config/ConfigValidator.js";
20
21
  export { AppError, ValidationError, AuthenticationError, ForbiddenError, NotFoundError, ConflictError, UnprocessableEntityError, RateLimitError, InternalServerError, ServiceUnavailableError, DatabaseError, ExternalAPIError, isAppError, isOperationalError, toAppError } from "./lib/Errors/AppError.js";
21
22
  export { ErrorMiddleware, } from "./lib/middlewares/ErrorMiddleware.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wCAAwC,CAAC;AAGvD,cAAc,yBAAyB,CAAA;AAGvC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAA;AAChF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAA;AAChG,YAAY,EACV,wBAAwB,EACxB,yBAAyB,EACzB,aAAa,GACd,MAAM,8BAA8B,CAAA;AACrC,YAAY,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAGlF,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,iBAAiB,EAAC,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,GAAG,EAAC,MAAM,uBAAuB,CAAA;AACzC,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACnB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,0BAA0B,EAC1B,YAAY,EACZ,aAAa,EACb,UAAU,EACV,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,qBAAqB,GAC3B,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,KAAK,UAAU,EAChB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EACL,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,aAAa,EACb,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,UAAU,EACX,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,eAAe,GAChB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAG5F,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAGvF,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,cAAc,EAAE,KAAK,cAAc,EAAC,MAAM,2BAA2B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wCAAwC,CAAC;AAGvD,cAAc,yBAAyB,CAAA;AAGvC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAA;AAChF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAA;AAChG,YAAY,EACV,wBAAwB,EACxB,yBAAyB,EACzB,aAAa,GACd,MAAM,8BAA8B,CAAA;AACrC,YAAY,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAGlF,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,iBAAiB,EAAC,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,GAAG,EAAC,MAAM,uBAAuB,CAAA;AACzC,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACnB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,0BAA0B,EAC1B,YAAY,EACZ,aAAa,EACb,UAAU,EACV,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,qBAAqB,GAC3B,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,IAAI,EACJ,UAAU,EACV,cAAc,EACd,aAAa,EACb,QAAQ,EACR,OAAO,GACR,MAAM,+BAA+B,CAAA;AAGtC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,KAAK,UAAU,EAChB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EACL,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,aAAa,EACb,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,UAAU,EACX,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,eAAe,GAChB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAG5F,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAGvF,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,cAAc,EAAE,KAAK,cAAc,EAAC,MAAM,2BAA2B,CAAA"}
package/dist/index.js CHANGED
@@ -19,6 +19,8 @@ export { SecretManager } from "./lib/utils/SecretManager.js";
19
19
  export { initializeSentry, isSentryEnabled, scrubObject, captureRequestBody, extractUserContext, buildRequestContext, buildResponseContext, reportErrorToSentry, reportMessageToSentry } from "./lib/utils/SentryUtil.js";
20
20
  //Testing Utilities
21
21
  export { createMockContext, createMockUser, createAuthenticatedContext, mockDatabase, flushPromises, assertions, executeRoute } from "./lib/testing/testHelpers.js";
22
+ // Testing Fixtures
23
+ export { TEST_UUIDS, TEST_DATES, TEST_DATA, isValidUUID, generateTestEmail, createTestUser, createTestCoach, createTestHeadCoach, createTestFinanceUser, createTestAdmin, createTestClient, wait, freezeTime, testAssertions, mockResponses, isObject, isArray } from "./lib/testing/testFixtures.js";
22
24
  //Config
23
25
  export { ConfigValidator, BaseConfigSchema, CommonSchemas, createConfig, ConfigurationError } from "./lib/config/ConfigValidator.js";
24
26
  //Errors
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["//Interfaces\nexport * from \"./lib/models/ProgramInterfaces.js\";\nexport * from \"./lib/models/ExerciseInterfaces.js\";\nexport * from \"./lib/models/WorkoutInterfaces.js\";\nexport * from \"./lib/models/UserInterfaces.js\";\nexport * from \"./lib/models/NotificationInterfaces.js\";\n\n//DB Models - Export all models and model arrays\nexport * from \"./lib/dbmodels/index.js\"\n\n//Clients\nexport { EmailClient } from \"./lib/clients/EmailClient.js\"\nexport { PushNotificationClient } from \"./lib/clients/PushNotificationClient.js\"\nexport { FirebasePushNotificationClient } from \"./lib/clients/FirebasePushNotificationClient.js\"\nexport type {\n SendTemplateEmailRequest,\n BatchTemplateEmailRequest,\n EmailResponse,\n} from \"./lib/clients/EmailClient.js\"\nexport type { NotificationPayload } from \"./lib/clients/PushNotificationClient.js\"\n\n//Utils\nexport {AuthenticationUtil} from \"./lib/utils/AuthenticationUtil.js\"\nexport {NotificationsUtil} from \"./lib/utils/NotificationsUtil.js\"\nexport {NotificationClient} from \"./lib/utils/NotificationClient.js\"\nexport {Log} from \"./lib/utils/Logger.js\"\nexport {SecretManager} from \"./lib/utils/SecretManager.js\"\nexport {\n initializeSentry,\n isSentryEnabled,\n scrubObject,\n captureRequestBody,\n extractUserContext,\n buildRequestContext,\n buildResponseContext,\n reportErrorToSentry,\n reportMessageToSentry,\n type ErrorReportOptions,\n type SeverityLevel,\n} from \"./lib/utils/SentryUtil.js\"\n\n//Testing Utilities\nexport {\n createMockContext,\n createMockUser,\n createAuthenticatedContext,\n mockDatabase,\n flushPromises,\n assertions,\n executeRoute,\n type BaseContext,\n type AuthenticatedContext,\n type RouterContext,\n type RouterMiddleware,\n type RouterLayer,\n type RouterLike,\n type SequelizeModelMethods,\n} from \"./lib/testing/testHelpers.js\"\n\n//Config\nexport {\n ConfigValidator,\n BaseConfigSchema,\n CommonSchemas,\n createConfig,\n ConfigurationError,\n type BaseConfig\n} from \"./lib/config/ConfigValidator.js\"\n\n//Errors\nexport {\n AppError,\n ValidationError,\n AuthenticationError,\n ForbiddenError,\n NotFoundError,\n ConflictError,\n UnprocessableEntityError,\n RateLimitError,\n InternalServerError,\n ServiceUnavailableError,\n DatabaseError,\n ExternalAPIError,\n isAppError,\n isOperationalError,\n toAppError\n} from \"./lib/Errors/AppError.js\"\n\n//Middlewares\nexport {\n ErrorMiddleware,\n} from \"./lib/middlewares/ErrorMiddleware.js\"\nexport { validate, type ValidationConfig } from \"./lib/middlewares/ValidationMiddleware.js\";\n\n//Controllers\nexport { BaseController, type RouteConfig } from \"./lib/controllers/BaseController.js\";\n\n\nexport {RedisClient} from \"./lib/classes/Redis.js\"\nexport {DatabaseClient, type DatabaseConfig} from \"./lib/classes/Database.js\""],"names":["EmailClient","PushNotificationClient","FirebasePushNotificationClient","AuthenticationUtil","NotificationsUtil","NotificationClient","Log","SecretManager","initializeSentry","isSentryEnabled","scrubObject","captureRequestBody","extractUserContext","buildRequestContext","buildResponseContext","reportErrorToSentry","reportMessageToSentry","createMockContext","createMockUser","createAuthenticatedContext","mockDatabase","flushPromises","assertions","executeRoute","ConfigValidator","BaseConfigSchema","CommonSchemas","createConfig","ConfigurationError","AppError","ValidationError","AuthenticationError","ForbiddenError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","ServiceUnavailableError","DatabaseError","ExternalAPIError","isAppError","isOperationalError","toAppError","ErrorMiddleware","validate","BaseController","RedisClient","DatabaseClient"],"mappings":"AAAA,YAAY;AACZ,cAAc,oCAAoC;AAClD,cAAc,qCAAqC;AACnD,cAAc,oCAAoC;AAClD,cAAc,iCAAiC;AAC/C,cAAc,yCAAyC;AAEvD,gDAAgD;AAChD,cAAc,iBAAyB;AAEvC,SAAS;AACT,SAASA,WAAW,QAAQ,+BAA8B;AAC1D,SAASC,sBAAsB,QAAQ,0CAAyC;AAChF,SAASC,8BAA8B,QAAQ,kDAAiD;AAQhG,OAAO;AACP,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,iBAAiB,QAAO,mCAAkC;AAClE,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,GAAG,QAAO,wBAAuB;AACzC,SAAQC,aAAa,QAAO,+BAA8B;AAC1D,SACEC,gBAAgB,EAChBC,eAAe,EACfC,WAAW,EACXC,kBAAkB,EAClBC,kBAAkB,EAClBC,mBAAmB,EACnBC,oBAAoB,EACpBC,mBAAmB,EACnBC,qBAAqB,QAGhB,4BAA2B;AAElC,mBAAmB;AACnB,SACEC,iBAAiB,EACjBC,cAAc,EACdC,0BAA0B,EAC1BC,YAAY,EACZC,aAAa,EACbC,UAAU,EACVC,YAAY,QAQP,+BAA8B;AAErC,QAAQ;AACR,SACEC,eAAe,EACfC,gBAAgB,EAChBC,aAAa,EACbC,YAAY,EACZC,kBAAkB,QAEb,kCAAiC;AAExC,QAAQ;AACR,SACEC,QAAQ,EACRC,eAAe,EACfC,mBAAmB,EACnBC,cAAc,EACdC,aAAa,EACbC,aAAa,EACbC,wBAAwB,EACxBC,cAAc,EACdC,mBAAmB,EACnBC,uBAAuB,EACvBC,aAAa,EACbC,gBAAgB,EAChBC,UAAU,EACVC,kBAAkB,EAClBC,UAAU,QACL,2BAA0B;AAEjC,aAAa;AACb,SACEC,eAAe,QACV,uCAAsC;AAC7C,SAASC,QAAQ,QAA+B,4CAA4C;AAE5F,aAAa;AACb,SAASC,cAAc,QAA0B,sCAAsC;AAGvF,SAAQC,WAAW,QAAO,yBAAwB;AAClD,SAAQC,cAAc,QAA4B,4BAA2B"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["//Interfaces\nexport * from \"./lib/models/ProgramInterfaces.js\";\nexport * from \"./lib/models/ExerciseInterfaces.js\";\nexport * from \"./lib/models/WorkoutInterfaces.js\";\nexport * from \"./lib/models/UserInterfaces.js\";\nexport * from \"./lib/models/NotificationInterfaces.js\";\n\n//DB Models - Export all models and model arrays\nexport * from \"./lib/dbmodels/index.js\"\n\n//Clients\nexport { EmailClient } from \"./lib/clients/EmailClient.js\"\nexport { PushNotificationClient } from \"./lib/clients/PushNotificationClient.js\"\nexport { FirebasePushNotificationClient } from \"./lib/clients/FirebasePushNotificationClient.js\"\nexport type {\n SendTemplateEmailRequest,\n BatchTemplateEmailRequest,\n EmailResponse,\n} from \"./lib/clients/EmailClient.js\"\nexport type { NotificationPayload } from \"./lib/clients/PushNotificationClient.js\"\n\n//Utils\nexport {AuthenticationUtil} from \"./lib/utils/AuthenticationUtil.js\"\nexport {NotificationsUtil} from \"./lib/utils/NotificationsUtil.js\"\nexport {NotificationClient} from \"./lib/utils/NotificationClient.js\"\nexport {Log} from \"./lib/utils/Logger.js\"\nexport {SecretManager} from \"./lib/utils/SecretManager.js\"\nexport {\n initializeSentry,\n isSentryEnabled,\n scrubObject,\n captureRequestBody,\n extractUserContext,\n buildRequestContext,\n buildResponseContext,\n reportErrorToSentry,\n reportMessageToSentry,\n type ErrorReportOptions,\n type SeverityLevel,\n} from \"./lib/utils/SentryUtil.js\"\n\n//Testing Utilities\nexport {\n createMockContext,\n createMockUser,\n createAuthenticatedContext,\n mockDatabase,\n flushPromises,\n assertions,\n executeRoute,\n type BaseContext,\n type AuthenticatedContext,\n type RouterContext,\n type RouterMiddleware,\n type RouterLayer,\n type RouterLike,\n type SequelizeModelMethods,\n} from \"./lib/testing/testHelpers.js\"\n\n// Testing Fixtures\nexport {\n TEST_UUIDS,\n TEST_DATES,\n TEST_DATA,\n isValidUUID,\n generateTestEmail,\n createTestUser,\n createTestCoach,\n createTestHeadCoach,\n createTestFinanceUser,\n createTestAdmin,\n createTestClient,\n wait,\n freezeTime,\n testAssertions,\n mockResponses,\n isObject,\n isArray,\n} from \"./lib/testing/testFixtures.js\"\n\n//Config\nexport {\n ConfigValidator,\n BaseConfigSchema,\n CommonSchemas,\n createConfig,\n ConfigurationError,\n type BaseConfig\n} from \"./lib/config/ConfigValidator.js\"\n\n//Errors\nexport {\n AppError,\n ValidationError,\n AuthenticationError,\n ForbiddenError,\n NotFoundError,\n ConflictError,\n UnprocessableEntityError,\n RateLimitError,\n InternalServerError,\n ServiceUnavailableError,\n DatabaseError,\n ExternalAPIError,\n isAppError,\n isOperationalError,\n toAppError\n} from \"./lib/Errors/AppError.js\"\n\n//Middlewares\nexport {\n ErrorMiddleware,\n} from \"./lib/middlewares/ErrorMiddleware.js\"\nexport { validate, type ValidationConfig } from \"./lib/middlewares/ValidationMiddleware.js\";\n\n//Controllers\nexport { BaseController, type RouteConfig } from \"./lib/controllers/BaseController.js\";\n\n\nexport {RedisClient} from \"./lib/classes/Redis.js\"\nexport {DatabaseClient, type DatabaseConfig} from \"./lib/classes/Database.js\""],"names":["EmailClient","PushNotificationClient","FirebasePushNotificationClient","AuthenticationUtil","NotificationsUtil","NotificationClient","Log","SecretManager","initializeSentry","isSentryEnabled","scrubObject","captureRequestBody","extractUserContext","buildRequestContext","buildResponseContext","reportErrorToSentry","reportMessageToSentry","createMockContext","createMockUser","createAuthenticatedContext","mockDatabase","flushPromises","assertions","executeRoute","TEST_UUIDS","TEST_DATES","TEST_DATA","isValidUUID","generateTestEmail","createTestUser","createTestCoach","createTestHeadCoach","createTestFinanceUser","createTestAdmin","createTestClient","wait","freezeTime","testAssertions","mockResponses","isObject","isArray","ConfigValidator","BaseConfigSchema","CommonSchemas","createConfig","ConfigurationError","AppError","ValidationError","AuthenticationError","ForbiddenError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","ServiceUnavailableError","DatabaseError","ExternalAPIError","isAppError","isOperationalError","toAppError","ErrorMiddleware","validate","BaseController","RedisClient","DatabaseClient"],"mappings":"AAAA,YAAY;AACZ,cAAc,oCAAoC;AAClD,cAAc,qCAAqC;AACnD,cAAc,oCAAoC;AAClD,cAAc,iCAAiC;AAC/C,cAAc,yCAAyC;AAEvD,gDAAgD;AAChD,cAAc,iBAAyB;AAEvC,SAAS;AACT,SAASA,WAAW,QAAQ,+BAA8B;AAC1D,SAASC,sBAAsB,QAAQ,0CAAyC;AAChF,SAASC,8BAA8B,QAAQ,kDAAiD;AAQhG,OAAO;AACP,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,iBAAiB,QAAO,mCAAkC;AAClE,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,GAAG,QAAO,wBAAuB;AACzC,SAAQC,aAAa,QAAO,+BAA8B;AAC1D,SACEC,gBAAgB,EAChBC,eAAe,EACfC,WAAW,EACXC,kBAAkB,EAClBC,kBAAkB,EAClBC,mBAAmB,EACnBC,oBAAoB,EACpBC,mBAAmB,EACnBC,qBAAqB,QAGhB,4BAA2B;AAElC,mBAAmB;AACnB,SACEC,iBAAiB,EACjBC,cAAc,EACdC,0BAA0B,EAC1BC,YAAY,EACZC,aAAa,EACbC,UAAU,EACVC,YAAY,QAQP,+BAA8B;AAErC,mBAAmB;AACnB,SACEC,UAAU,EACVC,UAAU,EACVC,SAAS,EACTC,WAAW,EACXC,iBAAiB,EACjBC,cAAc,EACdC,eAAe,EACfC,mBAAmB,EACnBC,qBAAqB,EACrBC,eAAe,EACfC,gBAAgB,EAChBC,IAAI,EACJC,UAAU,EACVC,cAAc,EACdC,aAAa,EACbC,QAAQ,EACRC,OAAO,QACF,gCAA+B;AAEtC,QAAQ;AACR,SACEC,eAAe,EACfC,gBAAgB,EAChBC,aAAa,EACbC,YAAY,EACZC,kBAAkB,QAEb,kCAAiC;AAExC,QAAQ;AACR,SACEC,QAAQ,EACRC,eAAe,EACfC,mBAAmB,EACnBC,cAAc,EACdC,aAAa,EACbC,aAAa,EACbC,wBAAwB,EACxBC,cAAc,EACdC,mBAAmB,EACnBC,uBAAuB,EACvBC,aAAa,EACbC,gBAAgB,EAChBC,UAAU,EACVC,kBAAkB,EAClBC,UAAU,QACL,2BAA0B;AAEjC,aAAa;AACb,SACEC,eAAe,QACV,uCAAsC;AAC7C,SAASC,QAAQ,QAA+B,4CAA4C;AAE5F,aAAa;AACb,SAASC,cAAc,QAA0B,sCAAsC;AAGvF,SAAQC,WAAW,QAAO,yBAAwB;AAClD,SAAQC,cAAc,QAA4B,4BAA2B"}
@@ -5,6 +5,7 @@ export interface DatabaseConfig {
5
5
  DB_POOL_MIN?: number;
6
6
  DB_ACQUIRE_TIMEOUT?: number;
7
7
  DB_IDLE_TIMEOUT?: number;
8
+ DB_EVICT_INTERVAL?: number;
8
9
  logging?: boolean;
9
10
  }
10
11
  export declare class DatabaseClient {
@@ -19,5 +20,6 @@ export declare class DatabaseClient {
19
20
  }): Promise<void>;
20
21
  static isConnectedToDatabase(): boolean;
21
22
  static getSequelizeInstance(): Sequelize;
23
+ private static setupPoolMonitoring;
22
24
  }
23
25
  //# sourceMappingURL=Database.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/lib/classes/Database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKxF,MAAM,WAAW,cAAc;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA0B;IACjD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAkB;IAE5C,MAAM,CAAC,WAAW,CACd,MAAM,CAAC,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,SAAS,EAAE,GACrB,SAAS;WAoCC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;WAmB7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;WAStB,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBhF,MAAM,CAAC,qBAAqB,IAAI,OAAO;IAKvC,MAAM,CAAC,oBAAoB,IAAI,SAAS;CAQ3C"}
1
+ {"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/lib/classes/Database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKxF,MAAM,WAAW,cAAc;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA0B;IACjD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAkB;IAE5C,MAAM,CAAC,WAAW,CACd,MAAM,CAAC,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,SAAS,EAAE,GACrB,SAAS;WA4CC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;WA2C7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;WAStB,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBhF,MAAM,CAAC,qBAAqB,IAAI,OAAO;IAKvC,MAAM,CAAC,oBAAoB,IAAI,SAAS;IASxC,OAAO,CAAC,MAAM,CAAC,mBAAmB;CAkDrC"}
@@ -9,17 +9,19 @@ export class DatabaseClient {
9
9
  if (!config) {
10
10
  throw new Error("DatabaseClient: config is required for first initialization");
11
11
  }
12
+ const poolConfig = {
13
+ max: config.DB_POOL_MAX || 10,
14
+ min: config.DB_POOL_MIN || 0,
15
+ acquire: config.DB_ACQUIRE_TIMEOUT || 60000,
16
+ idle: config.DB_IDLE_TIMEOUT || 10000,
17
+ evict: config.DB_EVICT_INTERVAL || 5000
18
+ };
12
19
  const options = {
13
20
  dialect: "postgres",
14
21
  dialectOptions: {
15
22
  socketPath: new URL(config.DATABASE_URL).hostname
16
23
  },
17
- pool: {
18
- max: config.DB_POOL_MAX || 10,
19
- min: config.DB_POOL_MIN || 0,
20
- acquire: config.DB_ACQUIRE_TIMEOUT || 60000,
21
- idle: config.DB_IDLE_TIMEOUT || 10000
22
- },
24
+ pool: poolConfig,
23
25
  logging: config.logging !== false ? (msg)=>logger.debug(msg) : false,
24
26
  models: models || [],
25
27
  define: {
@@ -27,7 +29,11 @@ export class DatabaseClient {
27
29
  }
28
30
  };
29
31
  DatabaseClient.instance = new Sequelize(config.DATABASE_URL, options);
30
- logger.info("DatabaseClient: Sequelize instance created");
32
+ logger.info("DatabaseClient: Sequelize instance created", {
33
+ poolConfig
34
+ });
35
+ // Set up connection pool monitoring
36
+ DatabaseClient.setupPoolMonitoring();
31
37
  } else if (models && models.length > 0) {
32
38
  DatabaseClient.instance.addModels(models);
33
39
  logger.info(`DatabaseClient: Added ${models.length} additional models`);
@@ -44,7 +50,29 @@ export class DatabaseClient {
44
50
  logger.info("DatabaseClient: Connection authenticated successfully");
45
51
  } catch (error) {
46
52
  DatabaseClient.isConnected = false;
47
- logger.error("DatabaseClient: Unable to connect to database", error);
53
+ // Enhanced error handling for common connection issues
54
+ if (error instanceof Error) {
55
+ if (error.message.includes("too many clients")) {
56
+ logger.error("DatabaseClient: PostgreSQL connection pool exhausted", {
57
+ error: error.message,
58
+ recommendation: "Increase DB_POOL_MAX or check for connection leaks"
59
+ });
60
+ } else if (error.message.includes("timeout")) {
61
+ logger.error("DatabaseClient: Connection timeout", {
62
+ error: error.message,
63
+ recommendation: "Check network connectivity or increase DB_ACQUIRE_TIMEOUT"
64
+ });
65
+ } else if (error.message.includes("authentication failed")) {
66
+ logger.error("DatabaseClient: Authentication failed", {
67
+ error: error.message,
68
+ recommendation: "Verify DB credentials in environment variables"
69
+ });
70
+ } else {
71
+ logger.error("DatabaseClient: Unable to connect to database", error);
72
+ }
73
+ } else {
74
+ logger.error("DatabaseClient: Unable to connect to database", error);
75
+ }
48
76
  throw error;
49
77
  }
50
78
  }
@@ -77,6 +105,50 @@ export class DatabaseClient {
77
105
  }
78
106
  return DatabaseClient.instance;
79
107
  }
108
+ static setupPoolMonitoring() {
109
+ if (!DatabaseClient.instance) {
110
+ return;
111
+ }
112
+ const pool = DatabaseClient.instance.connectionManager?.pool;
113
+ if (!pool) {
114
+ logger.warn("DatabaseClient: Connection pool not available for monitoring");
115
+ return;
116
+ }
117
+ // Log pool stats every 60 seconds in production
118
+ if (process.env.NODE_ENV === "production") {
119
+ setInterval(()=>{
120
+ try {
121
+ const stats = {
122
+ size: pool.size,
123
+ available: pool.available,
124
+ using: pool.using,
125
+ waiting: pool.waiting
126
+ };
127
+ // Only log if pool is being used or has waiting requests
128
+ if (stats.using > 0 || stats.waiting > 0) {
129
+ logger.info("DatabaseClient: Pool stats", stats);
130
+ }
131
+ // Warn if pool is near capacity
132
+ if (stats.using >= pool.max * 0.8) {
133
+ logger.warn("DatabaseClient: Pool usage high", {
134
+ ...stats,
135
+ capacityPercent: Math.round(stats.using / pool.max * 100)
136
+ });
137
+ }
138
+ // Alert if requests are waiting
139
+ if (stats.waiting > 0) {
140
+ logger.error("DatabaseClient: Connections waiting for pool", {
141
+ ...stats,
142
+ message: "Consider increasing DB_POOL_MAX"
143
+ });
144
+ }
145
+ } catch (error) {
146
+ logger.debug("DatabaseClient: Error reading pool stats", error);
147
+ }
148
+ }, 60000); // Every 60 seconds
149
+ }
150
+ logger.info("DatabaseClient: Pool monitoring enabled");
151
+ }
80
152
  }
81
153
 
82
154
  //# sourceMappingURL=Database.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/classes/Database.ts"],"sourcesContent":["import { Sequelize, type SequelizeOptions, type ModelCtor } from \"sequelize-typescript\";\nimport { Log } from \"../utils/Logger.js\";\n\nconst logger = Log.getInstance();\n\nexport interface DatabaseConfig {\n DATABASE_URL: string;\n DB_POOL_MAX?: number;\n DB_POOL_MIN?: number;\n DB_ACQUIRE_TIMEOUT?: number;\n DB_IDLE_TIMEOUT?: number;\n logging?: boolean;\n}\n\nexport class DatabaseClient {\n private static instance: Sequelize | null = null;\n private static isConnected: boolean = false;\n\n static getInstance(\n config?: DatabaseConfig,\n models?: ModelCtor[],\n ): Sequelize {\n if (!DatabaseClient.instance) {\n if (!config) {\n throw new Error(\n \"DatabaseClient: config is required for first initialization\",\n );\n }\n\n const options: SequelizeOptions = {\n dialect: \"postgres\",\n dialectOptions: {\n socketPath: new URL(config.DATABASE_URL).hostname,\n },\n pool: {\n max: config.DB_POOL_MAX || 10,\n min: config.DB_POOL_MIN || 0,\n acquire: config.DB_ACQUIRE_TIMEOUT || 60000,\n idle: config.DB_IDLE_TIMEOUT || 10000,\n },\n logging: config.logging !== false ? (msg: string) => logger.debug(msg) : false,\n models: models || [],\n define: {\n timestamps: false\n }\n };\n\n DatabaseClient.instance = new Sequelize(config.DATABASE_URL, options);\n logger.info(\"DatabaseClient: Sequelize instance created\");\n } else if (models && models.length > 0) {\n DatabaseClient.instance.addModels(models);\n logger.info(`DatabaseClient: Added ${models.length} additional models`);\n }\n\n return DatabaseClient.instance;\n }\n\n static async authenticate(): Promise<void> {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before authenticate()\",\n );\n }\n\n try {\n await DatabaseClient.instance.authenticate();\n DatabaseClient.isConnected = true;\n logger.info(\"DatabaseClient: Connection authenticated successfully\");\n } catch (error) {\n DatabaseClient.isConnected = false;\n logger.error(\"DatabaseClient: Unable to connect to database\", error);\n throw error;\n }\n }\n\n\n static async close(): Promise<void> {\n if (DatabaseClient.instance) {\n await DatabaseClient.instance.close();\n DatabaseClient.instance = null;\n DatabaseClient.isConnected = false;\n logger.info(\"DatabaseClient: Connection closed\");\n }\n }\n\n static async sync(options?: { force?: boolean; alter?: boolean }): Promise<void> {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before sync()\",\n );\n }\n\n try {\n await DatabaseClient.instance.sync(options);\n logger.info(\"DatabaseClient: Models synced with database\", options);\n } catch (error) {\n logger.error(\"DatabaseClient: Failed to sync models\", error);\n throw error;\n }\n }\n\n\n static isConnectedToDatabase(): boolean {\n return DatabaseClient.isConnected;\n }\n\n\n static getSequelizeInstance(): Sequelize {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before getSequelizeInstance()\",\n );\n }\n return DatabaseClient.instance;\n }\n}\n"],"names":["Sequelize","Log","logger","getInstance","DatabaseClient","instance","isConnected","config","models","Error","options","dialect","dialectOptions","socketPath","URL","DATABASE_URL","hostname","pool","max","DB_POOL_MAX","min","DB_POOL_MIN","acquire","DB_ACQUIRE_TIMEOUT","idle","DB_IDLE_TIMEOUT","logging","msg","debug","define","timestamps","info","length","addModels","authenticate","error","close","sync","isConnectedToDatabase","getSequelizeInstance"],"mappings":"AAAA,SAASA,SAAS,QAA+C,uBAAuB;AACxF,SAASC,GAAG,QAAQ,qBAAqB;AAEzC,MAAMC,SAASD,IAAIE,WAAW;AAW9B,OAAO,MAAMC;IACT,OAAeC,WAA6B,KAAK;IACjD,OAAeC,cAAuB,MAAM;IAE5C,OAAOH,YACHI,MAAuB,EACvBC,MAAoB,EACX;QACT,IAAI,CAACJ,eAAeC,QAAQ,EAAE;YAC1B,IAAI,CAACE,QAAQ;gBACT,MAAM,IAAIE,MACN;YAER;YAEA,MAAMC,UAA4B;gBAC9BC,SAAS;gBACTC,gBAAgB;oBACZC,YAAY,IAAIC,IAAIP,OAAOQ,YAAY,EAAEC,QAAQ;gBACrD;gBACAC,MAAM;oBACFC,KAAKX,OAAOY,WAAW,IAAI;oBAC3BC,KAAKb,OAAOc,WAAW,IAAI;oBAC3BC,SAASf,OAAOgB,kBAAkB,IAAI;oBACtCC,MAAMjB,OAAOkB,eAAe,IAAI;gBACpC;gBACAC,SAASnB,OAAOmB,OAAO,KAAK,QAAQ,CAACC,MAAgBzB,OAAO0B,KAAK,CAACD,OAAO;gBACzEnB,QAAQA,UAAU,EAAE;gBACpBqB,QAAQ;oBACJC,YAAY;gBAChB;YACJ;YAEA1B,eAAeC,QAAQ,GAAG,IAAIL,UAAUO,OAAOQ,YAAY,EAAEL;YAC7DR,OAAO6B,IAAI,CAAC;QAChB,OAAO,IAAIvB,UAAUA,OAAOwB,MAAM,GAAG,GAAG;YACpC5B,eAAeC,QAAQ,CAAC4B,SAAS,CAACzB;YAClCN,OAAO6B,IAAI,CAAC,CAAC,sBAAsB,EAAEvB,OAAOwB,MAAM,CAAC,kBAAkB,CAAC;QAC1E;QAEA,OAAO5B,eAAeC,QAAQ;IAClC;IAEA,aAAa6B,eAA8B;QACvC,IAAI,CAAC9B,eAAeC,QAAQ,EAAE;YAC1B,MAAM,IAAII,MACN;QAER;QAEA,IAAI;YACA,MAAML,eAAeC,QAAQ,CAAC6B,YAAY;YAC1C9B,eAAeE,WAAW,GAAG;YAC7BJ,OAAO6B,IAAI,CAAC;QAChB,EAAE,OAAOI,OAAO;YACZ/B,eAAeE,WAAW,GAAG;YAC7BJ,OAAOiC,KAAK,CAAC,iDAAiDA;YAC9D,MAAMA;QACV;IACJ;IAGA,aAAaC,QAAuB;QAChC,IAAIhC,eAAeC,QAAQ,EAAE;YACzB,MAAMD,eAAeC,QAAQ,CAAC+B,KAAK;YACnChC,eAAeC,QAAQ,GAAG;YAC1BD,eAAeE,WAAW,GAAG;YAC7BJ,OAAO6B,IAAI,CAAC;QAChB;IACJ;IAEA,aAAaM,KAAK3B,OAA8C,EAAiB;QAC7E,IAAI,CAACN,eAAeC,QAAQ,EAAE;YAC1B,MAAM,IAAII,MACN;QAER;QAEA,IAAI;YACA,MAAML,eAAeC,QAAQ,CAACgC,IAAI,CAAC3B;YACnCR,OAAO6B,IAAI,CAAC,+CAA+CrB;QAC/D,EAAE,OAAOyB,OAAO;YACZjC,OAAOiC,KAAK,CAAC,yCAAyCA;YACtD,MAAMA;QACV;IACJ;IAGA,OAAOG,wBAAiC;QACpC,OAAOlC,eAAeE,WAAW;IACrC;IAGA,OAAOiC,uBAAkC;QACrC,IAAI,CAACnC,eAAeC,QAAQ,EAAE;YAC1B,MAAM,IAAII,MACN;QAER;QACA,OAAOL,eAAeC,QAAQ;IAClC;AACJ"}
1
+ {"version":3,"sources":["../../../src/lib/classes/Database.ts"],"sourcesContent":["import { Sequelize, type SequelizeOptions, type ModelCtor } from \"sequelize-typescript\";\nimport { Log } from \"../utils/Logger.js\";\n\nconst logger = Log.getInstance();\n\nexport interface DatabaseConfig {\n DATABASE_URL: string;\n DB_POOL_MAX?: number;\n DB_POOL_MIN?: number;\n DB_ACQUIRE_TIMEOUT?: number;\n DB_IDLE_TIMEOUT?: number;\n DB_EVICT_INTERVAL?: number;\n logging?: boolean;\n}\n\nexport class DatabaseClient {\n private static instance: Sequelize | null = null;\n private static isConnected: boolean = false;\n\n static getInstance(\n config?: DatabaseConfig,\n models?: ModelCtor[],\n ): Sequelize {\n if (!DatabaseClient.instance) {\n if (!config) {\n throw new Error(\n \"DatabaseClient: config is required for first initialization\",\n );\n }\n\n const poolConfig = {\n max: config.DB_POOL_MAX || 10,\n min: config.DB_POOL_MIN || 0,\n acquire: config.DB_ACQUIRE_TIMEOUT || 60000,\n idle: config.DB_IDLE_TIMEOUT || 10000,\n evict: config.DB_EVICT_INTERVAL || 5000,\n };\n\n const options: SequelizeOptions = {\n dialect: \"postgres\",\n dialectOptions: {\n socketPath: new URL(config.DATABASE_URL).hostname,\n },\n pool: poolConfig,\n logging: config.logging !== false ? (msg: string) => logger.debug(msg) : false,\n models: models || [],\n define: {\n timestamps: false\n }\n };\n\n DatabaseClient.instance = new Sequelize(config.DATABASE_URL, options);\n logger.info(\"DatabaseClient: Sequelize instance created\", {\n poolConfig,\n });\n\n // Set up connection pool monitoring\n DatabaseClient.setupPoolMonitoring();\n } else if (models && models.length > 0) {\n DatabaseClient.instance.addModels(models);\n logger.info(`DatabaseClient: Added ${models.length} additional models`);\n }\n\n return DatabaseClient.instance;\n }\n\n static async authenticate(): Promise<void> {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before authenticate()\",\n );\n }\n\n try {\n await DatabaseClient.instance.authenticate();\n DatabaseClient.isConnected = true;\n logger.info(\"DatabaseClient: Connection authenticated successfully\");\n } catch (error) {\n DatabaseClient.isConnected = false;\n\n // Enhanced error handling for common connection issues\n if (error instanceof Error) {\n if (error.message.includes(\"too many clients\")) {\n logger.error(\"DatabaseClient: PostgreSQL connection pool exhausted\", {\n error: error.message,\n recommendation: \"Increase DB_POOL_MAX or check for connection leaks\",\n });\n } else if (error.message.includes(\"timeout\")) {\n logger.error(\"DatabaseClient: Connection timeout\", {\n error: error.message,\n recommendation: \"Check network connectivity or increase DB_ACQUIRE_TIMEOUT\",\n });\n } else if (error.message.includes(\"authentication failed\")) {\n logger.error(\"DatabaseClient: Authentication failed\", {\n error: error.message,\n recommendation: \"Verify DB credentials in environment variables\",\n });\n } else {\n logger.error(\"DatabaseClient: Unable to connect to database\", error);\n }\n } else {\n logger.error(\"DatabaseClient: Unable to connect to database\", error);\n }\n\n throw error;\n }\n }\n\n\n static async close(): Promise<void> {\n if (DatabaseClient.instance) {\n await DatabaseClient.instance.close();\n DatabaseClient.instance = null;\n DatabaseClient.isConnected = false;\n logger.info(\"DatabaseClient: Connection closed\");\n }\n }\n\n static async sync(options?: { force?: boolean; alter?: boolean }): Promise<void> {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before sync()\",\n );\n }\n\n try {\n await DatabaseClient.instance.sync(options);\n logger.info(\"DatabaseClient: Models synced with database\", options);\n } catch (error) {\n logger.error(\"DatabaseClient: Failed to sync models\", error);\n throw error;\n }\n }\n\n\n static isConnectedToDatabase(): boolean {\n return DatabaseClient.isConnected;\n }\n\n\n static getSequelizeInstance(): Sequelize {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before getSequelizeInstance()\",\n );\n }\n return DatabaseClient.instance;\n }\n\n private static setupPoolMonitoring(): void {\n if (!DatabaseClient.instance) {\n return;\n }\n\n const pool = (DatabaseClient.instance as any).connectionManager?.pool;\n if (!pool) {\n logger.warn(\"DatabaseClient: Connection pool not available for monitoring\");\n return;\n }\n\n // Log pool stats every 60 seconds in production\n if (process.env.NODE_ENV === \"production\") {\n setInterval(() => {\n try {\n const stats = {\n size: pool.size,\n available: pool.available,\n using: pool.using,\n waiting: pool.waiting,\n };\n\n // Only log if pool is being used or has waiting requests\n if (stats.using > 0 || stats.waiting > 0) {\n logger.info(\"DatabaseClient: Pool stats\", stats);\n }\n\n // Warn if pool is near capacity\n if (stats.using >= pool.max * 0.8) {\n logger.warn(\"DatabaseClient: Pool usage high\", {\n ...stats,\n capacityPercent: Math.round((stats.using / pool.max) * 100),\n });\n }\n\n // Alert if requests are waiting\n if (stats.waiting > 0) {\n logger.error(\"DatabaseClient: Connections waiting for pool\", {\n ...stats,\n message: \"Consider increasing DB_POOL_MAX\",\n });\n }\n } catch (error) {\n logger.debug(\"DatabaseClient: Error reading pool stats\", error);\n }\n }, 60000); // Every 60 seconds\n }\n\n logger.info(\"DatabaseClient: Pool monitoring enabled\");\n }\n}\n"],"names":["Sequelize","Log","logger","getInstance","DatabaseClient","instance","isConnected","config","models","Error","poolConfig","max","DB_POOL_MAX","min","DB_POOL_MIN","acquire","DB_ACQUIRE_TIMEOUT","idle","DB_IDLE_TIMEOUT","evict","DB_EVICT_INTERVAL","options","dialect","dialectOptions","socketPath","URL","DATABASE_URL","hostname","pool","logging","msg","debug","define","timestamps","info","setupPoolMonitoring","length","addModels","authenticate","error","message","includes","recommendation","close","sync","isConnectedToDatabase","getSequelizeInstance","connectionManager","warn","process","env","NODE_ENV","setInterval","stats","size","available","using","waiting","capacityPercent","Math","round"],"mappings":"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"}