@prosopo/database 2.0.3 → 2.1.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.
Files changed (65) hide show
  1. package/dist/base/index.d.ts +3 -0
  2. package/dist/base/index.d.ts.map +1 -0
  3. package/dist/base/index.js +3 -0
  4. package/dist/base/index.js.map +1 -0
  5. package/dist/base/mongo.d.ts +16 -0
  6. package/dist/base/mongo.d.ts.map +1 -0
  7. package/dist/base/mongo.js +89 -0
  8. package/dist/base/mongo.js.map +1 -0
  9. package/dist/{databases → base}/mongoMemory.d.ts +3 -2
  10. package/dist/base/mongoMemory.d.ts.map +1 -0
  11. package/dist/{databases → base}/mongoMemory.js +7 -10
  12. package/dist/base/mongoMemory.js.map +1 -0
  13. package/dist/cjs/base/index.cjs +6 -0
  14. package/dist/cjs/base/mongo.cjs +97 -0
  15. package/dist/cjs/{databases → base}/mongoMemory.cjs +7 -10
  16. package/dist/cjs/databases/captcha.cjs +82 -0
  17. package/dist/cjs/databases/client.cjs +46 -0
  18. package/dist/cjs/databases/index.cjs +12 -3
  19. package/dist/cjs/databases/{mongo.cjs → provider.cjs} +118 -107
  20. package/dist/cjs/index.cjs +11 -6
  21. package/dist/databases/captcha.d.ts +16 -0
  22. package/dist/databases/captcha.d.ts.map +1 -0
  23. package/dist/databases/captcha.js +75 -0
  24. package/dist/databases/captcha.js.map +1 -0
  25. package/dist/databases/client.d.ts +12 -0
  26. package/dist/databases/client.d.ts.map +1 -0
  27. package/dist/databases/client.js +42 -0
  28. package/dist/databases/client.js.map +1 -0
  29. package/dist/databases/index.d.ts +11 -2
  30. package/dist/databases/index.d.ts.map +1 -1
  31. package/dist/databases/index.js +11 -2
  32. package/dist/databases/index.js.map +1 -1
  33. package/dist/databases/{mongo.d.ts → provider.d.ts} +29 -19
  34. package/dist/databases/provider.d.ts.map +1 -0
  35. package/dist/databases/{mongo.js → provider.js} +129 -100
  36. package/dist/databases/provider.js.map +1 -0
  37. package/dist/index.d.ts +1 -2
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -2
  40. package/dist/index.js.map +1 -1
  41. package/package.json +52 -44
  42. package/dist/captchaDatabase/captchaDatabase.d.ts +0 -3
  43. package/dist/captchaDatabase/captchaDatabase.d.ts.map +0 -1
  44. package/dist/captchaDatabase/captchaDatabase.js +0 -49
  45. package/dist/captchaDatabase/captchaDatabase.js.map +0 -1
  46. package/dist/captchaDatabase/index.d.ts +0 -2
  47. package/dist/captchaDatabase/index.d.ts.map +0 -1
  48. package/dist/captchaDatabase/index.js +0 -2
  49. package/dist/captchaDatabase/index.js.map +0 -1
  50. package/dist/cjs/captchaDatabase/captchaDatabase.cjs +0 -59
  51. package/dist/cjs/captchaDatabase/index.cjs +0 -4
  52. package/dist/cjs/eventsDatabase/eventsDatabase.cjs +0 -47
  53. package/dist/cjs/eventsDatabase/index.cjs +0 -4
  54. package/dist/databases/mongo.d.ts.map +0 -1
  55. package/dist/databases/mongo.js.map +0 -1
  56. package/dist/databases/mongoMemory.d.ts.map +0 -1
  57. package/dist/databases/mongoMemory.js.map +0 -1
  58. package/dist/eventsDatabase/eventsDatabase.d.ts +0 -3
  59. package/dist/eventsDatabase/eventsDatabase.d.ts.map +0 -1
  60. package/dist/eventsDatabase/eventsDatabase.js +0 -48
  61. package/dist/eventsDatabase/eventsDatabase.js.map +0 -1
  62. package/dist/eventsDatabase/index.d.ts +0 -2
  63. package/dist/eventsDatabase/index.d.ts.map +0 -1
  64. package/dist/eventsDatabase/index.js +0 -2
  65. package/dist/eventsDatabase/index.js.map +0 -1
