Fixups for packs. Made the default banner not be in the database.
authorCameron Ball <cameron@getapproved.com.au>
Tue, 25 Nov 2014 09:00:18 +0000 (17:00 +0800)
committerCameron Ball <cameron@getapproved.com.au>
Tue, 25 Nov 2014 09:00:18 +0000 (17:00 +0800)
12 files changed:
Controllers/FileController.php
Controllers/SimfileController.php
DataAccess/FileRepository.php
DataAccess/IRepository.php
DataAccess/Queries/IQueryBuilder.php
DataAccess/Queries/QueryBuilder.php
DataAccess/StepMania/PackRepository.php
DataAccess/StepMania/SimfileRepository.php
DataAccess/UserRepository.php
Domain/Entities/StepMania/Pack.php
Domain/VOs/StepMania/StepChart.php
config/Routes.php

index 444ee85..656a182 100644 (file)
@@ -30,6 +30,15 @@ class FileController implements IDivineController
     // list simfiles
     public function serveBannerAction($hash)
     {
+        if($hash == 'default')
+        {        
+            $file = '../files/banners/default.png';
+            $this->_response->setHeader('Content-Type', 'image/png')
+                            ->setHeader('Content-Length', filesize($file))
+                            ->setBody(file_get_contents($file))
+                            ->sendResponse();
+        }
+        
         $file = $this->_fileRepository->findByHash($hash);
         
         if(!$file)
@@ -40,8 +49,9 @@ class FileController implements IDivineController
             
             return;
         }
-        
+                
         $match = reset(glob('../files/' . $file->getPath() . '/' . $file->getHash() . '.*'));
+        
         $this->_response->setHeader('Content-Type', $file->getMimetype())
                         ->setHeader('Content-Length', $file->getSize())
                         ->setBody(file_get_contents($match))
index defa951..ecf04b2 100644 (file)
@@ -49,44 +49,34 @@ class SimfileController implements IDivineController
     public function listAction()\r
     {\r
         /* @var $simfile Domain\Entities\StepMania\ISimfile */\r
-        $simfiles = $this->_simfileRepository->findRange(1, 10);\r
-        $returnArray = array();\r
+        $simfiles = $this->_simfileRepository->findAll();\r
+        $packs = $this->_packRepository->findAll();\r
+        $simfileArray = array();\r
+        $packArray = array();\r
         \r
         foreach($simfiles as $simfile)\r
         {\r
-            $singleSteps = array();\r
-            $doubleSteps = array();\r
-            \r
-            foreach($simfile->getSteps() as $steps)\r
-            {   \r
-                $stepDetails = array(\r
-                    'artist' => $steps->getArtist()->getTag(),\r
-                    'difficulty' => $steps->getDifficulty()->getITGName(),\r
-                    'rating' => $steps->getRating()\r
-                );\r
-                \r
-                if($steps->getMode()->getPrettyName() == 'Single')\r
-                {\r
-                    $singleSteps[] = $stepDetails;\r
-                } else {\r
-                    $doubleSteps[] = $stepDetails;\r
-                }\r
+            $simfileArray[] = $this->simfileToArray($simfile);\r
+        }\r
+        \r
+        foreach($packs as $pack)\r
+        {\r
+            $packSimfiles = array();\r
+            foreach($pack->getSimfiles() as $simfile)\r
+            {\r
+                $packSimfiles[] = $this->simfileToArray($simfile);\r
             }\r
 \r
-            $returnArray[] = array(\r
-                'title' => $simfile->getTitle(),\r
-                'artist' => $simfile->getArtist()->getName(),\r
-                'steps' => array(\r
-                    'single' => $singleSteps,\r
-                    'double' => $doubleSteps\r
-                ),\r
-                'bgChanges' => $simfile->hasBgChanges() ? 'Yes' : 'No',\r
-                'fgChanges' => $simfile->hasFgChanges() ? 'Yes' : 'No',\r
-                'bpmChanges' => $simfile->hasBPMChanges() ? 'Yes' : 'No',\r
-                'banner' => $simfile->getBanner() ? 'files/banner/' . $simfile->getBanner()->getHash() : 'files/banner/default'\r
+            $packArray[] = array(\r
+                'title'=> $pack->getTitle(),\r
+                'contributors' => $pack->getContributors(),\r
+                'simfiles' => $packSimfiles,\r
+                'banner' => $pack->getBanner() ? 'files/banner/' . $pack->getBanner()->getHash() : 'files/banner/default'\r
             );\r
         }\r
         \r
+        $returnArray = array('simfiles' => $simfileArray, 'packs' => $packArray);\r
+        \r
         $this->_response->setHeader('Content-Type', 'application/json')\r
                         ->setBody(json_encode($returnArray))\r
                         ->sendResponse();\r
@@ -127,4 +117,39 @@ class SimfileController implements IDivineController
             }\r
         }\r
     }\r
