Refactor: Standardize naming conventions in ae_core module to snake_case and remove deprecated functions.
This commit is contained in:
@@ -187,115 +187,7 @@ export async function delete_ae_obj_id(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated This function is deprecated. Use module-specific `process_ae_obj__*_props` functions instead.
|
|
||||||
* This generic processor with dynamic field detection is an older implementation.
|
|
||||||
* Module-specific processors now handle ID aliasing, content processing, and computed properties more effectively.
|
|
||||||
*/
|
|
||||||
export async function process_ae_obj__props({
|
|
||||||
obj_li,
|
|
||||||
log_lvl = 0,
|
|
||||||
}: {
|
|
||||||
obj_li: any[];
|
|
||||||
log_lvl?: number;
|
|
||||||
}) {
|
|
||||||
if (log_lvl) {
|
|
||||||
console.log(`*** process_ae_obj__props() ***`, obj_li);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!obj_li || obj_li.length === 0) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
const processed = obj_li.map(obj => {
|
|
||||||
// Extract fields with fallbacks and detect existence
|
|
||||||
const group = obj.group || '';
|
|
||||||
const priority = obj.priority !== undefined ? obj.priority : 0;
|
|
||||||
const sort = obj.sort !== undefined ? obj.sort : 0;
|
|
||||||
const created_on = obj.created_on || '';
|
|
||||||
const updated_on = obj.updated_on || '';
|
|
||||||
const name = obj.name || '';
|
|
||||||
|
|
||||||
// const description = obj.description || '';
|
|
||||||
// // Handle special case with description that has markdown
|
|
||||||
// // Remove the most common zerowidth characters from the start of the file
|
|
||||||
// const description_cleaned: string = obj.description.replace(/^[\u200B\u200C\u200D\u200E\u200F\uFEFF]/,"");
|
|
||||||
// const description_md_html: null|string = marked.parse(description_cleaned ?? '') ?? null;
|
|
||||||
// // Add processed description
|
|
||||||
// obj.description_md_html = description_md_html;
|
|
||||||
|
|
||||||
// Handle special case with content that has markdown
|
|
||||||
// Remove the most common zerowidth characters from the start of the file
|
|
||||||
const has_content = obj.content !== undefined && obj.content !== null;
|
|
||||||
if (has_content) {
|
|
||||||
const content_cleaned: string = obj.content.replace(/^[\u200B\u200C\u200D\u200E\u200F\uFEFF]/,"");
|
|
||||||
const content_md_html: null|string = marked.parse(content_cleaned ?? '') ?? null;
|
|
||||||
// Add processed content
|
|
||||||
obj.content_md_html = content_md_html;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check which fields actually exist for this object
|
|
||||||
const has_group = obj.group !== undefined && obj.group !== null;
|
|
||||||
const has_priority = obj.priority !== undefined && obj.priority !== null;
|
|
||||||
const has_sort = obj.sort !== undefined && obj.sort !== null;
|
|
||||||
const has_created = obj.created_on !== undefined && obj.created_on !== null;
|
|
||||||
const has_updated = obj.updated_on !== undefined && obj.updated_on !== null;
|
|
||||||
const has_name = obj.name !== undefined && obj.name !== null;
|
|
||||||
|
|
||||||
// Generate standardized tmp_sort fields with proper zero-padding
|
|
||||||
const sort_str = sort?.toString().padStart(3, '0') ?? '000';
|
|
||||||
|
|
||||||
// Build dynamic sorting combinations based on what exists
|
|
||||||
let tmp_sort_1 = '';
|
|
||||||
let tmp_sort_2 = '';
|
|
||||||
let tmp_sort_3 = '';
|
|
||||||
|
|
||||||
// Build based on existing fields
|
|
||||||
if (has_group && has_priority && has_sort) {
|
|
||||||
tmp_sort_1 = `${group}_${priority}_${sort_str}`;
|
|
||||||
tmp_sort_2 = `${group}_${priority}_${sort_str}_${name || ''}`;
|
|
||||||
tmp_sort_3 = `${priority}_${sort_str}_${group}`;
|
|
||||||
} else if (has_priority && has_sort) {
|
|
||||||
tmp_sort_1 = `${priority}_${sort_str}`;
|
|
||||||
tmp_sort_2 = `${priority}_${sort_str}_${name || ''}`;
|
|
||||||
tmp_sort_3 = `${priority}_${sort_str}`;
|
|
||||||
} else if (has_sort) {
|
|
||||||
tmp_sort_1 = `${sort_str}`;
|
|
||||||
tmp_sort_2 = `${sort_str}_${name || ''}`;
|
|
||||||
tmp_sort_3 = `${sort_str}`;
|
|
||||||
} else {
|
|
||||||
// Fallback for minimal data
|
|
||||||
tmp_sort_1 = `${created_on || ''}`;
|
|
||||||
tmp_sort_2 = `${created_on || ''}_${name || ''}`;
|
|
||||||
tmp_sort_3 = `${updated_on || ''}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add time-based sorting for better ordering
|
|
||||||
if (has_created && has_updated) {
|
|
||||||
tmp_sort_1 += `_${created_on}_${updated_on}`;
|
|
||||||
tmp_sort_2 += `_${created_on}_${updated_on}`;
|
|
||||||
tmp_sort_3 += `_${updated_on}`;
|
|
||||||
} else if (has_created) {
|
|
||||||
tmp_sort_1 += `_${created_on}`;
|
|
||||||
tmp_sort_2 += `_${created_on}`;
|
|
||||||
tmp_sort_3 += `_${created_on}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return processed object with standardized fields
|
|
||||||
return {
|
|
||||||
...obj,
|
|
||||||
tmp_sort_1,
|
|
||||||
tmp_sort_2,
|
|
||||||
tmp_sort_3
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
if (log_lvl) {
|
|
||||||
console.log(`Processed objects:`, processed);
|
|
||||||
}
|
|
||||||
|
|
||||||
return processed;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Additional Modules that might be needed for reloads
|
// Additional Modules that might be needed for reloads
|
||||||
@@ -315,49 +207,7 @@ import { load_ae_obj_id__post_comment } from "$lib/ae_posts/ae_posts__post_comme
|
|||||||
import { load_ae_obj_id__person } from "$lib/ae_core/core__person";
|
import { load_ae_obj_id__person } from "$lib/ae_core/core__person";
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use update_ae_obj_id_crud_v2 instead. This is the older version.
|
|
||||||
*/
|
|
||||||
export async function update_ae_obj_id_crud(
|
|
||||||
{
|
|
||||||
api_cfg,
|
|
||||||
object_type,
|
|
||||||
object_id,
|
|
||||||
field_name,
|
|
||||||
new_field_value,
|
|
||||||
log_lvl = 0
|
|
||||||
}: {
|
|
||||||
api_cfg: any,
|
|
||||||
object_type: string,
|
|
||||||
object_id: string,
|
|
||||||
field_name: string,
|
|
||||||
new_field_value: any,
|
|
||||||
log_lvl: number
|
|
||||||
}) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
const results = await api.update_ae_obj_id_crud({
|
|
||||||
api_cfg: api_cfg,
|
|
||||||
obj_type: object_type,
|
|
||||||
obj_id: object_id,
|
|
||||||
field_name: field_name,
|
|
||||||
field_value: new_field_value,
|
|
||||||
key: api_cfg.api_crud_super_key,
|
|
||||||
log_lvl: log_lvl
|
|
||||||
});
|
|
||||||
|
|
||||||
if (results) {
|
|
||||||
console.log(`Patched - Field Name: ${field_name} with new Field Value: ${new_field_value}`);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
console.log(`Not Patched - Field Name: ${field_name} with new Field Value: ${new_field_value}; Account ID: ${api_cfg.account_id}`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.log('Something went wrong patching the record.', error);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
export async function update_ae_obj_id_crud_v2(
|
export async function update_ae_obj_id_crud_v2(
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import type { Dexie, Table } from 'dexie';
|
|||||||
* @param log_lvl The logging level.
|
* @param log_lvl The logging level.
|
||||||
* @returns The found ID, or undefined if no ID could be found.
|
* @returns The found ID, or undefined if no ID could be found.
|
||||||
*/
|
*/
|
||||||
function findObjectId(obj: any, table_name: string, log_lvl: number): string | number | undefined {
|
function find_object_id(obj: any, table_name: string, log_lvl: number): string | number | undefined {
|
||||||
const potentialKeys = ['id', `${table_name}_id`, `${table_name}_id_random`];
|
const potential_keys = ['id', `${table_name}_id`, `${table_name}_id_random`];
|
||||||
|
|
||||||
for (const key of potentialKeys) {
|
for (const key of potentialKeys) {
|
||||||
if (obj[key]) {
|
if (obj[key]) {
|
||||||
@@ -67,12 +67,12 @@ export async function db_save_ae_obj_li__ae_obj<T extends Record<string, any>>({
|
|||||||
|
|
||||||
const db_table: Table<T> = db_instance.table(table_name);
|
const db_table: Table<T> = db_instance.table(table_name);
|
||||||
if (!db_table) {
|
if (!db_table) {
|
||||||
const errorMsg = `Table not found in Dexie instance: ${table_name}`;
|
const error_msg = `Table not found in Dexie instance: ${table_name}`;
|
||||||
console.error(errorMsg);
|
console.error(errorMsg);
|
||||||
throw new Error(errorMsg);
|
throw new Error(errorMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
const dataToSave = obj_li
|
const data_to_save = obj_li
|
||||||
.map((obj) => {
|
.map((obj) => {
|
||||||
const record: Partial<T> = {};
|
const record: Partial<T> = {};
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ export async function db_save_ae_obj_li__ae_obj<T extends Record<string, any>>({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ensure the primary key is included, attempting to find it from various legacy keys.
|
// Ensure the primary key is included, attempting to find it from various legacy keys.
|
||||||
const id = findObjectId(obj, table_name, log_lvl);
|
const id = find_object_id(obj, table_name, log_lvl);
|
||||||
|
|
||||||
if (id === undefined) {
|
if (id === undefined) {
|
||||||
return null; // Skip objects without a valid ID.
|
return null; // Skip objects without a valid ID.
|
||||||
@@ -93,7 +93,7 @@ export async function db_save_ae_obj_li__ae_obj<T extends Record<string, any>>({
|
|||||||
})
|
})
|
||||||
.filter(Boolean) as T[];
|
.filter(Boolean) as T[];
|
||||||
|
|
||||||
if (dataToSave.length === 0) {
|
if (data_to_save.length === 0) {
|
||||||
if (log_lvl > 0) {
|
if (log_lvl > 0) {
|
||||||
console.warn('All objects were skipped, likely due to missing IDs.');
|
console.warn('All objects were skipped, likely due to missing IDs.');
|
||||||
}
|
}
|
||||||
@@ -102,7 +102,7 @@ export async function db_save_ae_obj_li__ae_obj<T extends Record<string, any>>({
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// bulkPut efficiently handles both inserts and updates.
|
// bulkPut efficiently handles both inserts and updates.
|
||||||
const keys = await db_table.bulkPut(dataToSave);
|
const keys = await db_table.bulkPut(data_to_save);
|
||||||
if (log_lvl > 0) {
|
if (log_lvl > 0) {
|
||||||
console.log(`Successfully saved ${keys.length} objects to "${table_name}".`);
|
console.log(`Successfully saved ${keys.length} objects to "${table_name}".`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -687,13 +687,13 @@ async function _process_generic_props<T extends Record<string, any>>({
|
|||||||
// The API often returns fields like 'person_id_random', which need to be aliased to 'person_id'.
|
// The API often returns fields like 'person_id_random', which need to be aliased to 'person_id'.
|
||||||
for (const key in processed_obj) {
|
for (const key in processed_obj) {
|
||||||
if (key.endsWith('_random')) {
|
if (key.endsWith('_random')) {
|
||||||
const newKey = key.slice(0, -7); // Remove '_random' suffix
|
const new_key = key.slice(0, -7); // Remove '_random' suffix
|
||||||
processed_obj[newKey] = processed_obj[key];
|
processed_obj[newKey] = processed_obj[key];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Ensure 'id' is set from '[obj_type]_id_random'
|
// Ensure 'id' is set from '[obj_type]_id_random'
|
||||||
const randomIdKey = `${obj_type}_id_random`;
|
const random_id_key = `${obj_type}_id_random`;
|
||||||
if (processed_obj[randomIdKey]) {
|
if (processed_obj[random_id_key]) {
|
||||||
processed_obj.id = processed_obj[randomIdKey];
|
processed_obj.id = processed_obj[randomIdKey];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -164,26 +164,26 @@ export async function js_generate_qr_code(qr_type, params = {}) {
|
|||||||
|
|
||||||
console.log(`*** js_generate_qr_code() *** qr_type=${qr_type}`, params);
|
console.log(`*** js_generate_qr_code() *** qr_type=${qr_type}`, params);
|
||||||
|
|
||||||
let qrData = null;
|
let qr_data = null;
|
||||||
|
|
||||||
// --- 1. Replicate Data Formatting Logic ---
|
// --- 1. Replicate Data Formatting Logic ---
|
||||||
switch (qr_type) {
|
switch (qr_type) {
|
||||||
case 'mecard':
|
case 'mecard':
|
||||||
// Format: MECARD:N:name;EMAIL:email;ADR:address;;
|
// Format: MECARD:N:name;EMAIL:email;ADR:address;;
|
||||||
// Note: The original Python code had adr, but we'll use n and email as a minimum.
|
// Note: The original Python code had adr, but we'll use n and email as a minimum.
|
||||||
qrData = `MECARD:N:${n};EMAIL:${email};;`;
|
qr_data = `MECARD:N:${n};EMAIL:${email};;`;
|
||||||
// You can enhance this with other MeCard fields if needed.
|
// You can enhance this with other MeCard fields if needed.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'vcard':
|
case 'vcard':
|
||||||
// Format: BEGIN:VCARD...END:VCARD
|
// Format: BEGIN:VCARD...END:VCARD
|
||||||
qrData = `BEGIN:VCARD\nVERSION:3.0\nN:${n}\nFN:${fn}\nORG:${org}\nEMAIL:${email}\n`;
|
qr_data = `BEGIN:VCARD\nVERSION:3.0\nN:${n}\nFN:${fn}\nORG:${org}\nEMAIL:${email}\n`;
|
||||||
|
|
||||||
if (url) { qrData += `URL:${url}\n`; }
|
if (url) { qr_data += `URL:${url}\n`; }
|
||||||
if (tel) { qrData += `TEL:${tel}\n`; }
|
if (tel) { qr_data += `TEL:${tel}\n`; }
|
||||||
if (adr_loc) {
|
if (adr_loc) {
|
||||||
// ADR format: TYPE=postal:Po box;Ext;Street;Locality;Region;Postal code;Country
|
// ADR format: TYPE=postal:Po box;Ext;Street;Locality;Region;Postal code;Country
|
||||||
qrData += `ADR:${adr_poa};${adr_ext};${adr_str};${adr_loc};${adr_reg};${adr_postal};${adr_country}\n`;
|
qr_data += `ADR:${adr_poa};${adr_ext};${adr_str};${adr_loc};${adr_reg};${adr_postal};${adr_country}\n`;
|
||||||
}
|
}
|
||||||
qrData += 'END:VCARD';
|
qrData += 'END:VCARD';
|
||||||
break;
|
break;
|
||||||
@@ -191,32 +191,32 @@ export async function js_generate_qr_code(qr_type, params = {}) {
|
|||||||
case 'obj':
|
case 'obj':
|
||||||
// Custom format: OBJ:ot:obj_type,oi:obj_id
|
// Custom format: OBJ:ot:obj_type,oi:obj_id
|
||||||
if (!obj_type || !obj_id) throw new Error('Missing obj_type or obj_id for type "obj".');
|
if (!obj_type || !obj_id) throw new Error('Missing obj_type or obj_id for type "obj".');
|
||||||
qrData = `OBJ:ot:${obj_type},oi:${obj_id}`;
|
qr_data = `OBJ:ot:${obj_type},oi:${obj_id}`;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'kv':
|
case 'kv':
|
||||||
// Custom format: KV:k:"key",v:"val"
|
// Custom format: KV:k:"key",v:"val"
|
||||||
if (!key || !val) throw new Error('Missing key or val for type "kv".');
|
if (!key || !val) throw new Error('Missing key or val for type "kv".');
|
||||||
qrData = `KV:k:"${key}",v:"${val}"`;
|
qr_data = `KV:k:"${key}",v:"${val}"`;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'js':
|
case 'js':
|
||||||
// Assumes 'js' is a stringified JSON object
|
// Assumes 'js' is a stringified JSON object
|
||||||
if (!js) throw new Error('Missing js string for type "js".');
|
if (!js) throw new Error('Missing js string for type "js".');
|
||||||
qrData = `JS:${js}`;
|
qr_data = `JS:${js}`;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'str':
|
case 'str':
|
||||||
// Raw string data
|
// Raw string data
|
||||||
if (!str) throw new Error('Missing raw string data for type "str".');
|
if (!str) throw new Error('Missing raw string data for type "str".');
|
||||||
qrData = str;
|
qr_data = str;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new Error(`Unknown QR type: ${qr_type}`);
|
throw new Error(`Unknown QR type: ${qr_type}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!qrData) {
|
if (!qr_data) {
|
||||||
throw new Error('Failed to create QR code data string.');
|
throw new Error('Failed to create QR code data string.');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,14 +225,14 @@ export async function js_generate_qr_code(qr_type, params = {}) {
|
|||||||
// Options match the Python 'qrcode' library defaults closely:
|
// Options match the Python 'qrcode' library defaults closely:
|
||||||
// error_correction = qrcode.constants.ERROR_CORRECT_M
|
// error_correction = qrcode.constants.ERROR_CORRECT_M
|
||||||
// box_size = 10, border = 1
|
// box_size = 10, border = 1
|
||||||
const dataUrl = await QRCode.toDataURL(qrData, {
|
const data_url = await QRCode.toDataURL(qr_data, {
|
||||||
errorCorrectionLevel: 'M',
|
errorCorrectionLevel: 'M',
|
||||||
margin: 1, // Corresponds to border
|
margin: 1, // Corresponds to border
|
||||||
scale: 10, // Corresponds to box_size
|
scale: 10, // Corresponds to box_size
|
||||||
type: 'image/png',
|
type: 'image/png',
|
||||||
});
|
});
|
||||||
console.log('Generated QR code data URL:', dataUrl);
|
console.log('Generated QR code data URL:', data_url);
|
||||||
return dataUrl;
|
return data_url;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error generating QR code:', error);
|
console.error('Error generating QR code:', error);
|
||||||
throw new Error('Could not generate QR code image.');
|
throw new Error('Could not generate QR code image.');
|
||||||
|
|||||||
Reference in New Issue
Block a user