mirror of
https://github.com/flarum/core.git
synced 2025-10-13 07:54:25 +02:00
369 lines
11 KiB
PHP
369 lines
11 KiB
PHP
<?php
|
|
/*
|
|
* This file is part of Flarum.
|
|
*
|
|
* (c) Toby Zerner <toby.zerner@gmail.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Flarum\Api;
|
|
|
|
use Flarum\Api\Controller\AbstractSerializeController;
|
|
use Flarum\Api\Serializer\AbstractSerializer;
|
|
use Flarum\Api\Serializer\NotificationSerializer;
|
|
use Flarum\Event\ConfigureApiRoutes;
|
|
use Flarum\Event\ConfigureNotificationTypes;
|
|
use Flarum\Http\GenerateRouteHandlerTrait;
|
|
use Flarum\Http\RouteCollection;
|
|
use Flarum\Foundation\AbstractServiceProvider;
|
|
use Tobscure\JsonApi\ErrorHandler;
|
|
use Tobscure\JsonApi\Exception\Handler\FallbackExceptionHandler;
|
|
use Tobscure\JsonApi\Exception\Handler\InvalidParameterExceptionHandler;
|
|
|
|
class ApiServiceProvider extends AbstractServiceProvider
|
|
{
|
|
use GenerateRouteHandlerTrait;
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function register()
|
|
{
|
|
$this->app->singleton(UrlGenerator::class, function () {
|
|
return new UrlGenerator($this->app, $this->app->make('flarum.api.routes'));
|
|
});
|
|
|
|
$this->app->singleton('flarum.api.routes', function () {
|
|
return $this->getRoutes();
|
|
});
|
|
|
|
$this->app->singleton(ErrorHandler::class, function () {
|
|
$handler = new ErrorHandler;
|
|
|
|
$handler->registerHandler(new Handler\FloodingExceptionHandler);
|
|
$handler->registerHandler(new Handler\IlluminateValidationExceptionHandler);
|
|
$handler->registerHandler(new Handler\InvalidConfirmationTokenExceptionHandler);
|
|
$handler->registerHandler(new Handler\ModelNotFoundExceptionHandler);
|
|
$handler->registerHandler(new Handler\PermissionDeniedExceptionHandler);
|
|
$handler->registerHandler(new Handler\ValidationExceptionHandler);
|
|
$handler->registerHandler(new InvalidParameterExceptionHandler);
|
|
$handler->registerHandler(new FallbackExceptionHandler($this->app->inDebugMode()));
|
|
|
|
return $handler;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function boot()
|
|
{
|
|
$this->registerNotificationSerializers();
|
|
|
|
AbstractSerializeController::setContainer($this->app);
|
|
AbstractSerializeController::setEventDispatcher($events = $this->app->make('events'));
|
|
|
|
AbstractSerializer::setContainer($this->app);
|
|
AbstractSerializer::setEventDispatcher($events);
|
|
}
|
|
|
|
/**
|
|
* Register notification serializers.
|
|
*/
|
|
protected function registerNotificationSerializers()
|
|
{
|
|
$blueprints = [];
|
|
$serializers = [
|
|
'discussionRenamed' => 'Flarum\Api\Serializer\DiscussionBasicSerializer'
|
|
];
|
|
|
|
$this->app->make('events')->fire(
|
|
new ConfigureNotificationTypes($blueprints, $serializers)
|
|
);
|
|
|
|
foreach ($serializers as $type => $serializer) {
|
|
NotificationSerializer::setSubjectSerializer($type, $serializer);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the API routes.
|
|
*
|
|
* @return RouteCollection
|
|
*/
|
|
protected function getRoutes()
|
|
{
|
|
$routes = new RouteCollection;
|
|
|
|
$toController = $this->getHandlerGenerator($this->app);
|
|
|
|
// Get forum information
|
|
$routes->get(
|
|
'/forum',
|
|
'forum.show',
|
|
$toController('Flarum\Api\Controller\ShowForumController')
|
|
);
|
|
|
|
// Save forum information
|
|
$routes->patch(
|
|
'/forum',
|
|
'forum.update',
|
|
$toController('Flarum\Api\Controller\UpdateForumController')
|
|
);
|
|
|
|
// Retrieve authentication token
|
|
$routes->post(
|
|
'/token',
|
|
'token',
|
|
$toController('Flarum\Api\Controller\TokenController')
|
|
);
|
|
|
|
// Send forgot password email
|
|
$routes->post(
|
|
'/forgot',
|
|
'forgot',
|
|
$toController('Flarum\Api\Controller\ForgotPasswordController')
|
|
);
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Users
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
|
|
// List users
|
|
$routes->get(
|
|
'/users',
|
|
'users.index',
|
|
$toController('Flarum\Api\Controller\ListUsersController')
|
|
);
|
|
|
|
// Register a user
|
|
$routes->post(
|
|
'/users',
|
|
'users.create',
|
|
$toController('Flarum\Api\Controller\CreateUserController')
|
|
);
|
|
|
|
// Get a single user
|
|
$routes->get(
|
|
'/users/{id}',
|
|
'users.show',
|
|
$toController('Flarum\Api\Controller\ShowUserController')
|
|
);
|
|
|
|
// Edit a user
|
|
$routes->patch(
|
|
'/users/{id}',
|
|
'users.update',
|
|
$toController('Flarum\Api\Controller\UpdateUserController')
|
|
);
|
|
|
|
// Delete a user
|
|
$routes->delete(
|
|
'/users/{id}',
|
|
'users.delete',
|
|
$toController('Flarum\Api\Controller\DeleteUserController')
|
|
);
|
|
|
|
// Upload avatar
|
|
$routes->post(
|
|
'/users/{id}/avatar',
|
|
'users.avatar.upload',
|
|
$toController('Flarum\Api\Controller\UploadAvatarController')
|
|
);
|
|
|
|
// Remove avatar
|
|
$routes->delete(
|
|
'/users/{id}/avatar',
|
|
'users.avatar.delete',
|
|
$toController('Flarum\Api\Controller\DeleteAvatarController')
|
|
);
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Notifications
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
|
|
// List notifications for the current user
|
|
$routes->get(
|
|
'/notifications',
|
|
'notifications.index',
|
|
$toController('Flarum\Api\Controller\ListNotificationsController')
|
|
);
|
|
|
|
// Mark all notifications as read
|
|
$routes->post(
|
|
'/notifications/read',
|
|
'notifications.readAll',
|
|
$toController('Flarum\Api\Controller\ReadAllNotificationsController')
|
|
);
|
|
|
|
// Mark a single notification as read
|
|
$routes->patch(
|
|
'/notifications/{id}',
|
|
'notifications.update',
|
|
$toController('Flarum\Api\Controller\UpdateNotificationController')
|
|
);
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Discussions
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
|
|
// List discussions
|
|
$routes->get(
|
|
'/discussions',
|
|
'discussions.index',
|
|
$toController('Flarum\Api\Controller\ListDiscussionsController')
|
|
);
|
|
|
|
// Create a discussion
|
|
$routes->post(
|
|
'/discussions',
|
|
'discussions.create',
|
|
$toController('Flarum\Api\Controller\CreateDiscussionController')
|
|
);
|
|
|
|
// Show a single discussion
|
|
$routes->get(
|
|
'/discussions/{id}',
|
|
'discussions.show',
|
|
$toController('Flarum\Api\Controller\ShowDiscussionController')
|
|
);
|
|
|
|
// Edit a discussion
|
|
$routes->patch(
|
|
'/discussions/{id}',
|
|
'discussions.update',
|
|
$toController('Flarum\Api\Controller\UpdateDiscussionController')
|
|
);
|
|
|
|
// Delete a discussion
|
|
$routes->delete(
|
|
'/discussions/{id}',
|
|
'discussions.delete',
|
|
$toController('Flarum\Api\Controller\DeleteDiscussionController')
|
|
);
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Posts
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
|
|
// List posts, usually for a discussion
|
|
$routes->get(
|
|
'/posts',
|
|
'posts.index',
|
|
$toController('Flarum\Api\Controller\ListPostsController')
|
|
);
|
|
|
|
// Create a post
|
|
$routes->post(
|
|
'/posts',
|
|
'posts.create',
|
|
$toController('Flarum\Api\Controller\CreatePostController')
|
|
);
|
|
|
|
// Show a single or multiple posts by ID
|
|
$routes->get(
|
|
'/posts/{id}',
|
|
'posts.show',
|
|
$toController('Flarum\Api\Controller\ShowPostController')
|
|
);
|
|
|
|
// Edit a post
|
|
$routes->patch(
|
|
'/posts/{id}',
|
|
'posts.update',
|
|
$toController('Flarum\Api\Controller\UpdatePostController')
|
|
);
|
|
|
|
// Delete a post
|
|
$routes->delete(
|
|
'/posts/{id}',
|
|
'posts.delete',
|
|
$toController('Flarum\Api\Controller\DeletePostController')
|
|
);
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Groups
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
|
|
// List groups
|
|
$routes->get(
|
|
'/groups',
|
|
'groups.index',
|
|
$toController('Flarum\Api\Controller\ListGroupsController')
|
|
);
|
|
|
|
// Create a group
|
|
$routes->post(
|
|
'/groups',
|
|
'groups.create',
|
|
$toController('Flarum\Api\Controller\CreateGroupController')
|
|
);
|
|
|
|
// Edit a group
|
|
$routes->patch(
|
|
'/groups/{id}',
|
|
'groups.update',
|
|
$toController('Flarum\Api\Controller\UpdateGroupController')
|
|
);
|
|
|
|
// Delete a group
|
|
$routes->delete(
|
|
'/groups/{id}',
|
|
'groups.delete',
|
|
$toController('Flarum\Api\Controller\DeleteGroupController')
|
|
);
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Administration
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
|
|
// Toggle an extension
|
|
$routes->patch(
|
|
'/extensions/{name}',
|
|
'extensions.update',
|
|
$toController('Flarum\Api\Controller\UpdateExtensionController')
|
|
);
|
|
|
|
// Uninstall an extension
|
|
$routes->delete(
|
|
'/extensions/{name}',
|
|
'extensions.delete',
|
|
$toController('Flarum\Api\Controller\UninstallExtensionController')
|
|
);
|
|
|
|
// Update settings
|
|
$routes->post(
|
|
'/settings',
|
|
'settings',
|
|
$toController('Flarum\Api\Controller\SetSettingsController')
|
|
);
|
|
|
|
// Update a permission
|
|
$routes->post(
|
|
'/permission',
|
|
'permission',
|
|
$toController('Flarum\Api\Controller\SetPermissionController')
|
|
);
|
|
|
|
$this->app->make('events')->fire(
|
|
new ConfigureApiRoutes($routes, $toController)
|
|
);
|
|
|
|
return $routes;
|
|
}
|
|
}
|