import { FilterQuery, FindOneOptions, ObjectId } from 'mongodb'; import { DataDocument, DataModelAbstractMethods } from './method.type'; import { STATUS_CODE_BASE } from '@gongt/ts-stl-library/request/protocol'; import { RequestError } from '@gongt/ts-stl-library/request/request-error'; import { debugPromise, debugStart } from './debug'; import { BaseDocument } from './base.type'; import { ModelFindByIdAndUpdateOptions, ModelFindOneAndUpdateOptions, ModelUpdateOptions, QueryCursor, DocumentQuery } from 'mongoose'; import { MongoUpdate } from './mongodb.type'; export abstract class MongodbOperationImplements extends DataModelAbstractMethods { protected find( query: FilterQuery, projection?: T[]|Record, options?: FindOneOptions, ): Promise>[]> protected find( query: FilterQuery, projection?: Record, options?: FindOneOptions, ): Promise[]> protected find(query: FilterQuery): Promise[]> protected find( query: FilterQuery, projection?: T[]|Record, options?: FindOneOptions, ): Promise>[]|null> { if (this.log.data.enabled) { debugStart(`${this.name}::find`, this.log.silly, ...arguments); } const p = this.model.find(query, projection, options).exec(); if (this.log.data.enabled) { debugPromise(`${this.name}::find`, this.log.data, this.log.error, p); } return p; } public getOne( query: FilterQuery, projection?: T[]|Record, options?: FindOneOptions, ): Promise>> public getOne( query: FilterQuery, projection?: Record, options?: FindOneOptions, ): Promise> public getOne(query: FilterQuery): Promise> public getOne( query: FilterQuery, projection?: T[]|Record, options?: FindOneOptions, ): Promise>> { if (this.log.data.enabled) { debugStart(`${this.name}::getOne(findOne)`, this.log.silly, ...arguments); } const p = this.model.findOne(query, projection, options).exec(); if (this.log.data.enabled) { debugPromise(`${this.name}::getOne(findOne)`, this.log.data, this.log.error, p); } return p.then((data) => { if (!data) { this.log.debug('data not found: %j', query); throw new RequestError(STATUS_CODE_BASE.DATA_NOT_EXISTS, `在数据库 "${this.name}" 中进行查询 ${JSON.stringify(query)},没有找到数据`); } return data; }); } public findOne( query: FilterQuery, projection?: T[]|Record, options?: FindOneOptions, ): Promise>|null> public findOne( query: FilterQuery, projection?: Record, options?: FindOneOptions, ): Promise|null> public findOne(query: FilterQuery): Promise|null> public findOne( query: FilterQuery, projection?: T[]|Record, options?: FindOneOptions, ): Promise>|null> { if (this.log.data.enabled) { debugStart(`${this.name}::findOne`, this.log.silly, ...arguments); } const p = this.model.findOne(query, projection, options).exec(); if (this.log.data.enabled) { debugPromise(`${this.name}::findOne`, this.log.data, this.log.error, p); } return p; } public findById( query: ObjectId|string, projection?: T[]|Record, options?: FindOneOptions, ): Promise>|null> public findById( query: ObjectId|string, projection?: Record, options?: FindOneOptions, ): Promise|null> public findById(query: ObjectId|string): Promise|null> public findById( query: ObjectId|string, projection?: T[]|Record, options?: FindOneOptions, ): Promise>|null> { if (this.log.data.enabled) { debugStart(`${this.name}::findById`, this.log.silly, ...arguments); } const p = this.model.findById(query, projection, options).exec(); if (this.log.data.enabled) { debugPromise(`${this.name}::findById`, this.log.data, this.log.error, p); } return p; } public getById( query: ObjectId|string, projection?: T[]|Record, options?: FindOneOptions, ): Promise>> public getById( query: ObjectId|string, projection?: Record, options?: FindOneOptions, ): Promise> public getById(query: ObjectId|string): Promise> public getById( query: ObjectId|string, projection?: T[]|Record, options?: FindOneOptions, ): Promise>> { if (this.log.data.enabled) { debugStart(`${this.name}::getById(findById)`, this.log.silly, ...arguments); } const p = this.model.findById(query, projection, options).exec(); if (this.log.data.enabled) { debugPromise(`${this.name}::getById(findById)`, this.log.data, this.log.error, p); } return p.then((data) => { if (!data) { this.log.debug('data not found: %j', query); throw new RequestError(STATUS_CODE_BASE.DATA_NOT_EXISTS, `在数据库 "${this.name}" 中进行查询 ${JSON.stringify(query)},没有找到数据`); } return data; }); } protected _queryRaw( query: FilterQuery, projection?: T[]|Record, options?: FindOneOptions, ): DocumentQuery<(Pick)[], DataDocument>> protected _queryRaw( query: FilterQuery, projection?: Record, options?: FindOneOptions, ): DocumentQuery<(IDocType)[], DataDocument> protected _queryRaw(query: FilterQuery): DocumentQuery<(IDocType)[], DataDocument> protected _queryRaw( query: FilterQuery, projection?: T[]|Record, options?: FindOneOptions, ): DocumentQuery<(IDocType|Pick|null)[], DataDocument|null>> { if (this.log.data.enabled) { debugStart(`${this.name}::_queryRaw(find)`, this.log.silly, ...arguments); } const p = this.model.find(query, projection, options); return p; } public findCursor( query: FilterQuery, projection?: T[]|Record, options?: FindOneOptions, ): QueryCursor>> public findCursor( query: FilterQuery, projection?: Record, options?: FindOneOptions, ): QueryCursor> public findCursor(query: FilterQuery): QueryCursor> public findCursor( query: FilterQuery, projection?: T[]|Record, options?: FindOneOptions, ): QueryCursor>|null> { if (this.log.data.enabled) { debugStart(`${this.name}::findCursor(find)`, this.log.silly, ...arguments); } const p = this.model.find(query, projection, options).cursor(); return p; } protected findByIdAndUpdate( query: ObjectId|string, update: MongoUpdate, options?: ModelFindByIdAndUpdateOptions, ): Promise|null> { if (this.log.data.enabled) { debugStart(`${this.name}::findByIdAndUpdate`, this.log.silly, ...arguments); } const p = this.model.findByIdAndUpdate(query, update, options).exec(); if (this.log.data.enabled) { debugPromise(`${this.name}::findByIdAndUpdate`, this.log.data, this.log.error, p); } return p; } protected findOneAndUpdate( query: FilterQuery, update: MongoUpdate, options?: ModelFindOneAndUpdateOptions, ): Promise|null> { if (this.log.data.enabled) { debugStart(`${this.name}::findOneAndUpdate`, this.log.silly, ...arguments); } const p = this.model.findOneAndUpdate(query, update, options).exec(); if (this.log.data.enabled) { debugPromise(`${this.name}::findOneAndUpdate`, this.log.data, this.log.error, p); } return p; } protected getByIdAndUpdate( query: ObjectId|string, update: MongoUpdate, options?: ModelFindByIdAndUpdateOptions, ): Promise> { if (this.log.data.enabled) { debugStart(`${this.name}::getByIdAndUpdate{findByIdAndUpdate}`, this.log.silly, ...arguments); } const p = this.model.findByIdAndUpdate(query, update, options).exec(); if (this.log.data.enabled) { debugPromise(`${this.name}::getByIdAndUpdate{findByIdAndUpdate}`, this.log.data, this.log.error, p); } return p.then((data) => { if (!data) { this.log.debug('data not found: %j', query); throw new RequestError(STATUS_CODE_BASE.DATA_NOT_EXISTS, `在数据库 "${this.name}" 中进行查询 ${JSON.stringify(query)},没有找到数据`); } return data; }); } protected getOneAndUpdate( query: FilterQuery, update: MongoUpdate, options?: ModelFindOneAndUpdateOptions, ): Promise> { if (this.log.data.enabled) { debugStart(`${this.name}::getOneAndUpdate{findOneAndUpdate}`, this.log.silly, ...arguments); } const p = this.model.findOneAndUpdate(query, update, options).exec(); if (this.log.data.enabled) { debugPromise(`${this.name}::getOneAndUpdate{findOneAndUpdate}`, this.log.data, this.log.error, p); } return p.then((data) => { if (!data) { this.log.debug('data not found: %j', query); throw new RequestError(STATUS_CODE_BASE.DATA_NOT_EXISTS, `在数据库 "${this.name}" 中进行查询 ${JSON.stringify(query)},没有找到数据`); } return data; }); } protected update( query: FilterQuery, update: MongoUpdate, options?: ModelUpdateOptions, ): Promise|null> { if (this.log.data.enabled) { debugStart(`${this.name}::update`, this.log.silly, ...arguments); } const p = this.model.update(query, update, options).exec(); if (this.log.data.enabled) { debugPromise(`${this.name}::update`, this.log.data, this.log.error, p); } return p; } }