28a3061516474655b351b8473d42e122b553cfdf
[rock.divinelegy.git] / Controllers / SimfileController.php
1 <?php
2
3 namespace Controllers;
4
5 use Controllers\IDivineController;
6 use Services\Http\IHttpResponse;
7 use Services\Uploads\IUploadManager;
8 use Services\IUserSession;
9 use Services\IZipParser;
10 use DataAccess\StepMania\ISimfileRepository;
11 use DataAccess\StepMania\IPackRepository;
12 use DataAccess\IFileRepository;
13 use Domain\Entities\StepMania\ISimfile;
14 use Domain\Entities\StepMania\IPack;
15
16 class SimfileController implements IDivineController
17 {
18 private $_simfileRepository;
19 private $_packRepository;
20 private $_fileRepository;
21 private $_response;
22 private $_uploadManager;
23 private $_userSession;
24 private $_zipParser;
25
26 public function __construct(
27 IHttpResponse $response,
28 IUploadManager $uploadManager,
29 ISimfileRepository $simfileRepository,
30 IPackRepository $packRepository,
31 IFileRepository $fileRepository,
32 IUserSession $userSession,
33 IZipParser $zipParser
34 ) {
35 $this->_response = $response;
36 $this->_uploadManager = $uploadManager;
37 $this->_simfileRepository = $simfileRepository;
38 $this->_packRepository = $packRepository;
39 $this->_fileRepository = $fileRepository;
40 $this->_userSession = $userSession;
41 $this->_zipParser = $zipParser;
42 }
43
44 public function indexAction() {
45 ;
46 }
47
48 // list simfiles
49 public function listAction()
50 {
51 /* @var $simfile Domain\Entities\StepMania\ISimfile */
52 $simfiles = $this->_simfileRepository->findAll();
53 $packs = $this->_packRepository->findAll();
54 $simfileArray = array();
55 $packArray = array();
56
57 foreach($simfiles as $simfile)
58 {
59 $simfileArray[] = $this->simfileToArray($simfile);
60 }
61
62 foreach($packs as $pack)
63 {
64 $packSimfiles = array();
65 foreach($pack->getSimfiles() as $simfile)
66 {
67 $packSimfiles[] = $this->simfileToArray($simfile);
68 }
69
70 $packArray[] = array(
71 'title'=> $pack->getTitle(),
72 'contributors' => $pack->getContributors(),
73 'simfiles' => $packSimfiles,
74 'banner' => $pack->getBanner() ? 'files/banner/' . $pack->getBanner()->getHash() : 'files/banner/default'
75 );
76 }
77
78 $returnArray = array('simfiles' => $simfileArray, 'packs' => $packArray);
79
80 $this->_response->setHeader('Content-Type', 'application/json')
81 ->setBody(json_encode($returnArray))
82 ->sendResponse();
83 }
84
85 public function uploadAction()
86 {
87 //TODO: Put directory in config ?
88 $files = $this->_uploadManager->setFilesDirectory('../files')
89 ->setDestination('StepMania/')
90 ->process();
91
92 foreach($files as $file)
93 {
94 $zipParser = $this->_zipParser;
95 $zipParser->parse($file);
96
97 //save the actual zip in the db
98 $this->_fileRepository->save($file);
99
100 if($zipParser->isPack())
101 {
102 //XXX: Tricky! pack() uses packbuilder and so returns a new pack each time.
103 //I tried to be clever and call pack() multiple times thinking I was getting the same
104 //object. Should I cache it in zipparser?
105 $pack = $zipParser->pack();
106 $packBanner = $pack->getBanner() ? $this->_fileRepository->save($pack->getBanner()) : null;
107 $this->_packRepository->save($pack);
108 }
109
110 foreach($zipParser->simfiles() as $simfile)
111 {
112 $banner = $simfile->getBanner() ? $this->_fileRepository->save($simfile->getBanner()) : null;
113 $simfileZip = $simfile->getSimfile() ? $this->_fileRepository->save($simfile->getSimfile()) : null;
114
115 if(isset($pack)) $simfile->addToPack($pack);
116 $this->_simfileRepository->save($simfile);
117 }
118 }
119 }
120
121 private function simfileToArray(ISimfile $simfile)
122 {
123 $singleSteps = array();
124 $doubleSteps = array();
125
126 foreach($simfile->getSteps() as $steps)
127 {
128 $stepDetails = array(
129 'artist' => $steps->getArtist()->getTag(),
130 'difficulty' => $steps->getDifficulty()->getITGName(),
131 'rating' => $steps->getRating()
132 );
133
134 if($steps->getMode()->getPrettyName() == 'Single')
135 {
136 $singleSteps[] = $stepDetails;
137 } else {
138 $doubleSteps[] = $stepDetails;
139 }
140 }
141
142 return array(
143 'title' => $simfile->getTitle(),
144 'artist' => $simfile->getArtist()->getName(),
145 'steps' => array(
146 'single' => $singleSteps,
147 'double' => $doubleSteps
148 ),
149 'bgChanges' => $simfile->hasBgChanges() ? 'Yes' : 'No',
150 'fgChanges' => $simfile->hasFgChanges() ? 'Yes' : 'No',
151 'bpmChanges' => $simfile->hasBPMChanges() ? 'Yes' : 'No',
152 'banner' => $simfile->getBanner() ? 'files/banner/' . $simfile->getBanner()->getHash() : 'files/banner/default'
153 );
154 }
155 }