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

93 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;