1
0
mirror of https://gitlab.com/comunic/comunicapiv3 synced 2025-02-07 09:47:04 +00:00
comunicapiv3/src/helpers/posts_helper.rs

118 lines
3.2 KiB
Rust
Raw Normal View History

2020-07-02 18:19:04 +02:00
//! # 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")?
})
}