Smoothly wrote post find function

Jef Roosens 2021-10-12 16:41:14 +02:00
parent d013bd60bd
commit a107d9e283
Signed by untrusted user: Jef Roosens
GPG Key ID: 955C0660072F691F
5 changed files with 31 additions and 3 deletions

View File

@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize};
use uuid::Uuid; use uuid::Uuid;
use crate::{ use crate::{
errors::{RbError, RbResult}, errors::{RbError, RbResult, RbOption},
schema::{posts, posts::dsl::*}, schema::{posts, posts::dsl::*},
}; };
@ -48,6 +48,15 @@ pub fn get(conn: &PgConnection, offset_: u32, limit_: u32) -> RbResult<Vec<Post>
.map_err(|_| RbError::DbError("Couldn't query posts."))?) .map_err(|_| RbError::DbError("Couldn't query posts."))?)
} }
pub fn find(conn: &PgConnection, id_: &Uuid) -> RbOption<Post>
{
match posts.find(id_).first(conn) {
Ok(val) => Ok(Some(val)),
Err(diesel::NotFound) => Ok(None),
_ => Err(RbError::DbError("Couldn't find post.")),
}
}
pub fn create(conn: &PgConnection, new_post: &NewPost) -> RbResult<Post> pub fn create(conn: &PgConnection, new_post: &NewPost) -> RbResult<Post>
{ {
Ok(insert_into(posts) Ok(insert_into(posts)

View File

@ -12,6 +12,7 @@ pub struct Section
{ {
pub id: Uuid, pub id: Uuid,
pub title: String, pub title: String,
pub shortname: String,
pub description: Option<String>, pub description: Option<String>,
pub is_default: bool, pub is_default: bool,
pub has_titles: bool, pub has_titles: bool,
@ -23,6 +24,7 @@ pub struct Section
pub struct NewSection pub struct NewSection
{ {
title: String, title: String,
pub shortname: String,
description: Option<String>, description: Option<String>,
is_default: Option<bool>, is_default: Option<bool>,
has_titles: Option<bool>, has_titles: Option<bool>,
@ -34,6 +36,7 @@ pub struct NewSection
pub struct PatchSection pub struct PatchSection
{ {
title: Option<String>, title: Option<String>,
shortname: Option<String>,
description: Option<String>, description: Option<String>,
is_default: Option<bool>, is_default: Option<bool>,
has_titles: Option<bool>, has_titles: Option<bool>,

View File

@ -87,4 +87,8 @@ impl<'r> Responder<'r, 'static> for RbError
} }
} }
/// Type alias for results that can return an RbError
pub type RbResult<T> = std::result::Result<T, RbError>; pub type RbResult<T> = std::result::Result<T, RbError>;
/// Type alias for optional results that can fail & return an RbError
pub type RbOption<T> = RbResult<Option<T>>;

View File

@ -1,6 +1,6 @@
use rocket::serde::json::Json; use rocket::serde::json::Json;
use crate::{db, errors::RbResult, guards::Admin, RbDbConn}; use crate::{db, errors::RbResult, errors::RbOption, guards::Admin, RbDbConn};
#[get("/?<offset>&<limit>")] #[get("/?<offset>&<limit>")]
pub async fn get(conn: RbDbConn, offset: u32, limit: u32) -> RbResult<Json<Vec<db::Post>>> pub async fn get(conn: RbDbConn, offset: u32, limit: u32) -> RbResult<Json<Vec<db::Post>>>
@ -23,6 +23,12 @@ pub async fn create(
)) ))
} }
#[get("/<id>")]
pub async fn find(conn: RbDbConn, id: uuid::Uuid) -> RbOption<Json<db::Post>>
{
Ok(conn.run(move |c| db::posts::find(c, &id)).await?.and_then(|p| Some(Json(p))))
}
#[patch("/<id>", data = "<patch_post>")] #[patch("/<id>", data = "<patch_post>")]
pub async fn patch( pub async fn patch(
_admin: Admin, _admin: Admin,

View File

@ -21,6 +21,7 @@ table! {
sections (id) { sections (id) {
id -> Uuid, id -> Uuid,
title -> Varchar, title -> Varchar,
shortname -> Varchar,
description -> Nullable<Text>, description -> Nullable<Text>,
is_default -> Bool, is_default -> Bool,
has_titles -> Bool, has_titles -> Bool,
@ -40,4 +41,9 @@ table! {
joinable!(posts -> sections (section_id)); joinable!(posts -> sections (section_id));
joinable!(refresh_tokens -> users (user_id)); joinable!(refresh_tokens -> users (user_id));
allow_tables_to_appear_in_same_query!(posts, refresh_tokens, sections, users,); allow_tables_to_appear_in_same_query!(
posts,
refresh_tokens,
sections,
users,
);