graphile-settings
Version:
graphile settings
97 lines (96 loc) • 4.21 kB
JavaScript
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;
}