diff options
| author | Nathan Perry <avaglir@gmail.com> | 2019-04-10 01:56:47 -0400 |
|---|---|---|
| committer | Nathan Perry <avaglir@gmail.com> | 2019-04-10 01:57:47 -0400 |
| commit | f11a5ae72e7c3be7575761dde9669f2d93e67b59 (patch) | |
| tree | 55444e618d8a3780db683837006b471162e5fd05 /src/db/mod.rs | |
| parent | fcf5e989f995484987b3474494a8de5ca23d1633 (diff) | |
write meme `query` command
Diffstat (limited to 'src/db/mod.rs')
| -rw-r--r-- | src/db/mod.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/db/mod.rs b/src/db/mod.rs index 6a71dd5..8702099 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -67,6 +67,51 @@ pub fn find_meme<T: AsRef<str>>(conn: &PgConnection, search: T) -> Result<Meme> .map_err(Error::from) } +pub fn query_meme<T: AsRef<str>>(search: T, user_id: Option<u64>, age_desc: bool) -> Result<Vec<(Meme, Metadata)>> { + let raw_conn = raw_connection()?; + + let search = format!("%{}%", search.as_ref()); + + let rows = raw_conn.query(&format!(r#" + SELECT memes.id, title, content, image_id, audio_id, metadata_id, created, created_by + FROM memes + INNER JOIN metadata ON memes.metadata_id = metadata.id + WHERE (memes.title ILIKE $1 OR memes.content ILIKE $1) + AND (metadata.created_by = $2 OR $3) + ORDER BY metadata.created {} + LIMIT 100 + "#, + if age_desc { "DESC" } else { "ASC" }, + ), &[ + &search, + &(user_id.unwrap_or(0) as i64), + &user_id.is_none(), + ])?; + + let result = rows.iter() + .map(|row| { + let meme = Meme { + id: row.get(0), + title: row.get(1), + content: row.get(2), + image_id: row.get(3), + audio_id: row.get(4), + metadata_id: row.get(5), + }; + + let metadata = Metadata { + id: row.get(5), + created: row.get(6), + created_by: row.get(7), + }; + + (meme, metadata) + }) + .collect(); + + Ok(result) +} + pub fn delete_meme<T: AsRef<str>>(conn: &PgConnection, search: T, deleted_by: u64) -> Result<()> { conn.transaction::<(), Error, _>(|| { let deleted = memes::table |
