diff --git a/config/autoload/routes.global.php b/config/autoload/routes.global.php index 7f16c641..60da6d2a 100644 --- a/config/autoload/routes.global.php +++ b/config/autoload/routes.global.php @@ -19,6 +19,12 @@ return [ 'middleware' => Rest\CreateShortcodeMiddleware::class, 'allowed_methods' => ['POST'], ], + [ + 'name' => 'rest-resolve-url', + 'path' => '/rest/short-code/{shortCode}', + 'middleware' => Rest\ResolveUrlMiddleware::class, + 'allowed_methods' => ['GET'], + ], ], ]; diff --git a/config/autoload/services.global.php b/config/autoload/services.global.php index 617242b5..46890750 100644 --- a/config/autoload/services.global.php +++ b/config/autoload/services.global.php @@ -44,6 +44,8 @@ return [ // Middleware Middleware\Routable\RedirectMiddleware::class => AnnotatedFactory::class, + Middleware\Rest\CreateShortcodeMiddleware::class => AnnotatedFactory::class, + Middleware\Rest\ResolveUrlMiddleware::class => AnnotatedFactory::class, ], 'aliases' => [ 'em' => EntityManager::class, diff --git a/src/Middleware/Rest/CreateShortcodeMiddleware.php b/src/Middleware/Rest/CreateShortcodeMiddleware.php index 21ab4379..1e723d48 100644 --- a/src/Middleware/Rest/CreateShortcodeMiddleware.php +++ b/src/Middleware/Rest/CreateShortcodeMiddleware.php @@ -91,7 +91,7 @@ class CreateShortcodeMiddleware implements MiddlewareInterface } catch (\Exception $e) { return new JsonResponse([ 'error' => RestUtils::UNKNOWN_ERROR, - 'message' => sprintf('Provided URL "%s" is invalid. Try with a different one.', $longUrl), + 'message' => 'Unexpected error occured', ], 500); } } diff --git a/src/Middleware/Rest/ResolveUrlMiddleware.php b/src/Middleware/Rest/ResolveUrlMiddleware.php new file mode 100644 index 00000000..1beee164 --- /dev/null +++ b/src/Middleware/Rest/ResolveUrlMiddleware.php @@ -0,0 +1,85 @@ +urlShortener = $urlShortener; + } + + /** + * Process an incoming request and/or response. + * + * Accepts a server-side request and a response instance, and does + * something with them. + * + * If the response is not complete and/or further processing would not + * interfere with the work done in the middleware, or if the middleware + * wants to delegate to another process, it can use the `$out` callable + * if present. + * + * If the middleware does not return a value, execution of the current + * request is considered complete, and the response instance provided will + * be considered the response to return. + * + * Alternately, the middleware may return a response instance. + * + * Often, middleware will `return $out();`, with the assumption that a + * later middleware will return a response. + * + * @param Request $request + * @param Response $response + * @param null|callable $out + * @return null|Response + */ + public function __invoke(Request $request, Response $response, callable $out = null) + { + $shortCode = $request->getAttribute('shortCode'); + + try { + $longUrl = $this->urlShortener->shortCodeToUrl($shortCode); + if (! isset($longUrl)) { + return new JsonResponse([ + 'error' => RestUtils::INVALID_ARGUMENT_ERROR, + 'message' => sprintf('No URL found for shortcode "%s"', $shortCode), + ], 400); + } + + return new JsonResponse([ + 'longUrl' => $longUrl, + ]); + } catch (InvalidShortCodeException $e) { + return new JsonResponse([ + 'error' => RestUtils::getRestErrorCodeFromException($e), + 'message' => sprintf('Provided short code "%s" has an invalid format', $shortCode), + ], 400); + } catch (\Exception $e) { + return new JsonResponse([ + 'error' => RestUtils::UNKNOWN_ERROR, + 'message' => 'Unexpected error occured', + ], 500); + } + } +}