/*!
|
|
* Module requirements.
|
|
*/
|
|
|
|
var SchemaType = require('../schematype');
|
|
var CastError = SchemaType.CastError;
|
|
var utils = require('../utils');
|
|
|
|
/**
|
|
* Date SchemaType constructor.
|
|
*
|
|
* @param {String} key
|
|
* @param {Object} options
|
|
* @inherits SchemaType
|
|
* @api private
|
|
*/
|
|
|
|
function SchemaDate (key, options) {
|
|
SchemaType.call(this, key, options);
|
|
};
|
|
|
|
/*!
|
|
* Inherits from SchemaType.
|
|
*/
|
|
|
|
SchemaDate.prototype.__proto__ = SchemaType.prototype;
|
|
|
|
/**
|
|
* Declares a TTL index (rounded to the nearest second) for _Date_ types only.
|
|
*
|
|
* This sets the `expiresAfterSeconds` index option available in MongoDB >= 2.1.2.
|
|
* This index type is only compatible with Date types.
|
|
*
|
|
* ####Example:
|
|
*
|
|
* // expire in 24 hours
|
|
* new Schema({ createdAt: { type: Date, expires: 60*60*24 }});
|
|
*
|
|
* `expires` utilizes the `ms` module from [guille](https://github.com/guille/) allowing us to use a friendlier syntax:
|
|
*
|
|
* ####Example:
|
|
*
|
|
* // expire in 24 hours
|
|
* new Schema({ createdAt: { type: Date, expires: '24h' }});
|
|
*
|
|
* // expire in 1.5 hours
|
|
* new Schema({ createdAt: { type: Date, expires: '1.5h' }});
|
|
*
|
|
* // expire in 7 days
|
|
* var schema = new Schema({ createdAt: Date });
|
|
* schema.path('createdAt').expires('7d');
|
|
*
|
|
* @param {Number|String} when
|
|
* @added 3.0.0
|
|
* @return {SchemaType} this
|
|
* @api public
|
|
*/
|
|
|
|
SchemaDate.prototype.expires = function (when) {
|
|
if (!this._index || 'Object' !== this._index.constructor.name) {
|
|
this._index = {};
|
|
}
|
|
|
|
this._index.expires = when;
|
|
utils.expires(this._index);
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* Required validator for date
|
|
*
|
|
* @api private
|
|
*/
|
|
|
|
SchemaDate.prototype.checkRequired = function (value) {
|
|
return value instanceof Date;
|
|
};
|
|
|
|
/**
|
|
* Casts to date
|
|
*
|
|
* @param {Object} value to cast
|
|
* @api private
|
|
*/
|
|
|
|
SchemaDate.prototype.cast = function (value) {
|
|
if (value === null || value === '')
|
|
return null;
|
|
|
|
if (value instanceof Date)
|
|
return value;
|
|
|
|
var date;
|
|
|
|
// support for timestamps
|
|
if (value instanceof Number || 'number' == typeof value
|
|
|| String(value) == Number(value))
|
|
date = new Date(Number(value));
|
|
|
|
// support for date strings
|
|
else if (value.toString)
|
|
date = new Date(value.toString());
|
|
|
|
if (date.toString() != 'Invalid Date')
|
|
return date;
|
|
|
|
throw new CastError('date', value, this.path);
|
|
};
|
|
|
|
/*!
|
|
* Date Query casting.
|
|
*
|
|
* @api private
|
|
*/
|
|
|
|
function handleSingle (val) {
|
|
return this.cast(val);
|
|
}
|
|
|
|
function handleArray (val) {
|
|
var self = this;
|
|
return val.map( function (m) {
|
|
return self.cast(m);
|
|
});
|
|
}
|
|
|
|
SchemaDate.prototype.$conditionalHandlers = {
|
|
'$lt': handleSingle
|
|
, '$lte': handleSingle
|
|
, '$gt': handleSingle
|
|
, '$gte': handleSingle
|
|
, '$ne': handleSingle
|
|
, '$in': handleArray
|
|
, '$nin': handleArray
|
|
, '$all': handleArray
|
|
};
|
|
|
|
|
|
/**
|
|
* Casts contents for queries.
|
|
*
|
|
* @param {String} $conditional
|
|
* @param {any} [value]
|
|
* @api private
|
|
*/
|
|
|
|
SchemaDate.prototype.castForQuery = function ($conditional, val) {
|
|
var handler;
|
|
|
|
if (2 !== arguments.length) {
|
|
return this.cast($conditional);
|
|
}
|
|
|
|
handler = this.$conditionalHandlers[$conditional];
|
|
|
|
if (!handler) {
|
|
throw new Error("Can't use " + $conditional + " with Date.");
|
|
}
|
|
|
|
return handler.call(this, val);
|
|
};
|
|
|
|
/*!
|
|
* Module exports.
|
|
*/
|
|
|
|
module.exports = SchemaDate;
|