Move Rest generator service to container and resolve circular reference

This commit is contained in:
Peter Kokot
2019-01-25 22:18:39 +01:00
parent 56b7032cbb
commit e98cb34ebc
6 changed files with 156 additions and 28 deletions

View File

@@ -23,6 +23,7 @@
* Generate static REST files for PECL from existing data
*/
use App\Rest;
use App\Utils\Extractor;
use App\Utils\Filesystem;
use App\Repository\CategoryRepository;
@@ -34,6 +35,8 @@ use \PEAR_PackageFile as PEAR_PackageFile;
require_once __DIR__.'/../include/bootstrap.php';
$rest = $container->get(Rest::class);
$container->get(Filesystem::class)->delete($config->get('rest_dir'));
mkdir($config->get('rest_dir'), 0777, true);
@@ -69,14 +72,16 @@ $rest->saveAllPackages();
$pearConfig = PEAR_Config::singleton();
$pkg = new PEAR_PackageFile($pearConfig);
foreach ($container->get(PackageRepository::class)->listAll() as $package => $info) {
$packageRepository = $container->get(PackageRepository::class);
foreach ($packageRepository->listAll() as $package => $info) {
echo " $package\n";
$rest->savePackage($package);
echo " Maintainers...";
$rest->savePackageMaintainer($package);
echo "...done\n";
$releases = $packageEntity->info($package, 'releases');
$releases = $packageRepository->find($package, 'releases');
if ($releases) {
echo " Processing All Releases...";

View File

@@ -119,4 +119,17 @@ $container->set(App\Karma::class, function ($c) {
return new App\Karma($c->get(App\Database::class));
});
$container->set(App\Rest::class, function ($c) {
$rest = new App\Rest($c->get(App\Database::class), $c->get(App\Utils\Filesystem::class));
$rest->setDirectory($c->get('rest_dir'));
$rest->setScheme($c->get('scheme'));
$rest->setHost($c->get('host'));
$rest->setCategoryRepository($c->get(App\Repository\CategoryRepository::class));
$rest->setPackageRepository($c->get(App\Repository\PackageRepository::class));
$rest->setUserRepository($c->get(App\Repository\UserRepository::class));
return $rest;
});
return $container;

View File

@@ -30,4 +30,5 @@ return [
'scheme' => $config->get('scheme'),
'host' => $config->get('host'),
'tmp_dir' => $config->get('tmp_dir'),
'rest_dir' => $config->get('rest_dir'),
];

View File

@@ -35,11 +35,7 @@ use App\Config;
use App\Database;
use App\Rest;
use App\Entity\Package;
use App\Repository\CategoryRepository;
use App\Repository\PackageRepository;
use App\Repository\UserRepository;
use App\Template\Engine;
use App\Utils\Filesystem;
use Symfony\Component\Dotenv\Dotenv;
// Dual autoloader until PSR-4 and Composer's autoloader are fully supported.
@@ -103,20 +99,12 @@ $container = require_once __DIR__.'/../config/container.php';
// Database access with PDO enabled endpoints
$database = $container->get(Database::class);
$rest = new Rest($database, $container->get(Filesystem::class));
$rest->setDirectory($config->get('rest_dir'));
$rest->setScheme($config->get('scheme'));
$rest->setHost($config->get('host'));
$rest->setCategoryRepository($container->get(CategoryRepository::class));
$rest->setPackageRepository($container->get(PackageRepository::class));
$rest->setUserRepository($container->get(UserRepository::class));
// Rest XML generator service
$rest = $container->get(Rest::class);
$packageEntity = new Package();
$packageEntity->setDatabase($database);
$packageEntity->setRest($rest);
// Inject package entity dependency to REST generator
$rest->setPackage($packageEntity);
// Initialize template engine
$template = $container->get(Engine::class);

View File

@@ -264,4 +264,134 @@ class PackageRepository
return $this->database->run($sql, [$packageName])->fetchAll();
}
/**
* Get package information. Implemented $field values:
* releases, notes, category, description, authors, categoryid, packageid,
* authors.
*
* @param mixed Name of the package or it's ID
* @param string Single field to fetch
* @return mixed
*/
public function find($pkg, $field = null)
{
if (is_numeric($pkg)) {
$what = "id";
} else {
$what = "name";
}
$package_type = "p.package_type = 'pecl' AND ";
$pkg_sql = "SELECT p.id AS packageid, p.name AS name, ".
"p.package_type AS type, ".
"c.id AS categoryid, c.name AS category, ".
"p.stablerelease AS stable, p.license AS license, ".
"p.summary AS summary, p.homepage AS homepage, ".
"p.description AS description, p.cvs_link AS cvs_link, ".
"p.doc_link as doc_link, ".
"p.bug_link as bug_link, ".
"p.unmaintained as unmaintained, ".
"p.newpackagename as new_package, ".
"p.newchannel as new_channel".
" FROM packages p, categories c ".
"WHERE " . $package_type . " c.id = p.category AND p.{$what} = ?";
$rel_sql = "SELECT version, id, doneby, license, summary, ".
"description, releasedate, releasenotes, state " .
"FROM releases ".
"WHERE package = ? ".
"ORDER BY releasedate DESC";
$notes_sql = "SELECT id, nby, ntime, note FROM notes WHERE pid = ?";
$deps_sql = "SELECT type, relation, version, `name`, `release`, optional
FROM deps
WHERE `package` = ? ORDER BY `optional` ASC";
if ($field === null) {
$info = $this->database->run($pkg_sql, [$pkg])->fetch();
$info['releases'] = $this->database->run($rel_sql, [$info['packageid']])->fetchAll();
$results = [];
foreach ($info['releases'] as $item) {
$results[$item['version']] = $item;
}
$info['releases'] = $results;
$rels = count($info['releases']) ? array_keys($info['releases']) : [''];
$info['stable'] = $rels[0];
$info['notes'] = $this->database->run($notes_sql, [@$info['packageid']])->fetchAll();
$results = [];
foreach ($info['notes'] as $item) {
$results[$item['id']] = $item;
}
$info['notes'] = $results;
$deps = $this->database->run($deps_sql, [@$info['packageid']])->fetchAll();
foreach($deps as $dep) {
$rel_version = null;
foreach($info['releases'] as $version => $rel) {
if ($rel['id'] == $dep['release']) {
$rel_version = $version;
break;
}
}
if ($rel_version !== null) {
unset($dep['release']);
$info['releases'][$rel_version]['deps'][] = $dep;
}
}
} elseif (in_array($field, ['releases', 'notes'])) {
if ($what == "name") {
$pid = $this->database->run("SELECT p.id FROM packages p ".
"WHERE " . $package_type . " p.name = ?", [$pkg])->fetch()['id'];
} else {
$pid = $pkg;
}
if ($field == 'releases') {
$info = $this->database->run($rel_sql, [$pid])->fetchAll();
$results = [];
foreach ($info as $item) {
$results[$item['version']] = $item;
}
$info = $results;
} elseif ($field == 'notes') {
$info = $this->database->run($notes_sql, [$pid])->fetchAll();
$results = [];
foreach ($info as $item) {
$results[$item['id']] = $item;
}
$info = $results;
}
} elseif ($field === 'category') {
$sql = "SELECT c.name FROM categories c, packages p ".
"WHERE c.id = p.category AND " . $package_type . " p.{$what} = ?";
$info = $this->database->run($sql, [$pkg])->fetch()['name'];
} elseif ($field === 'description') {
$sql = "SELECT description FROM packages p WHERE " . $package_type . " p.{$what} = ?";
$info = $this->database->run($sql, [$pkg])->fetch()['description'];
} elseif ($field === 'authors') {
$sql = "SELECT u.handle, u.name, u.email, u.showemail, m.active, m.role
FROM maintains m, users u, packages p
WHERE " . $package_type ." m.package = p.id
AND p.$what = ?
AND m.handle = u.handle";
$info = $this->database->run($sql, [$pkg])->fetchAll();
} else {
if ($field == 'categoryid') {
$dbfield = 'category';
} elseif ($field == 'packageid') {
$dbfield = 'id';
} else {
$dbfield = $field;
}
$sql = "SELECT $dbfield FROM packages p WHERE " . $package_type ." p.{$what} = ?";
$info = $this->database->run($sql, [$pkg])->fetch()[$dbfield];
}
return $info;
}
}

View File

@@ -43,7 +43,6 @@ class Rest
private $categoryRepository;
private $packageRepository;
private $userRepository;
private $package;
/**
* Class constructor with injected dependencies.
@@ -102,14 +101,6 @@ class Rest
$this->userRepository = $userRepository;
}
/**
* Set package entity.
*/
public function setPackage(Package $package)
{
$this->package = $package;
}
/**
* Regenerate all categories info.
*/
@@ -347,7 +338,7 @@ class Rest
public function savePackage($package)
{
$extra = '/rest/';
$package = $this->package->info($package);
$package = $this->packageRepository->find($package);
$pdir = $this->dir.'/p';
@@ -435,7 +426,7 @@ class Rest
public function saveAllReleases($package)
{
$extra = '/rest/';
$pid = $this->package->info($package, 'id');
$pid = $this->packageRepository->find($package, 'id');
$releases = $this->database->run('SELECT * FROM releases WHERE package = ? ORDER BY releasedate DESC', [$pid])->fetchAll();
$rdir = $this->dir.'/r';
@@ -632,7 +623,7 @@ class Rest
*/
public function savePackageMaintainer($package)
{
$pid = $this->package->info($package, 'id');
$pid = $this->packageRepository->find($package, 'id');
$maintainers = $this->userRepository->findMaintainersByPackageId($pid);
$extra = '/rest/';