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
|
2018-03-11 09:57:01 +00:00
|
|
|
* @param int $friendID The ID of a specific friend (default -1)
|
2018-05-11 18:19:50 +00:00
|
|
|
* @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
|
|
|
*/
|
2018-05-11 18:19:50 +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";
|
2018-03-11 09:57:01 +00:00
|
|
|
$condition = "WHERE ID_personne = ? AND amis.ID_amis = utilisateurs.ID ";
|
2017-05-31 14:49:25 +00:00
|
|
|
$condValues = array($userID);
|
|
|
|
|
2018-03-11 09:57:01 +00:00
|
|
|
//Check if the request is targeting a specific friend
|
|
|
|
if($friendID != -1){
|
2018-05-11 18:19:50 +00:00
|
|
|
$condition .= " AND ID_amis = ? ";
|
2018-03-11 09:57:01 +00:00
|
|
|
$condValues[] = $friendID;
|
|
|
|
}
|
|
|
|
|
2018-05-11 18:19:50 +00:00
|
|
|
//Check if only accepted friendship must be selected
|
|
|
|
if($only_accepted){
|
|
|
|
$condition .= " AND actif = 1 ";
|
|
|
|
}
|
|
|
|
|
2018-03-11 09:57:01 +00:00
|
|
|
//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
|
|
|
|
|
|
|
/**
|
|
|
|
* 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;
|
|
|
|
}
|
2017-12-16 14:28:57 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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
|
2017-12-16 14:28:57 +00:00
|
|
|
* @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];
|
|
|
|
|
2017-12-16 14:28:57 +00:00
|
|
|
//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-16 14:28:57 +00:00
|
|
|
}
|
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;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-12-23 08:03:00 +00:00
|
|
|
/**
|
|
|
|
* 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
|
2017-12-23 08:03:00 +00:00
|
|
|
*/
|
|
|
|
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
|
|
|
|
|
|
|
/**
|
2017-12-21 17:55:20 +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;
|
|
|
|
}
|
2017-12-21 17:55:20 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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
|
2017-12-21 17:55:20 +00:00
|
|
|
* 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
|
2017-12-21 17:55:20 +00:00
|
|
|
*/
|
|
|
|
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-21 17:55:20 +00:00
|
|
|
|
2017-12-23 14:25:18 +00:00
|
|
|
//Perform the request
|
|
|
|
return CS::get()->db->updateDB($tableName, $conditions, $newValues, $conditionsValues);
|
2017-12-21 17:55:20 +00:00
|
|
|
}
|
2017-12-23 17:03:05 +00:00
|
|
|
|
2018-03-11 15:40:41 +00:00
|
|
|
/**
|
|
|
|
* 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);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-12-23 17:03:05 +00:00
|
|
|
/**
|
|
|
|
* 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;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-08-24 06:25:38 +00:00
|
|
|
/**
|
|
|
|
* 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());
|