/*! * 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;