CollectionWriter.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. namespace Mpociot\ApiDoc\Postman;
  3. use Ramsey\Uuid\Uuid;
  4. use Illuminate\Support\Str;
  5. use Illuminate\Support\Collection;
  6. use Illuminate\Support\Facades\URL;
  7. class CollectionWriter
  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. try {
  30. URL::forceRootUrl($this->baseUrl);
  31. if (Str::startsWith($this->baseUrl, 'https://')) {
  32. URL::forceScheme('https');
  33. }
  34. } catch (\Error $e) {
  35. echo "Warning: Couldn't force base url as your version of Lumen doesn't have the forceRootUrl method.\n";
  36. echo "You should probably double check URLs in your generated Postman collection.\n";
  37. }
  38. $collection = [
  39. 'variables' => [],
  40. 'info' => [
  41. 'name' => config('apidoc.postman.name') ?: config('app.name').' API',
  42. '_postman_id' => Uuid::uuid4()->toString(),
  43. 'description' => config('apidoc.postman.description') ?: '',
  44. 'schema' => 'https://schema.getpostman.com/json/collection/v2.0.0/collection.json',
  45. ],
  46. 'item' => $this->routeGroups->map(function ($routes, $groupName) {
  47. return [
  48. 'name' => $groupName,
  49. 'description' => '',
  50. 'item' => $routes->map(function ($route) {
  51. $mode = $route['methods'][0] === 'PUT' ? 'urlencoded' : 'formdata';
  52. return [
  53. 'name' => $route['metadata']['title'] != '' ? $route['metadata']['title'] : url($route['uri']),
  54. 'request' => [
  55. 'url' => url($route['uri']).(collect($route['queryParameters'])->isEmpty()
  56. ? ''
  57. : ('?'.implode('&', collect($route['queryParameters'])->map(function ($parameter, $key) {
  58. return urlencode($key).'='.urlencode($parameter['value'] ?? '');
  59. })->all()))),
  60. 'method' => $route['methods'][0],
  61. 'header' => collect($route['headers'])
  62. ->union([
  63. 'Accept' => 'application/json',
  64. ])
  65. ->map(function ($value, $header) {
  66. return [
  67. 'key' => $header,
  68. 'value' => $value,
  69. ];
  70. })
  71. ->values()->all(),
  72. 'body' => [
  73. 'mode' => $mode,
  74. $mode => collect($route['bodyParameters'])->map(function ($parameter, $key) {
  75. return [
  76. 'key' => $key,
  77. 'value' => $parameter['value'] ?? '',
  78. 'type' => 'text',
  79. 'enabled' => true,
  80. ];
  81. })->values()->toArray(),
  82. ],
  83. 'description' => $route['metadata']['description'],
  84. 'response' => [],
  85. ],
  86. ];
  87. })->toArray(),
  88. ];
  89. })->values()->toArray(),
  90. ];
  91. return json_encode($collection);
  92. }
  93. }