very-express
Version:
based on json schema and openapi, generate Express RestApi server with mongoDb
66 lines (54 loc) • 2.44 kB
text/typescript
// {{headerComment}}
import { Model, Document } from "mongoose";
import { VexRepository, Select, Filter, Join, VexPagination } from "../_types/vex";
import utils from "../_utils";
export class MongooseRepositoryAdapter<T extends Document> implements VexRepository<T> {
constructor(private model: Model<T>) {}
public get native(): Model<T> {
return this.model;
}
find(filter: Filter, join?: Join, select?: Select, pagination?: VexPagination): Promise<T[]> {
// TODO: complete mongoose support, handle join, select, and pagination
return this.model.find((filter || {}) as any).exec();
}
async count(filter: Filter): Promise<number> {
// TODO: complete mongoose support, handle filter
return 0;
}
findOne(filter: Filter, join?: Join, select?: Select): Promise<T | null> {
// TODO: complete mongoose support, handle join and select
return this.model.findOne(filter as any).exec();
}
findOneWhere(filter: Filter, join?: Join, select?: Select): Promise<T | null> {
// TODO: complete mongoose support, handle join and select
return this.model.findOne(filter as any).exec();
}
async create(data: Partial<T>): Promise<T> {
const doc = new this.model(data);
return doc.save();
}
replace(id: string | undefined, data: Partial<T>): Promise<T | null> {
if(!id) {
utils.log.error("MongooseRepositoryAdapter.replace called without id — refuse replace document");
return Promise.resolve(null);
}
return this.model.findByIdAndUpdate(id, data, { new: true, overwrite: true }).exec();
}
update(id: string | undefined, data: Partial<T>): Promise<T | null> {
if(!id) {
utils.log.error("MongooseRepositoryAdapter.update called without id — refuse update document");
return Promise.resolve(null);
}
return this.model.findByIdAndUpdate(id, { $set: data }, { new: true }).exec();
}
async delete(id: string | undefined): Promise<void> {
if(!id) {
utils.log.error("MongooseRepositoryAdapter.delete called without id — refuse delete document");
return;
}
await this.model.findByIdAndDelete(id).exec();
}
async deleteWhere(filter: Record<string, unknown>): Promise<void> {
await this.model.deleteOne(filter as any).exec();
}
}