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