@accounter/server
Version:
Accounter GraphQL server
66 lines • 2.57 kB
JavaScript
/**
* Key generator utility for generating unique identifiers
* Used for fields 1004, 1103, and 1153 which require randomly generated unique IDs
*/
/**
* Generates a random numeric string of specified length
* @param length - The length of the numeric string to generate (max 15 digits)
* @returns A random numeric string padded with leading zeros if necessary
*/
export function generateRandomKey(length = 15) {
if (length <= 0 || length > 15) {
throw new Error('Key length must be between 1 and 15 digits');
}
// Generate a random number with the specified number of digits
// For length 15, max value is 999,999,999,999,999 (15 nines)
const maxValue = Math.pow(10, length) - 1;
const minValue = Math.pow(10, length - 1); // Ensures we always get the full length
// Generate random number between minValue and maxValue
const randomNum = Math.floor(Math.random() * (maxValue - minValue + 1)) + minValue;
// Convert to string and pad with zeros if needed
return randomNum.toString().padStart(length, '0');
}
/**
* Generates a primary identifier for fields 1004, 1103, and 1153
* These fields must have the same value across all records in a single file
* @returns A 15-digit numeric string
*/
export function generatePrimaryIdentifier() {
return generateRandomKey(15);
}
/**
* Key generator context to maintain consistent IDs across records
* This ensures that fields 1004, 1103, and 1153 use the same value within a single file
*/
export class KeyGeneratorContext {
_primaryIdentifier = null;
/**
* Gets or generates the primary identifier for this context
* Ensures the same ID is used across all records that require it
*/
getPrimaryIdentifier() {
this._primaryIdentifier ||= generatePrimaryIdentifier();
return this._primaryIdentifier;
}
/**
* Resets the context, generating new IDs for the next file
*/
reset() {
this._primaryIdentifier = null;
}
/**
* Sets a specific primary identifier (useful for testing or when you have a specific ID requirement)
*/
setPrimaryIdentifier(id) {
if (!/^\d{1,15}$/.test(id)) {
throw new Error('Primary identifier must be a numeric string with 1-15 digits');
}
this._primaryIdentifier = id.padStart(15, '0');
}
}
/**
* Default key generator context instance
* Use this for most cases to ensure consistency across records
*/
export const defaultKeyGenerator = new KeyGeneratorContext();
//# sourceMappingURL=key-generator.js.map