From dcb711dcccbe97d727a5bd62871baab77569f69e Mon Sep 17 00:00:00 2001 From: Olivier PEREZ Date: Mon, 29 Dec 2014 21:54:07 +0100 Subject: [PATCH] Implements purge methods --- app/classes/Framadate/FramaDB.php | 32 +++++++++++++++++-- .../Framadate/Services/AdminPollService.php | 11 ++++--- .../Framadate/Services/PollService.php | 3 +- .../Framadate/Services/PurgeService.php | 31 +++++++++++++++--- choix_autre.php | 5 +-- choix_date.php | 5 +-- 6 files changed, 69 insertions(+), 18 deletions(-) diff --git a/app/classes/Framadate/FramaDB.php b/app/classes/Framadate/FramaDB.php index b6864ab..2982cb9 100644 --- a/app/classes/Framadate/FramaDB.php +++ b/app/classes/Framadate/FramaDB.php @@ -33,6 +33,7 @@ class FramaDB { function areTablesCreated() { $result = $this->pdo->query('SHOW TABLES'); $schemas = $result->fetchAll(\PDO::FETCH_COLUMN); + return 0 != count(array_diff($schemas, ['comments', 'sondage', 'sujet_studs', 'user_studs'])); } @@ -83,23 +84,27 @@ class FramaDB { function allCommentsByPollId($poll_id) { $prepared = $this->prepare('SELECT * FROM comments WHERE id_sondage = ? ORDER BY id_comment'); $prepared->execute(array($poll_id)); + return $prepared->fetchAll(); } function allUserVotesByPollId($poll_id) { $prepared = $this->prepare('SELECT * FROM user_studs WHERE id_sondage = ? ORDER BY id_users'); $prepared->execute(array($poll_id)); + return $prepared->fetchAll(); } function allSlotsByPollId($poll_id) { $prepared = $this->prepare('SELECT * FROM sujet_studs WHERE id_sondage = ? ORDER BY sujet'); $prepared->execute(array($poll_id)); + return $prepared->fetchAll(); } function insertDefaultVote($poll_id, $insert_position) { $prepared = $this->prepare('UPDATE user_studs SET reponses = CONCAT(SUBSTRING(reponses, 1, ?), "0", SUBSTRING(reponses, ?)) WHERE id_sondage = ?'); + return $prepared->execute([$insert_position, $insert_position + 1, $poll_id]); } @@ -118,6 +123,7 @@ class FramaDB { function deleteVote($poll_id, $vote_id) { $prepared = $this->prepare('DELETE FROM user_studs WHERE id_sondage = ? AND id_users = ?'); + return $prepared->execute([$poll_id, $vote_id]); } @@ -129,6 +135,7 @@ class FramaDB { */ function deleteVotesByPollId($poll_id) { $prepared = $this->prepare('DELETE FROM user_studs WHERE id_sondage = ?'); + return $prepared->execute([$poll_id]); } @@ -141,6 +148,7 @@ class FramaDB { */ function deleteVotesByIndex($poll_id, $index) { $prepared = $this->prepare('UPDATE user_studs SET reponses = CONCAT(SUBSTR(reponses, 1, ?), SUBSTR(reponses, ?)) WHERE id_sondage = ?'); + return $prepared->execute([$index, $index + 2, $poll_id]); } @@ -170,6 +178,7 @@ class FramaDB { */ function insertSlot($poll_id, $slot) { $prepared = $this->prepare('INSERT INTO sujet_studs (id_sondage, sujet) VALUES (?,?)'); + return $prepared->execute([$poll_id, $slot]); } @@ -183,6 +192,7 @@ class FramaDB { */ function updateSlot($poll_id, $datetime, $newValue) { $prepared = $this->prepare('UPDATE sujet_studs SET sujet = ? WHERE id_sondage = ? AND SUBSTRING_INDEX(sujet, \'@\', 1) = ?'); + return $prepared->execute([$newValue, $poll_id, $datetime]); } @@ -199,7 +209,7 @@ class FramaDB { function deleteSlotsByPollId($poll_id) { $prepared = $this->prepare('DELETE FROM sujet_studs WHERE id_sondage = ?'); - $prepared->execute([$poll_id]); + return $prepared->execute([$poll_id]); } /** @@ -210,27 +220,43 @@ class FramaDB { */ function deleteCommentsByPollId($poll_id) { $prepared = $this->prepare('DELETE FROM comments WHERE id_sondage = ?'); + return $prepared->execute([$poll_id]); } function updateVote($poll_id, $vote_id, $choices) { $prepared = $this->prepare('UPDATE user_studs SET reponses = ? WHERE id_sondage = ? AND id_users = ?'); + return $prepared->execute([$choices, $poll_id, $vote_id]); } function insertComment($poll_id, $name, $comment) { $prepared = $this->prepare('INSERT INTO comments (id_sondage, usercomment, comment) VALUES (?,?,?)'); + return $prepared->execute([$poll_id, $name, $comment]); } function deleteComment($poll_id, $comment_id) { $prepared = $this->prepare('DELETE FROM comments WHERE id_sondage = ? AND id_comment = ?'); + return $prepared->execute([$poll_id, $comment_id]); } - function deleteByPollId($poll_id) { + function deletePollById($poll_id) { $prepared = $this->prepare('DELETE FROM sondage WHERE poll_id = ?'); - $prepared->execute([$poll_id]); + return $prepared->execute([$poll_id]); + } + + /** + * Find old polls. Limit: 20. + * + * @return array Array of old polls + */ + public function findOldPolls() { + $prepared = $this->prepare('SELECT * FROM sondage WHERE end_date < NOW() LIMIT 20'); + $prepared->execute([]); + + return $prepared->fetchAll(); } } diff --git a/app/classes/Framadate/Services/AdminPollService.php b/app/classes/Framadate/Services/AdminPollService.php index 4445ef6..b8c7fec 100644 --- a/app/classes/Framadate/Services/AdminPollService.php +++ b/app/classes/Framadate/Services/AdminPollService.php @@ -1,6 +1,7 @@ connect = $connect; $this->pollService = $pollService; $this->logService = $logService; @@ -64,7 +65,7 @@ class AdminPollService { * @return bool|null true is action succeeded */ function cleanVotes($poll_id) { - $this->logService->log("CLEAN_VOTES", "id:$poll_id"); + $this->logService->log('CLEAN_VOTES', 'id:' . $poll_id); return $this->connect->deleteVotesByPollId($poll_id); } @@ -76,13 +77,13 @@ class AdminPollService { */ function deleteEntirePoll($poll_id) { $poll = $this->connect->findPollById($poll_id); - $this->logService->log("DELETE_POLL", "id:$poll->poll_id, format:$poll->format, admin:$poll->admin_name, mail:$poll->admin_mail"); + $this->logService->log('DELETE_POLL', "id:$poll->poll_id, format:$poll->format, admin:$poll->admin_name, mail:$poll->admin_mail"); // Delete the entire poll $this->connect->deleteVotesByPollId($poll_id); $this->connect->deleteCommentsByPollId($poll_id); $this->connect->deleteSlotsByPollId($poll_id); - $this->connect->deleteByPollId($poll_id); + $this->connect->deletePollById($poll_id); return true; } @@ -95,7 +96,7 @@ class AdminPollService { * @return bool true if action succeeded */ public function deleteSlot($poll_id, $slot) { - $this->logService->log("DELETE_SLOT", "id:$poll_id, slot:" . json_encode($slot)); + $this->logService->log('DELETE_SLOT', 'id:' . $poll_id . ', slot:' . json_encode($slot)); $ex = explode('@', $slot); $datetime = $ex[0]; $moment = $ex[1]; diff --git a/app/classes/Framadate/Services/PollService.php b/app/classes/Framadate/Services/PollService.php index 47407f3..8ac6fff 100644 --- a/app/classes/Framadate/Services/PollService.php +++ b/app/classes/Framadate/Services/PollService.php @@ -133,6 +133,7 @@ class PollService { // Insert poll + slots $this->connect->beginTransaction(); + // TODO Extract this to FramaDB (or repository layer) $sql = 'INSERT INTO sondage (poll_id, admin_poll_id, title, comment, admin_name, admin_mail, end_date, format, editable, receiveNewVotes) VALUES (?,?,?,?,?,?,FROM_UNIXTIME(?),?,?,?)'; @@ -166,7 +167,7 @@ class PollService { $this->connect->commit(); - $this->logService->log('CREATE_POLL', ' id:' . $poll_id . ', format:' . $form->format . ', admin:' . $form->admin_name . ', mail:' . $form->admin_mail); + $this->logService->log('CREATE_POLL', 'id:' . $poll_id . 'title: ' . $form->title . ', format:' . $form->format . ', admin:' . $form->admin_name . ', mail:' . $form->admin_mail); return [$poll_id, $admin_poll_id]; diff --git a/app/classes/Framadate/Services/PurgeService.php b/app/classes/Framadate/Services/PurgeService.php index bf7d85b..f1d73d8 100644 --- a/app/classes/Framadate/Services/PurgeService.php +++ b/app/classes/Framadate/Services/PurgeService.php @@ -3,16 +3,18 @@ namespace Framadate\Services; use Framadate\FramaDB; /** - * This service helps to purge old poll. + * This service helps to purge data. * * @package Framadate\Services */ class PurgeService { private $connect; + private $logService; - function __construct(FramaDB $connect) { + function __construct(FramaDB $connect, LogService $logService) { $this->connect = $connect; + $this->logService = $logService; } /** @@ -21,7 +23,21 @@ class PurgeService { * @return bool true is action succeeded */ function purgeOldPolls() { - // TODO Implements + $oldPolls = $this->connect->findOldPolls(); + $count = count($oldPolls); + + if ($count > 0) { + $this->logService->log('EXPIRATION', 'Going to purge ' . $count . ' poll(s)...'); + + foreach ($oldPolls as $poll) { + if ($this->purgePollById($poll->poll_id)) { + $this->logService->log('EXPIRATION_SUCCESS', 'id: ' . $poll->poll_id . ', title:' . $poll->title . ', format: '.$poll->format . ', admin: ' . $poll->admin_name); + } else { + $this->logService->log('EXPIRATION_FAILED', 'id: ' . $poll->poll_id . ', title:' . $poll->title . ', format: '.$poll->format . ', admin: ' . $poll->admin_name); + } + } + } + return false; } @@ -32,8 +48,13 @@ class PurgeService { * @return bool true is action succeeded */ function purgePollById($poll_id) { - // TODO Implements - return false; + $done = false; + $done |= $this->connect->deleteCommentsByPollId($poll_id); + $done |= $this->connect->deleteVotesByPollId($poll_id); + $done |= $this->connect->deleteSlotsByPollId($poll_id); + $done |= $this->connect->deletePollById($poll_id); + + return $done; } } diff --git a/choix_autre.php b/choix_autre.php index d66c264..da3c4bc 100644 --- a/choix_autre.php +++ b/choix_autre.php @@ -19,6 +19,7 @@ use Framadate\Services\LogService; use Framadate\Services\PollService; use Framadate\Services\MailService; +use Framadate\Services\PurgeService; use Framadate\Utils; use Framadate\Choice; @@ -29,6 +30,7 @@ include_once __DIR__ . '/app/inc/init.php'; $logService = new LogService(LOG_FILE); $pollService = new PollService($connect, $logService); $mailService = new MailService($config['use_smtp']); +$purgeService = new PurgeService($connect, $logService); if (file_exists('bandeaux_local.php')) { include_once('bandeaux_local.php'); @@ -95,8 +97,7 @@ if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || ( unset($_SESSION['form']); // Delete old polls - // TODO Create a PurgeService - Utils::cleaningOldPolls($connect, 'admin/logs_studs.txt'); + $purgeService->purgeOldPolls(); // Redirect to poll administration header('Location:' . Utils::getUrlSondage($admin_poll_id, true)); diff --git a/choix_date.php b/choix_date.php index 5a28339..623f5a5 100644 --- a/choix_date.php +++ b/choix_date.php @@ -19,6 +19,7 @@ use Framadate\Services\LogService; use Framadate\Services\PollService; use Framadate\Services\MailService; +use Framadate\Services\PurgeService; use Framadate\Utils; use Framadate\Choice; @@ -29,6 +30,7 @@ include_once __DIR__ . '/app/inc/init.php'; $logService = new LogService(LOG_FILE); $pollService = new PollService($connect, $logService); $mailService = new MailService($config['use_smtp']); +$purgeService = new PurgeService($connect, $logService); if (is_readable('bandeaux_local.php')) { include_once('bandeaux_local.php'); @@ -103,8 +105,7 @@ if (!isset($_SESSION['form']->title) || !isset($_SESSION['form']->admin_name) || unset($_SESSION['form']); // Delete old polls - // TODO Create a PurgeService - Utils::cleaningOldPolls($connect, 'admin/logs_studs.txt'); + $purgeService->purgeOldPolls(); // Redirect to poll administration header('Location:' . Utils::getUrlSondage($admin_poll_id, true));