feat(server): busca FTS5 com filtros e paginacao

This commit is contained in:
2026-08-05 20:35:17 -03:00
parent 2564c33748
commit 1d1de4bcec
7 changed files with 169 additions and 0 deletions
+43
View File
@@ -72,4 +72,47 @@ pub fn get_file(db: &Connection, file_id: &str) -> rusqlite::Result<FileRecord>
[file_id],
FileRecord::from_row,
)
}
pub fn search_files(
db: &Connection,
q: &str,
ftype: Option<&str>,
limit: i64,
offset: i64,
) -> rusqlite::Result<Vec<FileRecord>> {
let mut sql = String::from(
"SELECT f.id, f.peer_id, f.name, f.description, f.ftype, f.extension,
f.size_bytes, f.hash, f.license, f.tags, f.created_at
FROM files f",
);
let mut params: Vec<Box<dyn rusqlite::ToSql>> = Vec::new();
let mut where_added = false;
if let Some(query) = crate::search::fts_query(q) {
sql.push_str(" JOIN files_fts ON files_fts.rowid = f.rowid WHERE files_fts MATCH ?1");
params.push(Box::new(query));
where_added = true;
}
if let Some(ft) = ftype {
if !where_added {
sql.push_str(" WHERE");
where_added = true;
} else {
sql.push_str(" AND");
}
params.push(Box::new(ft.to_string()));
sql.push_str(&format!(" f.ftype = ?{}", params.len()));
}
params.push(Box::new(limit));
sql.push_str(&format!(" ORDER BY f.created_at DESC LIMIT ?{}", params.len()));
params.push(Box::new(offset));
sql.push_str(&format!(" OFFSET ?{}", params.len()));
let mut stmt = db.prepare(&sql)?;
let rows = stmt.query_map(
rusqlite::params_from_iter(params.iter().map(|p| p.as_ref())),
FileRecord::from_row,
)?;
rows.collect()
}