@opra/sqb
Version:
Opra SQB adapter package
89 lines (88 loc) • 3.98 kB
JavaScript
import { classes, cloneObject, ComplexType, DocumentElement, OpraSchema, } from '@opra/common';
import { DataType as SqbDataType, EntityMetadata, isAssociationField, isColumnField, } from '@sqb/connect';
var DataTypeFactory = classes.DataTypeFactory;
const _prepareComplexTypeArgs = DataTypeFactory
._prepareComplexTypeArgs;
DataTypeFactory._prepareComplexTypeArgs = async function (context, owner, initArgs, metadata) {
let sqbMeta;
if (initArgs.ctor &&
metadata.fields &&
(sqbMeta = EntityMetadata.get(initArgs.ctor))) {
metadata = cloneObject(metadata);
for (const [fieldName, fieldSchema] of Object.entries(metadata.fields)) {
const sqbField = sqbMeta && EntityMetadata.getField(sqbMeta, fieldName);
if (!sqbField)
continue;
/* Copy type information from sqb metadata to opra */
if (!fieldSchema.type || fieldSchema.type === Object) {
if (isAssociationField(sqbField)) {
if (!fieldSchema.type) {
const trg = await sqbField.association.resolveTarget();
if (trg?.ctor)
fieldSchema.type = trg.ctor;
}
}
else if (isColumnField(sqbField)) {
fieldSchema.type = sqbField.enum || sqbField.type;
}
}
if (isColumnField(sqbField)) {
const hasNoType = !fieldSchema.type || fieldSchema.type === Object;
switch (sqbField.dataType) {
case SqbDataType.INTEGER:
case SqbDataType.SMALLINT:
if (hasNoType || fieldSchema.type === Number)
fieldSchema.type = 'integer';
break;
case SqbDataType.GUID:
if (hasNoType || fieldSchema.type === String)
fieldSchema.type = 'uuid';
break;
case SqbDataType.DATE:
if (hasNoType ||
fieldSchema.type === String ||
fieldSchema.type === Date) {
fieldSchema.type = 'date';
}
break;
case SqbDataType.TIMESTAMP:
if (hasNoType ||
fieldSchema.type === String ||
fieldSchema.type === Date) {
fieldSchema.type = 'datetime';
}
break;
case SqbDataType.TIMESTAMPTZ:
if (hasNoType ||
fieldSchema.type === String ||
fieldSchema.type === Date) {
fieldSchema.type = 'datetimetz';
}
break;
case SqbDataType.TIME:
if (hasNoType || fieldSchema.type === String)
fieldSchema.type = 'time';
break;
default:
break;
}
}
if (isAssociationField(sqbField)) {
if (sqbField.association.returnsMany())
fieldSchema.isArray = true;
if (!Object.prototype.hasOwnProperty.call(fieldSchema, 'exclusive'))
fieldSchema.exclusive = true;
}
if (!Object.prototype.hasOwnProperty.call(fieldSchema, 'exclusive') &&
Object.prototype.hasOwnProperty.call(sqbField, 'exclusive')) {
fieldSchema.exclusive = sqbField.exclusive;
}
}
}
return _prepareComplexTypeArgs.apply(DataTypeFactory, [
context,
owner,
initArgs,
metadata,
]);
};