mirror of
https://gitlab.com/comunic/comunicapiv3
synced 2025-06-21 00:45:18 +00:00
Start to implement post logic
This commit is contained in:
@ -176,6 +176,12 @@ impl QueryInfo {
|
||||
self
|
||||
}
|
||||
|
||||
/// Add a custom User ID WHERE value
|
||||
pub fn add_custom_where_argument_user_id(mut self, val: &UserID) -> QueryInfo {
|
||||
self.custom_where_ars.push(mysql::Value::UInt(val.id()));
|
||||
self
|
||||
}
|
||||
|
||||
/// Add a custom string WHERE value
|
||||
pub fn add_custom_where_argument_str(mut self, val: &str) -> QueryInfo {
|
||||
self.custom_where_ars.push(mysql::Value::from(val));
|
||||
|
@ -8,5 +8,6 @@ pub mod custom_emojies_helper;
|
||||
pub mod background_image_helper;
|
||||
pub mod likes_helper;
|
||||
pub mod groups_helper;
|
||||
pub mod posts_helper;
|
||||
pub mod conversations_helper;
|
||||
pub mod virtual_directory_helper;
|
118
src/helpers/posts_helper.rs
Normal file
118
src/helpers/posts_helper.rs
Normal file
@ -0,0 +1,118 @@
|
||||
//! # Posts helper
|
||||
//!
|
||||
//! @author Pierre Hubert
|
||||
|
||||
use crate::constants::database_tables_names::POSTS_TABLE;
|
||||
use crate::data::error::ResultBoxError;
|
||||
use crate::data::post::{Post, PostVisibilityLevel};
|
||||
use crate::data::user::UserID;
|
||||
use crate::helpers::{database, friends_helper};
|
||||
|
||||
impl PostVisibilityLevel {
|
||||
pub fn to_db(&self) -> u32 {
|
||||
match self {
|
||||
PostVisibilityLevel::VISIBILITY_PUBLIC => 1,
|
||||
PostVisibilityLevel::VISIBILITY_FRIENDS => 2,
|
||||
PostVisibilityLevel::VISIBILITY_USER => 3,
|
||||
PostVisibilityLevel::VISIBILITY_GROUP_MEMBERS => 50,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pub struct PostsQuery {
|
||||
/// The ID of the user making the request
|
||||
user_id: Option<UserID>,
|
||||
|
||||
/// Maximum number of posts to get
|
||||
limit: u64,
|
||||
|
||||
/// Starting post
|
||||
start_from: u64,
|
||||
}
|
||||
|
||||
impl PostsQuery {
|
||||
/// Construct a new request
|
||||
pub fn new(user_id: Option<UserID>) -> PostsQuery {
|
||||
PostsQuery {
|
||||
user_id,
|
||||
limit: 10,
|
||||
start_from: 0,
|
||||
}
|
||||
}
|
||||
|
||||
/// Start starting point
|
||||
pub fn set_start_from(mut self, start_from: u64) -> PostsQuery {
|
||||
self.start_from = start_from;
|
||||
self
|
||||
}
|
||||
|
||||
/// Set the limit for this query
|
||||
pub fn set_limit(mut self, limit: u64) -> PostsQuery {
|
||||
self.limit = limit;
|
||||
self
|
||||
}
|
||||
|
||||
/// Get the posts of a user
|
||||
pub fn get_user(self, user_id: &UserID) -> ResultBoxError<Vec<Post>> {
|
||||
get_user(&self, user_id)
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the posts of `target_id`
|
||||
fn get_user(query: &PostsQuery, target_id: &UserID) -> ResultBoxError<Vec<Post>> {
|
||||
// Max user visibility
|
||||
let mut level = PostVisibilityLevel::VISIBILITY_PUBLIC;
|
||||
|
||||
if let Some(user_id) = &query.user_id {
|
||||
if user_id == target_id {
|
||||
level = PostVisibilityLevel::VISIBILITY_USER;
|
||||
} else if friends_helper::are_friend(user_id, target_id)? {
|
||||
level = PostVisibilityLevel::VISIBILITY_FRIENDS;
|
||||
}
|
||||
}
|
||||
|
||||
// Start request
|
||||
let mut db_query = database::QueryInfo::new(POSTS_TABLE);
|
||||
let mut custom_where = String::new();
|
||||
|
||||
// Preprocess conditions
|
||||
|
||||
// ============= PERMISSION CONDITIONS =================
|
||||
custom_where.push_str("((niveau_visibilite <= ?) ");
|
||||
db_query = db_query.add_custom_where_argument_u32(level.to_db());
|
||||
|
||||
// Add user posts (if signed in)
|
||||
if let Some(user_id) = &query.user_id {
|
||||
custom_where.push_str(" OR (ID_amis = ?) ");
|
||||
db_query = db_query.add_custom_where_argument_user_id(user_id);
|
||||
}
|
||||
|
||||
custom_where.push_str(")");
|
||||
// ============= /PERMISSION CONDITIONS =================
|
||||
|
||||
|
||||
// ============== START POINT CONDITION =================
|
||||
if query.start_from != 0 {
|
||||
custom_where.push_str(" AND ID <= ?");
|
||||
db_query = db_query.add_custom_where_argument_u64(query.start_from);
|
||||
}
|
||||
// ============== /START POINT CONDITION ================
|
||||
|
||||
|
||||
// Perform the request
|
||||
db_query
|
||||
.cond_user_id("ID_personne", target_id)
|
||||
.cond_u64("group_id", 0)
|
||||
.set_custom_where(&custom_where)
|
||||
.set_order("ID DESC")
|
||||
.set_limit(query.limit)
|
||||
.exec(db_to_post)
|
||||
}
|
||||
|
||||
/// Turn a post into a database entry
|
||||
fn db_to_post(res: &database::RowResult) -> ResultBoxError<Post> {
|
||||
Ok(Post {
|
||||
id: res.get_u64("ID")?
|
||||
})
|
||||
}
|
Reference in New Issue
Block a user