Add object_id null value check to Post::new(), prevent panics
This commit is contained in:
parent
65375ee2cd
commit
ac834fa99a
3 changed files with 17 additions and 9 deletions
|
@ -81,7 +81,8 @@ impl TryFrom<&Row> for Notification {
|
||||||
let db_post_author: DbActorProfile = row.try_get("post_author")?;
|
let db_post_author: DbActorProfile = row.try_get("post_author")?;
|
||||||
let db_attachments: Vec<DbMediaAttachment> = row.try_get("attachments")?;
|
let db_attachments: Vec<DbMediaAttachment> = row.try_get("attachments")?;
|
||||||
let db_mentions: Vec<DbActorProfile> = row.try_get("mentions")?;
|
let db_mentions: Vec<DbActorProfile> = row.try_get("mentions")?;
|
||||||
Some(Post::new(db_post, db_post_author, db_attachments, db_mentions))
|
let post = Post::new(db_post, db_post_author, db_attachments, db_mentions)?;
|
||||||
|
Some(post)
|
||||||
},
|
},
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
|
|
@ -203,7 +203,7 @@ pub async fn create_post(
|
||||||
}
|
}
|
||||||
|
|
||||||
transaction.commit().await?;
|
transaction.commit().await?;
|
||||||
let post = Post::new(db_post, author, db_attachments, db_mentions);
|
let post = Post::new(db_post, author, db_attachments, db_mentions)?;
|
||||||
Ok(post)
|
Ok(post)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ use tokio_postgres::Row;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use crate::database::int_enum::{int_enum_from_sql, int_enum_to_sql};
|
use crate::database::int_enum::{int_enum_from_sql, int_enum_to_sql};
|
||||||
use crate::errors::{ConversionError, ValidationError};
|
use crate::errors::{ConversionError, DatabaseError, ValidationError};
|
||||||
use crate::models::attachments::types::DbMediaAttachment;
|
use crate::models::attachments::types::DbMediaAttachment;
|
||||||
use crate::models::profiles::types::DbActorProfile;
|
use crate::models::profiles::types::DbActorProfile;
|
||||||
use crate::utils::html::clean_html;
|
use crate::utils::html::clean_html;
|
||||||
|
@ -88,9 +88,15 @@ impl Post {
|
||||||
db_author: DbActorProfile,
|
db_author: DbActorProfile,
|
||||||
db_attachments: Vec<DbMediaAttachment>,
|
db_attachments: Vec<DbMediaAttachment>,
|
||||||
db_mentions: Vec<DbActorProfile>,
|
db_mentions: Vec<DbActorProfile>,
|
||||||
) -> Self {
|
) -> Result<Self, ConversionError> {
|
||||||
assert_eq!(db_post.author_id, db_author.id);
|
// Consistency checks
|
||||||
Self {
|
if db_post.author_id != db_post.author_id {
|
||||||
|
return Err(ConversionError);
|
||||||
|
};
|
||||||
|
if db_author.is_local() != db_post.object_id.is_none() {
|
||||||
|
return Err(ConversionError);
|
||||||
|
};
|
||||||
|
let post = Self {
|
||||||
id: db_post.id,
|
id: db_post.id,
|
||||||
author: db_author,
|
author: db_author,
|
||||||
content: db_post.content,
|
content: db_post.content,
|
||||||
|
@ -106,7 +112,8 @@ impl Post {
|
||||||
token_tx_id: db_post.token_tx_id,
|
token_tx_id: db_post.token_tx_id,
|
||||||
created_at: db_post.created_at,
|
created_at: db_post.created_at,
|
||||||
actions: None,
|
actions: None,
|
||||||
}
|
};
|
||||||
|
Ok(post)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_public(&self) -> bool {
|
pub fn is_public(&self) -> bool {
|
||||||
|
@ -139,14 +146,14 @@ impl Default for Post {
|
||||||
|
|
||||||
impl TryFrom<&Row> for Post {
|
impl TryFrom<&Row> for Post {
|
||||||
|
|
||||||
type Error = tokio_postgres::Error;
|
type Error = DatabaseError;
|
||||||
|
|
||||||
fn try_from(row: &Row) -> Result<Self, Self::Error> {
|
fn try_from(row: &Row) -> Result<Self, Self::Error> {
|
||||||
let db_post: DbPost = row.try_get("post")?;
|
let db_post: DbPost = row.try_get("post")?;
|
||||||
let db_profile: DbActorProfile = row.try_get("actor_profile")?;
|
let db_profile: DbActorProfile = row.try_get("actor_profile")?;
|
||||||
let db_attachments: Vec<DbMediaAttachment> = row.try_get("attachments")?;
|
let db_attachments: Vec<DbMediaAttachment> = row.try_get("attachments")?;
|
||||||
let db_mentions: Vec<DbActorProfile> = row.try_get("mentions")?;
|
let db_mentions: Vec<DbActorProfile> = row.try_get("mentions")?;
|
||||||
let post = Self::new(db_post, db_profile, db_attachments, db_mentions);
|
let post = Self::new(db_post, db_profile, db_attachments, db_mentions)?;
|
||||||
Ok(post)
|
Ok(post)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue