UNPKG

4.13 kBJavaScriptView Raw
1/*jslint node: true, plusplus: true, nomen: true, vars: true, esversion: 6 */
2"use strict";
3
4const MongoDb = require('mongodb');
5const Async = require('async');
6const crypto = require('crypto');
7
8const debug = require('debug')('upnpserver:db:mongodb');
9const logger = require('../logger');
10
11const NeDbRegistry = require('./nedbRegistry');
12
13class MongoDbRegistry extends NeDbRegistry {
14
15 /**
16 *
17 */
18 initializeDb(callback) {
19 var url = process.env.MONGODB_URL; //'mongodb://localhost:27017/upnpserver';
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
168module.exports = MongoDbRegistry;