UNPKG

graphile-settings

Version:
97 lines (96 loc) 4.21 kB
import { buildForeignKeyConstraints, buildIndexes, buildPrimaryKey, buildUniqueConstraints, } from './constraint-meta-builders'; import { buildInflectionMeta, buildQueryMeta, resolveTableType } from './name-meta-builders'; import { buildBelongsToRelations, buildManyToManyRelations, buildReverseRelations, } from './relation-meta-builders'; import { buildStorageMeta, buildSearchMeta, buildI18nMeta, buildRealtimeMeta } from './storage-search-meta-builders'; import { buildFieldMeta } from './type-mappings'; import { createBuildContext, } from './table-meta-context'; import { getConfiguredSchemas, getRelations, getSchemaName, getUniques, isTableResource, } from './table-resource-utils'; function buildTableMeta(resource, schemaName, context) { const codec = resource.codec; const attributes = codec.attributes; const uniques = getUniques(resource); const relations = getRelations(resource); // Compute PK and FK attribute name sets for field metadata const pkAttrNames = new Set(); const fkAttrNames = new Set(); for (const unique of uniques) { if (unique.isPrimary) { for (const attrName of unique.attributes) pkAttrNames.add(attrName); } } for (const relation of Object.values(relations)) { if (relation.isReferencee) continue; for (const attrName of relation.localAttributes || []) fkAttrNames.add(attrName); } const fields = Object.entries(attributes).map(([attrName, attr]) => buildFieldMeta(context.inflectAttr(attrName, codec), attr, context.build, { isPrimaryKey: pkAttrNames.has(attrName), isForeignKey: fkAttrNames.has(attrName), })); const indexes = buildIndexes(codec, attributes, uniques, context); const primaryKey = buildPrimaryKey(codec, attributes, uniques, context); const uniqueConstraints = buildUniqueConstraints(codec, attributes, uniques, context); const foreignKeyConstraints = buildForeignKeyConstraints(codec, attributes, relations, context); const constraints = { primaryKey, unique: uniqueConstraints, foreignKey: foreignKeyConstraints, }; const belongsTo = buildBelongsToRelations(codec, attributes, uniques, relations, context); const { hasOne, hasMany } = buildReverseRelations(codec, attributes, relations, context); const manyToMany = buildManyToManyRelations(resource, codec, context); const relationsMeta = { belongsTo, has: [...hasOne, ...hasMany], hasOne, hasMany, manyToMany, }; const tableType = resolveTableType(context.build, codec); const storage = buildStorageMeta(codec); const search = buildSearchMeta(codec, context.build, context.inflectAttr); const i18n = buildI18nMeta(codec, context.build, context.inflectAttr); const realtime = buildRealtimeMeta(codec, context.build); return { name: tableType, schemaName, fields, indexes, constraints, foreignKeyConstraints, primaryKeyConstraints: primaryKey ? [primaryKey] : [], uniqueConstraints, relations: relationsMeta, inflection: buildInflectionMeta(resource, tableType, context.build), query: buildQueryMeta(resource, uniques, tableType, context.build), storage, search, i18n, realtime, }; } export function collectTablesMeta(build) { const configuredSchemas = getConfiguredSchemas(build); const context = createBuildContext(build); const seenCodecs = new Set(); const tablesMeta = []; for (const resource of Object.values(build.input.pgRegistry.pgResources || {})) { if (!isTableResource(resource)) continue; const codec = resource.codec; if (seenCodecs.has(codec)) continue; seenCodecs.add(codec); const schemaName = getSchemaName(resource); if (!schemaName) continue; if (configuredSchemas.length > 0 && !configuredSchemas.includes(schemaName)) { continue; } tablesMeta.push(buildTableMeta(resource, schemaName, context)); } return tablesMeta; }