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 crate::{
errors::{RbError, RbResult},
errors::{RbError, RbResult, RbOption},
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."))?)
}
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>
{
Ok(insert_into(posts)

View File

@ -12,6 +12,7 @@ pub struct Section
{
pub id: Uuid,
pub title: String,
pub shortname: String,
pub description: Option<String>,
pub is_default: bool,
pub has_titles: bool,
@ -23,6 +24,7 @@ pub struct Section
pub struct NewSection
{
title: String,
pub shortname: String,
description: Option<String>,
is_default: Option<bool>,
has_titles: Option<bool>,
@ -34,6 +36,7 @@ pub struct NewSection
pub struct PatchSection
{
title: Option<String>,
shortname: Option<String>,
description: Option<String>,
is_default: 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>;
/// 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 crate::{db, errors::RbResult, guards::Admin, RbDbConn};
use crate::{db, errors::RbResult, errors::RbOption, guards::Admin, RbDbConn};
#[get("/?<offset>&<limit>")]
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>")]
pub async fn patch(
_admin: Admin,

View File

@ -21,6 +21,7 @@ table! {
sections (id) {
id -> Uuid,
title -> Varchar,
shortname -> Varchar,
description -> Nullable<Text>,
is_default -> Bool,
has_titles -> Bool,
@ -40,4 +41,9 @@ table! {
joinable!(posts -> sections (section_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,
);