@riturajgc/upload-manager-service
Version:
Upload manager service for bitnudge
99 lines (87 loc) • 2.68 kB
JavaScript
const StorageTypes = require('../lib/utils/StorageTypes');
const setModel = function ( type, mongoose ) {
const { ObjectId } = mongoose.Schema.Types;
//Base schema for anytype of storage type
const BaseSchema = {
//source - from where user is uploading the image
source: {
device: {type:String,required:true},
userId: {type:ObjectId,ref:'User'},
creation: {type:String}
},
isActive: {type:Boolean,default:true},
history: [{
_id: false,
changedAt: {type:Date},
isActive: {type:Boolean},
actionBy: {
device: {type:String,required:true},
userId: {type:ObjectId,ref:'User'},
}
}],
};
const ModelDecorators = {
strict: false,
timestamps: true,
};
const StoreInDBSchema = {
//file - all the property related to file
//thumbnail - thumbnail of image
//hash - store hash of file
file:{
name:{type:String,required:true},
fileType:{type:String,required:true},
content:{type:Buffer,required:true},
height:{type:Number,required:true},
width:{type:Number,required:true},
size:{type:String,required:true}
},
thumbnail:{
name:{type:String},
fileType:{type:String},
content:{type:Buffer}
},
isThumbnailAvailable:{type:Boolean,default:false},
hash:{type:String,required:true}
};
const StoreInFSSchema = {
//TODO: Define mongoose schema for FS Storage type
};
const StoreInS3Schema = {
//TODO: Define mongoose schema for S3 Storage type
};
let StorageModel, indexFields;
if(type === StorageTypes.list.INDB){
StorageModel = new mongoose.Schema(Object.assign(StoreInDBSchema, BaseSchema), ModelDecorators);
indexFields = [
'source.userId',
'isActive'
];
}else if(type === StorageTypes.list.INFS){
StorageModel = new mongoose.Schema(Object.assign(StoreInFSSchema, BaseSchema), ModelDecorators);
//TODO: Define index fields for FS Storage type
indexFields = [
'source.userId',
'isActive'
];
}else if(type === StorageTypes.list.INS3){
StorageModel = new mongoose.Schema(Object.assign(StoreInS3Schema, BaseSchema), ModelDecorators);
//TODO: Define index fields for S3 Storage type
indexFields = [
'source.userId',
'isActive'
];
}
let fields = {};
indexFields.forEach(function(field) {
fields[field] = 1;
});
StorageModel.index(fields, {background:true});
const modelName = 'FileStore';
if(!mongoose.modelNames().includes(modelName)){
return mongoose.model(modelName, StorageModel);
}else{
return mongoose.model(modelName);
}
};
module.exports = setModel;