import {LogNoTrackedDefaults, EntityIdentifier} from "../log"; import {TableUtil} from "../table"; import {TrackRow} from "../track-row"; import {IConnection} from "../execution"; import {InsertRowLiteral} from "../insert"; //Like TrackedRow but all `tracked` is set export type FilledTrackRow = ( { readonly [columnName in LogT["tracked"][number]] : ( ReturnType ) } & { //All required `doNotCopy` columns must have values set. readonly [columnName in Extract< LogT["doNotCopy"][number], TableUtil.RequiredColumnNames> ] : ( ReturnType ) } & { //All optional `doNotCopy` columns may have values set or unset. //If unset, they use the default values declared on the database. readonly [columnName in Extract< LogT["doNotCopy"][number], TableUtil.OptionalColumnNames> ]? : ( ReturnType ) } ); export namespace FilledTrackRowUtil { export function isFilledTrackRow ( log : LogT, newRow : TrackRow, ) : newRow is FilledTrackRow { for (let columnName of log.tracked) { if ((newRow as any)[columnName] === undefined) { return false; } } return true; } export function assertFilledTrackRow ( log : LogT, newRow : TrackRow, ) : FilledTrackRow { for (let columnName of log.tracked) { if ((newRow as any)[columnName] === undefined) { throw new Error(`Expected a value for ${log.table.alias}.${columnName}`); } } return newRow; } export async function toInsertLiteralRow ( log : LogT, entityIdentifier : EntityIdentifier, newRow : FilledTrackRow, connection : IConnection ) : Promise> { const copyDefaults = await log.copyDefaultsDelegate({ entityIdentifier, connection, }); const insertRow : any = {}; for (let columnName of log.entityIdentifier) { insertRow[columnName] = (entityIdentifier as any)[columnName]; } for (let columnName of log.tracked) { insertRow[columnName] = (newRow as any)[columnName]; } for (let columnName of log.doNotCopy) { insertRow[columnName] = (newRow as any)[columnName]; } for (let columnName of log.copy) { insertRow[columnName] = (copyDefaults as any)[columnName]; } return insertRow; } }