fix(core): clarify account fallback source and pretty-print _json payloads

This commit is contained in:
Scott Idem
2026-04-30 17:00:53 -04:00
parent 2f5ad8ccc0
commit a1ebeddf9d
4 changed files with 64 additions and 33 deletions

View File

@@ -3,6 +3,22 @@ import { post_object } from './api_post_object';
import { patch_object } from './api_patch_object'; import { patch_object } from './api_patch_object';
import { delete_object } from './api_delete_object'; import { delete_object } from './api_delete_object';
const JSON_PRETTY_SPACES = 2;
function serialize_json_field_pretty(value: unknown) {
if (value === null || value === undefined) return value;
if (typeof value === 'string') {
try {
return JSON.stringify(JSON.parse(value), null, JSON_PRETTY_SPACES);
} catch {
return value;
}
}
return JSON.stringify(value, null, JSON_PRETTY_SPACES);
}
/** /**
* --- POST (CREATE) WRAPPERS --- * --- POST (CREATE) WRAPPERS ---
*/ */
@@ -33,13 +49,11 @@ export async function create_ae_obj({
// Standard Aether Pattern: Auto-serialize any key ending in _json // Standard Aether Pattern: Auto-serialize any key ending in _json
const cleaned_fields = { ...fields }; const cleaned_fields = { ...fields };
for (const key in cleaned_fields) { for (const key in cleaned_fields) {
if ( if (key.endsWith('_json') && cleaned_fields[key] !== null) {
key.endsWith('_json') &&
cleaned_fields[key] !== null &&
typeof cleaned_fields[key] === 'object'
) {
if (log_lvl) console.log(`Auto-serializing field: ${key}`); if (log_lvl) console.log(`Auto-serializing field: ${key}`);
cleaned_fields[key] = JSON.stringify(cleaned_fields[key]); cleaned_fields[key] = serialize_json_field_pretty(
cleaned_fields[key]
);
} }
} }
@@ -98,12 +112,10 @@ export async function create_nested_obj({
// Standard Aether Pattern: Auto-serialize any key ending in _json // Standard Aether Pattern: Auto-serialize any key ending in _json
const cleaned_fields = { ...fields }; const cleaned_fields = { ...fields };
for (const key in cleaned_fields) { for (const key in cleaned_fields) {
if ( if (key.endsWith('_json') && cleaned_fields[key] !== null) {
key.endsWith('_json') && cleaned_fields[key] = serialize_json_field_pretty(
cleaned_fields[key] !== null && cleaned_fields[key]
typeof cleaned_fields[key] === 'object' );
) {
cleaned_fields[key] = JSON.stringify(cleaned_fields[key]);
} }
} }
@@ -148,13 +160,11 @@ export async function update_ae_obj({
// Standard Aether Pattern: Auto-serialize any key ending in _json // Standard Aether Pattern: Auto-serialize any key ending in _json
const cleaned_fields = { ...fields }; const cleaned_fields = { ...fields };
for (const key in cleaned_fields) { for (const key in cleaned_fields) {
if ( if (key.endsWith('_json') && cleaned_fields[key] !== null) {
key.endsWith('_json') &&
cleaned_fields[key] !== null &&
typeof cleaned_fields[key] === 'object'
) {
if (log_lvl > 1) console.log(`Auto-serializing field: ${key}`); if (log_lvl > 1) console.log(`Auto-serializing field: ${key}`);
cleaned_fields[key] = JSON.stringify(cleaned_fields[key]); cleaned_fields[key] = serialize_json_field_pretty(
cleaned_fields[key]
);
} }
} }
@@ -214,12 +224,10 @@ export async function update_nested_obj({
// Standard Aether Pattern: Auto-serialize any key ending in _json // Standard Aether Pattern: Auto-serialize any key ending in _json
const cleaned_fields = { ...fields }; const cleaned_fields = { ...fields };
for (const key in cleaned_fields) { for (const key in cleaned_fields) {
if ( if (key.endsWith('_json') && cleaned_fields[key] !== null) {
key.endsWith('_json') && cleaned_fields[key] = serialize_json_field_pretty(
cleaned_fields[key] !== null && cleaned_fields[key]
typeof cleaned_fields[key] === 'object' );
) {
cleaned_fields[key] = JSON.stringify(cleaned_fields[key]);
} }
} }

View File

@@ -29,6 +29,22 @@ import {
import { get_data_store } from '$lib/ae_api/api_get__data_store'; import { get_data_store } from '$lib/ae_api/api_get__data_store';
const JSON_PRETTY_SPACES = 2;
function serialize_json_field_pretty(value: any) {
if (value === null || value === undefined) return value;
if (typeof value === 'string') {
try {
return JSON.stringify(JSON.parse(value), null, JSON_PRETTY_SPACES);
} catch {
return value;
}
}
return JSON.stringify(value, null, JSON_PRETTY_SPACES);
}
/** /**
* Get a list of lookup objects (V3) * Get a list of lookup objects (V3)
* Standardized lookup data like countries, timezones, and subdivisions. * Standardized lookup data like countries, timezones, and subdivisions.
@@ -165,7 +181,7 @@ export const create_ae_obj_crud = async function create_ae_obj_crud({
if (log_lvl) { if (log_lvl) {
console.log(`${key}: ${value}`); console.log(`${key}: ${value}`);
} }
data['data_list'][key] = JSON.stringify(value); data['data_list'][key] = serialize_json_field_pretty(value);
} }
} }
} }
@@ -276,7 +292,7 @@ export const update_ae_obj_id_crud = async function update_ae_obj_id_crud({
if (log_lvl) { if (log_lvl) {
console.log(`${key}: ${value}`); console.log(`${key}: ${value}`);
} }
data['data_list'][key] = JSON.stringify(value); data['data_list'][key] = serialize_json_field_pretty(value);
} }
} }
} }

View File

@@ -27,12 +27,14 @@ let saving = $state(false);
let save_success = $state(false); let save_success = $state(false);
let confirm_action = $state<string | null>(null); let confirm_action = $state<string | null>(null);
let load_error = $state<string | null>(null); let load_error = $state<string | null>(null);
let loaded_from_cache = $state(false); let loaded_from_list_fallback = $state(false);
let loaded_from_local_cache = $state(false);
async function load_account() { async function load_account() {
loading = true; loading = true;
load_error = null; load_error = null;
loaded_from_cache = false; loaded_from_list_fallback = false;
loaded_from_local_cache = false;
try { try {
account = await load_ae_obj_id__account({ account = await load_ae_obj_id__account({
api_cfg: $ae_api, api_cfg: $ae_api,
@@ -55,7 +57,7 @@ async function load_account() {
if (account_from_list) { if (account_from_list) {
account = account_from_list; account = account_from_list;
loaded_from_cache = true; loaded_from_list_fallback = true;
} }
const cached_account = await db_core.account const cached_account = await db_core.account
@@ -65,7 +67,7 @@ async function load_account() {
if (!account && cached_account) { if (!account && cached_account) {
account = cached_account; account = cached_account;
loaded_from_cache = true; loaded_from_local_cache = true;
} }
if (!account) { if (!account) {
@@ -221,11 +223,15 @@ async function handle_delete() {
</div> </div>
</div> </div>
{:else if account} {:else if account}
{#if loaded_from_cache} {#if loaded_from_list_fallback || loaded_from_local_cache}
<div <div
class="card border-warning-500/30 bg-warning-500/5 mb-2 flex items-start gap-3 border p-4 shadow-sm"> class="card border-warning-500/30 bg-warning-500/5 mb-2 flex items-start gap-3 border p-4 shadow-sm">
<p class="text-sm opacity-80"> <p class="text-sm opacity-80">
{#if loaded_from_local_cache}
This record loaded from local cache because direct account API access is currently restricted for this session. This record loaded from local cache because direct account API access is currently restricted for this session.
{:else}
This record loaded from the account list fallback because direct account-by-id API access is currently restricted for this session.
{/if}
</p> </p>
</div> </div>
{/if} {/if}

View File

@@ -70,7 +70,8 @@ async function handle_save_site() {
} }
}); });
// Pretty-print cfg_json so it's human-readable in the DB (TEXT column) // Keep cfg_json human-readable in DB TEXT columns.
// Safe here: V3 update_ae_obj only stringifies *_json when the value is an object.
data_kv.cfg_json = JSON.stringify(site.cfg_json, null, 2); data_kv.cfg_json = JSON.stringify(site.cfg_json, null, 2);
await update_ae_obj__site({ await update_ae_obj__site({