Source: lib/thing.js

'use strict';

var mongoose = require('mongoose');
var extend = require('mongoose-schema-extend');
var Schema = mongoose.Schema;

var meta = require('./plugins/meta');
var utils = require('./plugins/utils');

var Model = function(){

  /**
   * Thing - самый общий тип чего-либо.
   * Базовая схема для всех элементов системы
   * Изменение данной схемы
   * влияет на все элементы системы
   *
   * @class Thing
   * @see http://ruschema.org/Thing
   * @version 0.0.1
   *
   */
  var _Schema = mongoose.Schema(
    /** @lends Thing.prototype */
    {

      /**
       * Предки.
       * Массив идентификаторов предков
       */
      parents: [],

      /**
       * Родитель.
       * Прямая связь с родителем элемента
       */
      parentRef: { type: Schema.Types.ObjectId },

      /**
       * Full path of document
       * @see https://groups.google.com/forum/#!topic/mongodb-user/34JQVzyR91o
       * @see http://docs.mongodb.org/manual/tutorial/model-tree-structures-with-materialized-paths/
       *
       * @example
       *
       *  //поиск все потомков:
       * { path: /^,_id1/ }
       * { path: /^,_id1,_id2,_id3/ }
       *
       * db.categories.find( { path: /^,Books,/ } )
       * db.categories.find( { path: /^Books,/ } )
       *
       *
       */
      path: {
        type: String,
        trim: true,
        index: true
      },

      /**
       *
       * Дополнительный тип для элемента, который обычно используется
       * для добавления более конкретных типов от внешних словарей
       * в синтаксис микроданных.
       *
       * Это отношения между чем-то и классом к которому он принадлежит.
       * В синтаксисе RDFa, лучше использовать родной синтаксис RDF -
       * аттрибут "TypeOf" для множественных типов.
       *
       * Инстументы Schema.org могут слабо понимать дополнительные типы,
       * особенно те, которые определены извне.
       */
      additionalType: {
        type: String
      },

      typeOf: {
        type: String
      },

      /**
       * Короткое описание записи.
       */
      description: {
        type: String
      },

      /**
       *  URL изображения записи.
       */
      image: {
        type: String
      },

      /**
       *  Имя записи.
       */
      name: {
        type: String
      },

      /**
       * URL записи.
       */
      url: {
        type: String
      }
    }
  );

  _Schema.plugin(meta);
  _Schema.plugin(utils);

  return mongoose.model('Thing',_Schema);
};

module.exports = new Model();