From 7d84ec1e73595315d92c89693c528060c6615624 Mon Sep 17 00:00:00 2001
From: Olivier PEREZ <olivier@olivierperez.fr>
Date: Thu, 2 Apr 2015 23:23:34 +0200
Subject: [PATCH] Create SlotRepository + AbstractRepository

---
 app/classes/Framadate/FramaDB.php             | 31 ---------
 .../Repositories/AbstractRepository.php       | 33 +++++++++
 .../Framadate/Repositories/PollRepository.php | 69 ++++++-------------
 .../Repositories/RepositoryFactory.php        | 15 +++-
 .../Framadate/Repositories/SlotRepository.php | 67 ++++++++++++++++++
 .../Framadate/Services/PollService.php        | 54 +++++++--------
 6 files changed, 163 insertions(+), 106 deletions(-)
 create mode 100644 app/classes/Framadate/Repositories/AbstractRepository.php
 create mode 100644 app/classes/Framadate/Repositories/SlotRepository.php

diff --git a/app/classes/Framadate/FramaDB.php b/app/classes/Framadate/FramaDB.php
index 0cd44781..00a1b834 100644
--- a/app/classes/Framadate/FramaDB.php
+++ b/app/classes/Framadate/FramaDB.php
@@ -79,30 +79,6 @@ class FramaDB {
         return $this->pdo->query($sql);
     }
 
