refactor(src): consolidate duplicate lib directories (Group 1 cleanup)
Three pairs of duplicate/split directories collapsed into their canonical homes: - src/lib/api/ → src/lib/ae_api/: api.ts moved alongside the individual api_*.ts files it aggregates; all 85 import lines updated across the codebase. - src/lib/utils/ → src/lib/ae_utils/: ae_string_snippets.ts and utils.ts moved; one import updated (ae_stores.ts). utils.ts had no importers. - src/lib/ae_elements/ → src/lib/elements/: AE_AITools, AE_Object_Flags, AE_Record_Controls moved and renamed to snake_case (ae_ai_tools.svelte, ae_object_flags.svelte, ae_record_controls.svelte); 6 import paths updated. Local binding names left unchanged for a separate Group 2 pass. svelte-check: 0 errors, 0 warnings. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
406
src/lib/ae_api/api.ts
Normal file
406
src/lib/ae_api/api.ts
Normal file
@@ -0,0 +1,406 @@
|
||||
// Aether API Library (TS)
|
||||
// This is intended to be used with the Aether API. The goal is to just import all of the core functions and re-export them as a single module. This is to make it easier to import the functions into other modules.
|
||||
// This needs to be cleaned up and ideally removed the need for Axios.
|
||||
|
||||
import type { key_val } from '$lib/stores/ae_stores';
|
||||
|
||||
import { delete_object } from '$lib/ae_api/api_delete_object'; // Exported at the end of this file
|
||||
import { get_object } from '$lib/ae_api/api_get_object'; // Exported at the end of this file
|
||||
import { patch_object } from '$lib/ae_api/api_patch_object'; // Exported at the end of this file
|
||||
import { post_object } from '$lib/ae_api/api_post_object'; // Exported at the end of this file
|
||||
|
||||
import { get_ae_lookup_li } from '$lib/ae_api/api_get__lookup';
|
||||
import {
|
||||
get_ae_obj,
|
||||
get_nested_ae_obj,
|
||||
get_ae_obj_li,
|
||||
get_nested_obj_li
|
||||
} from '$lib/ae_api/api_get__crud_obj_li';
|
||||
import { search_ae_obj } from '$lib/ae_api/api_post__crud_search';
|
||||
import {
|
||||
create_ae_obj,
|
||||
create_nested_obj,
|
||||
update_ae_obj,
|
||||
update_nested_obj,
|
||||
delete_ae_obj,
|
||||
delete_nested_ae_obj
|
||||
} from '$lib/ae_api/api_post__crud_obj';
|
||||
|
||||
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)
|
||||
* Standardized lookup data like countries, timezones, and subdivisions.
|
||||
* Updated 2026-03-24
|
||||
*/
|
||||
export const get_ae_obj_li_for_lu = async function get_ae_obj_li_for_lu({
|
||||
api_cfg,
|
||||
for_lu_type,
|
||||
enabled = 'enabled',
|
||||
hidden = 'not_hidden',
|
||||
order_by_li = null,
|
||||
limit = 9999,
|
||||
offset = 0,
|
||||
headers = {},
|
||||
params_json = null,
|
||||
params = {},
|
||||
only_priority = false,
|
||||
log_lvl = 1
|
||||
}: {
|
||||
api_cfg: any;
|
||||
for_lu_type: string;
|
||||
enabled?: 'enabled' | 'all' | 'not_enabled' | undefined;
|
||||
hidden?: 'hidden' | 'all' | 'not_hidden' | undefined;
|
||||
order_by_li?: any;
|
||||
limit?: number;
|
||||
offset?: number;
|
||||
headers?: any;
|
||||
params_json?: any;
|
||||
params?: key_val;
|
||||
only_priority?: boolean;
|
||||
log_lvl?: number;
|
||||
}) {
|
||||
if (log_lvl) {
|
||||
console.log(
|
||||
`*** get_ae_obj_li_for_lu() *** for_lu_type=${for_lu_type}`
|
||||
);
|
||||
}
|
||||
|
||||
// Pass headers as-is — get_object will auto-promote the real account_id from api_cfg.
|
||||
// Do NOT use x-no-account-id bypass: the backend hardcodes account_id=1 for that path,
|
||||
// which leaks account-scoped lookup overrides to all callers.
|
||||
const merged_headers = { ...headers };
|
||||
|
||||
// More lists will be added in the future. For now, just country, subdivision, and time_zone.
|
||||
if (['country', 'country_subdivision', 'time_zone'].includes(for_lu_type)) {
|
||||
return await get_ae_lookup_li({
|
||||
api_cfg,
|
||||
lu_type: for_lu_type,
|
||||
include_disabled: enabled === 'all',
|
||||
only_priority: only_priority,
|
||||
order_by_li: order_by_li ?? undefined,
|
||||
limit: limit ?? undefined,
|
||||
offset: offset ?? undefined,
|
||||
params,
|
||||
headers: merged_headers,
|
||||
log_lvl
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// Updated 2023-11-14
|
||||
export const delete_ae_obj_id_crud = async function delete_ae_obj_id_crud({
|
||||
api_cfg,
|
||||
obj_type,
|
||||
obj_id,
|
||||
key,
|
||||
jwt = null,
|
||||
headers = {},
|
||||
params = {},
|
||||
data = {},
|
||||
method = 'delete', // 'delete', 'disable', 'hide'
|
||||
return_meta = false,
|
||||
log_lvl = 0
|
||||
}: {
|
||||
api_cfg: any;
|
||||
obj_type: string;
|
||||
obj_id: string;
|
||||
key: string;
|
||||
jwt?: null | string;
|
||||
headers?: any;
|
||||
params?: any;
|
||||
data?: any;
|
||||
method?: string;
|
||||
return_meta?: boolean;
|
||||
log_lvl?: number;
|
||||
}) {
|
||||
if (log_lvl) {
|
||||
console.log(
|
||||
`*** delete_ae_obj_id_crud() *** obj_type: ${obj_type} obj_id: ${obj_id}`
|
||||
);
|
||||
}
|
||||
|
||||
data['super_key'] = key;
|
||||
data['jwt'] = jwt;
|
||||
// NOTE: The key and or JWT should be in the header of the DELETE, GET, PATCH, POST
|
||||
|
||||
// V3 Standard: Unified endpoint for all objects
|
||||
const endpoint = `/v3/crud/${obj_type}/${obj_id}`;
|
||||
|
||||
if (log_lvl) {
|
||||
console.log('Endpoint:', endpoint);
|
||||
}
|
||||
|
||||
if (method) {
|
||||
// NOTE: method options: 'delete', 'disable', 'hide'
|
||||
params['method'] = method;
|
||||
}
|
||||
|
||||
if (log_lvl) {
|
||||
console.log('Params:', params);
|
||||
}
|
||||
|
||||
const object_obj_delete_promise = await delete_object({
|
||||
api_cfg: api_cfg,
|
||||
endpoint: endpoint,
|
||||
params: params,
|
||||
data: data,
|
||||
log_lvl: log_lvl
|
||||
});
|
||||
|
||||
if (log_lvl > 1) {
|
||||
console.log(object_obj_delete_promise);
|
||||
}
|
||||
|
||||
return object_obj_delete_promise;
|
||||
};
|
||||
|
||||
/* BEGIN: Hosted File Related */
|
||||
|
||||
// Updated 2026-01-07
|
||||
export const download_hosted_file = async function download_hosted_file({
|
||||
api_cfg,
|
||||
hosted_file_id,
|
||||
return_file = true,
|
||||
filename,
|
||||
auto_download = false,
|
||||
params = {},
|
||||
log_lvl = 0
|
||||
}: {
|
||||
api_cfg: any;
|
||||
hosted_file_id: string;
|
||||
return_file?: boolean;
|
||||
filename?: string;
|
||||
auto_download?: boolean;
|
||||
params?: key_val;
|
||||
log_lvl?: number;
|
||||
}) {
|
||||
console.log('*** stores_hosted_api.js: download_hosted_file() ***');
|
||||
|
||||
const task_id = hosted_file_id;
|
||||
|
||||
const endpoint = `/v3/action/hosted_file/${hosted_file_id}/download`;
|
||||
if (filename) {
|
||||
params['filename'] = filename;
|
||||
}
|
||||
params['return_file'] = true;
|
||||
|
||||
// Inject JWT into URL parameters if available
|
||||
if (api_cfg.jwt) {
|
||||
params['jwt'] = api_cfg.jwt;
|
||||
} else if (api_cfg.headers?.['authorization']) {
|
||||
// Fallback: extract from header if present
|
||||
const auth_header = api_cfg.headers['authorization'];
|
||||
if (auth_header.startsWith('Bearer ')) {
|
||||
params['jwt'] = auth_header.substring(7);
|
||||
}
|
||||
}
|
||||
|
||||
const hosted_file_download_get_promise = await api.get_object({
|
||||
api_cfg: api_cfg,
|
||||
endpoint: endpoint,
|
||||
params: params,
|
||||
return_blob: return_file,
|
||||
filename: filename,
|
||||
auto_download: auto_download,
|
||||
task_id: task_id,
|
||||
log_lvl: log_lvl
|
||||
});
|
||||
// console.log(hosted_file_download_get_promise);
|
||||
return hosted_file_download_get_promise;
|
||||
};
|
||||
|
||||
// Updated 2023-12-15
|
||||
export const delete_hosted_file = async function delete_hosted_file({
|
||||
api_cfg,
|
||||
hosted_file_id,
|
||||
link_to_type,
|
||||
link_to_id,
|
||||
rm_orphan = false,
|
||||
params = {},
|
||||
data = {},
|
||||
log_lvl = 1
|
||||
}: {
|
||||
api_cfg: any;
|
||||
hosted_file_id: string;
|
||||
link_to_type?: string;
|
||||
link_to_id?: string;
|
||||
rm_orphan?: boolean;
|
||||
params?: key_val;
|
||||
data?: key_val;
|
||||
log_lvl?: number;
|
||||
}) {
|
||||
console.log('*** stores_hosted_api.js: delete_hosted_file() ***');
|
||||
|
||||
const endpoint = `/v3/action/hosted_file/${hosted_file_id}`;
|
||||
if (link_to_type) {
|
||||
params['link_to_type'] = link_to_type;
|
||||
}
|
||||
if (link_to_id) {
|
||||
params['link_to_id'] = link_to_id;
|
||||
}
|
||||
if (rm_orphan) {
|
||||
params['rm_orphan'] = rm_orphan;
|
||||
}
|
||||
|
||||
const hosted_file_obj_delete_promise = await api.delete_object({
|
||||
api_cfg: api_cfg,
|
||||
endpoint: endpoint,
|
||||
params: params,
|
||||
data: data,
|
||||
log_lvl: log_lvl
|
||||
});
|
||||
// console.log(hosted_file_obj_delete_promise);
|
||||
return hosted_file_obj_delete_promise;
|
||||
};
|
||||
/* END: Hosted File Related */
|
||||
|
||||
|
||||
/* BEGIN: Utility: Email Related */
|
||||
|
||||
// Updated 2026-05-01 — migrated to the V3 action endpoint
|
||||
export const send_email = async function send_email({
|
||||
api_cfg,
|
||||
from_email,
|
||||
from_name = '',
|
||||
to_email,
|
||||
to_name = '',
|
||||
cc_email = null,
|
||||
cc_name = null,
|
||||
bcc_email = null,
|
||||
bcc_name = null,
|
||||
subject,
|
||||
body_html,
|
||||
body_text = null,
|
||||
// headers = {},
|
||||
params = {},
|
||||
data = {},
|
||||
return_obj = false,
|
||||
return_meta = false,
|
||||
test = false,
|
||||
log_lvl = 0
|
||||
}: {
|
||||
api_cfg: any;
|
||||
from_email: string;
|
||||
from_name?: string;
|
||||
to_email: string;
|
||||
to_name?: string;
|
||||
cc_email?: null | string;
|
||||
cc_name?: null | string;
|
||||
bcc_email?: null | string;
|
||||
bcc_name?: null | string;
|
||||
subject: string;
|
||||
body_html: string;
|
||||
body_text?: null | string;
|
||||
// headers?: key_val,
|
||||
params?: key_val;
|
||||
data?: key_val;
|
||||
return_obj?: boolean;
|
||||
return_meta?: boolean;
|
||||
test?: boolean;
|
||||
log_lvl?: number;
|
||||
}) {
|
||||
console.log('*** send_email() ***');
|
||||
|
||||
// Skip email sending entirely when running in a test/Playwright environment.
|
||||
// Set window.__ae_test_mode = true via addInitScript to activate this guard.
|
||||
if (
|
||||
typeof globalThis !== 'undefined' &&
|
||||
(globalThis as any).__ae_test_mode
|
||||
) {
|
||||
console.log(
|
||||
`[TEST MODE] send_email() suppressed — would have sent to: ${to_email}, subject: ${subject}`
|
||||
);
|
||||
return null;
|
||||
}
|
||||
|
||||
const endpoint = `/v3/action/email/send`;
|
||||
|
||||
data['from_email'] = from_email; // Required
|
||||
data['from_name'] = from_name;
|
||||
|
||||
data['to_email'] = to_email; // Required
|
||||
data['to_name'] = to_name;
|
||||
|
||||
data['cc_email'] = cc_email;
|
||||
data['cc_name'] = cc_name;
|
||||
|
||||
data['bcc_email'] = bcc_email;
|
||||
data['bcc_name'] = bcc_name;
|
||||
|
||||
data['subject'] = subject;
|
||||
if (log_lvl) {
|
||||
console.log('Data:', data);
|
||||
}
|
||||
|
||||
data['body_html'] = body_html;
|
||||
|
||||
data['body_text'] = body_text;
|
||||
|
||||
if (return_obj) {
|
||||
params['return_obj'] = true;
|
||||
}
|
||||
|
||||
if (test) {
|
||||
params['test'] = true;
|
||||
}
|
||||
|
||||
const send_email_post_promise = await api.post_object({
|
||||
api_cfg: api_cfg,
|
||||
endpoint: endpoint,
|
||||
params: params,
|
||||
data: data,
|
||||
return_meta: return_meta,
|
||||
log_lvl: log_lvl
|
||||
});
|
||||
|
||||
if (log_lvl > 1) {
|
||||
console.log('Response Data:', send_email_post_promise);
|
||||
}
|
||||
|
||||
return send_email_post_promise;
|
||||
};
|
||||
|
||||
/* END: Utility: Email Related */
|
||||
|
||||
const obj = {
|
||||
delete_object: delete_object,
|
||||
get_object: get_object,
|
||||
patch_object: patch_object,
|
||||
post_object: post_object,
|
||||
get_ae_obj: get_ae_obj,
|
||||
get_nested_ae_obj: get_nested_ae_obj,
|
||||
get_ae_obj_li: get_ae_obj_li,
|
||||
get_nested_obj_li: get_nested_obj_li,
|
||||
search_ae_obj: search_ae_obj,
|
||||
create_ae_obj: create_ae_obj,
|
||||
create_nested_obj: create_nested_obj,
|
||||
update_ae_obj: update_ae_obj,
|
||||
update_nested_obj: update_nested_obj,
|
||||
delete_ae_obj: delete_ae_obj,
|
||||
delete_nested_ae_obj: delete_nested_ae_obj,
|
||||
delete_ae_obj_id_crud: delete_ae_obj_id_crud,
|
||||
download_hosted_file: download_hosted_file,
|
||||
delete_hosted_file: delete_hosted_file,
|
||||
get_data_store: get_data_store,
|
||||
get_ae_obj_li_for_lu: get_ae_obj_li_for_lu,
|
||||
send_email: send_email
|
||||
};
|
||||
export const api = obj;
|
||||
// module.exports = api;
|
||||
Reference in New Issue
Block a user