Guest User

Untitled

a guest
Nov 16th, 2018
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.23 KB | None | 0 0
  1. import { DBCore, Query, Transformer } from "./driver";
  2. import { LogGenerator, Logger, createChildLogger } from "@alchemist/logger";
  3. import { Setup, Teardown } from "@alchemist/common-types";
  4. import {
  5. DriversDBNotInitializedError,
  6. DRIVERS_DB_STARTED,
  7. DRIVERS_DB_SHUTDOWN
  8. } from "@alchemist/resources";
  9. import { DBTransaction } from "./DBTransaction";
  10.  
  11. interface Options {
  12. logger: Logger.Logger;
  13. connectionString: string;
  14. userName: string;
  15. password: string;
  16. isEnterprise?: boolean;
  17. }
  18.  
  19. export interface DBOptions extends Options {}
  20.  
  21. export class DB implements LogGenerator, Setup, Teardown {
  22. private db?: DBCore.v1.Driver;
  23. private transformer = new Transformer();
  24. logger: Logger.Logger;
  25. options: Options;
  26. constructor(options: Options) {
  27. this.options = options;
  28. this.logger = this.createLogger(options.logger);
  29. }
  30. createLogger(baseLogger: Logger.Logger) {
  31. return createChildLogger(baseLogger, "DB");
  32. }
  33. get instance() {
  34. if (this.db) {
  35. return this.db;
  36. }
  37.  
  38. throw new DriversDBNotInitializedError();
  39. }
  40. transaction() {
  41. return new DBTransaction(this);
  42. }
  43. getQueryAndParams(query: Query | string, params?: any) {
  44. if (query instanceof Query) {
  45. const { query: q, params: p } = query.buildQueryObject();
  46. return { query: q, params: Object.assign({}, p, params) };
  47. }
  48.  
  49. return { query, params };
  50. }
  51. transformResults<R = any>(result: DBCore.v1.StatementResult) {
  52. return this.transformer.transformRecords<R>(result.records);
  53. }
  54. async runQuery<R = any>(
  55. query: Query | string,
  56. params?: any,
  57. transaction?: DBTransaction,
  58. logger = this.logger.child({ function: this.runQuery.name })
  59. ) {
  60. const { query: q, params: p } = this.getQueryAndParams(query, params);
  61. logger.debug({
  62. query: q,
  63. params: p,
  64. transaction: transaction && transaction.id
  65. });
  66. if (transaction) {
  67. return this.transformResults(await transaction.run(q, p));
  68. }
  69.  
  70. const session = this.instance.session();
  71. try {
  72. return this.transformResults(await session.run(q, p));
  73. } finally {
  74. session.close();
  75. }
  76. }
  77. async setup(): Promise<void> {
  78. const { connectionString, userName, password, isEnterprise } = this.options;
  79. this.db = DBCore.v1.driver(
  80. connectionString,
  81. DBCore.v1.auth.basic(userName, password)
  82. );
  83. this.logger.info(
  84. { connectionString, userName, isEnterprise },
  85. DRIVERS_DB_STARTED
  86. );
  87. }
  88. private static assertEnv(param: string) {
  89. const result = process.env[param];
  90. if (!result) {
  91. throw new Error(`process.env.${param} not available!`);
  92. }
  93.  
  94. return result;
  95. }
  96. static async fromEnv(logger: Logger.Logger) {
  97. const connectionString = `${DB.assertEnv(
  98. "NEO4J_PROTOCOL"
  99. )}://${DB.assertEnv("NEO4J_HOST")}:${DB.assertEnv("NEO4J_PORT")}`;
  100. const userName = DB.assertEnv("NEO4J_USERNAME");
  101. const password = DB.assertEnv("NEO4J_PASSWORD");
  102. const isEnterprise = process.env.NEO4J_ENTERPRISE === "true";
  103. return new DB({
  104. logger,
  105. connectionString,
  106. userName,
  107. password,
  108. isEnterprise
  109. });
  110. }
  111. async teardown(): Promise<void> {
  112. if (this.db) {
  113. this.logger.info(DRIVERS_DB_SHUTDOWN);
  114. this.db.close();
  115. this.db = undefined;
  116. }
  117. }
  118. }
Add Comment
Please, Sign In to add comment