publish post

This commit is contained in:
Christoph J. Scherr 2024-06-27 12:29:08 +02:00
parent 1be2f385b1
commit 13064b2cbd
2 changed files with 49 additions and 3 deletions

View File

@ -1,5 +1,5 @@
use diesel::SqliteConnection; use diesel::SqliteConnection;
use diesel_demo::models::PostDraft; use diesel_demo::models::{Post, PostDraft};
use libpt::log::{self, debug, error, trace}; use libpt::log::{self, debug, error, trace};
use diesel_demo as lib; use diesel_demo as lib;
@ -33,10 +33,23 @@ fn repl(conn: &mut SqliteConnection) -> anyhow::Result<()> {
help - show this menu\n\ help - show this menu\n\
exit - exit the application\n\ exit - exit the application\n\
list - list all posts\n\ list - list all posts\n\
publish [id] - delete the post with the id [id]\n\
delete [id] - delete the post with the id [id]\n\
new - create a new post" new - create a new post"
) )
} else if buf.starts_with("EXIT") { } else if buf.starts_with("EXIT") {
break; break;
} else if buf.starts_with("PUBLISH") {
let id: i32 = match get_id(&buf) {
Some(i) => i,
None => continue,
};
Post::publish(conn, id)?;
} else if buf.starts_with("DELETE") {
let id: i32 = match get_id(&buf) {
Some(i) => i,
None => continue,
};
} else if buf.starts_with("LIST") { } else if buf.starts_with("LIST") {
let posts = lib::load_all_posts(conn)?; let posts = lib::load_all_posts(conn)?;
trace!("loaded posts for display: {posts:#?}"); trace!("loaded posts for display: {posts:#?}");
@ -47,9 +60,29 @@ fn repl(conn: &mut SqliteConnection) -> anyhow::Result<()> {
error!("Could not submit the post: {e:?}"); error!("Could not submit the post: {e:?}");
}); });
} else { } else {
println!("Bad input: try 'help'"); usage()
} }
} }
Ok(()) Ok(())
} }
fn usage() {
println!("Bad input: try 'help'");
}
fn get_id(buf: &str) -> Option<i32> {
match buf.split(' ').nth(1) {
Some(s) => match s.parse() {
Ok(i) => Some(i),
Err(e) => {
error!("could not parse the id: {e:?}");
None
}
},
None => {
usage();
None
}
}
}

View File

@ -1,7 +1,7 @@
use std::io::{self, Read, Write}; use std::io::{self, Read, Write};
use diesel::prelude::*; use diesel::prelude::*;
use libpt::log::trace; use libpt::log::{info, trace};
use crate::schema::posts; use crate::schema::posts;
@ -21,6 +21,19 @@ pub struct Post {
pub published: bool, pub published: bool,
} }
impl Post {
pub fn publish(conn: &mut SqliteConnection, id: i32) -> anyhow::Result<()> {
use crate::schema::posts::dsl::{posts, published};
let post = diesel::update(posts.find(id))
.set(published.eq(true))
.returning(Post::as_returning())
.get_result(conn)?;
info!("updated post {}", post.id);
Ok(())
}
}
#[derive(Insertable, Debug)] #[derive(Insertable, Debug)]
#[diesel(table_name = crate::schema::posts)] #[diesel(table_name = crate::schema::posts)]
#[diesel(check_for_backend(diesel::sqlite::Sqlite))] // optional but improves generated compiler errors #[diesel(check_for_backend(diesel::sqlite::Sqlite))] // optional but improves generated compiler errors