2025-03-11 14:29:34 +03:00

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,
'',
'',
'[]'
));
}
}