@exogee/graphweaver-mikroorm 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,3 +9,80 @@ Comprehensive documentation and usage examples can be found on our [Docs Site](h
9
9
  ## Graphweaver CLI `graphweaver`
10
10
 
11
11
  The Graphweaver Command Line Interface (CLI) tool enables you to set up and manage Graphweaver using commands in your command-line shell. Check the `graphweaver` npm package [here.](https://www.npmjs.com/package/graphweaver)
12
+
13
+ ## Environment Variables
14
+
15
+ To configure a single database it is possible to use env vars. There are two options:
16
+
17
+ 1. Specify a single AWS Secrets Manager ARN that contains a JSON object of the connection details
18
+
19
+ ```shell
20
+ DATABASE_SECRET_ARN='<AWS SECRET ARN>'
21
+ ```
22
+
23
+ 2. Specify all the parameters as separate env vars
24
+
25
+ ```shell
26
+ DATABASE_HOST='localhost'
27
+ DATABASE_NAME='no_acls'
28
+ DATABASE_PORT='5432'
29
+ DATABASE_USERNAME='postgres'
30
+ DATABASE_PASSWORD='postgres'
31
+ ```
32
+
33
+ If you have multiple databases connected to graphweaver then you will need to pass in the configuration settings in your own code.
34
+
35
+ ```typescript
36
+ const connection = {
37
+ connectionManagerId: 'postgresql',
38
+ entities,
39
+ driver: PostgreSqlDriver,
40
+ mikroOrmConfig: {
41
+ host: process.env.DATABASE_HOST || 'localhost',
42
+ dbName: process.env.DATABASE_NAME || 'no_acls',
43
+ port: process.env.DATABASE_PORT ? Number(process.env.DATABASE_PORT) : 5432,
44
+ user: process.env.DATABASE_USERNAME || 'postgres',
45
+ password: process.env.DATABASE_PASSWORD || 'postgres',
46
+ }
47
+ }
48
+ @Entity('Tag', {
49
+ provider: new MikroBackendProvider(OrmTag, connection),
50
+ })
51
+ ```
52
+
53
+ You can also pass a different ARN per connection:
54
+
55
+ ```typescript
56
+ const connection = {
57
+ connectionManagerId: 'postgresql',
58
+ entities,
59
+ driver: PostgreSqlDriver,
60
+ secretArn: process.env.DATABASE_ONE_SECRET_ARN
61
+ }
62
+ @Entity('Tag', {
63
+ provider: new MikroBackendProvider(OrmTag, connection),
64
+ })
65
+ ```
66
+
67
+ Lastly, you can also pass a function to the MikroOrmConfig option and Graphweaver will await the result. For example:
68
+
69
+ ```typescript
70
+ export const postgresqlConnection: ConnectionOptions = {
71
+ connectionManagerId: 'postgresql',
72
+ mikroOrmConfig: async () => {
73
+ if (!config) {
74
+ logger.info('Resolving new connection config');
75
+ const credentials = await postgresqlCredentials();
76
+ config = {
77
+ entities: [LinkDataEntity, SubmissionDataEntity, UploadDataEntity, VisitDataEntity],
78
+ driver: PostgreSqlDriver,
79
+ ...credentials,
80
+ };
81
+ } else {
82
+ logger.info('Returning pre-cached connection config');
83
+ }
84
+
85
+ return config;
86
+ },
87
+ };
88
+ ```
package/lib/database.d.ts CHANGED
@@ -27,6 +27,7 @@ declare class DatabaseImplementation {
27
27
  transactional<T>(callback: () => Promise<T>, isolationLevel?: IsolationLevel): Promise<T>;
28
28
  isolatedTest(test: () => any): () => Promise<void>;
29
29
  get rawConnection(): import("@mikro-orm/postgresql").PostgreSqlConnection | import("@mikro-orm/postgresql").MySqlConnection | import("@mikro-orm/sqlite").SqliteConnection;
30
+ private getEnvironmentOverrides;
30
31
  private getConnectionInfo;
31
32
  getRepository: <T extends AnyEntity<T>>(entityName: EntityName<T>) => import("@mikro-orm/core").GetRepository<T, import("@mikro-orm/postgresql").EntityRepository<T>>;
32
33
  connect: (connectionOptions?: ConnectionOptions) => Promise<MikroORM<IDatabaseDriver<Connection>, import("@mikro-orm/core").EntityManager<IDatabaseDriver<Connection>>>>;
package/lib/database.js CHANGED
@@ -25,6 +25,7 @@ module.exports = __toCommonJS(database_exports);
25
25
  var import_change_tracker = require("./utils/change-tracker");
26
26
  var import_core = require("@mikro-orm/core");
27
27
  var import_logger = require("@exogee/logger");
28
+ var import_client_secrets_manager = require("@aws-sdk/client-secrets-manager");
28
29
  var IsolationLevel = /* @__PURE__ */ ((IsolationLevel2) => {
29
30
  IsolationLevel2["SERIALIZABLE"] = "SERIALIZABLE";
30
31
  IsolationLevel2["REPEATABLE_READ"] = "REPEATABLE READ";
@@ -40,6 +41,43 @@ const NumericIsolationLevels = {
40
41
  };
41
42
  class DatabaseImplementation {
42
43
  constructor() {
44
+ this.getEnvironmentOverrides = async (secretArn) => {
45
+ import_logger.logger.trace("Database::getEnvironmentOverrides() - Enter");
46
+ const secret = secretArn ?? process.env.DATABASE_SECRET_ARN;
47
+ if (secret) {
48
+ const client = new import_client_secrets_manager.SecretsManagerClient({
49
+ region: process.env.AWS_REGION
50
+ });
51
+ const command = new import_client_secrets_manager.GetSecretValueCommand({ SecretId: secret });
52
+ try {
53
+ import_logger.logger.trace("Fetching secret from Secrets Manager");
54
+ const response = await client.send(command);
55
+ const secret2 = JSON.parse(response.SecretString);
56
+ import_logger.logger.trace("Secret fetched from Secrets Manager");
57
+ return {
58
+ host: secret2.host,
59
+ port: secret2.port,
60
+ user: secret2.username,
61
+ password: secret2.password,
62
+ dbName: secret2.dbname,
63
+ driverOptions: {
64
+ connection: { ssl: true }
65
+ }
66
+ };
67
+ } catch (error) {
68
+ import_logger.logger.error("Error fetching secret from Secrets Manager");
69
+ throw error;
70
+ }
71
+ }
72
+ import_logger.logger.trace("No secret ARN provided, using environment variables");
73
+ return {
74
+ host: process.env.DATABASE_HOST,
75
+ port: process.env.DATABASE_PORT ? Number(process.env.DATABASE_PORT) : void 0,
76
+ user: process.env.DATABASE_USERNAME,
77
+ password: process.env.DATABASE_PASSWORD,
78
+ dbName: process.env.DATABASE_NAME
79
+ };
80
+ };
43
81
  this.getConnectionInfo = async (connectionOptions) => {
44
82
  import_logger.logger.trace("Database::getConnectionInfo() - Enter");
45
83
  const defaults = {
@@ -48,13 +86,7 @@ class DatabaseImplementation {
48
86
  dbName: "graphweaver"
49
87
  };
50
88
  const resolvedMikroOrmConfig = typeof connectionOptions?.mikroOrmConfig === "function" ? await connectionOptions.mikroOrmConfig() : connectionOptions?.mikroOrmConfig;
51
- const environmentOverrides = {
52
- host: process.env.DATABASE_HOST,
53
- port: process.env.DATABASE_PORT ? parseInt(process.env.DATABASE_PORT) : void 0,
54
- user: process.env.DATABASE_USERNAME,
55
- password: process.env.DATABASE_PASSWORD,
56
- dbName: process.env.DATABASE_NAME
57
- };
89
+ const environmentOverrides = await this.getEnvironmentOverrides(connectionOptions?.secretArn);
58
90
  const filterUndefined = (obj) => {
59
91
  if (!obj) return {};
60
92
  for (const key of Object.keys(obj)) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/database.ts"],
4
- "sourcesContent": ["import './utils/change-tracker';\n\nimport {\n\tAnyEntity,\n\tConnection,\n\tEntityName,\n\tIDatabaseDriver,\n\tMikroORM,\n\tOptions,\n\tReflectMetadataProvider,\n} from '@mikro-orm/core';\nimport { logger } from '@exogee/logger';\n\nimport type { EntityManager as PgEntityManager, PostgreSqlDriver } from '@mikro-orm/postgresql';\nimport type { EntityManager as MyEntityManager, MySqlDriver } from '@mikro-orm/mysql';\nimport type { EntityManager as SqliteEntityManager, SqliteDriver } from '@mikro-orm/sqlite';\ntype EntityManager =\n\t| PgEntityManager<PostgreSqlDriver>\n\t| MyEntityManager<MySqlDriver>\n\t| SqliteEntityManager<SqliteDriver>;\n\nexport type DatabaseType = 'mysql' | 'postgresql' | 'sqlite';\n\nexport interface ConnectionOptions {\n\tmikroOrmConfig?: Options | (() => Options | Promise<Options>);\n\tsecretArn?: string;\n\tconnectionManagerId?: string;\n}\n\nexport enum IsolationLevel {\n\tSERIALIZABLE = 'SERIALIZABLE',\n\tREPEATABLE_READ = 'REPEATABLE READ',\n\tREAD_COMMITTED = 'READ COMMITTED',\n\tREAD_UNCOMMITTED = 'READ UNCOMMITTED',\n}\n\nconst NumericIsolationLevels = {\n\t[IsolationLevel.SERIALIZABLE]: 4,\n\t[IsolationLevel.REPEATABLE_READ]: 3,\n\t[IsolationLevel.READ_COMMITTED]: 2,\n\t[IsolationLevel.READ_UNCOMMITTED]: 1,\n};\n\nexport type Database = typeof DatabaseImplementation.prototype;\n\nclass DatabaseImplementation {\n\tprivate cachedOrm?: MikroORM<IDatabaseDriver<Connection>>;\n\tprivate transactionalEm?: EntityManager;\n\tprivate transactionInProgressIsolationLevel?: IsolationLevel;\n\tprivate connectionOptions?: ConnectionOptions;\n\n\tpublic get orm() {\n\t\tif (!this.cachedOrm) {\n\t\t\tconst error = new Error('Tried to get the ORM before it was connected.');\n\t\t\tlogger.error(error);\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn this.cachedOrm;\n\t}\n\n\tpublic get em() {\n\t\treturn this.transactionalEm || (this.orm.em as EntityManager);\n\t}\n\n\tpublic async transactional<T>(\n\t\tcallback: () => Promise<T>,\n\t\tisolationLevel: IsolationLevel = IsolationLevel.READ_COMMITTED\n\t) {\n\t\tlogger.trace('Database::transactional() enter');\n\n\t\tif (\n\t\t\tthis.transactionInProgressIsolationLevel &&\n\t\t\tNumericIsolationLevels[this.transactionInProgressIsolationLevel] <\n\t\t\t\tNumericIsolationLevels[isolationLevel]\n\t\t) {\n\t\t\tconst error = new Error(\n\t\t\t\t`Transaction in progress is ${this.transactionInProgressIsolationLevel} isolation level, but ${isolationLevel} was requested, which is more restrictive. Since we can't upgrade, this is an error.`\n\t\t\t);\n\t\t\tlogger.error(error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (this.transactionalEm) {\n\t\t\t// Transaction is already in progress that is isolated enough. Run the callback without starting a new one.\n\t\t\tlogger.trace(\n\t\t\t\t'Transaction already in progress with sufficient isolation, proceeding without new transaction.'\n\t\t\t);\n\n\t\t\treturn callback();\n\t\t} else {\n\t\t\t// Ok, start a new one.\n\t\t\tlogger.trace('Starting transaction');\n\n\t\t\treturn this.em.transactional(async (em) => {\n\t\t\t\tthis.transactionalEm = em;\n\t\t\t\tthis.transactionInProgressIsolationLevel = isolationLevel;\n\n\t\t\t\tconst driver = this.em.getDriver();\n\t\t\t\tif (driver.constructor.name === 'SqliteDriver') {\n\t\t\t\t\tlogger.trace('All transactions in SQLite are SERIALIZABLE');\n\t\t\t\t} else {\n\t\t\t\t\tawait em.execute(`SET SESSION TRANSACTION ISOLATION LEVEL ${isolationLevel}`);\n\t\t\t\t}\n\n\t\t\t\tlet result: T;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await callback();\n\t\t\t\t} finally {\n\t\t\t\t\tdelete this.transactionalEm;\n\t\t\t\t\tdelete this.transactionInProgressIsolationLevel;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic isolatedTest(test: () => any) {\n\t\treturn async () => {\n\t\t\ttry {\n\t\t\t\tawait this.transactional(async () => {\n\t\t\t\t\tawait test();\n\t\t\t\t\tthrow new Error('Rollback transaction for test');\n\t\t\t\t}, IsolationLevel.SERIALIZABLE);\n\t\t\t} catch (error) {\n\t\t\t\t// Only need to care if this isn't our rollback from above.\n\t\t\t\t// Otherwise just gobble it.\n\t\t\t\tif ((error as Error).message !== 'Rollback transaction for test') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tpublic get rawConnection() {\n\t\treturn this.em.getDriver().getConnection();\n\t}\n\n\tprivate getConnectionInfo = async (connectionOptions?: ConnectionOptions): Promise<Options> => {\n\t\tlogger.trace('Database::getConnectionInfo() - Enter');\n\n\t\t// We have some defaults\n\t\tconst defaults: Options = {\n\t\t\thost: 'localhost',\n\t\t\tport: 5432,\n\t\t\tdbName: 'graphweaver',\n\t\t};\n\n\t\tconst resolvedMikroOrmConfig =\n\t\t\ttypeof connectionOptions?.mikroOrmConfig === 'function'\n\t\t\t\t? await connectionOptions.mikroOrmConfig()\n\t\t\t\t: connectionOptions?.mikroOrmConfig;\n\n\t\t// And finally we can override all of this with environment variables if needed.\n\t\tconst environmentOverrides: Options = {\n\t\t\thost: process.env.DATABASE_HOST,\n\t\t\tport: process.env.DATABASE_PORT ? parseInt(process.env.DATABASE_PORT) : undefined,\n\t\t\tuser: process.env.DATABASE_USERNAME,\n\t\t\tpassword: process.env.DATABASE_PASSWORD,\n\t\t\tdbName: process.env.DATABASE_NAME,\n\t\t};\n\n\t\t// Create a function we can use to filter out undefined values in the object.\n\t\tconst filterUndefined = (obj?: Options) => {\n\t\t\tif (!obj) return {};\n\n\t\t\tfor (const key of Object.keys(obj) as Array<keyof Options>) {\n\t\t\t\tif (obj[key] === undefined) delete obj[key];\n\t\t\t}\n\n\t\t\treturn obj;\n\t\t};\n\n\t\t// Apply each in order so the correct value wins.\n\t\treturn {\n\t\t\t...defaults,\n\t\t\t...filterUndefined(environmentOverrides),\n\t\t\t...filterUndefined(resolvedMikroOrmConfig),\n\t\t};\n\t};\n\n\tpublic getRepository = <T extends AnyEntity<T>>(entityName: EntityName<T>) =>\n\t\tthis.em.getRepository(entityName);\n\n\tpublic connect = async (connectionOptions?: ConnectionOptions) => {\n\t\tlogger.trace('Database::connect() - Enter');\n\t\tthis.connectionOptions = connectionOptions;\n\n\t\tif (this.cachedOrm) {\n\t\t\tlogger.trace('Returning cached ORM');\n\t\t\treturn this.cachedOrm;\n\t\t}\n\n\t\tlogger.trace('Creating new ORM');\n\t\tlogger.trace('Getting connection info');\n\n\t\tconst params = await this.getConnectionInfo(connectionOptions);\n\n\t\tlogger.trace('Initialising ORM');\n\n\t\tlogger.trace(`${params.entities?.length}x entities`);\n\n\t\tconst orm = await MikroORM.init({\n\t\t\tvalidateRequired: false, // Since v5, new entities are validated on runtime (just before executing insert queries), based on the entity metadata\n\n\t\t\timplicitTransactions: false,\n\t\t\tmetadataProvider: ReflectMetadataProvider,\n\t\t\tdiscovery: {\n\t\t\t\tdisableDynamicFileAccess: true,\n\t\t\t\trequireEntitiesArray: false,\n\t\t\t\twarnWhenNoEntities: false,\n\t\t\t},\n\t\t\tallowGlobalContext: true,\n\n\t\t\t// Ensure we only ever create one connection to the database.\n\t\t\tpool: {\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 1,\n\t\t\t},\n\t\t\t...params,\n\t\t});\n\n\t\tlogger.trace('Creating connection to %s on %s', params.dbName, params.host);\n\t\tawait orm.connect();\n\n\t\tlogger.trace('Caching connection');\n\t\tthis.cachedOrm = orm;\n\t\treturn orm;\n\t};\n\n\tpublic close = async () => {\n\t\tlogger.trace('Closing database connection');\n\n\t\tawait this.orm.close(true);\n\t\tdelete this.cachedOrm;\n\t};\n}\n\nclass ConnectionsManager {\n\tprivate connections: Map<string, DatabaseImplementation>;\n\n\tconstructor() {\n\t\tthis.connections = new Map<string, DatabaseImplementation>();\n\t}\n\n\tgetConnections() {\n\t\treturn Array.from(this.connections.values());\n\t}\n\n\tget default(): DatabaseImplementation {\n\t\tconst [defaultConnection] = [...this.connections];\n\t\tif (!defaultConnection)\n\t\t\tthrow new Error(\n\t\t\t\t'Error: No database connections. There should be at least one database connection.'\n\t\t\t);\n\t\tconst [_, databaseConnection] = defaultConnection;\n\t\treturn databaseConnection;\n\t}\n\n\tpublic connect = async (id?: string, connectionOptions?: ConnectionOptions) => {\n\t\tif (!id) throw new Error('Error: No id attached to connection.');\n\n\t\tif (this.connections.has(id)) return this.connections.get(id);\n\t\tconst database = new DatabaseImplementation();\n\t\tif (connectionOptions) await database.connect(connectionOptions);\n\t\tlogger.trace(`Saving database connection with id \"${id}\".`);\n\t\tthis.connections.set(id, database);\n\t};\n\n\tpublic database(id: string) {\n\t\tlogger.trace(`Finding database connection for id \"${id}\"`);\n\t\treturn this.connections.get(id);\n\t}\n\n\tpublic async close(id: string) {\n\t\tconst database = this.database(id);\n\t\tawait database?.close();\n\t\treturn true;\n\t}\n}\nexport const ConnectionManager = new ConnectionsManager();\n"],
5
- "mappings": "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",
6
- "names": ["IsolationLevel"]
4
+ "sourcesContent": ["import './utils/change-tracker';\n\nimport {\n\tAnyEntity,\n\tConnection,\n\tEntityName,\n\tIDatabaseDriver,\n\tMikroORM,\n\tOptions,\n\tReflectMetadataProvider,\n} from '@mikro-orm/core';\nimport { logger } from '@exogee/logger';\nimport { SecretsManagerClient, GetSecretValueCommand } from '@aws-sdk/client-secrets-manager';\n\nimport type { EntityManager as PgEntityManager, PostgreSqlDriver } from '@mikro-orm/postgresql';\nimport type { EntityManager as MyEntityManager, MySqlDriver } from '@mikro-orm/mysql';\nimport type { EntityManager as SqliteEntityManager, SqliteDriver } from '@mikro-orm/sqlite';\ntype EntityManager =\n\t| PgEntityManager<PostgreSqlDriver>\n\t| MyEntityManager<MySqlDriver>\n\t| SqliteEntityManager<SqliteDriver>;\n\nexport type DatabaseType = 'mysql' | 'postgresql' | 'sqlite';\n\nexport interface ConnectionOptions {\n\tmikroOrmConfig?: Options | (() => Options | Promise<Options>);\n\tsecretArn?: string;\n\tconnectionManagerId?: string;\n}\n\nexport enum IsolationLevel {\n\tSERIALIZABLE = 'SERIALIZABLE',\n\tREPEATABLE_READ = 'REPEATABLE READ',\n\tREAD_COMMITTED = 'READ COMMITTED',\n\tREAD_UNCOMMITTED = 'READ UNCOMMITTED',\n}\n\nconst NumericIsolationLevels = {\n\t[IsolationLevel.SERIALIZABLE]: 4,\n\t[IsolationLevel.REPEATABLE_READ]: 3,\n\t[IsolationLevel.READ_COMMITTED]: 2,\n\t[IsolationLevel.READ_UNCOMMITTED]: 1,\n};\n\nexport type Database = typeof DatabaseImplementation.prototype;\n\nclass DatabaseImplementation {\n\tprivate cachedOrm?: MikroORM<IDatabaseDriver<Connection>>;\n\tprivate transactionalEm?: EntityManager;\n\tprivate transactionInProgressIsolationLevel?: IsolationLevel;\n\tprivate connectionOptions?: ConnectionOptions;\n\n\tpublic get orm() {\n\t\tif (!this.cachedOrm) {\n\t\t\tconst error = new Error('Tried to get the ORM before it was connected.');\n\t\t\tlogger.error(error);\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn this.cachedOrm;\n\t}\n\n\tpublic get em() {\n\t\treturn this.transactionalEm || (this.orm.em as EntityManager);\n\t}\n\n\tpublic async transactional<T>(\n\t\tcallback: () => Promise<T>,\n\t\tisolationLevel: IsolationLevel = IsolationLevel.READ_COMMITTED\n\t) {\n\t\tlogger.trace('Database::transactional() enter');\n\n\t\tif (\n\t\t\tthis.transactionInProgressIsolationLevel &&\n\t\t\tNumericIsolationLevels[this.transactionInProgressIsolationLevel] <\n\t\t\t\tNumericIsolationLevels[isolationLevel]\n\t\t) {\n\t\t\tconst error = new Error(\n\t\t\t\t`Transaction in progress is ${this.transactionInProgressIsolationLevel} isolation level, but ${isolationLevel} was requested, which is more restrictive. Since we can't upgrade, this is an error.`\n\t\t\t);\n\t\t\tlogger.error(error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (this.transactionalEm) {\n\t\t\t// Transaction is already in progress that is isolated enough. Run the callback without starting a new one.\n\t\t\tlogger.trace(\n\t\t\t\t'Transaction already in progress with sufficient isolation, proceeding without new transaction.'\n\t\t\t);\n\n\t\t\treturn callback();\n\t\t} else {\n\t\t\t// Ok, start a new one.\n\t\t\tlogger.trace('Starting transaction');\n\n\t\t\treturn this.em.transactional(async (em) => {\n\t\t\t\tthis.transactionalEm = em;\n\t\t\t\tthis.transactionInProgressIsolationLevel = isolationLevel;\n\n\t\t\t\tconst driver = this.em.getDriver();\n\t\t\t\tif (driver.constructor.name === 'SqliteDriver') {\n\t\t\t\t\tlogger.trace('All transactions in SQLite are SERIALIZABLE');\n\t\t\t\t} else {\n\t\t\t\t\tawait em.execute(`SET SESSION TRANSACTION ISOLATION LEVEL ${isolationLevel}`);\n\t\t\t\t}\n\n\t\t\t\tlet result: T;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await callback();\n\t\t\t\t} finally {\n\t\t\t\t\tdelete this.transactionalEm;\n\t\t\t\t\tdelete this.transactionInProgressIsolationLevel;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic isolatedTest(test: () => any) {\n\t\treturn async () => {\n\t\t\ttry {\n\t\t\t\tawait this.transactional(async () => {\n\t\t\t\t\tawait test();\n\t\t\t\t\tthrow new Error('Rollback transaction for test');\n\t\t\t\t}, IsolationLevel.SERIALIZABLE);\n\t\t\t} catch (error) {\n\t\t\t\t// Only need to care if this isn't our rollback from above.\n\t\t\t\t// Otherwise just gobble it.\n\t\t\t\tif ((error as Error).message !== 'Rollback transaction for test') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tpublic get rawConnection() {\n\t\treturn this.em.getDriver().getConnection();\n\t}\n\n\tprivate getEnvironmentOverrides = async (secretArn?: string): Promise<Options> => {\n\t\tlogger.trace('Database::getEnvironmentOverrides() - Enter');\n\t\tconst secret = secretArn ?? process.env.DATABASE_SECRET_ARN;\n\t\tif (secret) {\n\t\t\tconst client = new SecretsManagerClient({\n\t\t\t\tregion: process.env.AWS_REGION,\n\t\t\t});\n\t\t\tconst command = new GetSecretValueCommand({ SecretId: secret });\n\n\t\t\ttry {\n\t\t\t\tlogger.trace('Fetching secret from Secrets Manager');\n\t\t\t\tconst response = await client.send(command);\n\t\t\t\tconst secret = JSON.parse(response.SecretString as string);\n\t\t\t\tlogger.trace('Secret fetched from Secrets Manager');\n\n\t\t\t\treturn {\n\t\t\t\t\thost: secret.host,\n\t\t\t\t\tport: secret.port,\n\t\t\t\t\tuser: secret.username,\n\t\t\t\t\tpassword: secret.password,\n\t\t\t\t\tdbName: secret.dbname,\n\t\t\t\t\tdriverOptions: {\n\t\t\t\t\t\tconnection: { ssl: true },\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Error fetching secret from Secrets Manager');\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tlogger.trace('No secret ARN provided, using environment variables');\n\n\t\treturn {\n\t\t\thost: process.env.DATABASE_HOST,\n\t\t\tport: process.env.DATABASE_PORT ? Number(process.env.DATABASE_PORT) : undefined,\n\t\t\tuser: process.env.DATABASE_USERNAME,\n\t\t\tpassword: process.env.DATABASE_PASSWORD,\n\t\t\tdbName: process.env.DATABASE_NAME,\n\t\t};\n\t};\n\n\tprivate getConnectionInfo = async (connectionOptions?: ConnectionOptions): Promise<Options> => {\n\t\tlogger.trace('Database::getConnectionInfo() - Enter');\n\n\t\t// We have some defaults\n\t\tconst defaults: Options = {\n\t\t\thost: 'localhost',\n\t\t\tport: 5432,\n\t\t\tdbName: 'graphweaver',\n\t\t};\n\n\t\tconst resolvedMikroOrmConfig =\n\t\t\ttypeof connectionOptions?.mikroOrmConfig === 'function'\n\t\t\t\t? await connectionOptions.mikroOrmConfig()\n\t\t\t\t: connectionOptions?.mikroOrmConfig;\n\n\t\t// And finally we can override all of this with environment variables if needed.\n\t\tconst environmentOverrides = await this.getEnvironmentOverrides(connectionOptions?.secretArn);\n\n\t\t// Create a function we can use to filter out undefined values in the object.\n\t\tconst filterUndefined = (obj?: Options) => {\n\t\t\tif (!obj) return {};\n\n\t\t\tfor (const key of Object.keys(obj) as Array<keyof Options>) {\n\t\t\t\tif (obj[key] === undefined) delete obj[key];\n\t\t\t}\n\n\t\t\treturn obj;\n\t\t};\n\n\t\t// Apply each in order so the correct value wins.\n\t\treturn {\n\t\t\t...defaults,\n\t\t\t...filterUndefined(environmentOverrides),\n\t\t\t...filterUndefined(resolvedMikroOrmConfig),\n\t\t};\n\t};\n\n\tpublic getRepository = <T extends AnyEntity<T>>(entityName: EntityName<T>) =>\n\t\tthis.em.getRepository(entityName);\n\n\tpublic connect = async (connectionOptions?: ConnectionOptions) => {\n\t\tlogger.trace('Database::connect() - Enter');\n\t\tthis.connectionOptions = connectionOptions;\n\n\t\tif (this.cachedOrm) {\n\t\t\tlogger.trace('Returning cached ORM');\n\t\t\treturn this.cachedOrm;\n\t\t}\n\n\t\tlogger.trace('Creating new ORM');\n\t\tlogger.trace('Getting connection info');\n\n\t\tconst params = await this.getConnectionInfo(connectionOptions);\n\n\t\tlogger.trace('Initialising ORM');\n\n\t\tlogger.trace(`${params.entities?.length}x entities`);\n\n\t\tconst orm = await MikroORM.init({\n\t\t\tvalidateRequired: false, // Since v5, new entities are validated on runtime (just before executing insert queries), based on the entity metadata\n\n\t\t\timplicitTransactions: false,\n\t\t\tmetadataProvider: ReflectMetadataProvider,\n\t\t\tdiscovery: {\n\t\t\t\tdisableDynamicFileAccess: true,\n\t\t\t\trequireEntitiesArray: false,\n\t\t\t\twarnWhenNoEntities: false,\n\t\t\t},\n\t\t\tallowGlobalContext: true,\n\n\t\t\t// Ensure we only ever create one connection to the database.\n\t\t\tpool: {\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 1,\n\t\t\t},\n\t\t\t...params,\n\t\t});\n\n\t\tlogger.trace('Creating connection to %s on %s', params.dbName, params.host);\n\t\tawait orm.connect();\n\n\t\tlogger.trace('Caching connection');\n\t\tthis.cachedOrm = orm;\n\t\treturn orm;\n\t};\n\n\tpublic close = async () => {\n\t\tlogger.trace('Closing database connection');\n\n\t\tawait this.orm.close(true);\n\t\tdelete this.cachedOrm;\n\t};\n}\n\nclass ConnectionsManager {\n\tprivate connections: Map<string, DatabaseImplementation>;\n\n\tconstructor() {\n\t\tthis.connections = new Map<string, DatabaseImplementation>();\n\t}\n\n\tgetConnections() {\n\t\treturn Array.from(this.connections.values());\n\t}\n\n\tget default(): DatabaseImplementation {\n\t\tconst [defaultConnection] = [...this.connections];\n\t\tif (!defaultConnection)\n\t\t\tthrow new Error(\n\t\t\t\t'Error: No database connections. There should be at least one database connection.'\n\t\t\t);\n\t\tconst [_, databaseConnection] = defaultConnection;\n\t\treturn databaseConnection;\n\t}\n\n\tpublic connect = async (id?: string, connectionOptions?: ConnectionOptions) => {\n\t\tif (!id) throw new Error('Error: No id attached to connection.');\n\n\t\tif (this.connections.has(id)) return this.connections.get(id);\n\t\tconst database = new DatabaseImplementation();\n\t\tif (connectionOptions) await database.connect(connectionOptions);\n\t\tlogger.trace(`Saving database connection with id \"${id}\".`);\n\t\tthis.connections.set(id, database);\n\t};\n\n\tpublic database(id: string) {\n\t\tlogger.trace(`Finding database connection for id \"${id}\"`);\n\t\treturn this.connections.get(id);\n\t}\n\n\tpublic async close(id: string) {\n\t\tconst database = this.database(id);\n\t\tawait database?.close();\n\t\treturn true;\n\t}\n}\nexport const ConnectionManager = new ConnectionsManager();\n"],
5
+ "mappings": "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",
6
+ "names": ["IsolationLevel", "secret"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exogee/graphweaver-mikroorm",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "MikroORM backend for @exogee/graphweaver",
5
5
  "license": "MIT",
6
6
  "main": "lib/index.js",
@@ -13,14 +13,15 @@
13
13
  ],
14
14
  "dependencies": {
15
15
  "@apollo/server": "4.10.4",
16
+ "@aws-sdk/client-secrets-manager": "3.613.0",
16
17
  "dataloader": "2.2.2",
17
18
  "decimal.js": "10.4.3",
18
19
  "dotenv": "16.4.5",
19
20
  "graphql": "16.9.0",
20
21
  "pluralize": "8.0.0",
21
22
  "reflect-metadata": "0.2.2",
22
- "@exogee/graphweaver": "2.0.0",
23
- "@exogee/logger": "2.0.0"
23
+ "@exogee/graphweaver": "2.0.1",
24
+ "@exogee/logger": "2.0.1"
24
25
  },
25
26
  "devDependencies": {
26
27
  "@mikro-orm/core": "6.2.9",