From 2cc0a12b3e52f164d192185757ea5d6904685231 Mon Sep 17 00:00:00 2001 From: Vladimir Tsykun Date: Wed, 13 Nov 2019 01:42:49 +0300 Subject: [PATCH] Fix not working api examples. - support token and basic authentication in packages api --- app/config/security.yml | 2 +- .../WebBundle/Controller/ApiDocController.php | 19 +++- .../Resources/views/ApiDoc/index.html.twig | 95 +++---------------- 3 files changed, 30 insertions(+), 86 deletions(-) diff --git a/app/config/security.yml b/app/config/security.yml index 613066de..ac9c6bd2 100644 --- a/app/config/security.yml +++ b/app/config/security.yml @@ -11,7 +11,7 @@ security: firewalls: packages: - pattern: (^(/packages.json$|/p/|/zipball/|/feeds/.+(\.rss|\.atom)|/downloads/|/api/))+ + pattern: (^(/packages.json$|/p/|/zipball/|/feeds/.+(\.rss|\.atom)|/packages/[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+?\.json|/packages/list\.json|/downloads/|/api/))+ api_basic: true main: diff --git a/src/Packagist/WebBundle/Controller/ApiDocController.php b/src/Packagist/WebBundle/Controller/ApiDocController.php index 9c39090c..86b113b9 100644 --- a/src/Packagist/WebBundle/Controller/ApiDocController.php +++ b/src/Packagist/WebBundle/Controller/ApiDocController.php @@ -12,6 +12,7 @@ namespace Packagist\WebBundle\Controller; +use Packagist\WebBundle\Entity\Version; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; @@ -26,6 +27,22 @@ class ApiDocController extends Controller */ public function indexAction() { - return array(); + $qb = $this->getDoctrine()->getRepository(Version::class) + ->createQueryBuilder('v'); + + $qb->select(['v.name']) + ->groupBy('v.name') + ->orderBy('COUNT(v.id)', 'DESC') + ->setMaxResults(1); + + try { + $examplePackage = $qb->getQuery()->getSingleScalarResult(); + } catch (\Exception $exception) { + $examplePackage = 'monolog/monolog'; + } + + return [ + 'examplePackage' => $examplePackage + ]; } } diff --git a/src/Packagist/WebBundle/Resources/views/ApiDoc/index.html.twig b/src/Packagist/WebBundle/Resources/views/ApiDoc/index.html.twig index 3c898908..373e9ebc 100644 --- a/src/Packagist/WebBundle/Resources/views/ApiDoc/index.html.twig +++ b/src/Packagist/WebBundle/Resources/views/ApiDoc/index.html.twig @@ -20,13 +20,13 @@
  • {{ 'api_doc.get_package_data'|trans }}
  • - +{% set apiToken = app.user.username ~ ':' ~ app.user.apiToken %}

    {{ 'api_doc.listing_names'|trans }}

    {{ 'api_doc.all_packages'|trans }}

    -GET https://{{ packagist_host }}/packages/list.json
    +GET https://{{ packagist_host }}/packages/list.json?token={{ apiToken }}
     
     {
       "packageNames": [
    @@ -35,11 +35,11 @@ GET https://{{ packagist_host }}/packages/list.json
       ]
     }
     
    -

    Working example: https://{{ packagist_host }}/packages/list.json

    +

    Working example: https://{{ packagist_host }}/packages/list.json?token={{ apiToken }}

    {{ 'api_doc.list_by_organization'|trans }}

    -GET https://{{ packagist_host }}/packages/list.json?vendor=[vendor]
    +GET https://{{ packagist_host }}/packages/list.json?vendor=[vendor]&token={{ apiToken }}
     
     {
       "packageNames": [
    @@ -48,11 +48,11 @@ GET https://{{ packagist_host }}/packages/list.json?vendor=[vendor]
       ]
     }
     
    -

    Working example: https://{{ packagist_host }}/packages/list.json?vendor=composer

    +

    Working example: https://{{ packagist_host }}/packages/list.json?vendor=composer&token={{ apiToken }}

    {{ 'api_doc.list_by_type'|trans }}

    -GET https://{{ packagist_host }}/packages/list.json?type=[type]
    +GET https://{{ packagist_host }}/packages/list.json?type=[type]&token={{ apiToken }}
     
     {
       "packageNames": [
    @@ -61,83 +61,11 @@ GET https://{{ packagist_host }}/packages/list.json?type=[type]
       ]
     }
     
    -

    Working example: https://{{ packagist_host }}/packages/list.json?type=composer-plugin

    +

    Working example: https://{{ packagist_host }}/packages/list.json?type=composer-plugin&token={{ apiToken }}

    -
    -

    {{ 'api_doc.searching'|trans }}

    - -

    Search results are paginated and you can change the pagination step by using the per_page parameter. For example https://{{ packagist_host }}/search.json?q=[query]&per_page=5

    - -

    {{ 'api_doc.search_by_name'|trans }}

    -
    -GET https://{{ packagist_host }}/search.json?q=[query]
    -
    -{
    -  "results" : [
    -    {
    -      "name": "[vendor]/[package]",
    -      "description": "[description]",
    -      "url": "https://{{ packagist_host }}/packages/[vendor]/[package]",
    -      "repository": [repository url],
    -      "downloads": [number of downloads],
    -      "favers": [number of favers]
    -    },
    -    ...
    -  ],
    -  "total": [number of results],
    -  "next": "https://{{ packagist_host }}/search.json?q=[query]&page=[next page number]"
    -}
    -
    -

    Working example: https://{{ packagist_host }}/search.json?q=monolog

    - -

    {{ 'api_doc.search_by_tag'|trans }}

    -
    -GET https://{{ packagist_host }}/search.json?tags=[tag]
    -
    -{
    -  "results": [
    -    {
    -      "name": "[vendor]/[package]",
    -      "description": "[description]",
    -      "url": "https://{{ packagist_host }}/packages/[vendor]/[package]",
    -      "repository": "[repository url]",
    -      "downloads": [number of downloads],
    -      "favers": [number of favers]
    -    }
    -    ...
    -  ],
    -  "total": [numbers of results]
    -}
    -
    -

    Working example: https://{{ packagist_host }}/search.json?q=monolog&tags=psr-3

    - -

    {{ 'api_doc.search_by_type'|trans }}

    -
    -GET https://{{ packagist_host }}/search.json?q=[query]&type=symfony-bundle
    -
    -{
    -  "results" : [
    -    {
    -      "name": "[vendor]/[package]",
    -      "description": "[description]",
    -      "url": "https://{{ packagist_host }}/packages/[vendor]/[package]",
    -      "repository": [repository url],
    -      "downloads": [number of downloads],
    -      "favers": [number of favers]
    -    },
    -    ...
    -  ],
    -  "total": [number of results],
    -  "next": "https://{{ packagist_host }}/search.json?q=[query]&page=[next page number]"
    -}
    -
    -

    Working example: https://{{ packagist_host }}/search.json?q=monolog&type=symfony-bundle

    -
    - -

    {{ 'api_doc.get_package_data'|trans }}

    @@ -156,7 +84,7 @@ GET https://{{ packagist_host }}/search.json?q=[query]&type=symfony-bundle

    -GET https://{{ packagist_host }}/p/[vendor]/[package].json
    +GET https://{{ packagist_host }}/p/[vendor]/[package].json?token={{ apiToken }}
     
     {
       "packages": {
    @@ -174,14 +102,14 @@ GET https://{{ packagist_host }}/p/[vendor]/[package].json
       }
     }
     
    -

    Working example: https://{{ packagist_host }}/p/monolog/monolog.json

    +

    Working example: https://{{ packagist_host }}/p/{{ examplePackage }}.json?token={{ apiToken }}

    Using the API

    The JSON API for packages gives you all the infos we have including downloads, dependents count, github info, etc. However it is generated dynamically so for performance reason we cache the responses for twelve hours. As such if the static file endpoint described above is enough please use it instead.

    -GET https://{{ packagist_host }}/packages/[vendor]/[package].json
    +GET https://{{ packagist_host }}/packages/[vendor]/[package].json?token={{ apiToken }}
     
     {
       "package": {
    @@ -201,9 +129,8 @@ GET https://{{ packagist_host }}/packages/[vendor]/[package].json
       }
     }
     
    -

    Working example: https://{{ packagist_host }}/packages/monolog/monolog.json

    +

    Working example: https://{{ packagist_host }}/packages/{{ examplePackage }}.json?token={{ apiToken }}

    - {% endblock %}