Browse Source

Merge remote-tracking branch 'ikwattro/vdl-stats'

Jordi Boggiano 10 years ago
parent
commit
a13aeb31da

+ 56 - 0
src/Packagist/WebBundle/Controller/WebController.php

@@ -679,6 +679,62 @@ class WebController extends Controller
         return $data;
     }
 
+    /**
+     * @Template()
+     * @Route(
+     *     "/packages/{name}/downloads.{_format}",
+     *     name="package_downloads_full",
+     *     requirements={"name"="[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+?", "_format"="(json)"}
+     * )
+     * @Method({"GET"})
+     */
+    public function viewPackageDownloadsAction(Request $req, $name)
+    {
+        $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Package');
+
+        try {
+            /** @var $package Package */
+            $package = $repo->findOneByName($name);
+        } catch (NoResultException $e) {
+            if ('json' === $req->getRequestFormat()) {
+                return new JsonResponse(array('status' => 'error', 'message' => 'Package not found'), 404);
+            }
+
+            if ($providers = $repo->findProviders($name)) {
+                return $this->redirect($this->generateUrl('view_providers', array('name' => $name)));
+            }
+
+            return $this->redirect($this->generateUrl('search', array('q' => $name, 'reason' => 'package_not_found')));
+        }
+
+        $versions = $package->getVersions();
+        $data = array(
+            'name' => $package->getName(),
+        );
+
+        try {
+            $data['downloads']['global'] = $this->get('packagist.download_manager')->getDownloads($package);
+            $data['favers'] = $this->get('packagist.favorite_manager')->getFaverCount($package);
+        } catch (ConnectionException $e) {
+            $data['downloads']['global'] = null;
+            $data['favers'] = null;
+        }
+
+        foreach ($versions as $version) {
+            try {
+                $data['downloads']['versions'][$version->getVersion()] = $this->get('packagist.download_manager')->getVersionDownloads($package, $version);
+            } catch (ConnectionException $e) {
+                $data['downloads']['versions'][$version->getVersion()] = null;
+            }
+
+        }
+
+        $response = new Response(json_encode(array('package' => $data)), 200);
+        $response->setSharedMaxAge(3600);
+
+        return $response;
+    }
+
     /**
      * @Template()
      * @Route(

+ 34 - 0
src/Packagist/WebBundle/Model/DownloadManager.php

@@ -58,6 +58,40 @@ class DownloadManager
         return $result;
     }
 
+    /**
+     * Gets the total, monthly, and daily download counts for a package's version
+     *
+     * @param \Packagist\WebBundle\Entity\Package|int $package
+     * @param \Packagist\WebBundle\Entity\Version|int $version
+     * @return array
+     */
+    public function getVersionDownloads($package, $version)
+    {
+        if ($package instanceof Package) {
+            $package = $package->getId();
+        }
+
+        if ($version instanceof Version) {
+            $version = $version->getId();
+        }
+
+        $date = new \DateTime();
+        $keys = array('dl:'.$package.':'.$version);
+        for ($i = 0; $i < 30; $i++) {
+            $keys[] = 'dl:' . $package . ':' . $version . ':' . $date->format('Ymd');
+            $date->modify('-1 day');
+        }
+
+        $vals = $this->redis->mget($keys);
+        $result = array(
+            'total' => (int) array_shift($vals) ?: 0,
+            'monthly' => (int) array_sum($vals) ?: 0,
+            'daily' => (int) $vals[0] ?: 0,
+        );
+
+        return $result;
+    }
+
     /**
      * Gets the total download count for a package.
      *