pinakes-core: add markdown link storage methods

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I5fa9fd045711664e5dcc7f1c12b6ca896a6a6964
This commit is contained in:
raf 2026-02-09 13:13:52 +03:00
commit 27be136e01
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
3 changed files with 27 additions and 16 deletions

View file

@ -801,7 +801,10 @@ pub trait StorageBackend: Send + Sync + 'static {
) -> Result<()>; ) -> Result<()>;
/// Get outgoing links from a media item. /// Get outgoing links from a media item.
async fn get_outgoing_links(&self, media_id: MediaId) -> Result<Vec<crate::model::MarkdownLink>>; async fn get_outgoing_links(
&self,
media_id: MediaId,
) -> Result<Vec<crate::model::MarkdownLink>>;
/// Get backlinks (incoming links) to a media item. /// Get backlinks (incoming links) to a media item.
async fn get_backlinks(&self, media_id: MediaId) -> Result<Vec<crate::model::BacklinkInfo>>; async fn get_backlinks(&self, media_id: MediaId) -> Result<Vec<crate::model::BacklinkInfo>>;

View file

@ -6092,7 +6092,10 @@ impl StorageBackend for PostgresBackend {
Ok(()) Ok(())
} }
async fn get_outgoing_links(&self, media_id: MediaId) -> Result<Vec<crate::model::MarkdownLink>> { async fn get_outgoing_links(
&self,
media_id: MediaId,
) -> Result<Vec<crate::model::MarkdownLink>> {
let client = self let client = self
.pool .pool
.get() .get()

View file

@ -6413,7 +6413,7 @@ impl StorageBackend for SqliteBackend {
"INSERT INTO markdown_links ( "INSERT INTO markdown_links (
id, source_media_id, target_path, target_media_id, id, source_media_id, target_path, target_media_id,
link_type, link_text, line_number, context, created_at link_type, link_text, line_number, context, created_at
) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)" ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)",
)?; )?;
for link in &links { for link in &links {
@ -6438,7 +6438,10 @@ impl StorageBackend for SqliteBackend {
Ok(()) Ok(())
} }
async fn get_outgoing_links(&self, media_id: MediaId) -> Result<Vec<crate::model::MarkdownLink>> { async fn get_outgoing_links(
&self,
media_id: MediaId,
) -> Result<Vec<crate::model::MarkdownLink>> {
let conn = self.conn.clone(); let conn = self.conn.clone();
let media_id_str = media_id.0.to_string(); let media_id_str = media_id.0.to_string();
@ -6449,12 +6452,10 @@ impl StorageBackend for SqliteBackend {
link_type, link_text, line_number, context, created_at link_type, link_text, line_number, context, created_at
FROM markdown_links FROM markdown_links
WHERE source_media_id = ?1 WHERE source_media_id = ?1
ORDER BY line_number" ORDER BY line_number",
)?; )?;
let rows = stmt.query_map([&media_id_str], |row| { let rows = stmt.query_map([&media_id_str], |row| row_to_markdown_link(row))?;
row_to_markdown_link(row)
})?;
let mut links = Vec::new(); let mut links = Vec::new();
for row in rows { for row in rows {
@ -6480,7 +6481,7 @@ impl StorageBackend for SqliteBackend {
FROM markdown_links l FROM markdown_links l
JOIN media_items m ON l.source_media_id = m.id JOIN media_items m ON l.source_media_id = m.id
WHERE l.target_media_id = ?1 WHERE l.target_media_id = ?1
ORDER BY m.title, l.line_number" ORDER BY m.title, l.line_number",
)?; )?;
let rows = stmt.query_map([&media_id_str], |row| { let rows = stmt.query_map([&media_id_str], |row| {
@ -6501,7 +6502,9 @@ impl StorageBackend for SqliteBackend {
link_text, link_text,
line_number, line_number,
context, context,
link_type: link_type_str.parse().unwrap_or(crate::model::LinkType::Wikilink), link_type: link_type_str
.parse()
.unwrap_or(crate::model::LinkType::Wikilink),
}) })
})?; })?;
@ -6564,7 +6567,7 @@ impl StorageBackend for SqliteBackend {
// Get outgoing links // Get outgoing links
let mut stmt = conn.prepare( let mut stmt = conn.prepare(
"SELECT target_media_id FROM markdown_links "SELECT target_media_id FROM markdown_links
WHERE source_media_id = ?1 AND target_media_id IS NOT NULL" WHERE source_media_id = ?1 AND target_media_id IS NOT NULL",
)?; )?;
let rows = stmt.query_map([node_id], |row| { let rows = stmt.query_map([node_id], |row| {
let id: String = row.get(0)?; let id: String = row.get(0)?;
@ -6581,7 +6584,7 @@ impl StorageBackend for SqliteBackend {
// Get incoming links // Get incoming links
let mut stmt = conn.prepare( let mut stmt = conn.prepare(
"SELECT source_media_id FROM markdown_links "SELECT source_media_id FROM markdown_links
WHERE target_media_id = ?1" WHERE target_media_id = ?1",
)?; )?;
let rows = stmt.query_map([node_id], |row| { let rows = stmt.query_map([node_id], |row| {
let id: String = row.get(0)?; let id: String = row.get(0)?;
@ -6605,7 +6608,7 @@ impl StorageBackend for SqliteBackend {
let mut stmt = conn.prepare( let mut stmt = conn.prepare(
"SELECT DISTINCT id FROM media_items "SELECT DISTINCT id FROM media_items
WHERE media_type = 'markdown' AND deleted_at IS NULL WHERE media_type = 'markdown' AND deleted_at IS NULL
LIMIT 500" LIMIT 500",
)?; )?;
let rows = stmt.query_map([], |row| { let rows = stmt.query_map([], |row| {
let id: String = row.get(0)?; let id: String = row.get(0)?;
@ -6620,7 +6623,7 @@ impl StorageBackend for SqliteBackend {
for node_id in &node_ids { for node_id in &node_ids {
let mut stmt = conn.prepare( let mut stmt = conn.prepare(
"SELECT id, COALESCE(title, file_name) as label, title, media_type "SELECT id, COALESCE(title, file_name) as label, title, media_type
FROM media_items WHERE id = ?1" FROM media_items WHERE id = ?1",
)?; )?;
if let Ok((id, label, title, media_type)) = stmt.query_row([node_id], |row| { if let Ok((id, label, title, media_type)) = stmt.query_row([node_id], |row| {
Ok(( Ok((
@ -6660,7 +6663,7 @@ impl StorageBackend for SqliteBackend {
let mut stmt = conn.prepare( let mut stmt = conn.prepare(
"SELECT source_media_id, target_media_id, link_type "SELECT source_media_id, target_media_id, link_type
FROM markdown_links FROM markdown_links
WHERE source_media_id = ?1 AND target_media_id IS NOT NULL" WHERE source_media_id = ?1 AND target_media_id IS NOT NULL",
)?; )?;
let rows = stmt.query_map([node_id], |row| { let rows = stmt.query_map([node_id], |row| {
let source: String = row.get(0)?; let source: String = row.get(0)?;
@ -6674,7 +6677,9 @@ impl StorageBackend for SqliteBackend {
edges.push(crate::model::GraphEdge { edges.push(crate::model::GraphEdge {
source, source,
target, target,
link_type: link_type_str.parse().unwrap_or(crate::model::LinkType::Wikilink), link_type: link_type_str
.parse()
.unwrap_or(crate::model::LinkType::Wikilink),
}); });
} }
} }