From a97577b7e9fc582f8c262d3515ece32a201e9aca Mon Sep 17 00:00:00 2001 From: Pierre Date: Sun, 22 Apr 2018 12:31:48 +0200 Subject: [PATCH] Partial implementation of Post object --- RestControllers/postsController.php | 77 ++++++++++++++++++-- classes/components/notifications.php | 14 ++-- classes/components/posts.php | 103 ++++++++++++++++++++++----- classes/models/Post.php | 16 ++--- 4 files changed, 174 insertions(+), 36 deletions(-) diff --git a/RestControllers/postsController.php b/RestControllers/postsController.php index cc4533c..7ddd550 100644 --- a/RestControllers/postsController.php +++ b/RestControllers/postsController.php @@ -95,15 +95,15 @@ class postsController { $postInfos = components()->posts->get_single($postID, false); //Check for errors - if(count($postInfos) == 0) + if(!$postInfos->isValid()) Rest_fatal_error(500, "Couldn't retrieve post informations !"); //Check if we can get the comments of the post - if(components()->user->allowComments($postInfos['user_page_id'])) - $postInfos['comments'] = components()->comments->get($postInfos["ID"]); + if(components()->user->allowComments($postInfos->get_user_page_id())) + $postInfos->set_comments(components()->comments->get($postInfos->get_id())); //Parse post informations - $postInfos = $this->parsePostForAPI($postInfos); + $postInfos = $this->PostToAPI($postInfos); //Return informations about the post return $postInfos; @@ -547,4 +547,73 @@ class postsController { //Return the post ready to be shown return $infos; } + + /** + * Turn a POST object into API entry object + * + * @param Post $post The post object to convert + * @return array Generated post object + */ + public static function PostToAPI(Post $post) : array { + + $data = array(); + + //Basic information about the post + $data["ID"] = $post->get_id(); + $data["userID"] = $post->get_userID(); + $data["user_page_id"] = $post->get_user_page_id(); + $data["post_time"] = $post->get_time_sent(); + $data["content"] = $post->has_content() ? $post->get_content() : null; + $data["visibility_level"] = self::VISIBILITY_LEVELS_API[$post->get_visibility_level()]; + $data["kind"] = $post->get_kind(); + + //File specific + $data["file_size"] = $post->has_file_size() ? $post->get_file_size() : null; + $data["file_type"] = $post->has_file_type() ? $post->get_file_type() : null; + $data["file_path"] = $post->has_file_path() ? $post->get_file_path() : null; + $data["file_path_url"] = $post->has_file_path_url() ? $post->get_file_path_url() : null; + + //Movie specific + $data["video_id"] = $post->has_movie_id() ? $post->get_movie_id() : null; + $data["video_info"] = $post->has_movie() ? MoviesController::MovieToAPI($post->get_movie()) : null; + + //Countdown timer specific + $data["time_end"] = $post->has_time_end() ? $post->get_time_end() : null; + + //Weblink specific + $data["link_url"] = $post->has_link_url() ? $post->get_link_url() : null; + $data["link_title"] = $post->has_link_title() ? $post->get_link_title() : null; + $data["link_description"] = $post->has_link_description() ? $post->get_link_description() : null; + $data["link_image"] = $post->has_link_image() ? $post->get_link_image() : null; + + //Survey specific + $data["data_survey"] = $post->has_survey() ? SurveysController::SurveyToAPI($post->get_survey()) : null; + + //Other post information + $data["likes"] = $post->has_likes() ? $post->get_likes() : null; + $data["userlike"] = $post->get_userLike(); + + //Comments + if($post->has_comments()){ + + //Process the list of comments + $data["comments"] = array(); + + foreach($post->get_comments() as $num=>$comment) + $data['comments'][$num] = CommentsController::commentToAPI($comment); + + } + else + $data["comments"] = null; + + + //Get access level to the post + $post->set_user_access_level(CS::get()->components->posts->access_level_with_infos($post, userID)); + + //Save level access in the response + $data["user_access"] = self::ACCESS_LEVEL_API[$post->get_user_access_level()]; + + return $data; + + } } \ No newline at end of file diff --git a/classes/components/notifications.php b/classes/components/notifications.php index 70cf069..9893ecb 100644 --- a/classes/components/notifications.php +++ b/classes/components/notifications.php @@ -94,21 +94,25 @@ class notificationComponent { if($notification->get_on_elem_type() == Notification::POST){ //Fetch post informations - $infos_post = components()->posts->get_single($notification->get_on_elem_id()); + $info_post = components()->posts->get_single($notification->get_on_elem_id()); + //Check for error + if(!$info_post->isValid()) + return false; + //Update post informations $notification->set_from_container_type(Notification::USER_PAGE); - $notification->set_from_container_id($infos_post['user_page_id']); + $notification->set_from_container_id($info_post->get_user_page_id()); //Check if the notification is private or not - if($infos_post['visibility_level'] == Posts::VISIBILITY_USER){ + if($info_post->get_visibility_level() == Posts::VISIBILITY_USER){ //Push the notification only to the user, and only if it is not him - if($notification->get_from_user_id() == $infos_post['user_page_id']) + if($notification->get_from_user_id() == $info_post->get_user_page_id()) return false; //Nothing to be done //Set the target user - $notification->set_dest_user_id($infos_post['user_page_id']); + $notification->set_dest_user_id($info_post->get_user_page_id()); //Push the notification return $this->push_private($notification); diff --git a/classes/components/posts.php b/classes/components/posts.php index 28f0338..6193d20 100644 --- a/classes/components/posts.php +++ b/classes/components/posts.php @@ -263,33 +263,37 @@ class Posts { * * This function requires the informations about the post * - * @param array $post_infos Informations about the post + * @param Post $post_info Informations about the post * @param int $userID The ID of the user to check * @return int The access level over the post */ - public function access_level_with_infos(array $post_infos, int $userID) : int { + public function access_level_with_infos(Post $post_info, int $userID) : int { + + //Check the validity of the Post object + if(!$post_info->isValid()) + return $this::NO_ACCESS; //Check if the user is the owner of the post - if($post_infos['userID'] == $userID) + if($post_info->get_userID() == $userID) return $this::FULL_ACCESS; //Check if the post was made on the user page - if($post_infos["user_page_id"] == $userID) + if($post_info->get_user_page_id() == $userID) return $this::INTERMEDIATE_ACCESS; //Check if the post is private - if($post_infos["visibility_level"] == $this::VISIBILITY_USER) + if($post_info->get_visibility_level() == $this::VISIBILITY_USER) return $this::NO_ACCESS; //Check if the post is for friends only - if($post_infos["visibility_level"] == $this::VISIBILITY_FRIENDS){ + if($post_info->get_visibility_level() == $this::VISIBILITY_FRIENDS){ //Check if user is signed in if($userID == 0) return $this::NO_ACCESS; //Check if this user and the owner of the page are friends or not - else if(!CS::get()->components->friends->are_friend($userID, $post_infos['user_page_id'])) + else if(!CS::get()->components->friends->are_friend($userID, $post_info->get_user_page_id())) return $this::NO_ACCESS; else @@ -298,16 +302,16 @@ class Posts { } //Check if the post is public - if($post_infos['visibility_level'] == $this::VISIBILITY_PUBLIC){ + if($post_info->get_visibility_level() == $this::VISIBILITY_PUBLIC){ //Check if the two personns are friend if($userID != 0){ - if(CS::get()->components->friends->are_friend($userID, $post_infos['user_page_id'])) + if(CS::get()->components->friends->are_friend($userID, $post_info->get_user_page_id())) return $this::BASIC_ACCESS; } //Get user visibility level - $visibilityLevel = CS::get()->components->user->getVisibility($post_infos['user_page_id']); + $visibilityLevel = CS::get()->components->user->getVisibility($post_info->get_user_page_id()); //If the page is open, access is free if($visibilityLevel == UserComponent::USER_PAGE_OPEN) @@ -491,7 +495,7 @@ class Posts { $post_infos = $this->get_single($postID); //Check if we didn't get informations about the post - if(count($post_infos) == 0) + if(!$post_infos->isValid()) return false; //Delete the likes associated to the post @@ -503,11 +507,11 @@ class Posts { return false; //Delete the associated image or PDF (if any) - if($post_infos['kind'] == $this::POST_KIND_IMAGE - || $post_infos['kind'] == $this::POST_KIND_PDF){ + if($post_infos->get_kind() == $this::POST_KIND_IMAGE + || $post_infos->get_kind() == $this::POST_KIND_PDF){ //Determine file path - $file_path = path_user_data($post_infos["file_path"], true); + $file_path = path_user_data($post_infos->get_file_path(), true); //Check if the file exists if(file_exists($file_path)){ @@ -519,7 +523,7 @@ class Posts { } //Delete the associated survey (if any) - if($post_infos['kind'] == $this::POST_KIND_SURVEY){ + if($post_infos->get_kind() == $this::POST_KIND_SURVEY){ //Check the post has an associated survey if(components()->survey->exists($postID)){ @@ -541,10 +545,10 @@ class Posts { * @param int $postID The ID of the post to get * @param bool $load_comments Specify if the comments should be loaded or not * (no by default) - * @return array Informations about the post / empty array + * @return Post Information about the post / invalid Post object * if the post was not found */ - public function get_single(int $postID, bool $load_comments = false) : array { + public function get_single(int $postID, bool $load_comments = false) : Post { //Perform a request on the database $conditions = "WHERE ID = ?"; @@ -553,10 +557,10 @@ class Posts { //Check if we got a response if(count($result) == 0) - return array(); //Empty array = error + return new Post(); //Empty array = error //Return parsed response - return $this->parse_post($result[0], $load_comments); + return $this->dbToPost($result[0], $load_comments); } @@ -643,6 +647,67 @@ class Posts { return $info; } + + /** + * Turn a database entry into a Post object + * + * @param array $entry The database entry to parse + * @param bool $load_comments Load the comments, if required + * @return Post Generated Post object + */ + private function dbToPost(array $entry, bool $load_comments) : Post { + + $post = new Post(); + + //General information + $post->set_id($entry["ID"]); + $post->set_userID($entry["ID_amis"] == 0 ? $entry["ID_personne"] : $entry["ID_amis"]); + $post->set_user_page_id($entry["ID_personne"]); + $post->set_time_sent(strtotime($entry["date_envoi"])); + $post->set_content($entry["texte"]); + $post->set_visibility_level($entry["niveau_visibilite"]); + $post->set_kind($this::POSTS_DB_TYPES[$entry["type"]]); + + //File specific + $post->set_file_size($entry["size"] != null ? $entry["size"] : -1); + $post->set_file_type($entry["file_type"] != null ? $entry["file_type"] : ""); + $post->set_file_path($entry["path"] != null ? $entry["path"] : ""); + $post->set_file_path_url($post->has_file_path() ? path_user_data($post->get_file_path) : ""); + + //Movie specific + $post->set_movie_id($entry["idvideo"] == null ? -1 : $entry["idvideo"]); + if($post->has_movie_id()) + $post->set_movie(components()->movie->get_info($post->get_movie_id())); + + + //Countdown timer - specific + if($entry['annee_fin'] != 0) + $post->set_time_end(strtotime($entry["annee_fin"]."/".$entry['mois_fin']."/".$entry["jour_fin"])); + + + //Web link + $post->set_link_url($entry["url_page"] != null ? $entry["url_page"] : ""); + $post->set_link_title($entry["titre_page"] != null ? $entry["titre_page"] : ""); + $post->set_link_description($entry["description_page"] != null ? $entry["description_page"] : ""); + $post->set_link_image($entry["image_page"] != null ? $entry["image_page"] : ""); + + + //Survey specific + if($post->get_kind() == "survey") + $post->set_survey(components()->survey->get_infos($post->get_id())); + + + //Get information about likes + $post->set_likes(components()->likes->count($post->get_id(), Likes::LIKE_POST)); + $post->set_userLike(user_signed_in() ? components()->likes->is_liking(userID, $post->get_id(), Likes::LIKE_POST) : false); + + //Load comments, if requested + if($load_comments) + $post->set_comments(components()->comments->get($post->get_id())); + + return $post; + + } } //Register component diff --git a/classes/models/Post.php b/classes/models/Post.php index 754903d..7d913c3 100644 --- a/classes/models/Post.php +++ b/classes/models/Post.php @@ -16,8 +16,8 @@ class Post extends BaseUniqueObjectFromUser { private $file_type; private $file_path; private $file_path_url; - private $video_id = -1; - private $video_info; + private $movie_id = -1; + private $movie; private $time_end = -1; private $link_url; private $link_title; @@ -139,16 +139,16 @@ class Post extends BaseUniqueObjectFromUser { //Set and get the ID of the movie - public function set_video_id(int $video_id){ - $this->video_id = $video_id; + public function set_movie_id(int $movie_id){ + $this->movie_id = $movie_id; } - public function has_video_id() : bool { - return $this->video_id > -1; + public function has_movie_id() : bool { + return $this->movie_id > -1; } - public function get_video_id() : int { - return $this->video_id; + public function get_movie_id() : int { + return $this->movie_id; }