mirror of
https://github.com/immich-app/immich.git
synced 2025-12-27 07:10:35 -05:00
52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
import { TableOptions } from 'src/sql-tools/from-code/decorators/table.decorator';
|
|
import { Processor, SchemaBuilder } from 'src/sql-tools/from-code/processors/type';
|
|
import { asMetadataKey, asSnakeCase } from 'src/sql-tools/helpers';
|
|
|
|
export const processTables: Processor = (builder, items) => {
|
|
for (const {
|
|
item: { options, object },
|
|
} of items.filter((item) => item.type === 'table')) {
|
|
const tableName = options.name || asSnakeCase(object.name);
|
|
|
|
writeMetadata(object, { name: tableName, options });
|
|
|
|
builder.tables.push({
|
|
name: tableName,
|
|
columns: [],
|
|
constraints: [],
|
|
indexes: [],
|
|
triggers: [],
|
|
synchronize: options.synchronize ?? true,
|
|
metadata: { options, object },
|
|
});
|
|
}
|
|
};
|
|
|
|
export const resolveTable = (builder: SchemaBuilder, object: object) => {
|
|
const metadata = readMetadata(object);
|
|
if (!metadata) {
|
|
return;
|
|
}
|
|
|
|
return builder.tables.find((table) => table.name === metadata.name);
|
|
};
|
|
|
|
export const onMissingTable = (
|
|
builder: SchemaBuilder,
|
|
context: string,
|
|
object: object,
|
|
propertyName?: symbol | string,
|
|
) => {
|
|
const label = object.constructor.name + (propertyName ? '.' + String(propertyName) : '');
|
|
builder.warnings.push(`[${context}] Unable to find table (${label})`);
|
|
};
|
|
|
|
const METADATA_KEY = asMetadataKey('table-metadata');
|
|
|
|
type TableMetadata = { name: string; options: TableOptions };
|
|
|
|
const readMetadata = (object: object): TableMetadata | undefined => Reflect.getMetadata(METADATA_KEY, object);
|
|
|
|
const writeMetadata = (object: object, metadata: TableMetadata): void =>
|
|
Reflect.defineMetadata(METADATA_KEY, metadata, object);
|