266 lines
8.5 KiB
PHP
266 lines
8.5 KiB
PHP
<?php
|
|
namespace OCA\Gestion\Db;
|
|
|
|
use OCP\IDBConnection;
|
|
use \Datetime;
|
|
use OCA\Gestion\Constants\BddConstant;
|
|
use Ramsey\Uuid\Uuid;
|
|
|
|
class TalkDb {
|
|
private $talkTablePrefix;
|
|
|
|
private const DEVIS_TALK_ROOM_TYPE = 1;
|
|
private const DEVIS_TALK_ROOM_ACTOR_TYPE = "users";
|
|
private const DEVIS_TALK_ROOM_VERB_COMMENT = "comment";
|
|
private const DEVIS_TALK_ROOM_VERB_INITIAL_MESSAGE = "system";
|
|
private const DEVIS_TALK_ROOM_INITIAL_MESSAGE = '{"message":"conversation_created","parameters":[]}';
|
|
private const DEVIS_TALK_ROOM_DEFAULT_MESSAGE_TYPE = "chat";
|
|
private const DEVIS_TALK_ROOM_DEFAULT_PARTICIPANT_TYPE = 1;
|
|
private const DEVIS_TALK_NOTIFICATIONS_APP_NAME ="spreed";
|
|
|
|
private $defaultTablePrefix;
|
|
private IDbConnection $pdo;
|
|
|
|
public function __construct(IDbConnection $db) {
|
|
$this->talkTablePrefix = BddConstant::DEFAULT_TABLE_PREFIX ."talk_";
|
|
$this->defaultTablePrefix = BddConstant::DEFAULT_TABLE_PREFIX;
|
|
$this->pdo = $db;
|
|
}
|
|
|
|
private function execSQL($sql, $conditions){
|
|
$stmt = $this->pdo->prepare($sql);
|
|
$stmt->execute($conditions);
|
|
$data = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
|
$stmt->closeCursor();
|
|
return json_encode($data);
|
|
}
|
|
|
|
private function execSQLNoData($sql, $conditions){
|
|
$stmt = $this->pdo->prepare($sql);
|
|
$stmt->execute($conditions);
|
|
$stmt->closeCursor();
|
|
}
|
|
|
|
private function execSQLNoJsonReturn($sql, $conditions){
|
|
$stmt = $this->pdo->prepare($sql);
|
|
$stmt->execute($conditions);
|
|
$data = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
|
$stmt->closeCursor();
|
|
return $data;
|
|
}
|
|
|
|
private function getDevisTalkRoomByName($name){
|
|
$sql = "SELECT *
|
|
FROM ".$this->talkTablePrefix."rooms as room
|
|
WHERE room.name = ? ORDER BY room.id DESC LIMIT 1;";
|
|
|
|
$rooms = $this->execSQLNoJsonReturn(
|
|
$sql,
|
|
[$name]);
|
|
|
|
if(!empty($rooms)){
|
|
return $rooms[0];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private function createDevisTalkRoom($name,$token){
|
|
$dateTime = new Datetime();
|
|
$dateTime = $dateTime->format(('Y-m-d H:i:s'));
|
|
$sql = "INSERT INTO `".$this->talkTablePrefix."rooms` (
|
|
`name`,
|
|
`token`,
|
|
`type`,
|
|
`last_activity`) VALUES (?,?,?,?);";
|
|
$this->execSQLNoData($sql, array(
|
|
$name,
|
|
$token,
|
|
self::DEVIS_TALK_ROOM_TYPE,
|
|
$dateTime
|
|
));
|
|
return true;
|
|
}
|
|
|
|
private function createDevisTalkRoomAttendeesByActors($actors,$roomId){
|
|
foreach($actors as $actor){
|
|
$this->createDevisTalkRoomAttendees($actor,$roomId);
|
|
}
|
|
}
|
|
|
|
private function createDevisTalkRoomAttendees($idNextCloud,$roomId){
|
|
$sql = "INSERT INTO `".$this->talkTablePrefix."attendees` (
|
|
`room_id`,
|
|
`actor_type`,
|
|
`actor_id`,
|
|
`display_name`,
|
|
`participant_type`) VALUES (?,?,?,?,?);";
|
|
$this->execSQLNoData($sql, array(
|
|
$roomId,
|
|
self::DEVIS_TALK_ROOM_ACTOR_TYPE,
|
|
$idNextCloud,
|
|
$idNextCloud,
|
|
self::DEVIS_TALK_ROOM_DEFAULT_PARTICIPANT_TYPE
|
|
));
|
|
}
|
|
|
|
private function createDevisTalkRoomMessage($actorId,$message,$verb,$roomId,$reference = null){
|
|
$datetime = new DateTime();
|
|
$datetime = $datetime->format(('Y-m-d H:i:s'));
|
|
$sql = "INSERT INTO `".$this->defaultTablePrefix."comments` (
|
|
`actor_type`,
|
|
`actor_id`,
|
|
`message`,
|
|
`verb`,
|
|
`creation_timestamp`,
|
|
`object_type`,
|
|
`object_id`,
|
|
`reference_id`
|
|
) VALUES (?,?,?,?,?,?,?,?);";
|
|
$this->execSQLNoData($sql, array(
|
|
self::DEVIS_TALK_ROOM_ACTOR_TYPE,
|
|
$actorId,
|
|
$message,
|
|
$verb,
|
|
$datetime,
|
|
self::DEVIS_TALK_ROOM_DEFAULT_MESSAGE_TYPE,
|
|
$roomId,
|
|
$reference
|
|
));
|
|
}
|
|
|
|
private function getDevisTalkRoomMessageByRoomAndMessage($roomId,$message){
|
|
$sql = "SELECT *
|
|
FROM ".$this->defaultTablePrefix."comments as comment
|
|
WHERE comment.object_id = ? AND
|
|
comment.message = ?
|
|
ORDER BY comment.id DESC
|
|
LIMIT 1;";
|
|
|
|
$messages = $this->execSQLNoJsonReturn(
|
|
$sql,
|
|
[$roomId,$message]);
|
|
|
|
if(!empty($messages)){
|
|
return $messages[0];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public function getDevisTalkRoomByNames($names){
|
|
$sql = "SELECT *
|
|
FROM ".$this->talkTablePrefix."rooms as room
|
|
WHERE room.name = ? OR room.name = ? LIMIT 1;";
|
|
|
|
$rooms = $this->execSQLNoJsonReturn(
|
|
$sql,
|
|
[$names['createdByUser'],$names['createdByAdmin']]);
|
|
|
|
if(!empty($rooms)){
|
|
return $rooms[0];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public function createDevisTalkRoomAndReturnDevisTalkRoom($idNextCloud,$token){
|
|
$roomName = '["'.$idNextCloud.'","'.BddConstant::DEFAULT_ADMIN_APP_ID_NEXTCLOUD.'"]';
|
|
$this->createDevisTalkRoom($roomName,$token);
|
|
$room = $this->getDevisTalkRoomByName($roomName);
|
|
$attendees = [
|
|
$idNextCloud,
|
|
BddConstant::DEFAULT_ADMIN_APP_ID_NEXTCLOUD
|
|
];
|
|
$this->createDevisTalkRoomAttendeesByActors($attendees,$room['id']);
|
|
return $room;
|
|
}
|
|
public function setDevisTalkRoomInitialMessageAndReturnMessage($roomId,$idNextCloud){
|
|
$this->createDevisTalkRoomMessage(
|
|
$idNextCloud,
|
|
self::DEVIS_TALK_ROOM_INITIAL_MESSAGE,
|
|
self::DEVIS_TALK_ROOM_VERB_INITIAL_MESSAGE,
|
|
$roomId
|
|
);
|
|
|
|
$message = $this->getDevisTalkRoomMessageByRoomAndMessage($roomId,self::DEVIS_TALK_ROOM_INITIAL_MESSAGE);
|
|
return $message;
|
|
}
|
|
|
|
public function setAttendeeLastReadMessage($roomId,$messageId,$idNextCloud){
|
|
$sql = "UPDATE ".$this->talkTablePrefix."attendees as attendee
|
|
SET
|
|
attendee.last_read_message = ?
|
|
WHERE attendee.room_id = ? AND
|
|
attendee.actor_id = ?;";
|
|
$this->execSQLNoData(
|
|
$sql,
|
|
[$messageId,$roomId,$idNextCloud]);
|
|
}
|
|
|
|
public function createDevisTalkRoomMessageAndReturnMessage($roomId,$message){
|
|
$this->createDevisTalkRoomMessage(
|
|
BddConstant::DEFAULT_ADMIN_APP_ID_NEXTCLOUD,
|
|
$message,
|
|
self::DEVIS_TALK_ROOM_VERB_COMMENT,
|
|
$roomId,
|
|
Uuid::uuid4()->toString()
|
|
);
|
|
$message = $this->getDevisTalkRoomMessageByRoomAndMessage($roomId,$message);
|
|
return $message;
|
|
}
|
|
|
|
public function updateDevisTalkRoomLastActivity($roomId,$datetime){
|
|
$datetime = $datetime->format(('Y-m-d H:i:s'));
|
|
$sql = "UPDATE ".$this->talkTablePrefix."rooms as room
|
|
SET
|
|
room.last_activity = ?
|
|
WHERE room.id = ?;";
|
|
$this->execSQLNoData(
|
|
$sql,
|
|
[$datetime,$roomId]);
|
|
}
|
|
|
|
public function updateRoomLastMessage($roomId,$lastMessageId){
|
|
$sql = "UPDATE ".$this->talkTablePrefix."rooms as room
|
|
SET
|
|
room.last_message = ?
|
|
WHERE room.id = ?;";
|
|
$this->execSQLNoData(
|
|
$sql,
|
|
[$lastMessageId,$roomId]);
|
|
}
|
|
|
|
public function sendAttendeeNotifications($idNextCloud,$roomToken,$notificationsSubjectsParameters,$notificationsMessageParameters){
|
|
$datetimeNow = new DateTime();
|
|
$timestamp = $datetimeNow->getTimestamp();
|
|
$sql = "INSERT INTO `".$this->defaultTablePrefix."notifications` (
|
|
`app`,
|
|
`user`,
|
|
`timestamp`,
|
|
`object_type`,
|
|
`object_id`,
|
|
`subject`,
|
|
`subject_parameters`,
|
|
`message`,
|
|
`message_parameters`,
|
|
`link`,
|
|
`icon`,
|
|
`actions`
|
|
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?);";
|
|
|
|
$this->execSQLNoData($sql, array(
|
|
self::DEVIS_TALK_NOTIFICATIONS_APP_NAME,
|
|
$idNextCloud,
|
|
$timestamp,
|
|
'chat',
|
|
$roomToken,
|
|
'chat',
|
|
$notificationsSubjectsParameters,
|
|
'comment',
|
|
$notificationsMessageParameters,
|
|
'',
|
|
'',
|
|
'[]'
|
|
));
|
|
}
|
|
|
|
|
|
} |