-    function findPollById($poll_id) {
-        $prepared = $this->prepare('SELECT * FROM `' . Utils::table('poll') . '` WHERE id = ?');
-
-        $prepared->execute(array($poll_id));
-        $poll = $prepared->fetch();
-        $prepared->closeCursor();
-
-        return $poll;
-    }
-
-    public function existsById($poll_id) {
-        $prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('poll') . '` WHERE id = ?');
-
-        $prepared->execute(array($poll_id));
-
-        return $prepared->rowCount() > 0;
-    }
-
-    function updatePoll($poll) {
-        $prepared = $this->prepare('UPDATE `' . Utils::table('poll') . '` SET title=?, admin_name=?, admin_mail=?, description=?, end_date=?, active=?, editable=? WHERE id = ?');
-
-        return $prepared->execute([$poll->title, $poll->admin_name, $poll->admin_mail, $poll->description, $poll->end_date, $poll->active, $poll->editable, $poll->id]);
-    }
-
     function allCommentsByPollId($poll_id) {
         $prepared = $this->prepare('SELECT * FROM `' . Utils::table('comment') . '` WHERE poll_id = ? ORDER BY id');
         $prepared->execute(array($poll_id));
@@ -117,13 +93,6 @@ class FramaDB {
         return $prepared->fetchAll();
     }
 
-    function allSlotsByPollId($poll_id) {
-        $prepared = $this->prepare('SELECT * FROM `' . Utils::table('slot') . '` WHERE poll_id = ? ORDER BY title');
-        $prepared->execute(array($poll_id));
-
-        return $prepared->fetchAll();
-    }
-
     function insertDefaultVote($poll_id, $insert_position) {
         $prepared = $this->prepare('UPDATE `' . Utils::table('vote') . '` SET choices = CONCAT(SUBSTRING(choices, 1, ?), "0", SUBSTRING(choices, ?)) WHERE poll_id = ?');
 
diff --git a/app/classes/Framadate/Repositories/AbstractRepository.php b/app/classes/Framadate/Repositories/AbstractRepository.php
new file mode 100644
index 00000000..35c03445
--- /dev/null
+++ b/app/classes/Framadate/Repositories/AbstractRepository.php
@@ -0,0 +1,33 @@
+<?php
+namespace Framadate\Repositories;
+
+use Framadate\FramaDB;
+
+abstract class AbstractRepository {
+
+    /**
+     * @var FramaDB
+     */
+    private $connect;
+
+    /**
+     * PollRepository constructor.
+     * @param FramaDB $connect
+     */
+    function __construct(FramaDB $connect) {
+        $this->connect = $connect;
+    }
+
+    public function beginTransaction() {
+        $this->connect->beginTransaction();
+    }
+
+    public function commit() {
+        $this->connect->commit();
+    }
+
+    public function prepare($sql) {
+        return $this->connect->prepare($sql);
+    }
+
+}
diff --git a/app/classes/Framadate/Repositories/PollRepository.php b/app/classes/Framadate/Repositories/PollRepository.php
index fecc4e31..041b3e7d 100644
--- a/app/classes/Framadate/Repositories/PollRepository.php
+++ b/app/classes/Framadate/Repositories/PollRepository.php
@@ -1,69 +1,44 @@
 <?php
 namespace Framadate\Repositories;
 
-use Framadate\FramaDB;
 use Framadate\Utils;
 
-class PollRepository {
+class PollRepository extends AbstractRepository {
 
-    /**
-     * @var FramaDB
-     */
-    private $connect;
-
-    /**
-     * PollRepository constructor.
-     * @param FramaDB $connect
-     */
-    function __construct($connect) {
-        $this->connect = $connect;
-    }
-
-    public function beginTransaction() {
-        $this->connect->beginTransaction();
-    }
-
-    public function commit() {
-        $this->connect->commit();
+    function __construct(FramaDB $connect) {
+        parent::__construct($connect);
     }
 
     public function insertPoll($poll_id, $admin_poll_id, $form) {
         $sql = 'INSERT INTO `' . Utils::table('poll') . '`
           (id, admin_id, title, description, admin_name, admin_mail, end_date, format, editable, receiveNewVotes, receiveNewComments)
           VALUES (?,?,?,?,?,?,FROM_UNIXTIME(?),?,?,?,?)';
-        $prepared = $this->connect->prepare($sql);
+        $prepared = $this->prepare($sql);
         $prepared->execute(array($poll_id, $admin_poll_id, $form->title, $form->description, $form->admin_name, $form->admin_mail, $form->end_date, $form->format, $form->editable, $form->receiveNewVotes, $form->receiveNewComments));
     }
 
-    /**
-     * @param int $poll_id
-     * @param array $choices
-     */
-    public function insertSlots($poll_id, $choices) {
-        $prepared = $this->connect->prepare('INSERT INTO ' . Utils::table('slot') . ' (poll_id, title, moments) VALUES (?, ?, ?)');
+    function findById($poll_id) {
+        $prepared = $this->prepare('SELECT * FROM `' . Utils::table('poll') . '` WHERE id = ?');
 
-        foreach ($choices as $choice) {
+        $prepared->execute(array($poll_id));
+        $poll = $prepared->fetch();
+        $prepared->closeCursor();
 
-            // We prepared the slots (joined by comas)
-            $joinedSlots = '';
-            $first = true;
-            foreach ($choice->getSlots() as $slot) {
-                if ($first) {
-                    $joinedSlots = $slot;
-                    $first = false;
-                } else {
-                    $joinedSlots .= ',' . $slot;
-                }
-            }
+        return $poll;
+    }
+
+    public function existsById($poll_id) {
+        $prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('poll') . '` WHERE id = ?');
+
+        $prepared->execute(array($poll_id));
+
+        return $prepared->rowCount() > 0;
+    }
 
-            // We execute the insertion
-            if (empty($joinedSlots)) {
-                $prepared->execute(array($poll_id, $choice->getName(), null));
-            } else {
-                $prepared->execute(array($poll_id, $choice->getName(), $joinedSlots));
-            }
+    function update($poll) {
+        $prepared = $this->prepare('UPDATE `' . Utils::table('poll') . '` SET title=?, admin_name=?, admin_mail=?, description=?, end_date=?, active=?, editable=? WHERE id = ?');
 
-        }
+        return $prepared->execute([$poll->title, $poll->admin_name, $poll->admin_mail, $poll->description, $poll->end_date, $poll->active, $poll->editable, $poll->id]);
     }
 
 }
diff --git a/app/classes/Framadate/Repositories/RepositoryFactory.php b/app/classes/Framadate/Repositories/RepositoryFactory.php
index f52ba8cb..2c0821b9 100644
--- a/app/classes/Framadate/Repositories/RepositoryFactory.php
+++ b/app/classes/Framadate/Repositories/RepositoryFactory.php
@@ -23,12 +23,14 @@ use Framadate\FramaDB;
 class RepositoryFactory {
 
     private static $connect;
+
     private static $pollRepository;
+    private static $slotRepository;
 
     /**
      * @param FramaDB $connect
      */
-    static function init($connect) {
+    static function init(FramaDB $connect) {
         self::$connect = $connect;
     }
 
@@ -43,4 +45,15 @@ class RepositoryFactory {
         return self::$pollRepository;
     }
 
+    /**
+     * @return SlotRepository The singleton of SlotRepository
+     */
+    static function slotRepository() {
+        if (self::$slotRepository == null) {
+            self::$slotRepository = new SlotRepository(self::$connect);
+        }
+
+        return self::$slotRepository;
+    }
+
 }
diff --git a/app/classes/Framadate/Repositories/SlotRepository.php b/app/classes/Framadate/Repositories/SlotRepository.php
new file mode 100644
index 00000000..b816a6ef
--- /dev/null
+++ b/app/classes/Framadate/Repositories/SlotRepository.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * This software is governed by the CeCILL-B license. If a copy of this license
+ * is not distributed with this file, you can obtain one at
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ *
+ * Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
+ * Authors of Framadate/OpenSondate: Framasoft (https://github.com/framasoft)
+ *
+ * =============================
+ *
+ * Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
+ * ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ *
+ * Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
+ * Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
+ */
+namespace Framadate\Repositories;
+
+class SlotRepository extends AbstractRepository {
+
+    function __construct(FramaDB $connect) {
+        parent::__construct($connect);
+    }
+
+    /**
+     * Insert a bulk of slots.
+     *
+     * @param int $poll_id
+     * @param array $choices
+     */
+    public function insertSlots($poll_id, $choices) {
+        $prepared = $this->prepare('INSERT INTO `' . Utils::table('slot') . '` (poll_id, title, moments) VALUES (?, ?, ?)');
+
+        foreach ($choices as $choice) {
+
+            // We prepared the slots (joined by comas)
+            $joinedSlots = '';
+            $first = true;
+            foreach ($choice->getSlots() as $slot) {
+                if ($first) {
+                    $joinedSlots = $slot;
+                    $first = false;
+                } else {
+                    $joinedSlots .= ',' . $slot;
+                }
+            }
+
+            // We execute the insertion
+            if (empty($joinedSlots)) {
+                $prepared->execute(array($poll_id, $choice->getName(), null));
+            } else {
+                $prepared->execute(array($poll_id, $choice->getName(), $joinedSlots));
+            }
+
+        }
+    }
+
+    function listByPollId($poll_id) {
+        $prepared = $this->prepare('SELECT * FROM `' . Utils::table('slot') . '` WHERE poll_id = ? ORDER BY title');
+        $prepared->execute(array($poll_id));
+
+        return $prepared->fetchAll();
+    }
+
+}
diff --git a/app/classes/Framadate/Services/PollService.php b/app/classes/Framadate/Services/PollService.php
index 7ff08206..a5301def 100644
--- a/app/classes/Framadate/Services/PollService.php
+++ b/app/classes/Framadate/Services/PollService.php
@@ -21,18 +21,19 @@ namespace Framadate\Services;
 use Framadate\Form;
 use Framadate\FramaDB;
 use Framadate\Repositories\RepositoryFactory;
-use Framadate\Utils;
 
 class PollService {
 
     private $connect;
     private $logService;
     private $pollRepository;
+    private $slotRepository;
 
     function __construct(FramaDB $connect, LogService $logService) {
         $this->connect = $connect;
         $this->logService = $logService;
         $this->pollRepository = RepositoryFactory::pollRepository();
+        $this->slotRepository = RepositoryFactory::slotRepository();
     }
 
     /**
@@ -43,7 +44,7 @@ class PollService {
      */
     function findById($poll_id) {
         if (preg_match('/^[\w\d]{16}$/i', $poll_id)) {
-            return $this->connect->findPollById($poll_id);
+            return $this->pollRepository->findById($poll_id);
         }
 
         return null;
@@ -58,7 +59,7 @@ class PollService {
     }
 
     function allSlotsByPollId($poll_id) {
-        return $this->connect->allSlotsByPollId($poll_id);
+        return $this->slotRepository->listByPollId($poll_id);
     }
 
     public function updateVote($poll_id, $vote_id, $name, $choices) {
@@ -82,6 +83,29 @@ class PollService {
         return $this->connect->countVotesByPollId($poll_id);
     }
 
+    /**
+     * @param Form $form
+     * @return string
+     */
+    function createPoll(Form $form) {
+
+        // Generate poll IDs, loop while poll ID already exists
+        do {
+            $poll_id = $this->random(16);
+        } while ($this->pollRepository->existsById($poll_id));
+        $admin_poll_id = $poll_id . $this->random(8);
+
+        // Insert poll + slots
+        $this->pollRepository->beginTransaction();
+        $this->pollRepository->insertPoll($poll_id, $admin_poll_id, $form);
+        $this->slotRepository->insertSlots($poll_id, $form->getChoices());
+        $this->pollRepository->commit();
+
+        $this->logService->log('CREATE_POLL', 'id:' . $poll_id . ', title: ' . $form->title . ', format:' . $form->format . ', admin:' . $form->admin_name . ', mail:' . $form->admin_mail);
+
+        return array($poll_id, $admin_poll_id);
+    }
+
     function computeBestChoices($votes) {
         $result = [];
         foreach ($votes as $vote) {
@@ -126,30 +150,6 @@ class PollService {
         return $splitted;
     }
 
-    /**
-     * @param Form $form
-     * @return string
-     */
-    function createPoll(Form $form) {
-
-        // Generate poll IDs, loop while poll ID already exists
-        do {
-            $poll_id = $this->random(16);
-        } while ($this->connect->existsById($poll_id));
-        $admin_poll_id = $poll_id . $this->random(8);
-
-        // Insert poll + slots
-        $this->pollRepository->beginTransaction();
-        $this->pollRepository->insertPoll($poll_id, $admin_poll_id, $form);
-        $this->pollRepository->insertSlots($poll_id, $form->getChoices());
-        $this->pollRepository->commit();
-
-        $this->logService->log('CREATE_POLL', 'id:' . $poll_id . ', title: ' . $form->title . ', format:' . $form->format . ', admin:' . $form->admin_name . ', mail:' . $form->admin_mail);
-
-
-        return array($poll_id, $admin_poll_id);
-    }
-
     private function random($car) {
         // TODO Better random ?
         $string = '';
-- 
GitLab