feat(server): busca FTS5 com filtros e paginacao
This commit is contained in:
@@ -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()
|
||||
}
|
||||
Reference in New Issue
Block a user