1 |
|
2 | "use strict";
|
3 |
|
4 | const MongoDb = require('mongodb');
|
5 | const Async = require('async');
|
6 | const crypto = require('crypto');
|
7 |
|
8 | const debug = require('debug')('upnpserver:db:mongodb');
|
9 | const logger = require('../logger');
|
10 |
|
11 | const NeDbRegistry = require('./nedbRegistry');
|
12 |
|
13 | class MongoDbRegistry extends NeDbRegistry {
|
14 |
|
15 | |
16 |
|
17 |
|
18 | initializeDb(callback) {
|
19 | var url = process.env.MONGODB_URL;
|
20 |
|
21 | if (!url) {
|
22 | var error=new Error("You must specify MONGODB_URL environment variable");
|
23 | return callback(error);
|
24 | }
|
25 |
|
26 | debug("Connect client to url",url);
|
27 |
|
28 | MongoDb.MongoClient.connect(url, (error, db) => {
|
29 | if (error) {
|
30 | logger.error("Can not connect mongodb server", url, error);
|
31 | return callback(error);
|
32 | }
|
33 |
|
34 | debug("Mongodb connected");
|
35 |
|
36 | var collection = db.collection('nodes');
|
37 | this._configureNodesDb(collection, (error) => {
|
38 | debug("NodesDb",collection,error);
|
39 |
|
40 | if (error) {
|
41 | return callback(error);
|
42 | }
|
43 | this._nodesCollection = collection;
|
44 |
|
45 | var collection2 = db.collection('metas');
|
46 | this._configureMetasDb(collection2, (error) => {
|
47 | debug("MetasDb",collection2,error);
|
48 | if (error) {
|
49 | return callback(error);
|
50 | }
|
51 |
|
52 | this._metasCollection = collection2;
|
53 |
|
54 | var collection3 = db.collection('repositories');
|
55 | this._configureRepositoriesDb(collection3, (error) => {
|
56 | debug("RepositoriesDb",collection3,error);
|
57 | if (error) {
|
58 | return callback(error);
|
59 | }
|
60 |
|
61 | this._repositoriesCollection = collection3;
|
62 |
|
63 | callback();
|
64 | });
|
65 | });
|
66 | });
|
67 | });
|
68 | }
|
69 |
|
70 | |
71 |
|
72 |
|
73 | _ensureIndexes(collection, fields, callback) {
|
74 | Async.eachSeries(fields, (f, callback) => {
|
75 |
|
76 | debug("Ensure Index",f);
|
77 |
|
78 | collection.ensureIndex(f.fieldName, {
|
79 | unique: f.unique,
|
80 | sparse: f.sparse
|
81 |
|
82 | }, (error) => {
|
83 | debug("Index done",error);
|
84 |
|
85 | callback(error);
|
86 | });
|
87 |
|
88 | }, (error) => {
|
89 | if (error) {
|
90 | logger.error(error);
|
91 | return callback(null, error);
|
92 | }
|
93 |
|
94 | debug("Indexes installed !");
|
95 |
|
96 | callback();
|
97 | });
|
98 | }
|
99 |
|
100 | allocateNodeId(node, callback) {
|
101 | var objectID = new MongoDb.ObjectID();
|
102 |
|
103 | node.$id=objectID;
|
104 | node._id=this._convertObjectIDToId(objectID);
|
105 |
|
106 | debug("Allocated id=", objectID);
|
107 |
|
108 | callback();
|
109 | }
|
110 |
|
111 | |
112 |
|
113 |
|
114 | _convertObjectIDToId(id, cache) {
|
115 | if (this.$rootId && this.$rootId.equals(id)) {
|
116 | return 0;
|
117 | }
|
118 | return String(id);
|
119 | }
|
120 |
|
121 | |
122 |
|
123 |
|
124 | _convertIdToObjectID(id, cache) {
|
125 | if (id===0) {
|
126 | return this.$rootId;
|
127 | }
|
128 | return new MongoDb.ObjectID(id);
|
129 | }
|
130 |
|
131 |
|
132 | |
133 |
|
134 |
|
135 | _fillChildrenAndLinkIds(node, objectID, callback) {
|
136 |
|
137 | this._nodesCollection.find( { parentId: objectID }).project({ _id: 1 }).toArray((error, docs) => {
|
138 | debug("Find children by parentId #", objectID, "=>", docs, "error=", error);
|
139 | if (error) {
|
140 | logger.error(error);
|
141 | return callback(error);
|
142 | }
|
143 |
|
144 | if (docs.length) {
|
145 | node.childrenIds=docs.map((doc) => this._convertObjectIDToId(doc._id));
|
146 | }
|
147 | debug("Node.childrenIds #", objectID, "=>", node.childrenIds);
|
148 |
|
149 | this._nodesCollection.find( { refId: objectID }).project({ _id: 1}).toArray((error, docs) => {
|
150 | debug("Find linked by node #", objectID, "=>", docs, "error=", error);
|
151 | if (error) {
|
152 | logger.error(error);
|
153 | return callback(error);
|
154 | }
|
155 |
|
156 | if (docs.length) {
|
157 | node.linkedIds=docs.map((doc) => this._convertObjectIDToId(doc._id));
|
158 | }
|
159 | debug("Node.linkedIds #", objectID, "=>", node.linkedIds);
|
160 |
|
161 | this._saveNode(node, null, callback);
|
162 | });
|
163 | });
|
164 | }
|
165 |
|
166 | }
|
167 |
|
168 | module.exports = MongoDbRegistry;
|