From d822727b242741f58ad5b6cb9a8894e5f7dec283 Mon Sep 17 00:00:00 2001 From: Cameron Ball Date: Tue, 25 Nov 2014 17:00:18 +0800 Subject: [PATCH] Fixups for packs. Made the default banner not be in the database. --- Controllers/FileController.php | 12 ++++- Controllers/SimfileController.php | 85 +++++++++++++++++++----------- DataAccess/FileRepository.php | 15 +++++- DataAccess/IRepository.php | 1 + DataAccess/Queries/IQueryBuilder.php | 1 + DataAccess/Queries/QueryBuilder.php | 8 +++ DataAccess/StepMania/PackRepository.php | 9 ++++ DataAccess/StepMania/SimfileRepository.php | 14 ++++- DataAccess/UserRepository.php | 15 +++++- Domain/Entities/StepMania/Pack.php | 6 +-- Domain/VOs/StepMania/StepChart.php | 12 ++--- config/Routes.php | 8 +-- 12 files changed, 135 insertions(+), 51 deletions(-) diff --git a/Controllers/FileController.php b/Controllers/FileController.php index 444ee85..656a182 100644 --- a/Controllers/FileController.php +++ b/Controllers/FileController.php @@ -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)) diff --git a/Controllers/SimfileController.php b/Controllers/SimfileController.php index defa951..ecf04b2 100644 --- a/Controllers/SimfileController.php +++ b/Controllers/SimfileController.php @@ -49,44 +49,34 @@ class SimfileController implements IDivineController public function listAction() { /* @var $simfile Domain\Entities\StepMania\ISimfile */ - $simfiles = $this->_simfileRepository->findRange(1, 10); - $returnArray = array(); + $simfiles = $this->_simfileRepository->findAll(); + $packs = $this->_packRepository->findAll(); + $simfileArray = array(); + $packArray = array(); foreach($simfiles as $simfile) { - $singleSteps = array(); - $doubleSteps = array(); - - foreach($simfile->getSteps() as $steps) - { - $stepDetails = array( - 'artist' => $steps->getArtist()->getTag(), - 'difficulty' => $steps->getDifficulty()->getITGName(), - 'rating' => $steps->getRating() - ); - - if($steps->getMode()->getPrettyName() == 'Single') - { - $singleSteps[] = $stepDetails; - } else { - $doubleSteps[] = $stepDetails; - } + $simfileArray[] = $this->simfileToArray($simfile); + } + + foreach($packs as $pack) + { + $packSimfiles = array(); + foreach($pack->getSimfiles() as $simfile) + { + $packSimfiles[] = $this->simfileToArray($simfile); } - $returnArray[] = array( - 'title' => $simfile->getTitle(), - 'artist' => $simfile->getArtist()->getName(), - 'steps' => array( - 'single' => $singleSteps, - 'double' => $doubleSteps - ), - 'bgChanges' => $simfile->hasBgChanges() ? 'Yes' : 'No', - 'fgChanges' => $simfile->hasFgChanges() ? 'Yes' : 'No', - 'bpmChanges' => $simfile->hasBPMChanges() ? 'Yes' : 'No', - 'banner' => $simfile->getBanner() ? 'files/banner/' . $simfile->getBanner()->getHash() : 'files/banner/default' + $packArray[] = array( + 'title'=> $pack->getTitle(), + 'contributors' => $pack->getContributors(), + 'simfiles' => $packSimfiles, + 'banner' => $pack->getBanner() ? 'files/banner/' . $pack->getBanner()->getHash() : 'files/banner/default' ); } + $returnArray = array('simfiles' => $simfileArray, 'packs' => $packArray); + $this->_response->setHeader('Content-Type', 'application/json') ->setBody(json_encode($returnArray)) ->sendResponse(); @@ -127,4 +117,39 @@ class SimfileController implements IDivineController } } } + + private function simfileToArray(ISimfile $simfile) + { + $singleSteps = array(); + $doubleSteps = array(); + + foreach($simfile->getSteps() as $steps) + { + $stepDetails = array( + 'artist' => $steps->getArtist()->getTag(), + 'difficulty' => $steps->getDifficulty()->getITGName(), + 'rating' => $steps->getRating() + ); + + if($steps->getMode()->getPrettyName() == 'Single') + { + $singleSteps[] = $stepDetails; + } else { + $doubleSteps[] = $stepDetails; + } + } + + return array( + 'title' => $simfile->getTitle(), + 'artist' => $simfile->getArtist()->getName(), + 'steps' => array( + 'single' => $singleSteps, + 'double' => $doubleSteps + ), + 'bgChanges' => $simfile->hasBgChanges() ? 'Yes' : 'No', + 'fgChanges' => $simfile->hasFgChanges() ? 'Yes' : 'No', + 'bpmChanges' => $simfile->hasBPMChanges() ? 'Yes' : 'No', + 'banner' => $simfile->getBanner() ? 'files/banner/' . $simfile->getBanner()->getHash() : 'files/banner/default' + ); + } } diff --git a/DataAccess/FileRepository.php b/DataAccess/FileRepository.php index bba8703..74d44b3 100644 --- a/DataAccess/FileRepository.php +++ b/DataAccess/FileRepository.php @@ -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', diff --git a/DataAccess/IRepository.php b/DataAccess/IRepository.php index af3a435..e75fbc5 100644 --- a/DataAccess/IRepository.php +++ b/DataAccess/IRepository.php @@ -7,5 +7,6 @@ use Domain\Entities\IDivineEntity; interface IRepository { public function findById($id); + public function findAll(); public function findRange($id, $limit); } \ No newline at end of file diff --git a/DataAccess/Queries/IQueryBuilder.php b/DataAccess/Queries/IQueryBuilder.php index 777cf15..69df99b 100644 --- a/DataAccess/Queries/IQueryBuilder.php +++ b/DataAccess/Queries/IQueryBuilder.php @@ -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 diff --git a/DataAccess/Queries/QueryBuilder.php b/DataAccess/Queries/QueryBuilder.php index 5e95a8c..c093568 100644 --- a/DataAccess/Queries/QueryBuilder.php +++ b/DataAccess/Queries/QueryBuilder.php @@ -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; } } diff --git a/DataAccess/StepMania/PackRepository.php b/DataAccess/StepMania/PackRepository.php index 55fa97c..20b50eb 100644 --- a/DataAccess/StepMania/PackRepository.php +++ b/DataAccess/StepMania/PackRepository.php @@ -26,6 +26,15 @@ class PackRepository implements IPackRepository return reset($result); } + public function findAll() + { + $queryBuilder = $this->_queryBuilderFactory->createInstance(); + $queryBuilder->where('id', '>', 0); + + $result = $this->_dataMapper->map('Pack', $queryBuilder); + return $result; + } + public function findRange($id, $limit) { $queryBuilder = $this->_queryBuilderFactory->createInstance(); diff --git a/DataAccess/StepMania/SimfileRepository.php b/DataAccess/StepMania/SimfileRepository.php index 5803c21..3cbc015 100644 --- a/DataAccess/StepMania/SimfileRepository.php +++ b/DataAccess/StepMania/SimfileRepository.php @@ -22,16 +22,24 @@ class SimfileRepository implements ISimfileRepository public function findById($id) { $queryBuilder = $this->_queryBuilderFactory->createInstance(); - $queryBuilder->where('id', '=', $id); + $queryBuilder->where('id', '=', $id)->null('pack_id'); $result = $this->_dataMapper->map('Simfile', $queryBuilder); return reset($result); } + public function findAll() + { + $queryBuilder = $this->_queryBuilderFactory->createInstance(); + $queryBuilder->where('id', '>', 0)->null('pack_id'); + $result = $this->_dataMapper->map('Simfile', $queryBuilder); + return $result; + } + public function findRange($id, $limit) { $queryBuilder = $this->_queryBuilderFactory->createInstance(); - $queryBuilder->where('id', '>=', $id)->limit($limit); + $queryBuilder->where('id', '>=', $id)->null('pack_id')->limit($limit); return $this->_dataMapper->map('Simfile', $queryBuilder); } @@ -52,6 +60,8 @@ class SimfileRepository implements ISimfileRepository $constraints->applyTo($queryBuilder); } + $queryBuilder->null('pack_id'); + return $this->_dataMapper->map('Simfile', $queryBuilder); } diff --git a/DataAccess/UserRepository.php b/DataAccess/UserRepository.php index e4acdc3..0278dd7 100644 --- a/DataAccess/UserRepository.php +++ b/DataAccess/UserRepository.php @@ -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', diff --git a/Domain/Entities/StepMania/Pack.php b/Domain/Entities/StepMania/Pack.php index 6df8d8e..241b1f2 100644 --- a/Domain/Entities/StepMania/Pack.php +++ b/Domain/Entities/StepMania/Pack.php @@ -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; diff --git a/Domain/VOs/StepMania/StepChart.php b/Domain/VOs/StepMania/StepChart.php index a13dea4..b6a3e65 100644 --- a/Domain/VOs/StepMania/StepChart.php +++ b/Domain/VOs/StepMania/StepChart.php @@ -2,9 +2,9 @@ namespace Domain\VOs\StepMania; -use Domain\VOs\StepMania\DanceMode; -use Domain\VOs\StepMania\Difficulty; -use Domain\VOs\StepMania\StepArtist; +use Domain\VOs\StepMania\IDanceMode; +use Domain\VOs\StepMania\IDifficulty; +use Domain\VOs\StepMania\IStepArtist; class StepChart implements IStepChart { @@ -17,9 +17,9 @@ class StepChart implements IStepChart protected $artist; function __construct( - DanceMode $mode, - Difficulty $difficulty, - StepArtist $artist = null, + IDanceMode $mode, + IDifficulty $difficulty, + IStepArtist $artist = null, $rating ) { $this->mode = $mode; diff --git a/config/Routes.php b/config/Routes.php index de8cf4b..6c9f5e7 100644 --- a/config/Routes.php +++ b/config/Routes.php @@ -12,13 +12,7 @@ return [ 'controller' => 'Simfile', 'action' => 'upload' ], - - //XXX: Test, delete later - '/simfiles/pack' => [ - 'methods' => ['GET'], - 'controller' => 'PackTest', - ], - + '/simfiles/argTest/:testarg' => [ 'methods' => ['GET'], 'controller' => 'Simfile', -- 2.11.0