Source: lib/person.js

"use strict";

var debug = require('debug')('models:person');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var extend = require('mongoose-schema-extend');
var bcrypt = require('bcrypt');
var parentModel = require('./profile');

var Model = function () {

  /**
   * Получение базовой коллекции
   * @type {Mongoose.Schema}
   */
  var Parent = mongoose.model('Profile').schema;

  /**
   * Схема профиля персоны, человека.
   *
   * __Thing > Profile > Person__
   *
   * @class Person
   * @augments Profile
   *
   * @see https://schema.org/Person
   * @see {@link Profile}
   * @see {@link Account}
   * @see {@link Thing}
   *
   * @example
   *
   * var Person = require('noda-models').Person;
   * var person = new Person({...});
   *
   * Person.find().exec(function(){});
   * person.save();
   *
   *
   *
   */
  var _Schema = Parent.extend(
    {

      /**
       * Связь с Account
       */
      accounts: [{
        type: Schema.Types.ObjectId,
        ref: 'Account'
      }],

      /**
       * Дополнительное имя человека, может быть использовано для отчества
       */
      additionalName: { type: String },

      /**
       *  Физический адрес
       */
      address: {
        type: Schema.Types.ObjectId,
        ref: 'PostalAddress'
      },

      /**
       *  Организация с которой связан этот человек.
       *  Например, школа/университет, клуб, команда
       */
      affiliation: [{
        type: Schema.Types.ObjectId,
        ref: 'Organization'
      }],

      /**
       *  Образовательные учереждения, выпусником которых является этот человек.
       */
      alumniOf:[{
        type: Schema.Types.ObjectId,
        ref: 'EducationOrganization'
      }],

      /**
       * Награды выигранные этим человеком
       * или этим результатом творчества (в единственном числе award).
       */
      awards: [{ type: String }],

      /**
       *  Дата рождения.
       */
      birthDate: { type: Date },

      /**
       *  Марка (бренд) продукта.
       */
      brand: [{
        type: Schema.Types.ObjectId,
        ref: 'Brand'
      }],

      /**
       * Контактная информация человека.
       */
      contactPoint: {
        type: Schema.Types.ObjectId,
        ref: 'ContactPoint'
      },

      /**
       * Контактная информация человека.
       */
      contactPoints: [{
        type: Schema.Types.ObjectId,
        ref: 'ContactPoint'
      }],

      /**
       *  Основной e-mail адрес.
       */
      email: { type: String },

      /**
       *  Фамильное имя. В США - последнее имя человека.
       *  Может быть использовано вместе с givenName вместо свойство Name.
       */
      familyName: { type: String },

      /**
       *  Номер факса.
       */
      faxNumber: { type: String },

      /**
       *  Самые общие однонаправленные социальные отношения.
       */
      follows: [{ type: Schema.Types.ObjectId, ref: 'Person' }],

      /**
       * Пол
       */
      gender: { type: String },

      /**
       *  Данное при рождении имя. В США первое имя человека.
       *  Может быть использовано вместе с FamilyName вместо свойства Name.
       */
      givenName: { type: String },

      /**
       * Домашние контактные данные.
       */
      homeLocation: [{
        type: Schema.Types.ObjectId,
        ref: 'ContactPoint'
      }],

      /**
       *  Почетный префикс предшествующий имени человека, например Dr/Mrs/Mr.
       */
      honorificPrefix: String,

      /**
       *  Почетный суффикс предшествующий имени человека,
       *  таких как MD/PhD/MSCSW (Доктор медицины / Доктор философии / ).
       */
      honorificSuffix: { type: String },

      /**
       * Должность этого человека (например, Financial Manager).
       */
      jobTitle: { type: String, trim: true },

      /**
       * Самые общие двунаправленные социальные/рабочие отношения.
       */
      knows: [{
        type: Schema.Types.ObjectId,
        ref: 'Person'
      }],

      /**
       *  Организация к которой этот человек принадлежит.
       */
      memberOf: [{
        type: Schema.Types.ObjectId,
        ref: 'Organization'
      }],

      /**
       *  национальность.
       */
      nationality: [{
        type: Schema.Types.ObjectId,
        ref: 'Country'
      }],

      /**
       *  Продукты, принадлежашие организации или человеку.
       *  OwnershipInfo or Product
       */
      owns: [{
        type: Schema.Types.ObjectId,
        ref: 'Product'
      }],

      /**
       * Событие, на котором этот человек является исполнителем или участинком.
       */
      performerIn: [{
        type: Schema.Types.ObjectId,
        ref: 'Event'
      }],

      /**
       *  ИНН(идентификационный номер налогоплательщика)
       *  организации или физического лица.
       */
      vatID: { type: String },

      /**
       * Рабочие контактные данные.
       */
      workLocation: [{
        type: Schema.Types.ObjectId,
        ref: 'ContactPoint'
      }],

      /**
       *  Связи с организацией,
       *  Организации, в которых этот человек работает.
       */
      worksFor: [{
        type: Schema.Types.ObjectId,
        ref: 'Organization'
      }]
    }
  );

  return mongoose.model('Person', _Schema);

};

module.exports = new Model();