1
0
Fork 0
arangodb/js/server/modules/@arangodb/foxx/legacy/schema.js

92 lines
2.4 KiB
JavaScript

'use strict';
////////////////////////////////////////////////////////////////////////////////
/// DISCLAIMER
///
/// Copyright 2015 ArangoDB GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is ArangoDB GmbH, Cologne, Germany
///
/// @author Alan Plum
////////////////////////////////////////////////////////////////////////////////
var _ = require('lodash'),
joi = require('joi');
function toJSONSchema(id, schema) {
var jsonSchema = {
id: id,
required: [],
properties: {}
};
if (!schema) {
return jsonSchema;
}
if (
typeof schema.toJSONSchema === 'function' &&
schema.toJSONSchema !== toJSONSchema &&
schema.toJSONSchema !== require('@arangodb/foxx/legacy/model').Model.toJSONSchema
) {
// allow overriding toJSONSchema.
return schema.toJSONSchema(id);
}
if (typeof schema === 'function') {
// assume schema is a Model
schema = schema.prototype.schema || {};
}
if (!schema.isJoi) {
schema = joi.object().keys(schema);
}
var description = schema.describe();
if (description.type !== 'object') {
return jsonSchema;
}
_.each(description.children, function (attributeDescription, attributeName) {
var attributeSchema = {type: attributeDescription.type},
rules = attributeDescription.rules,
flags = attributeDescription.flags;
if (flags && flags.presence === 'required') {
jsonSchema.required.push(attributeName);
}
if (
attributeSchema.type === 'number' &&
_.isArray(rules) &&
_.some(rules, function (rule) {
return rule.name === 'integer';
})
) {
attributeSchema.type = 'integer';
}
jsonSchema.properties[attributeName] = attributeSchema;
});
if (!jsonSchema.required.length) {
delete jsonSchema.required;
}
return jsonSchema;
}
exports.toJSONSchema = toJSONSchema;