/*jshint laxcomma: true, smarttabs: true, node:true */
'use strict';
/**
* Mixin class providing functionlity for building resource schemas
* @module tastypie/lib/resource/schema
* @author Eric Satterwhite
* @since 1.0.1
* @requires debug
* @requires mout/object
* @requires class
* @requires class/options
**/
var Class = require('../class')
, object = require('mout/object')
, get = object.get
, set = object.set
, EMPTY_OBJECT = {}
, Schema
;
/**
* @constructor
* @mixin
* @alias module:tastypie/lib/resource/schema
*/
Schema = new Class({
_schema_cache: null
/**
* function used to generate a resource schema
* @method module:tastypie/lib/resource/schema#build_schema
* @return {Object} schema
**/
,build_schema: function( fields, options ){
var schema;
options = options || this.options || EMPTY_OBJECT;
fields = fields || this.fields || EMPTY_OBJECT;
if( !this._schema_cache ){
schema = {
filtering: options.filtering || EMPTY_OBJECT
, ordering: options.ordering || []
, formats: Object.keys( options.serializer.options.content_types )
, limit: options.limit
, fields: object.map( this.fields, function( field ){
return {
'default' : field.default
, 'type' : field.type()
, 'format' : field.format()
, 'nullable' : field.options.nullable
, 'blank' : !!field.options.blank
, 'readonly' : !!field.options.readonly
, 'help' : field.options.help
, 'unique' : !!field.options.unique
, 'enum' : field.options.enum || []
};
})
};
this.routes && this.actions.forEach( function( action ){
var allowed = 'allowed.'+action;
set(
schema,
allowed,
Object
.keys( get( options, allowed ) || EMPTY_OBJECT)
.filter( function( method ){
return !!get( options, allowed )[method];
})
);
});
this._schema_cache = schema;
}
return this._schema_cache;
}
/**
* Top level method for generating resource specific schemas for *GET* requests
* @method module:tastypie/lib/resource#get_schema
* @param {Request} request A Hapi.js request object
* @param {Function} reply A hapi.js reply function
**/
, get_schema: function get_schema( req, res ){
this.respond( this.bundle( req, res, this.build_schema( ) ) );
}
});
module.exports = Schema;