graphile-settings
Version:
graphile settings
52 lines (51 loc) • 2.63 kB
JavaScript
import { buildFieldMeta } from './type-mappings';
import { buildFieldList } from './table-meta-context';
export function buildForeignKeyConstraint(constraintName, localCodec, localAttributes, localAttributeNames, remoteCodec, remoteAttributes, remoteAttributeNames, context) {
const referencedTable = remoteCodec?.name || 'unknown';
const referencedFields = remoteAttributeNames.map((attrName) => remoteCodec ? context.inflectAttr(attrName, remoteCodec) : attrName);
return {
name: constraintName,
fields: buildFieldList(localAttributeNames, localCodec, localAttributes, context),
referencedTable,
referencedFields,
refFields: remoteAttributeNames.map((attrName) => buildFieldMeta(remoteCodec ? context.inflectAttr(attrName, remoteCodec) : attrName, remoteAttributes[attrName], context.build)),
refTable: { name: referencedTable },
};
}
export function buildIndexes(codec, attributes, uniques, context) {
return uniques.map((unique) => ({
name: unique.tags?.name || `${codec.name}_${unique.attributes.join('_')}_idx`,
isUnique: true,
isPrimary: !!unique.isPrimary,
columns: unique.attributes.map((attrName) => context.inflectAttr(attrName, codec)),
fields: buildFieldList(unique.attributes, codec, attributes, context),
}));
}
export function buildPrimaryKey(codec, attributes, uniques, context) {
const primaryUnique = uniques.find((unique) => unique.isPrimary);
if (!primaryUnique)
return null;
return {
name: primaryUnique.tags?.name || `${codec.name}_pkey`,
fields: buildFieldList(primaryUnique.attributes, codec, attributes, context),
};
}
export function buildUniqueConstraints(codec, attributes, uniques, context) {
return uniques
.filter((unique) => !unique.isPrimary)
.map((unique) => ({
name: unique.tags?.name || `${codec.name}_${unique.attributes.join('_')}_key`,
fields: buildFieldList(unique.attributes, codec, attributes, context),
}));
}
export function buildForeignKeyConstraints(codec, attributes, relations, context) {
const constraints = [];
for (const [relationName, relation] of Object.entries(relations)) {
if (relation.isReferencee)
continue;
const remoteCodec = relation.remoteResource?.codec;
const remoteAttributes = remoteCodec?.attributes || {};
constraints.push(buildForeignKeyConstraint(relationName, codec, attributes, relation.localAttributes || [], remoteCodec, remoteAttributes, relation.remoteAttributes || [], context));
}
return constraints;
}