From 4cb1d1ead78511f6846a23bd9c7f7f6edb423d2c Mon Sep 17 00:00:00 2001 From: Kacper Donat <kadet1090@gmail.com> Date: Mon, 9 Dec 2019 19:31:13 +0100 Subject: [PATCH] api docs via swahher --- .../Api/v1/DeparturesController.php | 15 ++++++++ src/Controller/Api/v1/StopsController.php | 22 +++++++----- src/Controller/Api/v1/TracksController.php | 2 +- src/Model/Departure.php | 35 ++++++++++++++----- src/Model/Line.php | 21 +++++++++++ src/Model/Message.php | 5 +-- src/Model/Operator.php | 6 ++++ src/Model/Referable.php | 3 ++ src/Model/ReferableTrait.php | 9 +++-- src/Model/Track.php | 9 ++++- .../JustReferenceSerializationSubscriber.php | 28 +++++++++++++++ 11 files changed, 130 insertions(+), 25 deletions(-) create mode 100644 src/Subscriber/JustReferenceSerializationSubscriber.php diff --git a/src/Controller/Api/v1/DeparturesController.php b/src/Controller/Api/v1/DeparturesController.php index 0c5213a..12eb8d4 100644 --- a/src/Controller/Api/v1/DeparturesController.php +++ b/src/Controller/Api/v1/DeparturesController.php @@ -16,6 +16,8 @@ use Symfony\Component\Routing\Annotation\Route; * Class DeparturesController * * @Route("/departures") + * @SWG\Tag(name="Departures") + * @SWG\Parameter(ref="#/parameters/provider") */ class DeparturesController extends Controller { @@ -36,6 +38,19 @@ class DeparturesController extends Controller /** * @Route("/", methods={"GET"}) + * @SWG\Response( + * description="Gets departures from given stops.", + * response=200, + * @SWG\Schema(type="array", @SWG\Items(ref=@Model(type=Departure::class))) + * ) + * + * @SWG\Parameter( + * name="stop", + * description="Stop identifiers.", + * type="array", + * in="query", + * @SWG\Items(type="string") + * ) */ public function stops(DepartureRepository $departures, StopRepository $stops, Request $request) { diff --git a/src/Controller/Api/v1/StopsController.php b/src/Controller/Api/v1/StopsController.php index 1229ecb..69caaf3 100644 --- a/src/Controller/Api/v1/StopsController.php +++ b/src/Controller/Api/v1/StopsController.php @@ -5,6 +5,7 @@ namespace App\Controller\Api\v1; use App\Controller\Controller; use App\Model\Stop; +use App\Model\Track; use App\Model\StopGroup; use App\Provider\StopRepository; use App\Provider\TrackRepository; @@ -20,7 +21,7 @@ use Symfony\Component\Routing\Annotation\Route; * @package App\Controller * @Route("/stops") * - * @SWG\Tag(name="stops") + * @SWG\Tag(name="Stops") * @SWG\Parameter(ref="#/parameters/provider") */ class StopsController extends Controller @@ -49,10 +50,6 @@ class StopsController extends Controller $result = $stops->getManyById($request->query->get('id')); break; - case $request->query->has('name'): - $result = $stops->findGroupsByName($request->query->get('name')); - break; - default: $result = $stops->getAllGroups(); } @@ -79,10 +76,6 @@ class StopsController extends Controller public function groups(Request $request, StopRepository $stops) { switch (true) { - case $request->query->has('id'): - $result = $stops->getManyById($request->query->get('id')); - break; - case $request->query->has('name'): $result = $stops->findGroupsByName($request->query->get('name')); break; @@ -117,6 +110,17 @@ class StopsController extends Controller /** * @Route("/{id}/tracks", methods={"GET"}) + * + * @SWG\Response( + * response=200, + * description="Returns specific stop referenced via identificator.", + * @SWG\Schema(type="object", properties={ + * @SWG\Property(property="track", type="object", ref=@Model(type=Track::class)), + * @SWG\Property(property="order", type="integer", minimum="0") + * }) + * ) + * + * @SWG\Tag(name="Tracks") */ public function tracks(ReferenceFactory $reference, TrackRepository $tracks, $id) { diff --git a/src/Controller/Api/v1/TracksController.php b/src/Controller/Api/v1/TracksController.php index 5892c7a..069a338 100644 --- a/src/Controller/Api/v1/TracksController.php +++ b/src/Controller/Api/v1/TracksController.php @@ -23,7 +23,7 @@ class TracksController extends Controller * response=200, * description="Returns all tracks for specific provider, e.g. ZTM Gdańsk.", * ) - * @SWG\Tag(name="tracks") + * @SWG\Tag(name="Tracks") * @Route("/", methods={"GET"}) */ public function index(Request $request, TrackRepository $repository) diff --git a/src/Model/Departure.php b/src/Model/Departure.php index 9a3c3d3..df1e34d 100644 --- a/src/Model/Departure.php +++ b/src/Model/Departure.php @@ -4,44 +4,57 @@ namespace App\Model; use Carbon\Carbon; use JMS\Serializer\Annotation as Serializer; +use Nelmio\ApiDocBundle\Annotation\Model; +use Swagger\Annotations as SWG; class Departure implements Fillable { use FillTrait; /** - * Information about line - * @var \App\Model\Line + * Information about line. + * @var Line + * @Serializer\Type(Line::class) + * @SWG\Property(ref=@Model(type=Line::class, groups={"Default"})) + * */ private $line; /** - * Information about stop - * @var \App\Model\Stop + * Information about stop. + * @var Stop + * @Serializer\Type(Stop::class) */ private $stop; /** - * Vehicle identification + * Vehicle identification. * @var Vehicle|null + * @Serializer\Type(Vehicle::class) */ private $vehicle; /** - * Displayed destination + * Displayed destination. * @var string|null + * @Serializer\Type("string") + * @SWG\Property(example="Łostowice Świętokrzyska") */ private $display; /** - * Estimated time of departure, null if case of no realtime data + * Estimated time of departure, null if case of no realtime data. * @var Carbon|null + * @Serializer\Type("Carbon") + * @SWG\Property(type="string", format="date-time") */ private $estimated; /** - * Scheduled time of departure + * Scheduled time of departure. * @var Carbon + * @Serializer\Type("Carbon") + * @SWG\Property(type="string", format="date-time") */ private $scheduled; @@ -105,7 +118,11 @@ class Departure implements Fillable $this->stop = $stop; } - /** @Serializer\VirtualProperty() */ + /** + * @Serializer\VirtualProperty() + * @Serializer\Type("int") + * @SWG\Property(type="int") + */ public function getDelay(): ?int { return $this->getEstimated() diff --git a/src/Model/Line.php b/src/Model/Line.php index 917913b..b339218 100644 --- a/src/Model/Line.php +++ b/src/Model/Line.php @@ -2,6 +2,9 @@ namespace App\Model; +use JMS\Serializer\Annotation as Serializer; +use Nelmio\ApiDocBundle\Annotation\Model; +use Swagger\Annotations as SWG; use Tightenco\Collect\Support\Collection; class Line implements Fillable, Referable @@ -17,36 +20,54 @@ class Line implements Fillable, Referable /** * Line symbol, for example '10', or 'A' + * @Serializer\Type("string") + * @SWG\Property(example="10") * @var string */ private $symbol; /** * Line type tram, bus or whatever. + * @Serializer\Type("string") + * @SWG\Property(type="string", enum={ + * Line::TYPE_BUS, + * Line::TYPE_UNKNOWN, + * Line::TYPE_METRO, + * Line::TYPE_TRAIN, + * Line::TYPE_TRAM, + * Line::TYPE_TROLLEYBUS + * }) * @var string */ private $type; /** * Is line considered as fast line? + * @Serializer\Type("bool") * @var boolean */ private $fast = false; /** * Is line considered as night line? + * @Serializer\Type("bool") * @var boolean */ private $night = false; /** * Line operator + * @Serializer\Type(Operator::class) + * @SWG\Property(ref=@Model(type=Operator::class, groups={"Identity"})) * @var Operator */ private $operator; /** * Tracks for this line + * @Serializer\Type("Collection") + * @SWG\Property(type="array", @SWG\Items(ref=@Model(type=Track::class))) + * @Serializer\Groups("Full") * @var Collection<Track>|Track[] */ private $tracks; diff --git a/src/Model/Message.php b/src/Model/Message.php index 58dfe67..082f29a 100644 --- a/src/Model/Message.php +++ b/src/Model/Message.php @@ -17,6 +17,7 @@ class Message implements Fillable /** * Message content. * @Serializer\Type("string") + * @SWG\Property(example="Tram accident on Haller alley, possible delays on lines: 2, 3, 4, 5.") * @var string */ private $message; @@ -32,7 +33,7 @@ class Message implements Fillable /** * Message validity time span start * @Serializer\Type("Carbon") - * @SWG\Property(type="string") + * @SWG\Property(type="string", format="date-time") * @var Carbon|null */ private $validFrom; @@ -41,7 +42,7 @@ class Message implements Fillable * Message validity time span end * @var Carbon|null * @Serializer\Type("Carbon") - * @SWG\Property(type="string") + * @SWG\Property(type="string", format="date-time") */ private $validTo; diff --git a/src/Model/Operator.php b/src/Model/Operator.php index 2700172..c60a8d6 100644 --- a/src/Model/Operator.php +++ b/src/Model/Operator.php @@ -2,30 +2,36 @@ namespace App\Model; +use JMS\Serializer\Annotation as Serializer; + class Operator implements Fillable, Referable { use FillTrait, ReferableTrait; /** * Describes operator name + * @Serializer\Type("string") * @var string */ private $name; /** * Contact email to operator + * @Serializer\Type("string") * @var string|null */ private $email; /** * URL of operators page + * @Serializer\Type("string") * @var string|null */ private $url; /** * Contact phone to operator + * @Serializer\Type("string") * @var string|null */ private $phone; diff --git a/src/Model/Referable.php b/src/Model/Referable.php index 81e33d7..a4af90d 100644 --- a/src/Model/Referable.php +++ b/src/Model/Referable.php @@ -2,6 +2,9 @@ namespace App\Model; +use JMS\Serializer\Annotation as Serializer; +use Swagger\Annotations as SWG; + interface Referable { public function getId(); diff --git a/src/Model/ReferableTrait.php b/src/Model/ReferableTrait.php index a4ccaa7..70280dc 100644 --- a/src/Model/ReferableTrait.php +++ b/src/Model/ReferableTrait.php @@ -2,18 +2,21 @@ namespace App\Model; -use Swagger\Annotations as SWG; +use JMS\Serializer\Annotation as Serializer; trait ReferableTrait { /** * Identifier coming from provider service + * @Serializer\Type("string") + * @Serializer\Groups({"Default", "Identity", "Minimal"}) * @var string - * - * @SWG\Property(example="1045") */ private $id; + /** + * @return string + */ public function getId() { return $this->id; diff --git a/src/Model/Track.php b/src/Model/Track.php index bae46c6..bd62451 100644 --- a/src/Model/Track.php +++ b/src/Model/Track.php @@ -2,6 +2,8 @@ namespace App\Model; +use JMS\Serializer\Annotation as Serializer; +use Nelmio\ApiDocBundle\Annotation\Model; use Swagger\Annotations as SWG; use Tightenco\Collect\Support\Collection; @@ -11,6 +13,8 @@ class Track implements Referable, Fillable /** * Line variant describing track, for example 'a' + * @Serializer\Type("string") + * @SWG\Property(example="a") * @var string|null * */ @@ -18,12 +22,14 @@ class Track implements Referable, Fillable /** * Track description + * @Serializer\Type("string") * @var string|null */ private $description; /** * Line reference + * @SWG\Property(ref=@Model(type=Line::class, groups={"Default"})) * @var Line */ private $line; @@ -31,7 +37,8 @@ class Track implements Referable, Fillable /** * Stops in track * @var Stop[]|Collection - * @SWG\Property(type="Stop") + * @Serializer\Type("Collection") + * @SWG\Property(type="array", @SWG\Items(ref=@Model(type=Stop::class))) */ private $stops; diff --git a/src/Subscriber/JustReferenceSerializationSubscriber.php b/src/Subscriber/JustReferenceSerializationSubscriber.php new file mode 100644 index 0000000..35a9754 --- /dev/null +++ b/src/Subscriber/JustReferenceSerializationSubscriber.php @@ -0,0 +1,28 @@ +<?php + +namespace App\Subscriber; + +use App\Model\JustReference; +use JMS\Serializer\EventDispatcher\EventSubscriberInterface; +use JMS\Serializer\EventDispatcher\PreSerializeEvent; + +class JustReferenceSerializationSubscriber implements EventSubscriberInterface +{ + public function onPreSerialize(PreSerializeEvent $event) + { + $object = $event->getObject(); + $type = $event->getType(); + + $event->setType(get_parent_class($object), $type['params']); + } + + /** + * @inheritDoc + */ + public static function getSubscribedEvents() + { + return [ + ['event' => 'serializer.pre_serialize', 'method' => 'onPreSerialize', 'interface' => JustReference::class], + ]; + } +} \ No newline at end of file