+    \r
+    private function simfileToArray(ISimfile $simfile)\r
+    {\r
+        $singleSteps = array();\r
+        $doubleSteps = array();\r
+\r
+        foreach($simfile->getSteps() as $steps)\r
+        {   \r
+            $stepDetails = array(\r
+                'artist' => $steps->getArtist()->getTag(),\r
+                'difficulty' => $steps->getDifficulty()->getITGName(),\r
+                'rating' => $steps->getRating()\r
+            );\r
+\r
+            if($steps->getMode()->getPrettyName() == 'Single')\r
+            {\r
+                $singleSteps[] = $stepDetails;\r
+            } else {\r
+                $doubleSteps[] = $stepDetails;\r
+            }\r
+        }\r
+\r
+        return array(\r
+            'title' => $simfile->getTitle(),\r
+            'artist' => $simfile->getArtist()->getName(),\r
+            'steps' => array(\r
+                'single' => $singleSteps,\r
+                'double' => $doubleSteps\r
+            ),\r
+            'bgChanges' => $simfile->hasBgChanges() ? 'Yes' : 'No',\r
+            'fgChanges' => $simfile->hasFgChanges() ? 'Yes' : 'No',\r
+            'bpmChanges' => $simfile->hasBPMChanges() ? 'Yes' : 'No',\r
+            'banner' => $simfile->getBanner() ? 'files/banner/' . $simfile->getBanner()->getHash() : 'files/banner/default'\r
+        );\r
+    }\r
 }\r
index bba8703..74d44b3 100644 (file)
@@ -18,7 +18,20 @@ class FileRepository implements IFileRepository
     
     public function findById($id) {
         $queryBuilder = $this->_queryBuilderFactory->createInstance();
-        $queryBuilder->where('id', '=', "$id");
+        $queryBuilder->where('id', '=', $id);
+        
+        $results = $this->_dataMapper->map(
+            'File',
+            $queryBuilder
+        );
+        
+        return reset($results);
+    }
+    
+    public function findAll()
+    {
+        $queryBuilder = $this->_queryBuilderFactory->createInstance();
+        $queryBuilder->where('id', '>', 0);
         
         return $this->_dataMapper->map(
             'File',
index af3a435..e75fbc5 100644 (file)
@@ -7,5 +7,6 @@ use Domain\Entities\IDivineEntity;
 interface IRepository\r
 {\r
     public function findById($id);\r
+    public function findAll();\r
     public function findRange($id, $limit);\r
 }
\ No newline at end of file
index 777cf15..69df99b 100644 (file)
@@ -14,5 +14,6 @@ interface IQueryBuilder
     public function limit($start, $end);
     public function where($column, $operator, $value);
     public function join($type, $tableA, $columnA, $tableB, $columnB);
+    public function null($columnName);
     public function buildQuery();
 }
\ No newline at end of file
index 5e95a8c..c093568 100644 (file)
@@ -51,6 +51,11 @@ class QueryBuilder implements IQueryBuilder
         return $this;
     }
     
+    public function null($columnName)
+    {
+        return $this->where($columnName, 'is', null);
+    }
+    
     private function applyJoinClauses()
     {
         foreach($this->_joinClauses as $joinClause)
@@ -75,6 +80,9 @@ class QueryBuilder implements IQueryBuilder
                 case 'string':
                     $this->_queryString .= sprintf("%s %s '%s'", $columnName, $columnValue['operator'], $columnValue['value']) . ' AND ';
                     break;
+                case 'NULL':
+                    $this->_queryString .= sprintf("%s is null", $columnName) . ' AND ';
+                    break;
             }
             
         }
index 55fa97c..20b50eb 100644 (file)
@@ -26,6 +26,15 @@ class PackRepository implements IPackRepository
         return reset($result);\r
     }\r
     \r
