From 5d41e07c35e1f18070fe9de0b4e991033d678952 Mon Sep 17 00:00:00 2001 From: TJ Miller Date: Wed, 23 Aug 2017 16:36:03 -0400 Subject: [PATCH] Adds API version verification (#28) * Adds API version verification Adds a check to the package middleware to ensure that the request and response version are defined in the configuration. * Keep ability to pass no versions in the request --- src/RequestMigrationsMiddleware.php | 43 +++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/RequestMigrationsMiddleware.php b/src/RequestMigrationsMiddleware.php index 762882d..380164f 100644 --- a/src/RequestMigrationsMiddleware.php +++ b/src/RequestMigrationsMiddleware.php @@ -6,6 +6,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Config; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\HttpException; class RequestMigrationsMiddleware { @@ -17,6 +18,14 @@ class RequestMigrationsMiddleware */ public function handle(Request $request, Closure $next) : Response { + if ($this->requestVersion($request) && ! in_array($this->requestVersion($request), $this->versions())) { + throw new HttpException(400, 'The request version is invalid'); + } + + if ($this->responseVersion($request) && ! in_array($this->responseVersion($request), $this->versions())) { + throw new HttpException(400, 'The response version is invalid'); + } + $migrator = new Migrator($request, Config::get('request-migrations')); $migrator->processResponseMigrations( @@ -27,4 +36,38 @@ public function handle(Request $request, Closure $next) : Response return $migrator->getResponse(); } + + /** + * Get all the available versions. + * + * @return array + */ + private function versions() : array + { + return array_keys(Config::get('request-migrations.versions')); + } + + /** + * Get the request version from the request. + * + * @param \Illuminate\Http\Request $request + * + * @return string + */ + private function requestVersion(Request $request) : string + { + return $request->header(Config::get('request-migrations.headers.request-version'), ''); + } + + /** + * Get the response version from the request. + * + * @param \Illuminate\Http\Request $request + * + * @return string + */ + private function responseVersion(Request $request) : string + { + return $request->header(Config::get('request-migrations.headers.response-version'), ''); + } }