mirror of
https://github.com/php/web-pecl.git
synced 2026-03-23 23:02:08 +01:00
Move Rest generator service to container and resolve circular reference
This commit is contained in:
@@ -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...";
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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'),
|
||||
];
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
15
src/Rest.php
15
src/Rest.php
@@ -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/';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user