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.

112 lines
2.6 KiB

const mongoose = require('mongoose');
// const autoBind = require('auto-bind');
const { HttpResponse } = require('../helpers/HttpResponse');
class Service {
/**
* Base Service Layer
* @author Sunil Kumar Samanta
* @param model
*/
constructor(model) {
console.log(model, 32);
this.model = model;
// autoBind(this);
}
async index(query) {
let { skip, limit, sortBy } = query;
skip = skip ? Number(skip) : 0;
limit = limit ? Number(limit) : 10;
sortBy = sortBy ? sortBy : { 'createdAt': -1 };
delete query.skip;
delete query.limit;
delete query.sortBy;
if (query._id) {
try {
query._id = new mongoose.mongo.ObjectId(query._id);
} catch (error) {
throw new Error('Not able to generate mongoose id with content');
}
}
try {
const items = await this.model
.find(query)
.sort(sortBy)
.skip(skip)
.limit(limit),
total = await this.model.countDocuments(query);
return new HttpResponse(items, { 'totalCount': total });
} catch (errors) {
throw errors;
}
}
async show(id) {
try {
const item = await this.model.findById(id);
if (!item) {
const error = new Error('Item not found');
error.statusCode = 404;
throw error;
}
return new HttpResponse(item);
} catch (errors) {
throw errors;
}
}
async store(data) {
try {
const item = await this.model.create(data);
if (item) {
return new HttpResponse(item);
}
throw new Error('Something wrong happened');
} catch (error) {
throw error;
}
}
async update(id, data) {
try {
const item = await this.model.findByIdAndUpdate(id, data, { 'new': true });
return new HttpResponse(item);
} catch (errors) {
throw errors;
}
}
async delete(id) {
try {
const item = await this.model.findByIdAndDelete(id);
if (!item) {
const error = new Error('Item not found');
error.statusCode = 404;
throw error;
} else {
return new HttpResponse(item, { 'deleted': true });
}
} catch (errors) {
throw errors;
}
}
}
module.exports = { Service };