UNPKG

graphile-settings

Version:
52 lines (51 loc) 2.63 kB
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; }