+    public function findAll()\r
+    {\r
+        $queryBuilder = $this->_queryBuilderFactory->createInstance();\r
+        $queryBuilder->where('id', '>', 0);\r
+        \r
+        $result = $this->_dataMapper->map('Pack', $queryBuilder);\r
+        return $result;\r
+    }\r
+    \r
     public function findRange($id, $limit)\r
     {\r
         $queryBuilder = $this->_queryBuilderFactory->createInstance();\r
index 5803c21..3cbc015 100644 (file)
@@ -22,16 +22,24 @@ class SimfileRepository implements ISimfileRepository
     \r
     public function findById($id) {\r
         $queryBuilder = $this->_queryBuilderFactory->createInstance();\r
-        $queryBuilder->where('id', '=', $id);\r
+        $queryBuilder->where('id', '=', $id)->null('pack_id');\r
              \r
         $result = $this->_dataMapper->map('Simfile', $queryBuilder);\r
         return reset($result);\r
     }\r
     \r
+    public function findAll()\r
+    {\r
+        $queryBuilder = $this->_queryBuilderFactory->createInstance();\r
+        $queryBuilder->where('id', '>', 0)->null('pack_id');\r
+        $result = $this->_dataMapper->map('Simfile', $queryBuilder);\r
+        return $result;\r
+    }\r
+    \r
     public function findRange($id, $limit)\r
     {\r
         $queryBuilder = $this->_queryBuilderFactory->createInstance();\r
-        $queryBuilder->where('id', '>=', $id)->limit($limit);\r
+        $queryBuilder->where('id', '>=', $id)->null('pack_id')->limit($limit);\r
                 \r
         return $this->_dataMapper->map('Simfile', $queryBuilder);\r
     }\r
@@ -52,6 +60,8 @@ class SimfileRepository implements ISimfileRepository
             $constraints->applyTo($queryBuilder);\r
         }\r
         \r
+        $queryBuilder->null('pack_id');\r
+        \r
         return $this->_dataMapper->map('Simfile', $queryBuilder);\r
     }\r
     \r
index e4acdc3..0278dd7 100644 (file)
@@ -25,7 +25,20 @@ class UserRepository implements IUserRepository
     
     public function findById($id) {
         $queryBuilder = $this->_queryBuilderFactory->createInstance();
-        $queryBuilder->where('id', '=', "$id");
+        $queryBuilder->where('id', '=', $id);
+        
+        $results = $this->_dataMapper->map(
+            'User',
+            $queryBuilder
+        );
+        
+        return reset($results);
+    }
+    
+    public function findAll()
+    {
+        $queryBuilder = $this->_queryBuilderFactory->createInstance();
+        $queryBuilder->where('id', '>', 0);
         
         return $this->_dataMapper->map(
             'User',
index 6df8d8e..241b1f2 100644 (file)
@@ -58,7 +58,7 @@ class Pack extends AbstractEntity implements IPack
     
     public function getSimfiles()
     {
-        return $this->_file;
+        return $this->_simfiles;
     }
     
     public function getTitle()
@@ -81,8 +81,8 @@ class Pack extends AbstractEntity implements IPack
         $artists = array();
         foreach($simfile->getSteps() as $steps)
         {
-            /* @var $steps \Domain\VOs\StepMania\IStepChart */
-            if(!in_array($steps->getArtist(), $artists)) $artists[] = $steps->getArtist ();
+            /* @var $steps \Domain\VOs\StepMania\StepChart */
+            if($steps->getArtist()->getTag() && !in_array($steps->getArtist()->getTag(), $artists)) $artists[] = $steps->getArtist()->getTag();
         }
         
         return $artists;
index a13dea4..b6a3e65 100644 (file)
@@ -2,9 +2,9 @@
 \r
 namespace Domain\VOs\StepMania;\r
 \r
-use Domain\VOs\StepMania\DanceMode;\r
-use Domain\VOs\StepMania\Difficulty;\r
-use Domain\VOs\StepMania\StepArtist;\r
+use Domain\VOs\StepMania\IDanceMode;\r
+use Domain\VOs\StepMania\IDifficulty;\r
+use Domain\VOs\StepMania\IStepArtist;\r
 \r
 class StepChart implements IStepChart\r
 {   \r
@@ -17,9 +17,9 @@ class StepChart implements IStepChart
     protected $artist;\r
             \r
     function __construct(\r
-        DanceMode $mode,\r
-        Difficulty $difficulty,\r
-        StepArtist $artist = null,\r
+        IDanceMode $mode,\r
+        IDifficulty $difficulty,\r
+        IStepArtist $artist = null,\r
         $rating\r
     ) {\r
         $this->mode = $mode;\r
index de8cf4b..6c9f5e7 100644 (file)
@@ -12,13 +12,7 @@ return [
         'controller' => 'Simfile',\r
         'action' => 'upload'\r
     ],\r
-    \r
-    //XXX: Test, delete later\r
-    '/simfiles/pack' => [\r
-        'methods' => ['GET'],\r
-        'controller' => 'PackTest',\r
-    ],\r
-        \r
+            \r
     '/simfiles/argTest/:testarg' => [\r
         'methods' => ['GET'],\r
         'controller' => 'Simfile',\r