ComunicAPI/classes/components/friends.php

469 lines
13 KiB
PHP
Raw Permalink Normal View History

2017-05-28 12:09:20 +00:00
<?php
/**
* Friends component
*
* @author Pierre HUBERT
*/
class friends {
2017-05-31 14:49:25 +00:00
/**
* @var String $friendsTable The name of the table for friends
*/
private $friendsTable = "amis";
2018-01-09 05:57:01 +00:00
/**
* Cache friendship informations
*/
private $frienship_cache = array();
2017-05-28 12:09:20 +00:00
/**
* Public construcor
*/
public function __construct(){
//Nothing now
}
2017-05-31 14:49:25 +00:00
/**
* Get and returns the list of the friends of a user
*
2018-02-03 14:02:43 +00:00
* @param int $userID The ID of the user
* @param int $friendID The ID of a specific friend (default -1)
* @param bool $only_accepted Specify if only the accepted friends must be selected (default: FALSE)
2018-02-03 14:25:58 +00:00
* @return array The list of the friends of the user (Friend objects)
2017-05-31 14:49:25 +00:00
*/
public function getList(int $userID, int $friendID = -1, bool $only_accepted = FALSE) : array {
2017-05-31 14:49:25 +00:00
//Prepare the request on the database
$tableName = $this->friendsTable.", utilisateurs";
$condition = "WHERE ID_personne = ? AND amis.ID_amis = utilisateurs.ID ";
2017-05-31 14:49:25 +00:00
$condValues = array($userID);
//Check if the request is targeting a specific friend
if($friendID != -1){
$condition .= " AND ID_amis = ? ";
$condValues[] = $friendID;
}
//Check if only accepted friendship must be selected
if($only_accepted){
$condition .= " AND actif = 1 ";
}
//Complete conditions
$condition .= "ORDER BY utilisateurs.last_activity DESC";
2017-05-31 14:49:25 +00:00
//Specify which fields to get
$fieldsList = array(
"utilisateurs.last_activity",
$this->friendsTable.".ID_amis",
$this->friendsTable.".actif",
$this->friendsTable.".abonnement",
2018-03-05 18:04:21 +00:00
$this->friendsTable.".autoriser_post_page"
2017-05-31 14:49:25 +00:00
);
//Perform the request on the database
$results = CS::get()->db->select($tableName, $condition, $condValues, $fieldsList);
//Process results
$friendsList = array();
foreach($results as $process){
2018-02-03 14:25:58 +00:00
$friendsList[] = $this->parse_friend_db_infos($process);
2017-05-31 14:49:25 +00:00
}
//Return result
return $friendsList;
}
2017-06-04 14:36:12 +00:00
/**
* Get the list of friends of a given user that allows him to
* create posts on their page
*
* @param $userID The ID of the target user
* @return array The list of friends of a user that allows him
* to create posts
*/
public function getListThatAllowPostsFromUser(int $userID) : array {
$list = db()->select(
$this->friendsTable,
"WHERE autoriser_post_page = 1 AND ID_amis = ?",
array($userID),
array("ID_personne")
);
foreach($list as $num=>$info)
$list[$num] = (int)$info["ID_personne"];
return $list;
}
2017-06-04 14:36:12 +00:00
/**
* Respond to a friendship request
*
2018-02-03 14:02:43 +00:00
* @param int $userID The ID of the user who respond to the request
* @param int $friendID The ID of the target friend
* @param bool $accept Defines wether the friend request was accepted or not
* @return bool True or false depending of the success of the operation
2017-06-04 14:36:12 +00:00
*/
2018-02-03 14:02:43 +00:00
public function respondRequest(int $userID, int $friendID, bool $accept) : bool {
2017-06-04 14:36:12 +00:00
//If the request is to refuse friendship request, there isn't any security check to perform
if(!$accept){
//Perform a request on the database
$conditions = "ID_personne = ? AND ID_amis = ? AND actif = 0";
$conditionsValues = array(
$userID*1,
$friendID*1
);
//Try to perform request
if(CS::get()->db->deleteEntry($this->friendsTable, $conditions, $conditionsValues))
return true; //Operation is a success
else
return false; //An error occured
}
//Else it is a little more complicated
//First, check the request was really performed
if(!$this->checkFriendShipRequestExistence($friendID, $userID))
return false; //There isn't any existing request
//Else we can update the database to accept the request
//Update the table
$conditions = "ID_personne = ? AND ID_amis = ? AND actif = 0";
$whereValues = array(
$userID*1,
$friendID*1
);
$modifs = array(
"actif" => 1
);
//First update the table
if(!CS::get()->db->updateDB($this->friendsTable, $conditions, $modifs, $whereValues))
return false;
//Then insert the second friend line
$insertValues = array(
"ID_personne" => $friendID,
"ID_amis" => $userID,
"actif" => 1
);
if(!CS::get()->db->addLine($this->friendsTable, $insertValues))
return false; //An error occurred
//The operation is a success
return true;
}
/**
* Check if a friendship request was performed by someone to someone
*
* @param Integer $userID The user who may have performed a request
* @param Integer $friendID The destination of the request
* @return Boolean True or false depending of the success of the operation
*/
2017-12-04 19:18:30 +00:00
public function checkFriendShipRequestExistence($userID, $friendID){
2017-06-04 14:36:12 +00:00
//Perform a request on the database
$conditions = "WHERE ID_personne = ? AND ID_amis = ? AND actif = 0";
$dataConditions = array(
$friendID*1,
$userID*1
);
$fieldsList = array("ID");
//Try to perform request
$results = CS::get()->db->select($this->friendsTable, $conditions, $dataConditions, $fieldsList);
//Check for errors
if($results === false)
return false; //An error occured
//Else we check the results
else
return count($results) === 1;
2017-12-04 19:18:30 +00:00
}
/**
* Remove a friend from the firends list
*
* @param int $userID The ID of the user who delete the friend
* @param int $friendID The ID of the friend that is being removed from the list
* @return bool True if the user was successfully removed / false else
*/
public function remove(int $userID, int $friendID) : bool {
//Delete the friend from the database
$tableName = $this->friendsTable;
$conditions = "(ID_personne = ? AND ID_amis = ?) OR (ID_personne = ? AND ID_amis = ?)";
$condValues = array($userID, $friendID, $friendID, $userID);
//Try to perform the request
$success = CS::get()->db->deleteEntry($tableName, $conditions, $condValues);
return $success;
}
/**
* Check wether two users are friend or not
*
2018-01-09 05:57:01 +00:00
* @param int $user1 The ID of the first user
* @param int $user2 The ID of the second user
* @return TRUE if the users are friend / FALSE else
*/
public function are_friend(int $user1, int $user2) : bool {
2018-01-09 05:57:01 +00:00
//Check if the response is in the cache
if(isset($this->frienship_cache[$user1."-".$user2]))
return $this->frienship_cache[$user1."-".$user2];
//Query the friends table
$tableName = $this->friendsTable;
$conditions = "WHERE ID_personne = ? AND ID_amis = ? AND actif = 1";
$condValues = array($user1, $user2);
//Try to perform the request
$response = CS::get()->db->select($tableName, $conditions, $condValues);
//Return the result
2018-01-09 05:57:01 +00:00
$are_friend = count($response) > 0;
//Cache the response
$this->frienship_cache[$user1."-".$user2] = $are_friend;
return $are_friend;
}
2017-12-20 17:53:00 +00:00
2017-12-21 18:24:25 +00:00
/**
* Send a friendship request
*
2018-01-09 05:57:01 +00:00
* @param int $userID The ID of the user creating the request
* @param int $targetID The target of the friendship request
* @return bool TRUE in case of success / FALSE else
2017-12-21 18:24:25 +00:00
*/
public function send_request(int $userID, int $targetID) : bool {
//Prepare the insertion
$tableName = $this->friendsTable;
$values = array(
"ID_personne" => $targetID,
"ID_amis" => $userID,
"actif" => 0
);
//Try to perform the request
return CS::get()->db->addLine($tableName, $values) == true;
}
/**
* Delete a friendship request previously created
*
2018-01-09 05:57:01 +00:00
* @param int $userID The ID of the user removing its request
* @param int $targetID The ID of the target of the request
* @return bool TRUE in case of success / false else
*/
public function remove_request(int $userID, int $targetID) : bool {
//Prepare the request on the database
$tableName = $this->friendsTable;
$conditions = "ID_personne = ? AND ID_amis = ? AND actif = 0";
$values = array($targetID, $userID);
//Try to perform the request
return CS::get()->db->deleteEntry($tableName, $conditions, $values);
}
2017-12-20 17:53:00 +00:00
/**
2017-12-21 17:49:50 +00:00
* Check wether a user has sent a friendship
2017-12-20 17:53:00 +00:00
* request to another friend
*
2018-01-09 05:57:01 +00:00
* @param int $user The ID of the user supposed to have sent a request
* @param int $targetUser The ID of the target user
* @return bool TRUE if a request has been sent / FALSE else
2017-12-20 17:53:00 +00:00
*/
public function sent_request(int $user, int $targetUser) : bool {
//Query the friend table
$tableName = $this->friendsTable;
$conditions = "WHERE ID_personne = ? AND ID_amis = ? AND actif = 0";
$condValues = array($targetUser, $user);
//Try to perform the request
$response = CS::get()->db->select($tableName, $conditions, $condValues);
//Return result
return count($response) > 0;
}
2017-12-21 17:49:50 +00:00
/**
* Check wether a user is following or not another friend
2017-12-21 17:49:50 +00:00
*
2018-01-09 05:57:01 +00:00
* @param int $userID The ID of the user supposed to follow another friend
* @param int $friendID The ID of the friend
* @return bool TRUE if the user is following the other user / FALSE else
2017-12-21 17:49:50 +00:00
*/
public function is_following(int $userID, int $friendID) : bool {
//Query the friend table
$tableName = $this->friendsTable;
$conditions = "WHERE ID_personne = ? AND ID_amis = ? AND actif = 1";
$condValues = array($userID, $friendID);
$requiredFields = array("abonnement");
//Try to perform the request
$response = CS::get()->db->select($tableName, $conditions, $condValues, $requiredFields);
//Check for result
if(count($response) < 1)
return FALSE; //No entry found
return $response[0]['abonnement'] == 1;
}
/**
* Check wether a friend allows a friend to post text on his page or not
*
2018-01-09 05:57:01 +00:00
* @param int $userID The ID of the user performing the request
* @param int $friendID The ID of the friend allowing or denying the user
* to post texts on his page
2018-01-09 05:57:01 +00:00
* @return bool TRUE if the user is allowed to post texts on the page / FALSE else
*/
public function can_post_text(int $userID, int $friendID) : bool {
//Query the friend table
$tableName = $this->friendsTable;
$conditions = "WHERE ID_personne = ? AND ID_amis = ? AND actif = 1";
$condValues = array($friendID, $userID);
$requiredFields = array("autoriser_post_page");
//Try to perform the request
$response = CS::get()->db->select($tableName, $conditions, $condValues, $requiredFields);
//Check for result
if(count($response) < 1)
return FALSE; //No entry found
return $response[0]['autoriser_post_page'] == 1;
2017-12-23 14:25:18 +00:00
}
/**
* Update the following status for a friendship
*
* @param int $userID The ID of the user updating the status
* @param int $friendID The ID of the target friend
* @param boolean $following The new status
* @return bool True in case of succcess / false else
*/
public function set_following(int $userID, int $friendID, bool $following) : bool {
//Update the table
$tableName = $this->friendsTable;
$conditions = "ID_personne = ? AND ID_amis = ?";
$conditionsValues = array($userID, $friendID);
$newValues = array(
"abonnement" => $following ? 1 : 0
);
2017-12-23 14:25:18 +00:00
//Perform the request
return CS::get()->db->updateDB($tableName, $conditions, $newValues, $conditionsValues);
}
/**
* Update the posts authorization status for a friendship
*
* @param int $userID The ID of the user updating the authorization status
* @param int $friendID The ID of the target friend
* @param boolean $allow The new authorization status
* @return bool TRUE in case of success / FALSE else
*/
public function set_can_post_texts(int $userID, int $friendID, bool $allow) : bool {
//Update the table
$tableName = $this->friendsTable;
$conditions = "ID_personne = ? AND ID_amis = ?";
$conditionsValues = array($userID, $friendID);
$newValues = array(
"autoriser_post_page" => $allow ? 1 : 0
);
//Perform the request
return CS::get()->db->updateDB($tableName, $conditions, $newValues, $conditionsValues);
}
/**
* Count the number of friends of a user
*
* @param int $userID The target user ID
* @return int The number of friends of the user
*/
public function count_all(int $userID) : int {
//Perform a request on the datbase
$tableName = $this->friendsTable;
$conditions = "WHERE ID_amis = ? AND actif = 1";
$condValues = array($userID);
return CS::get()->db->count($tableName, $conditions, $condValues);
}
2018-02-03 14:25:58 +00:00
2018-05-10 06:42:58 +00:00
/**
* Delete all the friends of a user, including friendship requests
*
* @param int $userID The ID of the target user
* @return bool TRUE for a success / FALSE else
*/
public function deleteAllUserFriends(int $userID) : bool {
//Delete the friend from the database
$tableName = $this->friendsTable;
$conditions = "ID_personne = ? OR ID_amis = ?";
$condValues = array($userID, $userID);
//Try to perform the request
$success = CS::get()->db->deleteEntry($tableName, $conditions, $condValues);
return $success;
}
/**
* Count the number of friendship requests a user has received
*
* @param int $userID Target user ID
* @return int The number of friendship request the user received
*/
public function count_requests(int $userID) : int {
return db()->count(
$this->friendsTable,
"WHERE ID_personne = ? AND actif = 0",
array($userID));
}
2018-02-03 14:25:58 +00:00
/**
* Parse friend informations from the database
*
* @param array $data Informations about the friend from the database
* @return Friend Parsed friend object
*/
private function parse_friend_db_infos(array $data) : Friend {
$friend = new Friend();
//Parse informations
$friend->setFriendID($data["ID_amis"]);
$friend->setAccepted($data["actif"] == 1);
$friend->setFollowing($data["abonnement"] == 1);
$friend->setLastActivityTime($data["last_activity"]);
2018-03-05 18:04:21 +00:00
$friend->setCanPostTexts($data["autoriser_post_page"] == 1);
2018-02-03 14:25:58 +00:00
return $friend;
}
2017-05-28 12:09:20 +00:00
}
//Register component
Components::register("friends", new friends());