PSR7 Router
# Goals - [x] Request handler working prototype with legacy routes support - [x] Allow modules to provide routes - [x] Allow modules to specify per-route middlewares - [x] Catch uncaught exceptions and cast them as `status: error` responses. Ensure Sentry works. - [x] ~~API/FS versioning?~~ - [x] ... Middlewares ## Milestones | Milestone | Link | | ------ | ------ | | PSR-7 Router | https://gitlab.com/groups/minds/-/milestones/63 | ## Merge Requests & Branches | | | | ------ | ------ | | https://gitlab.com/groups/minds/-/merge_requests?scope=all&utf8=%E2%9C%93&state=opened&search=router | PSR-7 Router | ## Mockups ## Flow ### Successful response ```mermaid graph TD HTTP[HTTP Interface] --Request--> Hooks[Pre/Post Hooks] --Request--> App_Middleware[App Middleware] --Request--> Group_Middleware[Group Middleware] --Request--> Route_Middleware[Route Middleware] --Request--> Module_Action[Module Action] --Response--> Hooks --Response--> HTTP ``` ### App Middleware failure response e.g.: XSRF validation failure ```mermaid graph TD HTTP[HTTP Interface] --Request--> Hooks[Pre/Post Hooks] --Request--> App_Middleware[App Middleware] -.- Group_Middleware[Group Middleware] -.- Route_Middleware[Route Middleware] -.- Module_Action[Module Action] -.- Route_Middleware -.- Group_Middleware -.- App_Middleware --ErrorResponse--> Hooks --ErrorResponse--> HTTP ``` ### Group failure response e.g. Logged-in user required for certain routes group ```mermaid graph TD HTTP[HTTP Interface] --Request--> Hooks[Pre/Post Hooks] --Request--> App_Middleware[App Middleware] --Request--> Group_Middleware[Group Middleware] -.- Route_Middleware[Route Middleware] -.- Module_Action[Module Action] -.- Route_Middleware -.- Group_Middleware --ErrorResponse--> Hooks --ErrorResponse--> HTTP ``` ### Action failure response e.g. Database unavailable failure ```mermaid graph TD HTTP[HTTP Interface] --Request--> Hooks[Pre/Post Hooks] --Request--> App_Middleware[App Middleware] --Request--> Group_Middleware[Group Middleware] --Request--> Route_Middleware[Route Middleware] --Request--> Module_Action[Module Action] --ErrorResponse--> Hooks --ErrorResponse-->HTTP ``` ## Potential implementation example ```php $this->route->withPrefix('api/v3/newsfeed', function(Route $route) { $route->get( '/', function(ServerRequest $request) { return (new JsonResponse([])) ->withStatus(501); } ); $route->using([ LoggedInMiddleware::class, ])->get( '/subscribed', DiRef::_('Newsfeed\Manager', 'listBySubscriptions') ); $route->using([ LoggedInMiddleware::class, ])->withPrefix('/activity', function (Route $route) { $route->post( '/', DiRef::_('Newsfeed\Activity\Manager', 'create') ); $route->post( '/:id', DiRef::_('Newsfeed\Activity\Manager', 'edit') ); $route->delete( '/:id', DiRef::_('Newsfeed\Activity\Manager', 'delete') ); }); $route->get( '/:algorithm', DiRef::_('Newsfeed\Manager', 'listByAlgorithm') ); }); ``` ## Developers | Developer | Focus | | ------ | ------ | | @edgebal | backend |
epic