1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
import * as mongodb from 'mongodb';
import { Transferable } from './Message';
export class Database {
public static DocumentsCollection = 'documents';
public static Instance = new Database();
private MongoClient = mongodb.MongoClient;
private url = 'mongodb://localhost:27017/Dash';
private currentWrites: { [id: string]: Promise<void> } = {};
private db?: mongodb.Db;
constructor() {
this.MongoClient.connect(this.url, (err, client) => this.db = client.db());
}
public update(id: string, value: any, callback: () => void, upsert = true, collectionName = Database.DocumentsCollection) {
if (this.db) {
let collection = this.db.collection(collectionName);
const prom = this.currentWrites[id];
let newProm: Promise<void>;
const run = (): Promise<void> => {
return new Promise<void>(resolve => {
collection.updateOne({ _id: id }, value, { upsert }
, (err, res) => {
if (err) {
console.log(err.message);
console.log(err.errmsg);
}
// if (res) {
// console.log(JSON.stringify(res.result));
// }
if (this.currentWrites[id] === newProm) {
delete this.currentWrites[id];
}
resolve();
callback();
});
});
};
newProm = prom ? prom.then(run) : run();
this.currentWrites[id] = newProm;
}
}
public delete(id: string, collectionName = Database.DocumentsCollection) {
this.db && this.db.collection(collectionName).remove({ id: id });
}
public deleteAll(collectionName = Database.DocumentsCollection): Promise<any> {
return new Promise(res =>
this.db && this.db.collection(collectionName).deleteMany({}, res));
}
public insert(value: any, collectionName = Database.DocumentsCollection) {
if ("id" in value) {
value._id = value.id;
delete value.id;
}
this.db && this.db.collection(collectionName).insertOne(value);
}
public getDocument(id: string, fn: (result?: Transferable) => void, collectionName = Database.DocumentsCollection) {
this.db && this.db.collection(collectionName).findOne({ _id: id }, (err, result) => {
if (result) {
result.id = result._id;
delete result._id;
fn(result);
} else {
fn(undefined);
}
});
}
public getDocuments(ids: string[], fn: (result: Transferable[]) => void, collectionName = Database.DocumentsCollection) {
this.db && this.db.collection(collectionName).find({ _id: { "$in": ids } }).toArray((err, docs) => {
if (err) {
console.log(err.message);
console.log(err.errmsg);
}
fn(docs.map(doc => {
doc.id = doc._id;
delete doc._id;
return doc;
}));
});
}
public print() {
console.log("db says hi!");
}
}
|