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.
99 lines
3.8 KiB
99 lines
3.8 KiB
import { Collection } from './collection'; |
|
import { getDbQueryWrapper, dbCollection } from '../data_layer'; |
|
import { DbConnector } from './db_connector'; |
|
import { DbConnectorFactory } from './db_connector/factory'; |
|
|
|
|
|
export enum SortingOrder { ASCENDING = 1, DESCENDING = -1 }; |
|
|
|
/** |
|
* Class which helps to make queries to your collection |
|
* |
|
* @param { string | object } query: a key as a string or mongodb-style query |
|
*/ |
|
export type DBQ = { |
|
findOne: (query: string | object) => Promise<any | null>, |
|
findMany: (query: string[] | object, sortQuery?: object) => Promise<any[]>, |
|
insertOne: (document: object) => Promise<string>, |
|
insertMany: (documents: object[]) => Promise<string[]>, |
|
updateOne: (query: string | object, updateQuery: any) => Promise<void>, |
|
updateMany: (query: string[] | object, updateQuery: any) => Promise<void>, |
|
removeOne: (query: string) => Promise<boolean> |
|
removeMany: (query: string[] | object) => Promise<number> |
|
} |
|
|
|
export class DataService { |
|
private static _instance: DataService; |
|
private _queryWrapper = getDbQueryWrapper(); |
|
|
|
private constructor() { |
|
if(DataService._instance !== undefined) { |
|
throw new Error(`Can't create 2nd instance of singleton class`); |
|
} |
|
} |
|
|
|
public static getInstance(): DataService { |
|
if(DataService._instance === undefined) { |
|
DataService._instance = new DataService(); |
|
} |
|
return DataService._instance; |
|
} |
|
|
|
public makeDBQ(collection: Collection): DBQ { |
|
return { |
|
findOne: async (query: object | string) => { |
|
const dbCollection = await this._getDbCollectionFromCollection(collection); |
|
return this._queryWrapper.dbFindOne(dbCollection, query); |
|
}, |
|
findMany: async (query: object | string[], sortQuery: object) => { |
|
const dbCollection = await this._getDbCollectionFromCollection(collection); |
|
return this._queryWrapper.dbFindMany(dbCollection, query, sortQuery); |
|
}, |
|
insertOne: async (doc: object) => { |
|
const dbCollection = await this._getDbCollectionFromCollection(collection); |
|
return this._queryWrapper.dbInsertOne(dbCollection, doc); |
|
}, |
|
insertMany: async (docs: object[]) => { |
|
const dbCollection = await this._getDbCollectionFromCollection(collection); |
|
return this._queryWrapper.dbInsertMany(dbCollection, docs); |
|
}, |
|
updateOne: async(query: object | string, updateQuery: object) => { |
|
const dbCollection = await this._getDbCollectionFromCollection(collection); |
|
return this._queryWrapper.dbUpdateOne(dbCollection, query, updateQuery); |
|
}, |
|
updateMany: async (query: object | string[], updateQuery: object) => { |
|
const dbCollection = await this._getDbCollectionFromCollection(collection); |
|
return this._queryWrapper.dbUpdateMany(dbCollection, query, updateQuery); |
|
}, |
|
removeOne: async (query: string | object) => { |
|
const dbCollection = await this._getDbCollectionFromCollection(collection); |
|
return this._queryWrapper.dbRemoveOne(dbCollection, query); |
|
}, |
|
removeMany: async (query: object | string[]) => { |
|
const dbCollection = await this._getDbCollectionFromCollection(collection); |
|
return this._queryWrapper.dbRemoveMany(dbCollection, query); |
|
} |
|
}; |
|
} |
|
|
|
private async _getConnector(): Promise<DbConnector> { |
|
try { |
|
const connector = await DbConnectorFactory.getDbConnector(); |
|
return connector; |
|
} catch (err) { |
|
console.log(`data service got an error while connecting to database: ${err}`); |
|
throw err; |
|
} |
|
} |
|
|
|
private async _getDbCollectionFromCollection(collection: Collection): Promise<dbCollection> { |
|
const connector = await this._getConnector(); |
|
const db = connector.db; |
|
|
|
let dbCollection = db.get(collection); |
|
if(dbCollection === undefined) { |
|
throw new Error('Can`t find collection ' + collection); |
|
} |
|
return dbCollection; |
|
} |
|
}
|
|
|