@@ -0,0 +1,3 @@
1
+ export * from "./mongo.js";
2
+ export * from "./mongoMemory.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AAaA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./mongo.js";
2
+ export * from "./mongoMemory.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AAaA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type Logger } from "@prosopo/common";
2
+ import mongoose, { type Connection } from "mongoose";
3
+ export declare class MongoDatabase {
4
+ protected readonly _url: string;
5
+ safeURL: string;
6
+ dbname: string;
7
+ connection?: Connection;
8
+ logger: Logger;
9
+ connected: boolean;
10
+ constructor(url: string, dbname?: string, authSource?: string, logger?: Logger);
11
+ get url(): string;
12
+ getConnection(): mongoose.Connection;
13
+ connect(): Promise<void>;
14
+ close(): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=mongo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.d.ts","sourceRoot":"","sources":["../../src/base/mongo.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,MAAM,EAAoC,MAAM,iBAAiB,CAAC;AAEhF,OAAO,QAAQ,EAAE,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAarD,qBAAa,aAAa;IACzB,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,UAAS;gBAGjB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM;IAgBhB,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,aAAa,IAAI,QAAQ,CAAC,UAAU;IAa9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgExB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI5B"}
@@ -0,0 +1,89 @@
1
+ import { ProsopoDBError, getLoggerDefault } from "@prosopo/common";
2
+ import { ServerApiVersion } from "mongodb";
3
+ import mongoose from "mongoose";
4
+ mongoose.set("strictQuery", false);
5
+ const DEFAULT_ENDPOINT = "mongodb://127.0.0.1:27017";
6
+ export class MongoDatabase {
7
+ constructor(url, dbname, authSource, logger) {
8
+ this.connected = false;
9
+ const baseEndpoint = url || DEFAULT_ENDPOINT;
10
+ const parsedUrl = new URL(baseEndpoint);
11
+ if (dbname) {
12
+ parsedUrl.pathname = dbname;
13
+ }
14
+ if (authSource) {
15
+ parsedUrl.searchParams.set("authSource", authSource);
16
+ }
17
+ this._url = parsedUrl.toString();
18
+ this.safeURL = this.url.replace(/\w+:\w+/, "<Credentials>");
19
+ this.dbname = dbname || parsedUrl.pathname.replace("/", "");
20
+ this.logger = logger || getLoggerDefault();
21
+ }
22
+ get url() {
23
+ return this._url;
24
+ }
25
+ getConnection() {
26
+ if (!this.connection) {
27
+ throw new ProsopoDBError("DATABASE.CONNECTION_UNDEFINED", {
28
+ context: { failedFuncName: this.getConnection.name },
29
+ logger: this.logger,
30
+ });
31
+ }
32
+ return this.connection;
33
+ }
34
+ async connect() {
35
+ this.logger.info(`Mongo url: ${this.safeURL}`);
36
+ if (this.connected) {
37
+ this.logger.info(`Database connection to ${this.safeURL} already open`);
38
+ return;
39
+ }
40
+ this.connection = await new Promise((resolve, reject) => {
41
+ const connection = mongoose.createConnection(this.url, {
42
+ dbName: this.dbname,
43
+ serverApi: ServerApiVersion.v1,
44
+ });
45
+ connection.on("open", () => {
46
+ this.logger.info(`Database connection to ${this.safeURL} opened`);
47
+ this.connected = true;
48
+ resolve(connection);
49
+ });
50
+ connection.on("error", (err) => {
51
+ this.connected = false;
52
+ this.logger.error(`Database error: ${err}`);
53
+ reject(err);
54
+ });
55
+ connection.on("connected", () => {
56
+ this.logger.info(`Database connected to ${this.safeURL}`);
57
+ this.connected = true;
58
+ resolve(connection);
59
+ });
60
+ connection.on("disconnected", () => {
61
+ this.connected = false;
62
+ this.logger.info(`Database disconnected from ${this.safeURL}`);
63
+ });
64
+ connection.on("reconnected", () => {
65
+ this.logger.info(`Database reconnected to ${this.safeURL}`);
66
+ this.connected = true;
67
+ resolve(connection);
68
+ });
69
+ connection.on("reconnectFailed", () => {
70
+ this.connected = false;
71
+ this.logger.error(`Database reconnect failed to ${this.safeURL}`);
72
+ });
73
+ connection.on("close", () => {
74
+ this.connected = false;
75
+ this.logger.info(`Database connection to ${this.safeURL} closed`);
76
+ });
77
+ connection.on("fullsetup", () => {
78
+ this.connected = true;
79
+ this.logger.info(`Database connection to ${this.safeURL} is fully setup`);
80
+ resolve(connection);
81
+ });
82
+ });
83
+ }
84
+ async close() {
85
+ this.logger.debug(`Closing connection to ${this.safeURL}`);
86
+ await this.connection?.close();
87
+ }
88
+ }
89
+ //# sourceMappingURL=mongo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.js","sourceRoot":"","sources":["../../src/base/mongo.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import type { Logger } from "@prosopo/common";
2
- import { ProsopoDatabase as MongoDatabase } from "./mongo.js";
2
+ import { MongoDatabase } from "./mongo.js";
3
3
  export declare class MongoMemoryDatabase extends MongoDatabase {
4
+ protected readonly _url: string;
4
5
  private mongod;
5
6
  private running;
6
- init(url: string, dbname: string, logger: Logger, authSource?: string): Promise<this>;
7
+ constructor(url: string, dbname: string, logger: Logger, authSource?: string);
7
8
  connect(): Promise<void>;
8
9
  close(): Promise<void>;
9
10
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongoMemory.d.ts","sourceRoot":"","sources":["../../src/base/mongoMemory.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,qBAAa,mBAAoB,SAAQ,aAAa;IACrD,mBAA4B,IAAI,EAAE,MAAM,CAAC;IACzC,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,OAAO,CAAS;gBAGvB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM;IASX,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAYlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAOrC"}
@@ -1,16 +1,13 @@
1
1
  import { MongoMemoryServer } from "mongodb-memory-server";
2
- import { ProsopoDatabase as MongoDatabase } from "./mongo.js";
2
+ import { MongoDatabase } from "./mongo.js";
3
3
  export class MongoMemoryDatabase extends MongoDatabase {
4
- constructor() {
5
- super(...arguments);
4
+ constructor(url, dbname, logger, authSource) {
5
+ const mongod = new MongoMemoryServer();
6
+ const mongoMemoryURL = mongod.getUri();
7
+ super(mongoMemoryURL, dbname, authSource, logger);
6
8
  this.running = false;
7
- }
8
- async init(url, dbname, logger, authSource) {
9
- this.mongod = await MongoMemoryServer.create();
10
- this.running = true;
11
- const mongoMemoryURL = this.mongod.getUri();
12
- await super.init(mongoMemoryURL, dbname, logger, authSource);
13
- return this;
9
+ this.mongod = mongod;
10
+ this._url = mongoMemoryURL;
14
11
  }
15
12
  connect() {
16
13
  if (!this.running) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongoMemory.js","sourceRoot":"","sources":["../../src/base/mongoMemory.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAKrD,YACC,GAAW,EACX,MAAc,EACd,MAAc,EACd,UAAmB;QAEnB,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACvC,KAAK,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAV3C,YAAO,GAAG,KAAK,CAAC;QAWvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC5B,CAAC;IAEQ,OAAO;QACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAGnB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,CAAC;QAER,CAAC;QACD,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAEQ,KAAK,CAAC,KAAK;QACnB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAGpB,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACtB,CAAC;CACD"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const mongo = require("./mongo.cjs");
4
+ const mongoMemory = require("./mongoMemory.cjs");
5
+ exports.MongoDatabase = mongo.MongoDatabase;
6
+ exports.MongoMemoryDatabase = mongoMemory.MongoMemoryDatabase;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const common = require("@prosopo/common");
4
+ const mongodb = require("mongodb");
5
+ const mongoose = require("mongoose");
6
+ mongoose.set("strictQuery", false);
7
+ const DEFAULT_ENDPOINT = "mongodb://127.0.0.1:27017";
8
+ class MongoDatabase {
9
+ constructor(url, dbname, authSource, logger) {
10
+ this.connected = false;
11
+ const baseEndpoint = url || DEFAULT_ENDPOINT;
12
+ const parsedUrl = new URL(baseEndpoint);
13
+ if (dbname) {
14
+ parsedUrl.pathname = dbname;
15
+ }
16
+ if (authSource) {
17
+ parsedUrl.searchParams.set("authSource", authSource);
18
+ }
19
+ this._url = parsedUrl.toString();
20
+ this.safeURL = this.url.replace(/\w+:\w+/, "<Credentials>");
21
+ this.dbname = dbname || parsedUrl.pathname.replace("/", "");
22
+ this.logger = logger || common.getLoggerDefault();
23
+ }
24
+ get url() {
25
+ return this._url;
26
+ }
27
+ getConnection() {
28
+ if (!this.connection) {
29
+ throw new common.ProsopoDBError("DATABASE.CONNECTION_UNDEFINED", {
30
+ context: { failedFuncName: this.getConnection.name },
31
+ logger: this.logger
32
+ });
33
+ }
34
+ return this.connection;
35
+ }
36
+ /**
37
+ * @description Connect to the database and set the various tables
38
+ */
39
+ async connect() {
40
+ this.logger.info(`Mongo url: ${this.safeURL}`);
41
+ if (this.connected) {
42
+ this.logger.info(`Database connection to ${this.safeURL} already open`);
43
+ return;
44
+ }
45
+ this.connection = await new Promise((resolve, reject) => {
46
+ const connection = mongoose.createConnection(this.url, {
47
+ dbName: this.dbname,
48
+ serverApi: mongodb.ServerApiVersion.v1
49
+ });
50
+ connection.on("open", () => {
51
+ this.logger.info(`Database connection to ${this.safeURL} opened`);
52
+ this.connected = true;
53
+ resolve(connection);
54
+ });
55
+ connection.on("error", (err) => {
56
+ this.connected = false;
57
+ this.logger.error(`Database error: ${err}`);
58
+ reject(err);
59
+ });
60
+ connection.on("connected", () => {
61
+ this.logger.info(`Database connected to ${this.safeURL}`);
62
+ this.connected = true;
63
+ resolve(connection);
64
+ });
65
+ connection.on("disconnected", () => {
66
+ this.connected = false;
67
+ this.logger.info(`Database disconnected from ${this.safeURL}`);
68
+ });
69
+ connection.on("reconnected", () => {
70
+ this.logger.info(`Database reconnected to ${this.safeURL}`);
71
+ this.connected = true;
72
+ resolve(connection);
73
+ });
74
+ connection.on("reconnectFailed", () => {
75
+ this.connected = false;
76
+ this.logger.error(`Database reconnect failed to ${this.safeURL}`);
77
+ });
78
+ connection.on("close", () => {
79
+ this.connected = false;
80
+ this.logger.info(`Database connection to ${this.safeURL} closed`);
81
+ });
82
+ connection.on("fullsetup", () => {
83
+ this.connected = true;
84
+ this.logger.info(
85
+ `Database connection to ${this.safeURL} is fully setup`
86
+ );
87
+ resolve(connection);
88
+ });
89
+ });
90
+ }
91
+ /** Close connection to the database */
92
+ async close() {
93
+ this.logger.debug(`Closing connection to ${this.safeURL}`);
94
+ await this.connection?.close();
95
+ }
96
+ }
97
+ exports.MongoDatabase = MongoDatabase;
@@ -2,17 +2,14 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const mongodbMemoryServer = require("mongodb-memory-server");
4
4
  const mongo = require("./mongo.cjs");
5
- class MongoMemoryDatabase extends mongo.ProsopoDatabase {
6
- constructor() {
7
- super(...arguments);
5
+ class MongoMemoryDatabase extends mongo.MongoDatabase {
6
+ constructor(url, dbname, logger, authSource) {
7
+ const mongod = new mongodbMemoryServer.MongoMemoryServer();
8
+ const mongoMemoryURL = mongod.getUri();
9
+ super(mongoMemoryURL, dbname, authSource, logger);
8
10
  this.running = false;
9
- }
10
- async init(url, dbname, logger, authSource) {
11
- this.mongod = await mongodbMemoryServer.MongoMemoryServer.create();
12
- this.running = true;
13
- const mongoMemoryURL = this.mongod.getUri();
14
- await super.init(mongoMemoryURL, dbname, logger, authSource);
15
- return this;
11
+ this.mongod = mongod;
12
+ this._url = mongoMemoryURL;
16
13
  }
17
14
  connect() {
18
15
  if (!this.running) {
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const common = require("@prosopo/common");
4
+ const typesDatabase = require("@prosopo/types-database");
5
+ require("../base/index.cjs");
6
+ const mongo = require("../base/mongo.cjs");
7
+ const logger = common.getLoggerDefault();
8
+ var TableNames = /* @__PURE__ */ ((TableNames2) => {
9
+ TableNames2["commitment"] = "commitment";
10
+ TableNames2["powcaptcha"] = "powcaptcha";
11
+ return TableNames2;
12
+ })(TableNames || {});
13
+ const CAPTCHA_TABLES = [
14
+ {
15
+ collectionName: "powcaptcha",
16
+ modelName: "PowCaptcha",
17
+ schema: typesDatabase.PoWCaptchaRecordSchema
18
+ },
19
+ {
20
+ collectionName: "commitment",
21
+ modelName: "UserCommitment",
22
+ schema: typesDatabase.UserCommitmentRecordSchema
23
+ }
24
+ ];
25
+ class CaptchaDatabase extends mongo.MongoDatabase {
26
+ constructor(url, dbname, authSource, logger2) {
27
+ super(url, dbname, authSource, logger2);
28
+ this.tables = {};
29
+ }
30
+ async connect() {
31
+ await super.connect();
32
+ CAPTCHA_TABLES.map(({ collectionName, modelName, schema }) => {
33
+ if (this.connection) {
34
+ this.tables[collectionName] = this.connection.model(modelName, schema);
35
+ }
36
+ });
37
+ }
38
+ getTables() {
39
+ if (!this.tables) {
40
+ throw new common.ProsopoDBError("DATABASE.TABLES_UNDEFINED", {
41
+ context: { failedFuncName: this.getTables.name },
42
+ logger: this.logger
43
+ });
44
+ }
45
+ return this.tables;
46
+ }
47
+ async saveCaptchas(imageCaptchaEvents, powCaptchaEvents) {
48
+ await this.connect();
49
+ if (imageCaptchaEvents.length) {
50
+ const result = await this.tables.commitment.bulkWrite(
51
+ imageCaptchaEvents.map((doc) => {
52
+ const { _id, ...safeDoc } = doc;
53
+ return {
54
+ updateOne: {
55
+ filter: { id: safeDoc.id },
56
+ update: { $set: safeDoc },
57
+ upsert: true
58
+ }
59
+ };
60
+ })
61
+ );
62
+ logger.info("Mongo Saved Image Events", result);
63
+ }
64
+ if (powCaptchaEvents.length) {
65
+ const result = await this.tables.powcaptcha.bulkWrite(
66
+ powCaptchaEvents.map((doc) => {
67
+ const { _id, ...safeDoc } = doc;
68
+ return {
69
+ updateOne: {
70
+ filter: { challenge: safeDoc.challenge },
71
+ update: { $set: safeDoc },
72
+ upsert: true
73
+ }
74
+ };
75
+ })
76
+ );
77
+ logger.info("Mongo Saved PoW Events", result);
78
+ }
79
+ await this.close();
80
+ }
81
+ }
82
+ exports.CaptchaDatabase = CaptchaDatabase;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const common = require("@prosopo/common");
4
+ const typesDatabase = require("@prosopo/types-database");
5
+ require("../base/index.cjs");
6
+ const mongo = require("../base/mongo.cjs");
7
+ const CLIENT_TABLES = [
8
+ {
9
+ collectionName: typesDatabase.TableNames.emails,
10
+ modelName: "Email",
11
+ schema: typesDatabase.UserDataSchema
12
+ }
13
+ ];
14
+ class ClientDatabase extends mongo.MongoDatabase {
15
+ constructor(url, dbname, authSource, logger) {
16
+ super(url, dbname, authSource, logger);
17
+ this.tables = {};
18
+ }
19
+ async connect() {
20
+ await super.connect();
21
+ CLIENT_TABLES.map(({ collectionName, modelName, schema }) => {
22
+ if (this.connection) {
23
+ this.tables[collectionName] = this.connection.model(modelName, schema);
24
+ }
25
+ });
26
+ }
27
+ getTables() {
28
+ if (!this.tables) {
29
+ throw new common.ProsopoDBError("DATABASE.TABLES_UNDEFINED", {
30
+ context: { failedFuncName: this.getTables.name },
31
+ logger: this.logger
32
+ });
33
+ }
34
+ return this.tables;
35
+ }
36
+ async getUpdatedClients(updatedAtTimestamp) {
37
+ await this.connect();
38
+ const newClientRecords = await this.tables.emails.find(
39
+ { updatedAtTimestamp: { $gt: updatedAtTimestamp }, activated: true },
40
+ { account: 1, settings: 1 }
41
+ ).lean();
42
+ await this.close();
43
+ return newClientRecords;
44
+ }
45
+ }
46
+ exports.ClientDatabase = ClientDatabase;
@@ -1,10 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const types = require("@prosopo/types");
4
- const mongo = require("./mongo.cjs");
5
- const mongoMemory = require("./mongoMemory.cjs");
4
+ const mongo = require("../base/mongo.cjs");
5
+ const mongoMemory = require("../base/mongoMemory.cjs");
6
+ const captcha = require("./captcha.cjs");
7
+ const client = require("./client.cjs");
8
+ const provider = require("./provider.cjs");
6
9
  const Databases = {
7
- [types.DatabaseTypes.Values.mongo]: mongo.ProsopoDatabase,
10
+ [types.DatabaseTypes.Values.mongo]: mongo.MongoDatabase,
11
+ [types.DatabaseTypes.Values.provider]: provider.ProviderDatabase,
12
+ [types.DatabaseTypes.Values.client]: client.ClientDatabase,
13
+ [types.DatabaseTypes.Values.captcha]: captcha.CaptchaDatabase,
8
14
  [types.DatabaseTypes.Values.mongoMemory]: mongoMemory.MongoMemoryDatabase
9
15
  };
16
+ exports.CaptchaDatabase = captcha.CaptchaDatabase;
17
+ exports.ClientDatabase = client.ClientDatabase;
18
+ exports.ProviderDatabase = provider.ProviderDatabase;
10
19
  exports.Databases = Databases;