framework/src/Api/ApiServiceProvider.php
2015-07-29 21:00:09 +09:30

339 lines
9.7 KiB
PHP

<?php namespace Flarum\Api;
use Flarum\Api\Serializers\ActivitySerializer;
use Flarum\Api\Serializers\NotificationSerializer;
use Flarum\Core\Users\Guest;
use Flarum\Events\RegisterApiRoutes;
use Flarum\Events\RegisterActivityTypes;
use Flarum\Events\RegisterNotificationTypes;
use Flarum\Http\RouteCollection;
use Flarum\Http\UrlGenerator;
use Illuminate\Support\ServiceProvider;
use Psr\Http\Message\ServerRequestInterface;
class ApiServiceProvider extends ServiceProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->bind('flarum.actor', function () {
return new Guest;
});
$this->app->singleton(
'Flarum\Http\UrlGeneratorInterface',
function () {
return new UrlGenerator($this->app->make('flarum.api.routes'));
}
);
$this->app->register('Flarum\Locale\LocaleServiceProvider');
}
/**
* Bootstrap the application events.
*
* @return void
*/
public function boot()
{
$this->routes();
$this->registerActivitySerializers();
$this->registerNotificationSerializers();
}
/**
* Register activity serializers.
*/
protected function registerActivitySerializers()
{
$blueprints = [];
$serializers = [
'posted' => 'Flarum\Api\Serializers\PostBasicSerializer',
'startedDiscussion' => 'Flarum\Api\Serializers\PostBasicSerializer',
'joined' => 'Flarum\Api\Serializers\UserSerializer'
];
event(new RegisterActivityTypes($blueprints, $serializers));
foreach ($serializers as $type => $serializer) {
ActivitySerializer::setSubjectSerializer($type, $serializer);
}
}
/**
* Register notification serializers.
*/
protected function registerNotificationSerializers()
{
$blueprints = [];
$serializers = [
'discussionRenamed' => 'Flarum\Api\Serializers\DiscussionBasicSerializer'
];
event(new RegisterNotificationTypes($blueprints, $serializers));
foreach ($serializers as $type => $serializer) {
NotificationSerializer::setSubjectSerializer($type, $serializer);
}
}
protected function routes()
{
$this->app->instance('flarum.api.routes', $routes = new RouteCollection);
// Get forum information
$routes->get(
'/forum',
'flarum.api.forum.show',
$this->action('Flarum\Api\Actions\Forum\ShowAction')
);
// Save forum information
$routes->patch(
'/forum',
'flarum.api.forum.update',
$this->action('Flarum\Api\Actions\Forum\UpdateAction')
);
// Retrieve authentication token
$routes->post(
'/token',
'flarum.api.token',
$this->action('Flarum\Api\Actions\TokenAction')
);
// Send forgot password email
$routes->post(
'/forgot',
'flarum.api.forgot',
$this->action('Flarum\Api\Actions\ForgotAction')
);
/*
|--------------------------------------------------------------------------
| Users
|--------------------------------------------------------------------------
*/
// List users
$routes->get(
'/users',
'flarum.api.users.index',
$this->action('Flarum\Api\Actions\Users\IndexAction')
);
// Register a user
$routes->post(
'/users',
'flarum.api.users.create',
$this->action('Flarum\Api\Actions\Users\CreateAction')
);
// Get a single user
$routes->get(
'/users/{id}',
'flarum.api.users.show',
$this->action('Flarum\Api\Actions\Users\ShowAction')
);
// Edit a user
$routes->patch(
'/users/{id}',
'flarum.api.users.update',
$this->action('Flarum\Api\Actions\Users\UpdateAction')
);
// Delete a user
$routes->delete(
'/users/{id}',
'flarum.api.users.delete',
$this->action('Flarum\Api\Actions\Users\DeleteAction')
);
// Upload avatar
$routes->post(
'/users/{id}/avatar',
'flarum.api.users.avatar.upload',
$this->action('Flarum\Api\Actions\Users\UploadAvatarAction')
);
// Remove avatar
$routes->delete(
'/users/{id}/avatar',
'flarum.api.users.avatar.delete',
$this->action('Flarum\Api\Actions\Users\DeleteAvatarAction')
);
/*
|--------------------------------------------------------------------------
| Activity
|--------------------------------------------------------------------------
*/
// List activity
$routes->get(
'/activity',
'flarum.api.activity.index',
$this->action('Flarum\Api\Actions\Activity\IndexAction')
);
// List notifications for the current user
$routes->get(
'/notifications',
'flarum.api.notifications.index',
$this->action('Flarum\Api\Actions\Notifications\IndexAction')
);
// Mark a single notification as read
$routes->patch(
'/notifications/{id}',
'flarum.api.notifications.update',
$this->action('Flarum\Api\Actions\Notifications\UpdateAction')
);
/*
|--------------------------------------------------------------------------
| Discussions
|--------------------------------------------------------------------------
*/
// List discussions
$routes->get(
'/discussions',
'flarum.api.discussions.index',
$this->action('Flarum\Api\Actions\Discussions\IndexAction')
);
// Create a discussion
$routes->post(
'/discussions',
'flarum.api.discussions.create',
$this->action('Flarum\Api\Actions\Discussions\CreateAction')
);
// Show a single discussion
$routes->get(
'/discussions/{id}',
'flarum.api.discussions.show',
$this->action('Flarum\Api\Actions\Discussions\ShowAction')
);
// Edit a discussion
$routes->patch(
'/discussions/{id}',
'flarum.api.discussions.update',
$this->action('Flarum\Api\Actions\Discussions\UpdateAction')
);
// Delete a discussion
$routes->delete(
'/discussions/{id}',
'flarum.api.discussions.delete',
$this->action('Flarum\Api\Actions\Discussions\DeleteAction')
);
/*
|--------------------------------------------------------------------------
| Posts
|--------------------------------------------------------------------------
*/
// List posts, usually for a discussion
$routes->get(
'/posts',
'flarum.api.posts.index',
$this->action('Flarum\Api\Actions\Posts\IndexAction')
);
// Create a post
$routes->post(
'/posts',
'flarum.api.posts.create',
$this->action('Flarum\Api\Actions\Posts\CreateAction')
);
// Show a single or multiple posts by ID
$routes->get(
'/posts/{id}',
'flarum.api.posts.show',
$this->action('Flarum\Api\Actions\Posts\ShowAction')
);
// Edit a post
$routes->patch(
'/posts/{id}',
'flarum.api.posts.update',
$this->action('Flarum\Api\Actions\Posts\UpdateAction')
);
// Delete a post
$routes->delete(
'/posts/{id}',
'flarum.api.posts.delete',
$this->action('Flarum\Api\Actions\Posts\DeleteAction')
);
/*
|--------------------------------------------------------------------------
| Groups
|--------------------------------------------------------------------------
*/
// List groups
$routes->get(
'/groups',
'flarum.api.groups.index',
$this->action('Flarum\Api\Actions\Groups\IndexAction')
);
// Create a group
$routes->post(
'/groups',
'flarum.api.groups.create',
$this->action('Flarum\Api\Actions\Groups\CreateAction')
);
// Show a single group
$routes->get(
'/groups/{id}',
'flarum.api.groups.show',
$this->action('Flarum\Api\Actions\Groups\ShowAction')
);
// Edit a group
$routes->patch(
'/groups/{id}',
'flarum.api.groups.update',
$this->action('Flarum\Api\Actions\Groups\UpdateAction')
);
// Delete a group
$routes->delete(
'/groups/{id}',
'flarum.api.groups.delete',
$this->action('Flarum\Api\Actions\Groups\DeleteAction')
);
event(new RegisterApiRoutes($routes));
}
protected function action($class)
{
return function (ServerRequestInterface $httpRequest, $routeParams) use ($class) {
$action = app($class);
$actor = app('flarum.actor');
$input = array_merge($httpRequest->getQueryParams(), $httpRequest->getAttributes(), $routeParams);
$request = new Request($input, $actor, $httpRequest);
return $action->handle($request);
};
}
}