h-sphere_sql-seal/src/codeblockHandler/inline/InlineProcessor.ts

74 lines
2.3 KiB
TypeScript
Raw Normal View History

2025-01-09 20:12:39 +00:00
import { OmnibusRegistrator } from "@hypersphere/omnibus";
import { App, MarkdownRenderChild } from "obsidian";
import { SqlSealDatabase } from "../../database/database";
import { Sync } from "../../datamodel/sync";
import { transformQuery } from "../../sql/sqlTransformer";
import { registerObservers } from "../../utils/registerObservers";
import { displayError } from "../../utils/ui";
import SqlSealPlugin from "../../main";
2025-01-09 20:12:39 +00:00
export class InlineProcessor extends MarkdownRenderChild {
private registrator: OmnibusRegistrator;
constructor(
private el: HTMLElement,
private query: string,
private sourcePath: string,
private db: SqlSealDatabase,
private plugin: SqlSealPlugin,
2025-01-09 20:12:39 +00:00
private app: App,
private sync: Sync
) {
super(el);
this.registrator = this.sync.getRegistrator();
}
async onload() {
try {
await this.render();
} catch (e) {
displayError(this.el, e.toString());
}
}
onunload() {
this.registrator.offAll();
}
async render() {
try {
const registeredTablesForContext = await this.sync.getTablesMappingForContext(this.sourcePath);
const transformedQuery = transformQuery(this.query, registeredTablesForContext);
if (this.plugin.settings.enableDynamicUpdates) {
registerObservers({
bus: this.registrator,
tables: transformedQuery.mappedTables,
callback: () => this.render(),
fileName: this.sourcePath
})
}
2025-01-09 20:12:39 +00:00
const file = this.app.vault.getFileByPath(this.sourcePath);
if (!file) {
return;
}
const fileCache = this.app.metadataCache.getFileCache(file);
const { data, columns } = await this.db.select(
transformedQuery.sql,
2025-01-09 20:12:39 +00:00
fileCache?.frontmatter ?? {}
);
this.el.empty()
let value = data[0][columns[0]] ?? ''
if (typeof value !== 'string') {
value = value?.toString()
}
this.el.createSpan({ text: value })
2025-01-09 20:12:39 +00:00
} catch (e) {
displayError(this.el, e.toString())
}
}
}