@overture-stack/lyric
Version:
Data Submission system
214 lines (213 loc) • 13.8 kB
TypeScript
import { type DataRecord, Dictionary as SchemasDictionary, DictionaryValidationError, DictionaryValidationRecordErrorDetails, Schema, TestResult } from '@overture-stack/lectern-client';
import { type Submission, SubmissionData, type SubmissionDeleteData, type SubmissionInsertData, type SubmissionUpdateData, type SubmittedData } from '@overture-stack/lyric-data-model/models';
import type { SchemaChildNode } from './dictionarySchemaRelations.js';
import { type DataRecordReference, type EditSubmittedDataReference, type NewSubmittedDataReference, type SubmissionActionType, type SubmissionResponse, type SubmissionStatus, type SubmissionSummaryRepository, type SubmissionSummaryResponse, SubmittedDataReference } from './types.js';
declare const statusesAllowedToClose: readonly ["OPEN", "VALID", "INVALID"];
type StatusesAllowedToClose = typeof statusesAllowedToClose extends Array<infer T> ? T : never;
/** Determines if a Submission can be closed based on it's current status
* @param {SubmissionStatus} status Status of a Submission
* @returns {boolean}
*/
export declare const canTransitionToClosed: (status: SubmissionStatus) => status is StatusesAllowedToClose;
/**
* Checks if object is a Submission or a SubmittedData
* @param {SubmittedDataReference | NewSubmittedDataReference | EditSubmittedDataReference} toBeDetermined
* @returns {boolean}
*/
export declare const determineIfIsSubmission: (reference: SubmittedDataReference | NewSubmittedDataReference | EditSubmittedDataReference) => reference is NewSubmittedDataReference | EditSubmittedDataReference;
/**
* Creates a Record type of DataRecord[] grouped by Entity names
* @param {Record<string, DataRecordReference[]>} mergeDataRecordsByEntityName
* @returns {Record<string, DataRecord[]>}
*/
export declare const extractSchemaDataFromMergedDataRecords: (mergeDataRecordsByEntityName: Record<string, DataRecordReference[]>) => Record<string, DataRecord[]>;
/**
* Finds and returns a list of invalid records based on a provided schema name.
*
* This function checks if the validation results are marked as invalid, and if so,
* filters the validation errors to return those related to a specific schema name.
*
* @param results - The validation results containing details of validation errors.
* @param entityName - The name of the schema to filter the invalid records by.
*
* @returns An array of invalid records for the specified schema, or an empty array if none are found.
*/
export declare const findInvalidRecordErrorsBySchemaName: (results: TestResult<DictionaryValidationError[]>, entityName: string) => import("@overture-stack/lectern-client").SchemaRecordError<DictionaryValidationRecordErrorDetails>[];
/**
* Generalized function to filter out conflicting records between two data sets based on `systemId`.
*
* This function can be used to either filter updates from deletes or deletes from updates, depending on the provided parameters.
* It removes records from the `sourceData` that have a matching `systemId` in the `conflictData`.
*
* @param sourceData - A record of the primary data (e.g., updates or deletes) to be filtered, grouped by entity name.
* @param conflictData - A record of data that might conflict (e.g., deletes or updates), grouped by entity name.
* @param entitySelector - A function to select the `systemId` from the source records.
* @param conflictSelector - A function to select the `systemId` from the conflict records.
* @returns A record of filtered source data, excluding records that conflict based on `systemId`.
*/
export declare const filterRecordsByConflicts: <SourceData, ConflictData>(sourceData: Record<string, SourceData[]>, conflictData: Record<string, ConflictData[]>, entitySelector: (item: SourceData) => string, conflictSelector: (item: ConflictData) => string) => Record<string, SourceData[]>;
/**
* Filters updates from the provided `submissionUpdateData` based on conflicts found in the `submissionDeleteData`.
* Conflicts are determined by matching the `systemId` of the items in both records.
*
* @param submissionUpdateData - A record containing arrays of `SubmissionUpdateData` to be filtered.
* @param submissionDeleteData - A record containing arrays of `SubmissionDeleteData` that defines the conflicts.
* @returns A filtered record of `SubmissionUpdateData[]` where no items conflict with those in `submissionDeleteData`.
*/
export declare const filterUpdatesFromDeletes: (submissionUpdateData: Record<string, SubmissionUpdateData[]>, submissionDeleteData: Record<string, SubmissionDeleteData[]>) => Record<string, SubmissionUpdateData[]>;
/**
* Filters deletes from the provided `submissionDeleteData` based on conflicts found in the `submissionUpdateData`.
* Conflicts are determined by matching the `systemId` of the items in both records.
*
* @param submissionDeleteData - A record containing arrays of `SubmissionDeleteData` to be filtered.
* @param submissionUpdateData - A record containing arrays of `SubmissionUpdateData` that defines the conflicts.
* @returns A filtered record of `SubmissionDeleteData[]` where no items conflict with those in `submissionUpdateData`.
*/
export declare const filterDeletesFromUpdates: (submissionDeleteData: Record<string, SubmissionDeleteData[]>, submissionUpdateData: Record<string, SubmissionUpdateData[]>) => Record<string, SubmissionDeleteData[]>;
/**
* Returns a filter to query the database used to find dependents records when the update record involves changes of an primary ID field
*
* @param schemaRelations An array of `SchemaChildNode` representing the schema relations for the entity. Each node contains information about parent-child relationships.
* @param updateRecord The update record containing old and new data. The function checks the `old` data to identify fields involved in the relationship.
* @returns
*/
export declare const filterRelationsForPrimaryIdUpdate: (schemaRelations: SchemaChildNode[], updateRecord: SubmissionUpdateData) => {
entityName: string;
dataField: string;
dataValue: string | undefined;
}[];
/**
* Returns only the schema errors corresponding to the Active Submission.
* Schema errors are grouped by Entity name.
* @param {object} input
* @param {TestResult<DictionaryValidationError[]>} input.resultValidation
* @param {Record<string, DataRecordReference[]>} input.dataValidated
* @returns {Record<string, Record<string, DictionaryValidationRecordErrorDetails[]>>}
*/
export declare const groupSchemaErrorsByEntity: (input: {
resultValidation: TestResult<DictionaryValidationError[]>;
dataValidated: Record<string, DataRecordReference[]>;
}) => Record<string, Record<string, DictionaryValidationRecordErrorDetails[]>>;
/**
* This function extracts the Schema Data from the Active Submission
* and maps it to it's original reference Id
* The result mapping is used to perform the cross schema validation
* @param {number} activeSubmissionId
* @param {Record<string, SubmissionInsertData>} activeSubmissionInsertDataEntities
* @returns {Record<string, DataRecordReference[]>}
*/
export declare const mapInsertDataToRecordReferences: (activeSubmissionId: number, activeSubmissionInsertDataEntities: Record<string, SubmissionInsertData>) => Record<string, DataRecordReference[]>;
/**
* This function takes a collection of dependent data grouped by entity name, applies a filter to each entity,
* and creates a mapping of `SubmissionUpdateData` based on the specified filter and new data values.
*
* @param params
* @param param.dependentData A record where each key is an entity name and each value is an array of `SubmittedData` objects.
* @param param.filterEntity An array of filter criteria where each entry contains an `entityName`, `dataField`, and `dataValue` to filter.
* @param param.newDataRecord A record containing new data values to be applied to the filtered entities.
* @returns
*/
export declare const mapGroupedUpdateSubmissionData: ({ dependentData, filterEntity, newDataRecord, }: {
dependentData: Record<string, SubmittedData[]>;
filterEntity: {
entityName: string;
dataField: string;
dataValue: string | undefined;
}[];
newDataRecord: DataRecord;
}) => Record<string, SubmissionUpdateData[]>;
/**
* Combines **Active Submission** and the **Submitted Data** recevied as arguments.
* Then, the Schema Data is extracted and mapped with its internal reference ID.
* The returned Object is a collection of the raw Schema Data with it's reference ID grouped by entity name.
* @param {Submission} originalSubmission The Active Submission to be merged
* @param {Object} submissionData
* @param {Record<string, SubmissionInsertData>} submissionData.insertData Collection of Data records of the Active Submission
* @param {Record<string, SubmissionUpdateData[]>} submissionData.updateData Collection of Data records of the Active Submission
* @param {Record<string, SubmissionDeleteData[]>} submissionData.deleteData Collection of Data records of the Active Submission
* @param {number} submissionData.id ID of the Active Submission
* @param {SubmittedData[]} submittedData An array of Submitted Data
* @returns {Record<string, DataRecordReference[]>}
*/
export declare const mergeAndReferenceEntityData: ({ originalSubmission, submissionData, submittedData, }: {
originalSubmission: Submission;
submissionData: SubmissionData;
submittedData: SubmittedData[];
}) => Record<string, DataRecordReference[]>;
/**
* Merges multiple `Record<string, SubmissionInsertData>` objects into a single object.
* If there are duplicate keys between the objects, the `records` arrays of `SubmissionInsertData`
* are concatenated for the matching keys, ensuring no duplicates.
*
* @param objects An array of objects where each object is a `Record<string, SubmissionInsertData>`.
* Each key represents the entityName, and the value is an object of type `SubmissionInsertData`.
*
* @returns A new `Record<string, SubmissionInsertData>` where:
* - If a key is unique across all objects, its value is directly included.
* - If a key appears in multiple objects, the `records` arrays are concatenated for that key, avoiding duplicates.
*/
export declare const mergeInsertsRecords: (...objects: Record<string, SubmissionInsertData>[]) => Record<string, SubmissionInsertData>;
/**
* Merges multiple `Record<string, SubmissionDeleteData[]>` objects into a single object.
* For each key, the `SubmissionDeleteData[]` arrays are concatenated, ensuring no duplicate
* `SubmissionDeleteData` objects based on the `systemId` field.
*
* @param objects Multiple `Record<string, SubmissionDeleteData[]>` objects to be merged.
* Each key represents an identifier, and the value is an array of `SubmissionDeleteData`.
*
* @returns
*/
export declare const mergeDeleteRecords: (...objects: Record<string, SubmissionDeleteData[]>[]) => Record<string, SubmissionDeleteData[]>;
/**
* Merge Active Submission data with incoming TSV file data processed
*
* @param objects
* @returns An arbitrary number of arrays of Record<string, SubmissionUpdateData[]>
*/
export declare const mergeUpdatesBySystemId: (...objects: Record<string, SubmissionUpdateData[]>[]) => Record<string, SubmissionUpdateData[]>;
/**
* Utility to parse a raw Submission to a Response type
* @param {SubmissionSummaryRepository} submission
* @returns {SubmissionResponse}
*/
export declare const parseSubmissionResponse: (submission: SubmissionSummaryRepository) => SubmissionResponse;
/**
* Utility to parse a raw Submission to a Summary of the Submission
* @param {SubmissionSummaryRepository} submission
* @returns {SubmissionSummaryResponse}
*/
export declare const parseSubmissionSummaryResponse: (submission: SubmissionSummaryRepository) => SubmissionSummaryResponse;
export declare const pluralizeSchemaName: (schemaName: string) => string;
export declare const removeItemsFromSubmission: (submissionData: SubmissionData, filter: {
actionType: SubmissionActionType;
entityName: string;
index: number | null;
}) => SubmissionData;
/**
* Processes the `foundDependentUpdates` array and segregates the updates based on
* whether they involve ID fields (dependent fields) or non-ID fields.
*
* @param foundDependentUpdates - Array of updates to be processed.
* @param filesDataProcessed - Record where the key is a string (representing an entity name) and
* each value is an array of `SubmissionUpdateData`. These are the processed data files to match against.
* @returns An object containing two records:
* - `idFieldChangeRecord`: A record of updates involving ID fields.
* - `nonIdFieldChangeRecord`: A record of updates involving non-ID fields.
*/
export declare const segregateFieldChangeRecords: (submissionUpdateRecords: Record<string, SubmissionUpdateData[]>, dictionaryRelations: Record<string, SchemaChildNode[]>) => {
idFieldChangeRecord: Record<string, SubmissionUpdateData[]>;
nonIdFieldChangeRecord: Record<string, SubmissionUpdateData[]>;
};
/**
* Validate a full set of Schema Data using a Dictionary
* @param {SchemasDictionary & {id: number }} dictionary
* @param {Record<string, DataRecord[]>} schemasData
* @returns A TestResult object representing the outcome of a test applied to some data.
* If a test is valid, no additional data is added to the result. If it is invalid, then the
* reason (or array of reasons) for why the test failed should be given.
*/
export declare const validateSchemas: (dictionary: SchemasDictionary & {
id: number;
}, schemasData: Record<string, DataRecord[]>) => TestResult<DictionaryValidationError[]>;
export declare const parseToSchema: (schema: Schema) => (record: Record<string, string>) => DataRecord;
export {};