You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.7 KiB
139 lines
3.7 KiB
import { DbQueryWrapper } from './basedb'; |
|
import { wrapIdToQuery, wrapIdsToQuery, isEmptyArray } from './utils'; |
|
|
|
import * as nedb from 'nedb'; |
|
|
|
|
|
export class NeDbQueryWrapper implements DbQueryWrapper { |
|
async dbInsertOne(nd: nedb, doc: object): Promise<string> { |
|
return new Promise<string>((resolve, reject) => { |
|
nd.insert(doc, (err, newDoc: any) => { |
|
if(err) { |
|
reject(err); |
|
} else { |
|
resolve(newDoc._id); |
|
} |
|
}) |
|
}); |
|
} |
|
|
|
async dbInsertMany(nd: nedb, docs: object[]): Promise<string[]> { |
|
if(docs.length === 0) { |
|
return Promise.resolve([]); |
|
} |
|
return new Promise<string[]>((resolve, reject) => { |
|
nd.insert(docs, (err, newDocs: any[]) => { |
|
if(err) { |
|
reject(err); |
|
} else { |
|
resolve(newDocs.map(d => d._id)); |
|
} |
|
}); |
|
}); |
|
} |
|
|
|
async dbUpdateOne(nd: nedb, query: string | object, updateQuery: object): Promise<void> { |
|
// https://github.com/louischatriot/nedb#updating-documents |
|
let nedbUpdateQuery = { $set: updateQuery } |
|
query = wrapIdToQuery(query); |
|
return new Promise<any>((resolve, reject) => { |
|
nd.update( |
|
query, |
|
nedbUpdateQuery, |
|
{ returnUpdatedDocs: true }, |
|
(err: Error, numAffected: number, affectedDocument: any) => { |
|
if(err) { |
|
reject(err); |
|
} else { |
|
resolve(); |
|
} |
|
} |
|
); |
|
}); |
|
} |
|
|
|
async dbUpdateMany(nd: nedb, query: string[] | object, updateQuery: object): Promise<any> { |
|
// https://github.com/louischatriot/nedb#updating-documents |
|
if(isEmptyArray(query)) { |
|
return; |
|
} |
|
let nedbUpdateQuery = { $set: updateQuery }; |
|
query = wrapIdsToQuery(query); |
|
return new Promise<void>((resolve, reject) => { |
|
nd.update( |
|
query, |
|
nedbUpdateQuery, |
|
{ returnUpdatedDocs: true, multi: true }, |
|
(err: Error, numAffected: number, affectedDocuments: any[]) => { |
|
if(err) { |
|
reject(err); |
|
} else { |
|
resolve(); |
|
} |
|
} |
|
); |
|
}); |
|
} |
|
|
|
async dbFindOne(nd: nedb, query: string | object): Promise<any> { |
|
query = wrapIdToQuery(query); |
|
return new Promise<any | null>((resolve, reject) => { |
|
nd.findOne(query, (err, doc) => { |
|
if(err) { |
|
reject(err); |
|
} else { |
|
resolve(doc); |
|
} |
|
}); |
|
}); |
|
} |
|
|
|
async dbFindMany(nd: nedb, query: string[] | object, sortQuery: object = {}): Promise<any[]> { |
|
if(isEmptyArray(query)) { |
|
return Promise.resolve([]); |
|
} |
|
query = wrapIdsToQuery(query); |
|
return new Promise<any[]>((resolve, reject) => { |
|
nd.find(query).sort(sortQuery).exec((err, docs: any[]) => { |
|
if(err) { |
|
reject(err); |
|
} else { |
|
resolve(docs); |
|
} |
|
}); |
|
}); |
|
} |
|
|
|
async dbRemoveOne(nd: nedb, query: string | object): Promise<boolean> { |
|
query = wrapIdToQuery(query); |
|
return new Promise<boolean>((resolve, reject) => { |
|
nd.remove(query, { /* options */ }, (err, numRemoved) => { |
|
if(err) { |
|
reject(err); |
|
} else { |
|
if(numRemoved > 1) { |
|
throw new Error(`Removed ${numRemoved} elements with query: ${JSON.stringify(query)}. Only one is Ok.`); |
|
} else { |
|
resolve(numRemoved == 1); |
|
} |
|
} |
|
}); |
|
}); |
|
} |
|
|
|
async dbRemoveMany(nd: nedb, query: string[] | object): Promise<number> { |
|
if(isEmptyArray(query)) { |
|
return Promise.resolve(0); |
|
} |
|
query = wrapIdsToQuery(query); |
|
return new Promise<number>((resolve, reject) => { |
|
nd.remove(query, { multi: true }, (err, numRemoved) => { |
|
if(err) { |
|
reject(err); |
|
} else { |
|
resolve(numRemoved); |
|
} |
|
}); |
|
}); |
|
} |
|
}
|
|
|