diff options
| author | Nathan Perry <avaglir@gmail.com> | 2018-04-05 22:52:02 -0400 |
|---|---|---|
| committer | Nathan Perry <avaglir@gmail.com> | 2018-04-05 22:52:02 -0400 |
| commit | ee1d099c6acdb38a173a7455804724f3a1b78836 (patch) | |
| tree | 0f4a8a949de370874d3e61788f5882dd7dddcf43 /src/db | |
| parent | 1fda857d25c3d33e593951eef3ce713fa69a7025 (diff) | |
consolidate memes to one table
Diffstat (limited to 'src/db')
| -rw-r--r-- | src/db/mod.rs | 52 | ||||
| -rw-r--r-- | src/db/models.rs | 94 | ||||
| -rw-r--r-- | src/db/schema.rs | 46 |
3 files changed, 85 insertions, 107 deletions
diff --git a/src/db/mod.rs b/src/db/mod.rs index e1c3a55..258d5a5 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -19,60 +19,58 @@ pub fn connection() -> Result<PgConnection> { CONN_MGR.connect().map_err(Error::from)
}
-pub trait AssociatedData {
- type Associated;
-
- fn associated_data(&self, conn: &PgConnection) -> Result<Self::Associated>;
-}
-
-pub fn find_text(conn: &PgConnection, search: String) -> Result<TextMeme> {
+pub fn find_text(conn: &PgConnection, search: String) -> Result<Meme> {
+ use diesel::dsl::sql;
let format_search = format!("%{}%", search);
- text_memes::table
- .filter(text_memes::title.ilike(&format_search).or(text_memes::content.ilike(&format_search)))
+ memes::table
+ .filter(memes::title.ilike(&format_search).or(sql(&format!("content ILIKE %{}%", search))))
.limit(1)
- .first::<TextMeme>(conn)
+ .first::<Meme>(conn)
.map_err(Error::from)
}
-pub fn find_audio(conn: &PgConnection, search: String) -> Result<AudioMeme> {
+pub fn find_audio(conn: &PgConnection, search: String) -> Result<Meme> {
let format_search = format!("%{}%", search);
- audio_memes::table
- .filter(audio_memes::title.ilike(format_search))
+ memes::table
+ .filter(memes::title.ilike(format_search).and(memes::audio_id.is_not_null()))
.limit(1)
- .first::<AudioMeme>(conn)
+ .first::<Meme>(conn)
.map_err(Error::from)
}
-pub fn find_image(conn: &PgConnection, search: String) -> Result<ImageMeme> {
+pub fn find_image(conn: &PgConnection, search: String) -> Result<Meme> {
let format_search = format!("%{}%", search);
- image_memes::table
- .filter(image_memes::title.ilike(format_search))
+ memes::table
+ .filter(memes::title.ilike(format_search).and(memes::image_id.is_not_null()))
.limit(1)
- .first::<ImageMeme>(conn)
+ .first::<Meme>(conn)
.map_err(Error::from)
}
-pub fn rand_text(conn: &PgConnection) -> Result<TextMeme> {
- text_memes::table
+pub fn rand_text(conn: &PgConnection) -> Result<Meme> {
+ memes::table
+ .filter(memes::content.is_not_null())
.order(random.desc())
- .first::<TextMeme>(conn)
+ .first::<Meme>(conn)
.map_err(Error::from)
}
-pub fn rand_image(conn: &PgConnection) -> Result<ImageMeme> {
- image_memes::table
+pub fn rand_image(conn: &PgConnection) -> Result<Meme> {
+ memes::table
+ .filter(memes::image_id.is_not_null())
.order(random.desc())
- .first::<ImageMeme>(conn)
+ .first::<Meme>(conn)
.map_err(Error::from)
}
-pub fn rand_audio(conn: &PgConnection) -> Result<AudioMeme> {
- audio_memes::table
+pub fn rand_audio(conn: &PgConnection) -> Result<Meme> {
+ memes::table
+ .filter(memes::audio_id.is_not_null())
.order(random.desc())
- .first::<AudioMeme>(conn)
+ .first::<Meme>(conn)
.map_err(Error::from)
}
diff --git a/src/db/models.rs b/src/db/models.rs index c07a12a..7479fff 100644 --- a/src/db/models.rs +++ b/src/db/models.rs @@ -2,85 +2,73 @@ use chrono::naive::NaiveDateTime; use diesel::prelude::*;
use super::schema::*;
-use super::AssociatedData;
use ::{Result, Error};
-#[derive(Insertable, Queryable, Identifiable, PartialEq, AsChangeset, Debug)]
-#[table_name="text_memes"]
-pub struct TextMeme {
+#[derive(Queryable, Identifiable, PartialEq, Debug)]
+#[table_name="memes"]
+pub struct Meme {
pub id: i32,
pub title: String,
- pub content: String,
+ pub content: Option<String>,
pub image_id: Option<i32>,
pub audio_id: Option<i32>,
pub metadata_id: i32,
}
-impl AssociatedData for TextMeme {
- type Associated = (Option<Image>, Option<Audio>);
-
- fn associated_data(&self, conn: &PgConnection) -> Result<Self::Associated> {
- let image = self.image_id.map(|x: i32| images::table.find(x).first(conn)).transpose()?;
- let audio = self.audio_id.map(|x: i32| audio::table.find(x).first(conn)).transpose()?;
+impl Meme {
+ pub fn image(&self, conn: &PgConnection) -> Option<Result<Image>> {
+ self.image_id.map(|x: i32| images::table.find(x).first(conn).map_err(Error::from))
+ }
- Ok((image, audio))
+ pub fn audio(&self, conn: &PgConnection) -> Option<Result<Audio>> {
+ self.audio_id.map(|x: i32| audio::table.find(x).first(conn).map_err(Error::from))
}
}
-
-#[derive(Insertable, Queryable, Identifiable, PartialEq, AsChangeset, Debug)]
-#[table_name="image_memes"]
-pub struct ImageMeme {
- pub id: i32,
+#[derive(Insertable, PartialEq, Debug)]
+#[table_name="memes"]
+pub struct NewMeme {
pub title: String,
- pub image_id: i32,
+ pub content: Option<String>,
+ pub image_id: Option<i32>,
+ pub audio_id: Option<i32>,
pub metadata_id: i32,
}
-impl AssociatedData for ImageMeme {
- type Associated = Image;
-
- fn associated_data(&self, conn: &PgConnection) -> Result<Self::Associated> {
- images::table.find(self.image_id).first(conn).map_err(Error::from)
- }
-}
-
-#[derive(Insertable, Queryable, Identifiable, PartialEq, AsChangeset, Debug)]
-#[table_name="audio_memes"]
-pub struct AudioMeme {
+#[derive(Queryable, Identifiable, PartialEq, Debug)]
+#[table_name="audio"]
+pub struct Audio {
pub id: i32,
- pub title: String,
- pub audio_id: i32,
+ pub data: Vec<u8>,
pub metadata_id: i32,
}
-impl AssociatedData for AudioMeme {
- type Associated = Audio;
-
- fn associated_data(&self, conn: &PgConnection) -> Result<Self::Associated> {
- audio::table.find(self.audio_id).first(conn).map_err(Error::from)
- }
+#[derive(Insertable, PartialEq, Debug)]
+#[table_name="audio"]
+pub struct NewAudio {
+ pub data: Vec<u8>,
+ pub metadata_id: i32,
}
-#[derive(Insertable, Queryable, Identifiable, PartialEq, AsChangeset, Debug)]
-#[table_name="audio"]
-pub struct Audio {
+#[derive(Queryable, Identifiable, PartialEq, Debug)]
+#[table_name="images"]
+pub struct Image {
pub id: i32,
pub data: Vec<u8>,
pub metadata_id: i32,
}
-#[derive(Insertable, Queryable, Identifiable, PartialEq, AsChangeset, Debug)]
+#[derive(Insertable, PartialEq, Debug)]
#[table_name="images"]
-pub struct Image {
- pub id: i32,
+pub struct NewImage {
pub data: Vec<u8>,
pub metadata_id: i32,
}
-#[derive(Insertable, Queryable, Identifiable, PartialEq, AsChangeset, Debug)]
+
+#[derive(Queryable, Identifiable, PartialEq, Debug)]
#[table_name="metadata"]
pub struct Metadata {
pub id: i32,
@@ -88,7 +76,15 @@ pub struct Metadata { pub created_by: i64,
}
-#[derive(Insertable, Queryable, Identifiable, PartialEq, AsChangeset, Debug)]
+#[derive(Insertable, PartialEq, Debug)]
+#[table_name="metadata"]
+pub struct NewMetadata {
+ pub created: NaiveDateTime,
+ pub created_by: i64,
+}
+
+
+#[derive(Queryable, Identifiable, PartialEq, Debug)]
#[table_name="audit_records"]
pub struct AuditRecord {
pub id: i32,
@@ -96,3 +92,11 @@ pub struct AuditRecord { pub updated_by: i64,
pub metadata_id: i32,
}
+
+#[derive(Insertable, PartialEq, Debug)]
+#[table_name="audit_records"]
+pub struct NewAuditRecord {
+ pub updated: NaiveDateTime,
+ pub updated_by: i64,
+ pub metadata_id: i32,
+}
diff --git a/src/db/schema.rs b/src/db/schema.rs index 40891a5..cf15dcd 100644 --- a/src/db/schema.rs +++ b/src/db/schema.rs @@ -7,15 +7,6 @@ table! { } table! { - audio_memes (id) { - id -> Int4, - title -> Varchar, - audio_id -> Int4, - metadata_id -> Int4, - } -} - -table! { audit_records (id) { id -> Int4, updated -> Timestamp, @@ -25,18 +16,20 @@ table! { } table! { - image_memes (id) { + images (id) { id -> Int4, - title -> Varchar, - image_id -> Int4, + data -> Bytea, metadata_id -> Int4, } } table! { - images (id) { + memes (id) { id -> Int4, - data -> Bytea, + title -> Varchar, + content -> Nullable<Text>, + image_id -> Nullable<Int4>, + audio_id -> Nullable<Int4>, metadata_id -> Int4, } } @@ -49,34 +42,17 @@ table! { } } -table! { - text_memes (id) { - id -> Int4, - title -> Varchar, - content -> Text, - image_id -> Nullable<Int4>, - audio_id -> Nullable<Int4>, - metadata_id -> Int4, - } -} - joinable!(audio -> metadata (metadata_id)); -joinable!(audio_memes -> audio (audio_id)); -joinable!(audio_memes -> metadata (metadata_id)); joinable!(audit_records -> metadata (metadata_id)); -joinable!(image_memes -> images (image_id)); -joinable!(image_memes -> metadata (metadata_id)); joinable!(images -> metadata (metadata_id)); -joinable!(text_memes -> audio (audio_id)); -joinable!(text_memes -> images (image_id)); -joinable!(text_memes -> metadata (metadata_id)); +joinable!(memes -> audio (audio_id)); +joinable!(memes -> images (image_id)); +joinable!(memes -> metadata (metadata_id)); allow_tables_to_appear_in_same_query!( audio, - audio_memes, audit_records, - image_memes, images, + memes, metadata, - text_memes, ); |
