diff --git a/migrations/2018-04-23-111655_create_blog_authors/down.sql b/migrations/2018-04-23-111655_create_blog_authors/down.sql new file mode 100644 index 00000000..cfb62abd --- /dev/null +++ b/migrations/2018-04-23-111655_create_blog_authors/down.sql @@ -0,0 +1,2 @@ +-- This file should undo anything in `up.sql` +DROP TABLE blog_authors; diff --git a/migrations/2018-04-23-111655_create_blog_authors/up.sql b/migrations/2018-04-23-111655_create_blog_authors/up.sql new file mode 100644 index 00000000..f59e6c7b --- /dev/null +++ b/migrations/2018-04-23-111655_create_blog_authors/up.sql @@ -0,0 +1,7 @@ +-- Your SQL goes here +CREATE TABLE blog_authors ( + id SERIAL PRIMARY KEY, + blog_id INTEGER REFERENCES blogs(id) ON DELETE CASCADE NOT NULL, + author_id INTEGER REFERENCES users(id) ON DELETE CASCADE NOT NULL, + is_owner BOOLEAN NOT NULL DEFAULT 'f' +) diff --git a/src/models/blog_authors.rs b/src/models/blog_authors.rs new file mode 100644 index 00000000..8a0e73e6 --- /dev/null +++ b/src/models/blog_authors.rs @@ -0,0 +1,36 @@ +use diesel; +use diesel::{QueryDsl, RunQueryDsl, ExpressionMethods, PgConnection}; +use schema::blog_authors; + +#[derive(Queryable, Identifiable)] +pub struct BlogAuthor { + pub id: i32, + pub blog_id: i32, + pub author_id: i32, + pub is_owner: bool, +} + +#[derive(Insertable)] +#[table_name = "blog_authors"] +pub struct NewBlogAuthor { + pub blog_id: i32, + pub author_id: i32, + pub is_owner: bool, +} + +impl BlogAuthor { + pub fn insert (conn: &PgConnection, new: NewBlogAuthor) -> BlogAuthor { + diesel::insert_into(blog_authors::table) + .values(new) + .get_result(conn) + .expect("Error saving new blog") + } + + pub fn get(conn: &PgConnection, id: i32) -> Option { + blog_authors::table.filter(blog_authors::id.eq(id)) + .limit(1) + .load::(conn) + .expect("Error loading blog by id") + .into_iter().nth(0) + } +} diff --git a/src/models/mod.rs b/src/models/mod.rs index 284de04a..0639787a 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -1,3 +1,4 @@ +pub mod blog_authors; pub mod blogs; pub mod instance; pub mod user; diff --git a/src/schema.rs b/src/schema.rs index 5af7ab02..06b777c7 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -1,3 +1,12 @@ +table! { + blog_authors (id) { + id -> Int4, + blog_id -> Int4, + author_id -> Int4, + is_owner -> Bool, + } +} + table! { blogs (id) { id -> Int4, @@ -36,10 +45,13 @@ table! { } } +joinable!(blog_authors -> blogs (blog_id)); +joinable!(blog_authors -> users (author_id)); joinable!(blogs -> instances (instance_id)); joinable!(users -> instances (instance_id)); allow_tables_to_appear_in_same_query!( + blog_authors, blogs, instances, users,