You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.7 KiB
PHP
95 lines
2.7 KiB
PHP
<?php
|
|
|
|
|
|
namespace CubiStore\Web\Controller;
|
|
|
|
use CubiStore\Web\Service\ApkService;
|
|
use CubiStore\Web\Service\AppService;
|
|
use CubiStore\Web\Utils\Apk;
|
|
use Doctrine\ORM\EntityManager;
|
|
use Psr\Http\Message\ResponseInterface;
|
|
use Psr\Http\Message\UploadedFileInterface;
|
|
use Slim\Psr7\Request;
|
|
use Slim\Psr7\Response;
|
|
use Twig\Environment;
|
|
|
|
class AppManager
|
|
{
|
|
public function createShow(Environment $twig, ResponseInterface $response)
|
|
{
|
|
$response->getBody()->write($twig->render('app/create.html.twig'));
|
|
return $response;
|
|
}
|
|
|
|
public function createAction(Request $request, Response $response, ApkService $apkService, AppService $appService, EntityManager $em)
|
|
{
|
|
$files = $request->getUploadedFiles();
|
|
|
|
if (!isset($files['apk'])) {
|
|
return $response
|
|
->withStatus(302)
|
|
->withHeader('Location', '/app/create');
|
|
}
|
|
|
|
/** @var UploadedFileInterface $apkUpload */
|
|
$apkUpload = $files['apk'];
|
|
|
|
// Check if upload succeeded
|
|
if ($apkUpload->getError() !== UPLOAD_ERR_OK) {
|
|
return $response
|
|
->withStatus(302)
|
|
->withHeader('Location', '/app/create');
|
|
}
|
|
|
|
$tmp = tempnam(sys_get_temp_dir(), 'apk-');
|
|
|
|
if ($tmp === false) {
|
|
throw new \RuntimeException("Failed creating temp file");
|
|
}
|
|
|
|
$apkUpload->moveTo($tmp);
|
|
|
|
$apk = new Apk($tmp);
|
|
|
|
if (!$apk->isValid()) {
|
|
return $response
|
|
->withStatus(302)
|
|
->withHeader('Location', '/app/create');
|
|
}
|
|
|
|
if ($appService->hasApprovedApp($apk->getPackageName())) {
|
|
return $response
|
|
->withStatus(302)
|
|
->withHeader('Location', '/app/create');
|
|
}
|
|
|
|
$app = $appService->createApp($apk);
|
|
|
|
// Flush to get id, as it's used in getStorePath
|
|
$em->persist($app);
|
|
$em->flush();
|
|
|
|
$storePath = $appService->getStorePath($app, $apk);
|
|
if (!is_dir($storePath) && !mkdir($storePath, 0777, true)) {
|
|
return $response
|
|
->withStatus(302)
|
|
->withHeader('Location', '/app/create');
|
|
}
|
|
|
|
$newApkPath = $storePath . '/' . $apkUpload->getClientFilename();
|
|
if (!rename($tmp, $newApkPath)) {
|
|
return $response
|
|
->withStatus(302)
|
|
->withHeader('Location', '/app/create');
|
|
}
|
|
|
|
$release = $appService->createRelease($apk, $app, $newApkPath);
|
|
$em->persist($release);
|
|
$em->flush();
|
|
|
|
return $response
|
|
->withStatus(302)
|
|
->withHeader('Location', '/app/' . $app->getName() . '/' . $app->getId() . '/manage');
|
|
}
|
|
}
|