From 0a4940161d902912405ad13a73fe52cbc62e656f Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Fri, 1 Aug 2025 17:30:30 -0400 Subject: [PATCH] Initial work on finally creating and implementing more generic and standardized CRUD functions for my Aether objects. It should work very well for Delete, Create, and Update. Load and Load List will need more work. --- src/lib/ae_core/core__crud_generic.ts | 443 ++++++++++++++++++ src/lib/ae_core/core__idb_dexie.ts | 2 +- src/lib/ae_journals/ae_journals__journal.ts | 56 +-- src/lib/ae_journals/db_journals.ts | 209 ++++++++- src/routes/journals/[journal_id]/+layout.ts | 40 +- .../entry/[journal_entry_id]/+page.ts | 19 +- 6 files changed, 722 insertions(+), 47 deletions(-) create mode 100644 src/lib/ae_core/core__crud_generic.ts diff --git a/src/lib/ae_core/core__crud_generic.ts b/src/lib/ae_core/core__crud_generic.ts new file mode 100644 index 00000000..4d33bac9 --- /dev/null +++ b/src/lib/ae_core/core__crud_generic.ts @@ -0,0 +1,443 @@ +import { marked } from 'marked'; + +import type { key_val } from '$lib/ae_stores'; +import { api } from '$lib/api'; + +import { db_save_ae_obj_li__ae_obj } from "$lib/ae_core/core__idb_dexie"; + +// Define generic CRUD args +export interface GenericCrudArgs { + api_cfg: any; + obj_type: string; + obj_id?: string; + for_obj_type?: string; + for_obj_id?: string; + + db_instance?: any; // Optional DB instance for caching + db_field_li?: string[]; // Optional list of fields to save in DB + + // Flags to include related core object models + inc_account_li?: boolean; + inc_address_li?: boolean; + inc_contact_li?: boolean; + inc_person_li?: boolean; + inc_site_li?: boolean; + inc_site_domain_li?: boolean; + inc_user_li?: boolean; + + + // Flags to include related other object models + inc_archive_li?: boolean; + inc_archive_entry_li?: boolean; + inc_event_li?: boolean; + inc_event_session_li?: boolean; + inc_post_li?: boolean; + inc_post_comment_li?: boolean; + inc_journal_li?: boolean; + inc_journal_entry_li?: boolean; + + inc_obj_type_li?: string[]; // Optional list of object types to include + + data_kv?: key_val; + enabled?: 'enabled' | 'disabled' | 'all'; + hidden?: 'not_hidden' | 'hidden' | 'all'; + limit?: number; + offset?: number; + order_by_li?: key_val; + params?: key_val; + try_cache?: boolean; + log_lvl?: number; +} + +// Generic function: Load single object by ID +export async function load_ae_obj_id( + args: GenericCrudArgs +): Promise { + const { api_cfg, obj_type, obj_id, db_instance, db_field_li, inc_obj_type_li, try_cache = true, log_lvl = 0 } = args; + + if (log_lvl) { + console.log(`*** load_ae_obj_id() *** obj_type=${obj_type} obj_id=${obj_id}`); + } + + let result = await api.get_ae_obj_id_crud({ + api_cfg, + obj_type, + obj_id, + params: {}, + log_lvl + }); + + let idb_db_instance = null; // You must inject the correct DB instance per module + let idb_tbl_name = obj_type; + let properties_to_save: string[] = []; + if (obj_type === 'journal') { + idb_db_instance = 'ae_journals_db'; + // idb_tbl_name = 'journal'; + + result.id = result.journal_id_random; // Ensure we use the correct ID field + result.journal_id = result.journal_id_random; + result.account_id = result.account_id_random; + result.person_id = result.person_id_random; + + // WARNING: This works to populate most of the IDB table fields but it is not ideal. It is sort of a safety net. + properties_to_save = Object.keys(db_instance.table('journal').schema.idxByName); + } + if (obj_type === 'journal_entry') { + idb_db_instance = 'ae_journals_db'; + // idb_tbl_name = 'entry'; + + result.id = result.journal_entry_id_random; // Ensure we use the correct ID field + result.journal_entry_id = result.journal_entry_id_random; // Ensure we use the correct ID field + result.journal_id = result.journal_id_random; + + // WARNING: This works to populate most of the IDB table fields but it is not ideal. It is sort of a safety net. + properties_to_save = Object.keys(db_instance.table('journal_entry').schema.idxByName); + + } + properties_to_save = [ + ...db_field_li + ]; + + // if (log_lvl) { + // console.log('IDB DB Instance:', db_instance); + // console.log(db_instance.journal_entry.core.schema); + // console.log(db_instance.table('journal_entry')); + // console.log(db_instance.table('journal_entry').schema.idxByName); + // // Show only the keys of the indexes + // console.log(Object.keys(db_instance.table('journal_entry').schema.idxByName)); + // } + + if (try_cache && result) { + // Process and save to DB + const processed = await process_ae_obj__props({ obj_li: [result], log_lvl }); + await db_save_ae_obj_li__ae_obj({ + db_instance: db_instance, // You must inject the correct DB instance per module + table_name: idb_tbl_name, + obj_li: processed, + properties_to_save: properties_to_save, + log_lvl + }); + } + + if (inc_obj_type_li) { + // Load related objects if specified + for (const inc_obj_type of inc_obj_type_li) { + if (log_lvl) { + console.log(`Loading related objects of type: ${inc_obj_type}`); + } + const related_objects = await load_ae_obj_li({ + api_cfg, + obj_type: inc_obj_type, + for_obj_type: obj_type, + for_obj_id: obj_id, + enabled: 'enabled', + hidden: 'not_hidden', + limit: 99, + try_cache, + log_lvl + }); + result[`${inc_obj_type}_li`] = related_objects; + } + } + + return result; +} + +// Generic function: Load list of objects +export async function load_ae_obj_li( + args: GenericCrudArgs +): Promise { + const { + api_cfg, + obj_type, + for_obj_type = '', + for_obj_id, + db_instance, + db_field_li, + inc_obj_type_li, + enabled = 'enabled', + hidden = 'not_hidden', + limit = 99, + offset = 0, + order_by_li = {}, + params = {}, + try_cache = true, + log_lvl = 0 + } = args; + + if (log_lvl) { + console.log(`*** load_ae_obj_li() *** obj_type=${obj_type} for_obj_type=${for_obj_type} for_obj_id=${for_obj_id}`); + } + + let params_json: key_val = {}; + + let result = await api.get_ae_obj_li_for_obj_id_crud_v2({ + api_cfg, + obj_type, + for_obj_type, + for_obj_id, + enabled, + hidden, + order_by_li, + limit, + offset, + params_json: {}, + params, + log_lvl + }); + + // Loop through results a + let idb_db_instance = null; // You must inject the correct DB instance per module + let idb_tbl_name = obj_type; + let properties_to_save: string[] = []; + if (obj_type === 'journal') { + idb_db_instance = 'ae_journals_db'; + // idb_tbl_name = 'journal'; + + result.id = result.journal_id_random; // Ensure we use the correct ID field + result.journal_id = result.journal_id_random; + result.account_id = result.account_id_random; + result.person_id = result.person_id_random; + + // WARNING: This works to populate most of the IDB table fields but it is not ideal. It is sort of a safety net. + properties_to_save = Object.keys(db_instance.table('journal').schema.idxByName); + } + if (obj_type === 'journal_entry') { + idb_db_instance = 'ae_journals_db'; + // idb_tbl_name = 'entry'; + + result.id = result.journal_entry_id_random; // Ensure we use the correct ID field + result.journal_entry_id = result.journal_entry_id_random; // Ensure we use the correct ID field + result.journal_id = result.journal_id_random; + + // WARNING: This works to populate most of the IDB table fields but it is not ideal. It is sort of a safety net. + properties_to_save = Object.keys(db_instance.table('journal_entry').schema.idxByName); + + } + + + + if (try_cache && result) { + // Process and save to DB + const processed = await process_ae_obj__props({ obj_li: result, log_lvl }); + await db_save_ae_obj_li__ae_obj({ + db_instance: db_instance, + table_name: idb_tbl_name, + obj_li: processed, + properties_to_save: [], + log_lvl + }); + } + + return result; +} + +// Generic function: Create object +export async function create_ae_obj( + args: GenericCrudArgs +): Promise { + const { api_cfg, obj_type, data_kv, try_cache = true, log_lvl = 0 } = args; + + if (log_lvl) { + console.log(`*** create_ae_obj() *** obj_type=${obj_type}`, data_kv); + } + + let result = await api.create_ae_obj_crud({ + api_cfg, + obj_type, + fields: data_kv, + key: api_cfg.api_crud_super_key, + params: {}, + return_obj: true, + log_lvl + }); + + if (try_cache && result) { + const processed = await process_ae_obj__props({ obj_li: [result], log_lvl }); + await db_save_ae_obj_li__ae_obj({ + db_instance: null, + table_name: obj_type, + obj_li: processed, + properties_to_save: [], + log_lvl + }); + } + + return result; +} + +// Generic function: Update object +export async function update_ae_obj( + args: GenericCrudArgs +): Promise { + const { api_cfg, obj_type, obj_id, data_kv, try_cache = true, log_lvl = 0 } = args; + + if (log_lvl) { + console.log(`*** update_ae_obj() *** obj_type=${obj_type} obj_id=${obj_id}`, data_kv); + } + + let result = await api.update_ae_obj_id_crud({ + api_cfg, + obj_type, + obj_id, + fields: data_kv, + key: api_cfg.api_crud_super_key, + params: {}, + return_obj: true, + log_lvl + }); + + if (try_cache && result) { + const processed = await process_ae_obj__props({ obj_li: [result], log_lvl }); + await db_save_ae_obj_li__ae_obj({ + db_instance: null, + table_name: obj_type, + obj_li: processed, + properties_to_save: [], + log_lvl + }); + } + + return result; +} + +// Generic function: Delete object +export async function delete_ae_obj_id( + args: GenericCrudArgs +): Promise { + const { api_cfg, obj_type, obj_id, method = 'delete', try_cache = true, log_lvl = 0 } = args; + + if (log_lvl) { + console.log(`*** delete_ae_obj_id() *** obj_type=${obj_type} obj_id=${obj_id}`); + } + + let result = await api.delete_ae_obj_id_crud({ + api_cfg, + obj_type, + obj_id, + key: api_cfg.api_crud_super_key, + params: {}, + method, + log_lvl + }); + + if (try_cache) { + // Remove from DB regardless of success/failure + try { + // db_..delete(obj_id); // You must inject the correct DB here + } catch (err) { + console.error(`Failed to delete ${obj_id}:`, err); + } + } + + return result; +} + + + + +// Generic processor with dynamic field detection +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; +} diff --git a/src/lib/ae_core/core__idb_dexie.ts b/src/lib/ae_core/core__idb_dexie.ts index ff1797ab..9a861302 100644 --- a/src/lib/ae_core/core__idb_dexie.ts +++ b/src/lib/ae_core/core__idb_dexie.ts @@ -32,7 +32,7 @@ export async function db_save_ae_obj_li__ae_obj({ const db_table = db_instance[table_name]; if (!db_table) { - console.error(`Table not found: ${table_name}`); + console.error(`Table not found in ${db_instance}: ${table_name}`); return []; } diff --git a/src/lib/ae_journals/ae_journals__journal.ts b/src/lib/ae_journals/ae_journals__journal.ts index 543eaf46..090bfc0c 100644 --- a/src/lib/ae_journals/ae_journals__journal.ts +++ b/src/lib/ae_journals/ae_journals__journal.ts @@ -104,35 +104,35 @@ export async function load_ae_obj_id__journal( } if (inc_entry_li) { - // Load the entries for the journal - if (log_lvl) { - console.log(`Need to load the entry list for the journal now`); - } - let load_journal_entry_obj_li = load_ae_obj_li__journal_entry({ - api_cfg: api_cfg, - for_obj_type: 'journal', - for_obj_id: journal_id, - enabled: enabled, // all, disabled, enabled - hidden: hidden, // all, hidden, not_hidden - limit: limit, // Limit for the entries - offset: offset, - order_by_li: order_by_li, - params: params, - try_cache: try_cache, - log_lvl: log_lvl - }) - .then((journal_entry_obj_li) => { - if (log_lvl) { - console.log(`journal_entry_obj_li = `, journal_entry_obj_li); - } - return journal_entry_obj_li; - }); - - if (log_lvl) { - console.log(`journal_entry_obj_li = `, load_journal_entry_obj_li); - } - ae_promises.load__journal_obj.journal_entry_li = load_journal_entry_obj_li; + // Load the entries for the journal + if (log_lvl) { + console.log(`Need to load the entry list for the journal now`); } + let load_journal_entry_obj_li = load_ae_obj_li__journal_entry({ + api_cfg: api_cfg, + for_obj_type: 'journal', + for_obj_id: journal_id, + enabled: enabled, // all, disabled, enabled + hidden: hidden, // all, hidden, not_hidden + limit: limit, // Limit for the entries + offset: offset, + order_by_li: order_by_li, + params: params, + try_cache: try_cache, + log_lvl: log_lvl + }) + .then((journal_entry_obj_li) => { + if (log_lvl) { + console.log(`journal_entry_obj_li = `, journal_entry_obj_li); + } + return journal_entry_obj_li; + }); + + if (log_lvl) { + console.log(`journal_entry_obj_li = `, load_journal_entry_obj_li); + } + ae_promises.load__journal_obj.journal_entry_li = load_journal_entry_obj_li; + } return ae_promises.load__journal_obj; } diff --git a/src/lib/ae_journals/db_journals.ts b/src/lib/ae_journals/db_journals.ts index 1f2b4ae6..43d70c43 100644 --- a/src/lib/ae_journals/db_journals.ts +++ b/src/lib/ae_journals/db_journals.ts @@ -150,6 +150,104 @@ export interface Journal { obj_updated_on?: null|Date; } +export const journal_field_li = [ + 'id', + 'journal_id', + 'snapshot_id', + 'previous_id', + 'next_id', + 'external_id', + 'import_id', + 'code', + 'for_type', + 'for_id', + 'type_code', + 'account_id', + 'person_id', + 'name', + 'short_name', + 'summary', + 'outline', + 'description', + 'description_md_html', + 'description_md_html_alt', + 'description_html', + 'description_json', + 'start_datetime', + 'end_datetime', + 'timezone', + 'alert', + 'alert_msg', + 'sort_by', + 'sort_by_desc', + 'cfg_json', + 'data_json', + 'ux_mode', + 'passcode_read', + 'passcode_read_expire', + 'passcode_write', + 'passcode_write_expire', + 'passcode_timeout', + 'private_passcode', + 'auth_key', + 'enable', + 'hide', + 'archive', // Archive the journal + 'archive_on', // Archive date + 'priority', // Priority flag + 'sort', // Sort order + 'group', // Group name + 'notes', // Notes about the journal + 'created_on', // Creation date + 'updated_on', // Last updated date + + 'tmp_sort_1', // Temporary sort field 1 + 'tmp_sort_2', // Temporary sort field 2 + 'tmp_sort_3', // Temporary sort field 3 + + 'combined_passcode', // For Journal Entry encryption password + 'file_count', // Only files directly under a journal + 'journal_file_id_li_json', // JSON string of file IDs + 'person__given_name', // Person's given name + 'person__family_name', // Person's family name + 'person__full_name', // Person's full name + 'person__primary_email', // Person's primary email + 'person__passcode', // Person's passcode + 'person__kv_json', // JSON formatted key value pairs for multiple people + 'journal_name', // Journal name + 'journal_location_code', // Journal location code + 'journal_location_name', // Journal location name + 'journal_entry_count', // Count of journal entries + 'journal_entry_kv', // Key value list of the entries + 'journal_entry_li', // List of journal entries + 'journal_file_kv', // Key value list of the files + 'journal_file_li', // List of journal files + + 'obj_id', // Object ID + 'obj_ext_uid', // External UID + 'obj_ext_id', // External ID + 'obj_import_id', // Import ID + 'obj_code', // Object code + 'obj_account_id', // Object account ID + 'obj_passcode', // Object passcode + 'obj_type', // Object type + 'obj_type_ver_id', // Object type version ID + 'obj_name', // Object name + 'obj_summary', // Object summary + 'obj_outline', // Object outline + 'obj_description', // Object description + 'obj_enable', // Object enable flag + 'obj_enable_on', // Object enable date + 'obj_archive_on', // Object archive date + 'obj_hide', // Object hide flag + 'obj_priority', // Object priority + 'obj_sort', // Object sort order + 'obj_group', // Object group name + 'obj_cfg_json', // Object configuration JSON + 'obj_notes', // Object notes + 'obj_created_on', // Object creation date + 'obj_updated_on' // Object last updated date +]; // Updated 2025-04-02 export interface Journal_Entry { @@ -301,6 +399,111 @@ export interface Journal_Entry { obj_updated_on?: null|Date; } +export const journal_entry_field_li = [ + 'id', + 'journal_entry_id', + 'journal_id', + 'code', + 'for_type', + 'for_id', + 'template', + 'activity_code', + 'category_code', + 'topic_code', + 'type_code', + 'tags', + 'journal_entry_type', + 'account_id', + 'person_id', + 'public', + 'private', + 'personal', + 'professional', + 'name', + 'short_name', + 'summary', + 'outline', + 'content', + 'content_md_html', + 'content_md_html_alt', + 'content_html', + 'content_json', + 'content_encrypted', + 'history', + 'history_encrypted', + 'passcode_hash', + 'start_datetime', + 'end_datetime', + 'timezone', + 'seconds', + 'location', + 'latitude', + 'longitude', + 'billable', + 'bill_to', + 'bill_rate', + 'billable_minutes', + 'alert', + 'alert_msg', + 'parent_id', + 'related_entry_id_li', + 'data_json', + 'passcode_read', + 'passcode_read_expire', + 'passcode_write', + 'passcode_write_expire', + 'enable', + 'hide', + 'priority', + 'sort', + 'group', + 'notes', + 'created_on', + 'updated_on', + + 'tmp_sort_1', + 'tmp_sort_2', + 'tmp_sort_3', + + 'file_count', + 'journal_file_id_li_json', + 'journal_code', + 'journal_name', + 'person__given_name', + 'person__family_name', + 'person__full_name', + 'person__primary_email', + 'person__passcode', + 'person__kv_json', + 'journal_file_kv', + 'journal_file_li', + + 'obj_id', + 'obj_ext_uid', + 'obj_ext_id', + 'obj_import_id', + 'obj_code', + 'obj_account_id', + 'obj_passcode', + 'obj_type', + 'obj_type_ver_id', + 'obj_name', + 'obj_summary', + 'obj_outline', + 'obj_description', + 'obj_enable', + 'obj_enable_on', + 'obj_archive_on', + 'obj_hide', + 'obj_priority', + 'obj_sort', + 'obj_group', + 'obj_cfg_json', + 'obj_notes', + 'obj_created_on', + 'obj_updated_on' +]; + // Updated 2024-06-10 export class MySubClassedDexie extends Dexie { @@ -310,7 +513,7 @@ export class MySubClassedDexie extends Dexie { constructor() { super('ae_journals_db'); - this.version(3).stores({ + this.version(4).stores({ journal: ` id, journal_id, code, @@ -321,7 +524,7 @@ export class MySubClassedDexie extends Dexie { start_datetime, end_datetime, timezone, tmp_sort_1, tmp_sort_2, tmp_sort_3, - enable, hide, priority, sort, group, notes, created_on, updated_on`, + enable, hide, priority, sort, group, created_on, updated_on`, journal_entry: ` id, journal_entry_id, journal_id, @@ -332,7 +535,7 @@ export class MySubClassedDexie extends Dexie { start_datetime, end_datetime, timezone, tmp_sort_1, tmp_sort_2, tmp_sort_3, - enable, hide, priority, sort, group, notes, created_on, updated_on`, + enable, hide, priority, sort, group, created_on, updated_on`, }); } } diff --git a/src/routes/journals/[journal_id]/+layout.ts b/src/routes/journals/[journal_id]/+layout.ts index 32a6a491..e2d833bf 100644 --- a/src/routes/journals/[journal_id]/+layout.ts +++ b/src/routes/journals/[journal_id]/+layout.ts @@ -4,6 +4,8 @@ console.log(`ae_l_journals [journal_id] +layout.ts start`); import { error } from '@sveltejs/kit'; import { browser } from '$app/environment'; import { journals_func } from '$lib/ae_journals/ae_journals_functions'; +// import { db_journals, journal_field_li, journal_entry_field_li } from "$lib/ae_journals/db_journals"; +// import { load_ae_obj_id } from '$lib/ae_core/core__crud_generic'; export async function load({ params, parent }) { let log_lvl: number = 0; @@ -31,6 +33,16 @@ export async function load({ params, parent }) { console.log(`ae_journals journals [journal_id] +page.ts: journal_id = `, journal_id); } // Load journal object + // let load_journal_obj = load_ae_obj_id({ + // api_cfg: ae_acct.api, + // obj_type: 'journal', + // obj_id: journal_id, + // db_instance: db_journals, + // db_field_li: journal_field_li, + // inc_obj_type_li: ['journal_entry'], + // log_lvl: 2 + // }); + let load_journal_obj = await journals_func.load_ae_obj_id__journal({ api_cfg: ae_acct.api, journal_id: journal_id, @@ -40,24 +52,30 @@ export async function load({ params, parent }) { limit: 99, try_cache: true, log_lvl: log_lvl - }) - .then((results) => { - if (!results) { - error(404, { - message: 'Journals - Journal not found' - }); - } else { - // ae_acct.slct.journal_obj = results; - } + }); + // .then((results) => { + // if (!results) { + // error(404, { + // message: 'Journals - Journal not found' + // }); + // } else { + // // ae_acct.slct.journal_obj = results; + // } // }) // .catch((err) => { // console.error(`Error loading journal object:`, err); // error(500, { // message: 'Journals - Error loading journal object' // }); - }); + // }); - ae_acct.slct.journal_obj = load_journal_obj; + if (!load_journal_obj) { + error(404, { + message: 'Journals - Journal Entry not found' + }); + } else { + ae_acct.slct.load_journal_obj = load_journal_obj; + } } // WARNING: Precaution against shared data between sites. diff --git a/src/routes/journals/[journal_id]/entry/[journal_entry_id]/+page.ts b/src/routes/journals/[journal_id]/entry/[journal_entry_id]/+page.ts index 96e676a5..b029ed80 100644 --- a/src/routes/journals/[journal_id]/entry/[journal_entry_id]/+page.ts +++ b/src/routes/journals/[journal_id]/entry/[journal_entry_id]/+page.ts @@ -4,6 +4,8 @@ console.log(`ae_p_journals [journal_entry_id] +page.ts start`); import { browser } from '$app/environment'; import { journals_func } from '$lib/ae_journals/ae_journals_functions'; +import { db_journals, journal_entry_field_li } from "$lib/ae_journals/db_journals"; +import { load_ae_obj_id } from '$lib/ae_core/core__crud_generic'; export async function load({ params, parent }) { // route let log_lvl: number = 0; @@ -34,11 +36,20 @@ export async function load({ params, parent }) { // route console.log(`ae_journals journals [journal_entry_id] +page.ts: journal_entry_id = `, journal_entry_id); } // Load event journal entry object - let load_journal_entry_obj = journals_func.load_ae_obj_id__journal_entry({ + // let load_journal_entry_obj = journals_func.load_ae_obj_id__journal_entry({ + // api_cfg: ae_acct.api, + // journal_entry_id: journal_entry_id, + // try_cache: true, + // log_lvl: log_lvl + // }); + + let load_journal_entry_obj = load_ae_obj_id({ api_cfg: ae_acct.api, - journal_entry_id: journal_entry_id, - try_cache: true, - log_lvl: log_lvl + obj_type: 'journal_entry', + obj_id: journal_entry_id, + db_instance: db_journals, + db_field_li: journal_entry_field_li, + log_lvl: 2 }); if (!load_journal_entry_obj) {