PostmanCollectionWriter.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. namespace Mpociot\ApiDoc\Writing;
  3. use Ramsey\Uuid\Uuid;
  4. use Illuminate\Support\Str;
  5. use Illuminate\Support\Collection;
  6. use Illuminate\Support\Facades\URL;
  7. class PostmanCollectionWriter
  8. {
  9. /**
  10. * @var Collection
  11. */
  12. private $routeGroups;
  13. /**
  14. * @var string
  15. */
  16. private $baseUrl;
  17. /**
  18. * CollectionWriter constructor.
  19. *
  20. * @param Collection $routeGroups
  21. */
  22. public function __construct(Collection $routeGroups, $baseUrl)
  23. {
  24. $this->routeGroups = $routeGroups;
  25. $this->baseUrl = $baseUrl;
  26. }
  27. public function getCollection()
  28. {
  29. URL::forceRootUrl($this->baseUrl);
  30. if (Str::startsWith($this->baseUrl, 'https://')) {
  31. URL::forceScheme('https');
  32. }
  33. $collection = [
  34. 'variables' => [],
  35. 'info' => [
  36. 'name' => config('apidoc.postman.name') ?: config('app.name').' API',
  37. '_postman_id' => Uuid::uuid4()->toString(),
  38. 'description' => config('apidoc.postman.description') ?: '',
  39. 'schema' => 'https://schema.getpostman.com/json/collection/v2.0.0/collection.json',
  40. ],
  41. 'item' => $this->routeGroups->map(function ($routes, $groupName) {
  42. return [
  43. 'name' => $groupName,
  44. 'description' => '',
  45. 'item' => $routes->map(function ($route) {
  46. $mode = "raw";
  47. return [
  48. 'name' => $route['metadata']['title'] != '' ? $route['metadata']['title'] : url($route['uri']),
  49. 'request' => [
  50. 'url' => url($route['uri']).(collect($route['queryParameters'])->isEmpty()
  51. ? ''
  52. : ('?'.implode('&', collect($route['queryParameters'])->map(function ($parameter, $key) {
  53. return urlencode($key).'='.urlencode($parameter['value'] ?? '');
  54. })->all()))),
  55. 'method' => $route['methods'][0],
  56. 'header' => collect($route['headers'])
  57. ->union([
  58. 'Accept' => 'application/json',
  59. ])
  60. ->map(function ($value, $header) {
  61. return [
  62. 'key' => $header,
  63. 'value' => $value,
  64. ];
  65. })
  66. ->values()->all(),
  67. 'body' => [
  68. 'mode' => $mode,
  69. $mode => json_encode($route['cleanBodyParameters'], JSON_PRETTY_PRINT)
  70. ],
  71. 'description' => $route['metadata']['description'],
  72. 'response' => [],
  73. ],
  74. ];
  75. })->toArray(),
  76. ];
  77. })->values()->toArray(),
  78. ];
  79. return json_encode($collection, JSON_PRETTY_PRINT);
  80. }
  81. }