use diesel::{self, PgConnection, QueryDsl, ExpressionMethods, RunQueryDsl}; use serde_json; use ap_url; use instance::Instance; use schema::medias; #[derive(Queryable, Serialize)] pub struct Media { pub id: i32, pub file_path: String, pub alt_text: String, pub is_remote: bool, pub remote_url: Option, pub sensitive: bool, pub content_warning: Option, pub owner_id: i32 } #[derive(Insertable)] #[table_name = "medias"] pub struct NewMedia { pub file_path: String, pub alt_text: String, pub is_remote: bool, pub remote_url: Option, pub sensitive: bool, pub content_warning: Option, pub owner_id: i32 } impl Media { insert!(medias, NewMedia); get!(medias); list_by!(medias, for_user, owner_id as i32); pub fn to_json(&self, conn: &PgConnection) -> serde_json::Value { let mut json = serde_json::to_value(self).unwrap(); let (preview, html) = match self.file_path.rsplitn(2, '.').next().unwrap() { "png" | "jpg" | "jpeg" | "gif" => ( format!("\"{}\"", self.url(conn), self.alt_text, self.alt_text), format!("\"{}\"", self.url(conn), self.alt_text, self.alt_text) ), "mp3" | "wav" | "flac" => ( format!("", self.url(conn), self.alt_text), format!("", self.url(conn), self.alt_text) ), "mp4" | "avi" | "webm" | "mov" => ( format!("", self.url(conn), self.alt_text), format!("", self.url(conn), self.alt_text) ), _ => (String::new(), String::new()) }; json["html_preview"] = json!(preview); json["html"] = json!(html); json } pub fn url(&self, conn: &PgConnection) -> String { ap_url(format!("{}/static/{}", Instance::get_local(conn).unwrap().public_domain, self.file_path)) } }