1
0
mirror of https://github.com/flarum/core.git synced 2025-10-22 20:26:15 +02:00

Massive refactor

- Use contextual namespaces within Flarum\Core
- Clean up and docblock everything
- Refactor Activity/Notification blueprint stuff
- Refactor Formatter stuff
- Refactor Search stuff
- Upgrade to JSON-API 1.0
- Removed “addedPosts” and “removedPosts” relationships from discussion
API. This was used for adding/removing event posts after renaming a
discussion etc. Instead we should make an additional request to get all
new posts

Todo:
- Fix Extenders and extensions
- Get rid of repository interfaces
- Fix other bugs I’ve inevitably introduced
This commit is contained in:
Toby Zerner
2015-07-04 12:24:48 +09:30
parent 12dd550a14
commit a74b40fe47
324 changed files with 6443 additions and 4197 deletions

View File

@@ -7,7 +7,7 @@ interface ActionInterface
/**
* Handle a request to the API, returning an HTTP response.
*
* @param \Flarum\Api\Request $request
* @param Request $request
* @return \Psr\Http\Message\ResponseInterface
*/
public function handle(Request $request);

View File

@@ -1,7 +1,7 @@
<?php namespace Flarum\Api\Actions\Activity;
use Flarum\Core\Repositories\UserRepositoryInterface;
use Flarum\Core\Repositories\ActivityRepositoryInterface;
use Flarum\Core\Users\UserRepositoryInterface;
use Flarum\Core\Activity\ActivityRepositoryInterface;
use Flarum\Api\Actions\SerializeCollectionAction;
use Flarum\Api\JsonApiRequest;
use Tobscure\JsonApi\Document;
@@ -9,12 +9,12 @@ use Tobscure\JsonApi\Document;
class IndexAction extends SerializeCollectionAction
{
/**
* @var \Flarum\Core\Repositories\UserRepositoryInterface
* @var UserRepositoryInterface
*/
protected $users;
/**
* @var \Flarum\Core\Repositories\ActivityRepositoryInterface
* @var ActivityRepositoryInterface
*/
protected $activity;
@@ -58,10 +58,8 @@ class IndexAction extends SerializeCollectionAction
public static $sort;
/**
* Instantiate the action.
*
* @param \Flarum\Core\Repositories\UserRepositoryInterface $users
* @param \Flarum\Core\Repositories\ActivityRepositoryInterface $activity
* @param UserRepositoryInterface $users
* @param ActivityRepositoryInterface $activity
*/
public function __construct(UserRepositoryInterface $users, ActivityRepositoryInterface $activity)
{
@@ -73,17 +71,24 @@ class IndexAction extends SerializeCollectionAction
* Get the activity results, ready to be serialized and assigned to the
* document response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @param JsonApiRequest $request
* @param Document $document
* @return \Illuminate\Database\Eloquent\Collection
*/
protected function data(JsonApiRequest $request, Document $document)
{
$actor = $request->actor->getUser();
$userId = $request->get('filter.user');
$actor = $request->actor;
$user = $this->users->findOrFail($request->get('users'), $actor);
$user = $this->users->findOrFail($userId, $actor);
return $this->activity->findByUser($user->id, $actor, $request->limit, $request->offset, $request->get('type'))
return $this->activity->findByUser(
$user->id,
$actor,
$request->limit,
$request->offset,
$request->get('filter.type')
)
->load($request->include);
}
}

View File

@@ -1,8 +1,7 @@
<?php namespace Flarum\Api\Actions\Discussions;
use Flarum\Core\Commands\StartDiscussionCommand;
use Flarum\Core\Commands\ReadDiscussionCommand;
use Flarum\Core\Models\Forum;
use Flarum\Core\Discussions\Commands\StartDiscussion;
use Flarum\Core\Discussions\Commands\ReadDiscussion;
use Flarum\Api\Actions\CreateAction as BaseCreateAction;
use Flarum\Api\JsonApiRequest;
use Illuminate\Contracts\Bus\Dispatcher;
@@ -12,17 +11,10 @@ class CreateAction extends BaseCreateAction
/**
* The command bus.
*
* @var \Illuminate\Contracts\Bus\Dispatcher
* @var Dispatcher
*/
protected $bus;
/**
* The default forum instance.
*
* @var \Flarum\Core\Models\Forum
*/
protected $forum;
/**
* @inheritdoc
*/
@@ -67,35 +59,33 @@ class CreateAction extends BaseCreateAction
/**
* Instantiate the action.
*
* @param \Illuminate\Contracts\Bus\Dispatcher $bus
* @param \Flarum\Core\Models\Forum $forum
* @param Dispatcher $bus
*/
public function __construct(Dispatcher $bus, Forum $forum)
public function __construct(Dispatcher $bus)
{
$this->bus = $bus;
$this->forum = $forum;
}
/**
* Create a discussion according to input from the API request.
*
* @param JsonApiRequest $request
* @return \Flarum\Core\Models\Model
* @return \Flarum\Core\Discussions\Discussion
*/
protected function create(JsonApiRequest $request)
{
$user = $request->actor->getUser();
$actor = $request->actor;
$discussion = $this->bus->dispatch(
new StartDiscussionCommand($user, $this->forum, $request->get('data'))
new StartDiscussion($actor, $request->get('data'))
);
// After creating the discussion, we assume that the user has seen all
// of the posts in the discussion; thus, we will mark the discussion
// as read if they are logged in.
if ($user->exists) {
if ($actor->exists) {
$this->bus->dispatch(
new ReadDiscussionCommand($discussion->id, $user, 1)
new ReadDiscussion($discussion->id, $actor, 1)
);
}

View File

@@ -1,6 +1,6 @@
<?php namespace Flarum\Api\Actions\Discussions;
use Flarum\Core\Commands\DeleteDiscussionCommand;
use Flarum\Core\Discussions\Commands\DeleteDiscussion;
use Flarum\Api\Actions\DeleteAction as BaseDeleteAction;
use Flarum\Api\Request;
use Illuminate\Contracts\Bus\Dispatcher;
@@ -8,16 +8,12 @@ use Illuminate\Contracts\Bus\Dispatcher;
class DeleteAction extends BaseDeleteAction
{
/**
* The command bus.
*
* @var \Illuminate\Contracts\Bus\Dispatcher
* @var Dispatcher
*/
protected $bus;
/**
* Instantiate the action.
*
* @param \Illuminate\Contracts\Bus\Dispatcher $bus
* @param Dispatcher $bus
*/
public function __construct(Dispatcher $bus)
{
@@ -25,15 +21,16 @@ class DeleteAction extends BaseDeleteAction
}
/**
* Delete a discussion.
*
* @param \Flarum\Api\Request $request
* @return void
* {@inheritdoc}
*/
protected function delete(Request $request)
{
$id = $request->get('id');
$actor = $request->actor;
$input = $request->all();
$this->bus->dispatch(
new DeleteDiscussionCommand($request->get('id'), $request->actor->getUser())
new DeleteDiscussion($id, $actor, $input)
);
}
}

View File

@@ -1,7 +1,7 @@
<?php namespace Flarum\Api\Actions\Discussions;
use Flarum\Core\Search\Discussions\DiscussionSearchCriteria;
use Flarum\Core\Search\Discussions\DiscussionSearcher;
use Flarum\Core\Search\SearchCriteria;
use Flarum\Core\Discussions\Search\DiscussionSearcher;
use Flarum\Api\Actions\SerializeCollectionAction;
use Flarum\Api\JsonApiRequest;
use Flarum\Http\UrlGeneratorInterface;
@@ -10,16 +10,12 @@ use Tobscure\JsonApi\Document;
class IndexAction extends SerializeCollectionAction
{
/**
* The discussion searcher.
*
* @var \Flarum\Core\Search\Discussions\DiscussionSearcher
* @var DiscussionSearcher
*/
protected $searcher;
/**
* The URL generator.
*
* @var \Flarum\Http\UrlGeneratorInterface
* @var UrlGeneratorInterface
*/
protected $url;
@@ -67,10 +63,8 @@ class IndexAction extends SerializeCollectionAction
public static $sort;
/**
* Instantiate the action.
*
* @param \Flarum\Core\Search\Discussions\DiscussionSearcher $searcher
* @param \Flarum\Http\UrlGeneratorInterface $url
* @param DiscussionSearcher $searcher
* @param UrlGeneratorInterface $url
*/
public function __construct(DiscussionSearcher $searcher, UrlGeneratorInterface $url)
{
@@ -82,21 +76,23 @@ class IndexAction extends SerializeCollectionAction
* Get the discussion results, ready to be serialized and assigned to the
* document response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @param JsonApiRequest $request
* @param Document $document
* @return \Illuminate\Database\Eloquent\Collection
*/
protected function data(JsonApiRequest $request, Document $document)
{
$criteria = new DiscussionSearchCriteria(
$request->actor->getUser(),
$request->get('q'),
$criteria = new SearchCriteria(
$request->actor,
$request->get('filter.q'),
$request->sort
);
$load = array_merge($request->include, ['state']);
$results = $this->searcher->search($criteria, $request->limit, $request->offset, $load);
// TODO: add query params (filter, sort, include) to the pagination URLs
static::addPaginationLinks(
$document,
$request,
@@ -104,6 +100,6 @@ class IndexAction extends SerializeCollectionAction
$results->areMoreResults()
);
return $results->getDiscussions();
return $results->getResults();
}
}

View File

@@ -1,7 +1,7 @@
<?php namespace Flarum\Api\Actions\Discussions;
use Flarum\Core\Repositories\DiscussionRepositoryInterface;
use Flarum\Core\Repositories\PostRepositoryInterface;
use Flarum\Core\Discussions\DiscussionRepositoryInterface;
use Flarum\Core\Posts\PostRepositoryInterface;
use Flarum\Api\Actions\SerializeResourceAction;
use Flarum\Api\Actions\Posts\GetsPosts;
use Flarum\Api\JsonApiRequest;
@@ -12,15 +12,10 @@ class ShowAction extends SerializeResourceAction
use GetsPosts;
/**
* @var \Flarum\Core\Repositories\DiscussionRepositoryInterface
* @var \Flarum\Core\Discussions\DiscussionRepositoryInterface
*/
protected $discussions;
/**
* @var \Flarum\Core\Repositories\PostRepositoryInterface
*/
protected $posts;
/**
* @inheritdoc
*/
@@ -69,8 +64,8 @@ class ShowAction extends SerializeResourceAction
/**
* Instantiate the action.
*
* @param \Flarum\Core\Repositories\DiscussionRepositoryInterface $discussions
* @param \Flarum\Core\Repositories\PostRepositoryInterface $posts
* @param DiscussionRepositoryInterface $discussions
* @param PostRepositoryInterface $posts
*/
public function __construct(DiscussionRepositoryInterface $discussions, PostRepositoryInterface $posts)
{
@@ -82,25 +77,29 @@ class ShowAction extends SerializeResourceAction
* Get a single discussion, ready to be serialized and assigned to the
* JsonApi response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @return \Illuminate\Database\Eloquent\Collection
* @param JsonApiRequest $request
* @param Document $document
* @return \Flarum\Core\Discussions\Discussion
*/
protected function data(JsonApiRequest $request, Document $document)
{
$user = $request->actor->getUser();
$discussionId = $request->get('id');
$actor = $request->actor;
$discussion = $this->discussions->findOrFail($request->get('id'), $user);
$discussion = $this->discussions->findOrFail($discussionId, $actor);
$discussion->posts_ids = $discussion->visiblePosts($user)->orderBy('time')->lists('id');
$discussion->posts_ids = $discussion->postsVisibleTo($actor)->orderBy('time')->lists('id');
// TODO: Refactor to be simpler, and get posts straight from the
// discussion's postsVisibleTo relation method.
if (in_array('posts', $request->include)) {
$length = strlen($prefix = 'posts.');
$relations = array_filter(array_map(function ($relationship) use ($prefix, $length) {
return substr($relationship, 0, $length) === $prefix ? substr($relationship, $length) : false;
$prefixLength = strlen($prefix = 'posts.');
$postRelations = array_filter(array_map(function ($relation) use ($prefix, $prefixLength) {
return substr($relation, 0, $prefixLength) === $prefix ? substr($relation, $prefixLength) : false;
}, $request->include));
$discussion->posts = $this->getPosts($request, ['discussion_id' => $discussion->id])->load($relations);
$discussion->posts = $this->getPosts($request, ['discussion_id' => $discussion->id])->load($postRelations);
}
return $discussion;

View File

@@ -1,7 +1,7 @@
<?php namespace Flarum\Api\Actions\Discussions;
use Flarum\Core\Commands\EditDiscussionCommand;
use Flarum\Core\Commands\ReadDiscussionCommand;
use Flarum\Core\Discussions\Commands\EditDiscussion;
use Flarum\Core\Discussions\Commands\ReadDiscussion;
use Flarum\Api\Actions\SerializeResourceAction;
use Flarum\Api\JsonApiRequest;
use Illuminate\Contracts\Bus\Dispatcher;
@@ -10,7 +10,7 @@ use Tobscure\JsonApi\Document;
class UpdateAction extends SerializeResourceAction
{
/**
* @var \Illuminate\Contracts\Bus\Dispatcher
* @var Dispatcher
*/
protected $bus;
@@ -22,11 +22,7 @@ class UpdateAction extends SerializeResourceAction
/**
* @inheritdoc
*/
public static $include = [
'addedPosts' => true,
'addedPosts.user' => true,
'addedPosts.discussion' => true
];
public static $include = [];
/**
* @inheritdoc
@@ -54,9 +50,7 @@ class UpdateAction extends SerializeResourceAction
public static $sort;
/**
* Instantiate the action.
*
* @param \Illuminate\Contracts\Bus\Dispatcher $bus
* @param Dispatcher $bus
*/
public function __construct(Dispatcher $bus)
{
@@ -67,24 +61,25 @@ class UpdateAction extends SerializeResourceAction
* Update a discussion according to input from the API request, and return
* it ready to be serialized and assigned to the JsonApi response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @return \Illuminate\Database\Eloquent\Collection
* @param JsonApiRequest $request
* @param Document $document
* @return \Flarum\Core\Discussions\Discussion
*/
protected function data(JsonApiRequest $request, Document $document)
{
$user = $request->actor->getUser();
$actor = $request->actor;
$discussionId = $request->get('id');
$data = $request->get('data');
if ($data = array_except($request->get('data'), ['readNumber'])) {
$discussion = $this->bus->dispatch(
new EditDiscussionCommand($discussionId, $user, $data)
);
}
$discussion = $this->bus->dispatch(
new EditDiscussion($discussionId, $actor, $data)
);
if ($readNumber = $request->get('data.readNumber')) {
// TODO: Refactor the ReadDiscussion (state) command into EditDiscussion?
// That's what extensions will do anyway.
if ($readNumber = array_get($data, 'attributes.readNumber')) {
$state = $this->bus->dispatch(
new ReadDiscussionCommand($discussionId, $user, $readNumber)
new ReadDiscussion($discussionId, $actor, $readNumber)
);
$discussion = $state->discussion;

View File

@@ -2,7 +2,7 @@
use Flarum\Api\Request;
use Flarum\Core\Repositories\UserRepositoryInterface;
use Flarum\Core\Commands\RequestPasswordResetCommand;
use Flarum\Core\Commands\RequestPasswordReset;
use Illuminate\Contracts\Bus\Dispatcher;
use Zend\Diactoros\Response\EmptyResponse;
@@ -29,7 +29,7 @@ class ForgotAction extends JsonApiAction
$email = $request->get('email');
$this->bus->dispatch(
new RequestPasswordResetCommand($email)
new RequestPasswordReset($email)
);
return new EmptyResponse();

View File

@@ -45,9 +45,9 @@ class ShowAction extends SerializeResourceAction
* Get the forum, ready to be serialized and assigned to the JsonApi
* response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @return array
* @param JsonApiRequest $request
* @param Document $document
* @return \Flarum\Core\Forum
*/
protected function data(JsonApiRequest $request, Document $document)
{

View File

@@ -1,6 +1,6 @@
<?php namespace Flarum\Api\Actions\Groups;
use Flarum\Core\Models\Group;
use Flarum\Core\Users\Group;
use Flarum\Api\Actions\SerializeCollectionAction;
use Flarum\Api\JsonApiRequest;
use Tobscure\JsonApi\Document;
@@ -46,12 +46,12 @@ class IndexAction extends SerializeCollectionAction
* Get the groups, ready to be serialized and assigned to the document
* response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @param JsonApiRequest $request
* @param Document $document
* @return \Illuminate\Database\Eloquent\Collection
*/
protected function data(JsonApiRequest $request, Document $document)
{
return Group::get();
return Group::all();
}
}

View File

@@ -12,11 +12,12 @@ abstract class JsonApiAction implements ActionInterface
* Handle an API request and return an API response, handling any relevant
* (API-related) exceptions that are thrown.
*
* @param \Flarum\Api\Request $request
* @param Request $request
* @return \Psr\Http\Message\ResponseInterface
*/
public function handle(Request $request)
{
// TODO: Move this error handling code to middleware?
try {
return $this->respond($request);
} catch (ValidationFailureException $e) {
@@ -38,7 +39,7 @@ abstract class JsonApiAction implements ActionInterface
/**
* Handle an API request and return an API response.
*
* @param \Flarum\Api\Request $request
* @param Request $request
* @return \Psr\Http\Message\ResponseInterface
*/
abstract protected function respond(Request $request);

View File

@@ -1,6 +1,6 @@
<?php namespace Flarum\Api\Actions\Notifications;
use Flarum\Core\Repositories\NotificationRepositoryInterface;
use Flarum\Core\Notifications\NotificationRepositoryInterface;
use Flarum\Core\Exceptions\PermissionDeniedException;
use Flarum\Api\Actions\SerializeCollectionAction;
use Flarum\Api\JsonApiRequest;
@@ -9,7 +9,7 @@ use Tobscure\JsonApi\Document;
class IndexAction extends SerializeCollectionAction
{
/**
* @var \Flarum\Core\Repositories\NotificationRepositoryInterface
* @var NotificationRepositoryInterface
*/
protected $notifications;
@@ -55,7 +55,7 @@ class IndexAction extends SerializeCollectionAction
/**
* Instantiate the action.
*
* @param \Flarum\Core\Repositories\NotificationRepositoryInterface $notifications
* @param NotificationRepositoryInterface $notifications
*/
public function __construct(NotificationRepositoryInterface $notifications)
{
@@ -66,22 +66,22 @@ class IndexAction extends SerializeCollectionAction
* Get the notification results, ready to be serialized and assigned to the
* document response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @param JsonApiRequest $request
* @param Document $document
* @return \Illuminate\Database\Eloquent\Collection
* @throws PermissionDeniedException
*/
protected function data(JsonApiRequest $request, Document $document)
{
if (! $request->actor->isAuthenticated()) {
$actor = $request->actor;
if ($actor->isGuest()) {
throw new PermissionDeniedException;
}
$user = $request->actor->getUser();
$actor->markNotificationsAsRead()->save();
$user->markNotificationsAsRead()->save();
return $this->notifications->findByUser($user, $request->limit, $request->offset)
return $this->notifications->findByUser($actor, $request->limit, $request->offset)
->load($request->include);
}
}

View File

@@ -1,6 +1,6 @@
<?php namespace Flarum\Api\Actions\Notifications;
use Flarum\Core\Commands\ReadNotificationCommand;
use Flarum\Core\Notifications\Commands\ReadNotification;
use Flarum\Api\Actions\SerializeResourceAction;
use Flarum\Api\JsonApiRequest;
use Illuminate\Contracts\Bus\Dispatcher;
@@ -9,7 +9,7 @@ use Tobscure\JsonApi\Document;
class UpdateAction extends SerializeResourceAction
{
/**
* @var \Illuminate\Contracts\Bus\Dispatcher
* @var Dispatcher
*/
protected $bus;
@@ -49,9 +49,7 @@ class UpdateAction extends SerializeResourceAction
public static $sort;
/**
* Instantiate the action.
*
* @param \Illuminate\Contracts\Bus\Dispatcher $bus
* @param Dispatcher $bus
*/
public function __construct(Dispatcher $bus)
{
@@ -62,14 +60,14 @@ class UpdateAction extends SerializeResourceAction
* Mark a notification as read, and return it ready to be serialized and
* assigned to the JsonApi response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @return \Illuminate\Database\Eloquent\Collection
* @param JsonApiRequest $request
* @param Document $document
* @return \Flarum\Core\Notifications\Notification
*/
protected function data(JsonApiRequest $request, Document $document)
{
return $this->bus->dispatch(
new ReadNotificationCommand($request->get('id'), $request->actor->getUser())
new ReadNotification($request->get('id'), $request->actor)
);
}
}

View File

@@ -1,7 +1,7 @@
<?php namespace Flarum\Api\Actions\Posts;
use Flarum\Core\Commands\PostReplyCommand;
use Flarum\Core\Commands\ReadDiscussionCommand;
use Flarum\Core\Posts\Commands\PostReply;
use Flarum\Core\Discussions\Commands\ReadDiscussion;
use Flarum\Api\Actions\CreateAction as BaseCreateAction;
use Flarum\Api\JsonApiRequest;
use Illuminate\Contracts\Bus\Dispatcher;
@@ -9,7 +9,7 @@ use Illuminate\Contracts\Bus\Dispatcher;
class CreateAction extends BaseCreateAction
{
/**
* @var \Illuminate\Contracts\Bus\Dispatcher
* @var Dispatcher
*/
protected $bus;
@@ -53,7 +53,7 @@ class CreateAction extends BaseCreateAction
/**
* Instantiate the action.
*
* @param \Illuminate\Contracts\Bus\Dispatcher $bus
* @param Dispatcher $bus
*/
public function __construct(Dispatcher $bus)
{
@@ -64,24 +64,23 @@ class CreateAction extends BaseCreateAction
* Reply to a discussion according to input from the API request.
*
* @param JsonApiRequest $request
* @return \Flarum\Core\Models\Model
* @return \Flarum\Core\Posts\Post
*/
protected function create(JsonApiRequest $request)
{
$user = $request->actor->getUser();
$discussionId = $request->get('data.links.discussion.linkage.id');
$actor = $request->actor;
$discussionId = $request->get('data.relationships.discussion.data.id');
$post = $this->bus->dispatch(
new PostReplyCommand($discussionId, $user, $request->get('data'))
new PostReply($discussionId, $actor, $request->get('data'))
);
// After replying, we assume that the user has seen all of the posts
// in the discussion; thus, we will mark the discussion as read if
// they are logged in.
if ($user->exists) {
if ($actor->exists) {
$this->bus->dispatch(
new ReadDiscussionCommand($discussionId, $user, $post->number)
new ReadDiscussion($discussionId, $actor, $post->number)
);
}

View File

@@ -1,6 +1,6 @@
<?php namespace Flarum\Api\Actions\Posts;
use Flarum\Core\Commands\DeletePostCommand;
use Flarum\Core\Posts\Commands\DeletePost;
use Flarum\Api\Actions\DeleteAction as BaseDeleteAction;
use Flarum\Api\Request;
use Illuminate\Contracts\Bus\Dispatcher;
@@ -8,14 +8,12 @@ use Illuminate\Contracts\Bus\Dispatcher;
class DeleteAction extends BaseDeleteAction
{
/**
* @var \Illuminate\Contracts\Bus\Dispatcher
* @var Dispatcher
*/
protected $bus;
/**
* Instantiate the action.
*
* @param \Illuminate\Contracts\Bus\Dispatcher $bus
* @param Dispatcher $bus
*/
public function __construct(Dispatcher $bus)
{
@@ -25,13 +23,13 @@ class DeleteAction extends BaseDeleteAction
/**
* Delete a post.
*
* @param \Flarum\Api\Request $request
* @param Request $request
* @return void
*/
protected function delete(Request $request)
{
$this->bus->dispatch(
new DeletePostCommand($request->get('id'), $request->actor->getUser())
new DeletePost($request->get('id'), $request->actor)
);
}
}

View File

@@ -4,12 +4,22 @@ use Flarum\Api\JsonApiRequest;
trait GetsPosts
{
/**
* @var \Flarum\Core\Posts\PostRepositoryInterface
*/
protected $posts;
/**
* @param JsonApiRequest $request
* @param array $where
* @return \Illuminate\Database\Eloquent\Collection
*/
protected function getPosts(JsonApiRequest $request, array $where)
{
$user = $request->actor->getUser();
$actor = $request->actor;
if (isset($where['discussion_id']) && ($near = $request->get('near')) > 1) {
$offset = $this->posts->getIndexForNumber($where['discussion_id'], $near, $user);
if (isset($where['discussion_id']) && ($near = $request->get('page.near')) > 1) {
$offset = $this->posts->getIndexForNumber($where['discussion_id'], $near, $actor);
$offset = max(0, $offset - $request->limit / 2);
} else {
$offset = 0;
@@ -17,7 +27,7 @@ trait GetsPosts
return $this->posts->findWhere(
$where,
$user,
$actor,
$request->sort,
$request->limit,
$offset

View File

@@ -1,6 +1,6 @@
<?php namespace Flarum\Api\Actions\Posts;
use Flarum\Core\Repositories\PostRepositoryInterface;
use Flarum\Core\Posts\PostRepositoryInterface;
use Flarum\Api\Actions\SerializeCollectionAction;
use Flarum\Api\JsonApiRequest;
use Tobscure\JsonApi\Document;
@@ -9,11 +9,6 @@ class IndexAction extends SerializeCollectionAction
{
use GetsPosts;
/**
* @var \Flarum\Core\Repositories\PostRepositoryInterface
*/
protected $posts;
/**
* @inheritdoc
*/
@@ -56,9 +51,7 @@ class IndexAction extends SerializeCollectionAction
public static $sort;
/**
* Instantiate the action.
*
* @param \Flarum\Core\Repositories\PostRepositoryInterface $posts
* @param PostRepositoryInterface $posts
*/
public function __construct(PostRepositoryInterface $posts)
{
@@ -69,26 +62,26 @@ class IndexAction extends SerializeCollectionAction
* Get the post results, ready to be serialized and assigned to the
* document response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @param JsonApiRequest $request
* @param Document $document
* @return \Illuminate\Database\Eloquent\Collection
*/
protected function data(JsonApiRequest $request, Document $document)
{
$postIds = (array) $request->get('ids');
$user = $request->actor->getUser();
$actor = $request->actor;
if (count($postIds)) {
$posts = $this->posts->findByIds($postIds, $user);
$posts = $this->posts->findByIds($postIds, $actor);
} else {
$where = [];
if ($discussionId = $request->get('discussions')) {
if ($discussionId = $request->get('filter.discussion')) {
$where['discussion_id'] = $discussionId;
}
if ($number = $request->get('number')) {
if ($number = $request->get('page.number')) {
$where['number'] = $number;
}
if ($userId = $request->get('users')) {
if ($userId = $request->get('filter.user')) {
$where['user_id'] = $userId;
}
$posts = $this->getPosts($request, $where);

View File

@@ -1,7 +1,7 @@
<?php namespace Flarum\Api\Actions\Posts;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Flarum\Core\Repositories\PostRepositoryInterface;
use Flarum\Core\Posts\PostRepositoryInterface;
use Flarum\Api\Actions\SerializeResourceAction;
use Flarum\Api\JsonApiRequest;
use Tobscure\JsonApi\Document;
@@ -9,7 +9,7 @@ use Tobscure\JsonApi\Document;
class ShowAction extends SerializeResourceAction
{
/**
* @var \Flarum\Core\Repositories\PostRepositoryInterface
* @var PostRepositoryInterface
*/
protected $posts;
@@ -55,9 +55,7 @@ class ShowAction extends SerializeResourceAction
public static $sort;
/**
* Instantiate the action.
*
* @param \Flarum\Core\Repositories\PostRepositoryInterface $posts
* @param PostRepositoryInterface $posts
*/
public function __construct(PostRepositoryInterface $posts)
{
@@ -68,12 +66,12 @@ class ShowAction extends SerializeResourceAction
* Get a single post, ready to be serialized and assigned to the JsonApi
* response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @return \Illuminate\Database\Eloquent\Collection
* @param JsonApiRequest $request
* @param Document $document
* @return \Flarum\Core\Posts\Post
*/
protected function data(JsonApiRequest $request, Document $document)
{
return $this->posts->findOrFail($request->get('id'), $request->actor->getUser());
return $this->posts->findOrFail($request->get('id'), $request->actor);
}
}

View File

@@ -1,6 +1,6 @@
<?php namespace Flarum\Api\Actions\Posts;
use Flarum\Core\Commands\EditPostCommand;
use Flarum\Core\Posts\Commands\EditPost;
use Flarum\Api\Actions\SerializeResourceAction;
use Flarum\Api\JsonApiRequest;
use Illuminate\Contracts\Bus\Dispatcher;
@@ -9,7 +9,7 @@ use Tobscure\JsonApi\Document;
class UpdateAction extends SerializeResourceAction
{
/**
* @var \Illuminate\Contracts\Bus\Dispatcher
* @var Dispatcher
*/
protected $bus;
@@ -49,9 +49,7 @@ class UpdateAction extends SerializeResourceAction
public static $sort;
/**
* Instantiate the action.
*
* @param \Illuminate\Contracts\Bus\Dispatcher $bus
* @param Dispatcher $bus
*/
public function __construct(Dispatcher $bus)
{
@@ -62,14 +60,14 @@ class UpdateAction extends SerializeResourceAction
* Update a post according to input from the API request, and return it
* ready to be serialized and assigned to the JsonApi response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @param JsonApiRequest $request
* @param Document $document
* @return \Illuminate\Database\Eloquent\Collection
*/
protected function data(JsonApiRequest $request, Document $document)
{
return $this->bus->dispatch(
new EditPostCommand($request->get('id'), $request->actor->getUser(), $request->get('data'))
new EditPost($request->get('id'), $request->actor, $request->get('data'))
);
}
}

View File

@@ -63,8 +63,8 @@ abstract class SerializeAction extends JsonApiAction
/**
* Handle an API request and return an API response.
*
* @param \Flarum\Api\Request $request
* @return \Psr\Http\Message\ResponseInterface
* @param Request $request
* @return JsonResponse
*/
public function respond(Request $request)
{
@@ -78,14 +78,15 @@ abstract class SerializeAction extends JsonApiAction
$serializer = new static::$serializer($request->actor, $request->include, $request->link);
$document->setData($this->serialize($serializer, $data));
return new JsonResponse($document, 200, ['content-type' => 'application/vnd.api+json']);
}
/**
* Get the data to be serialized and assigned to the response document.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @param JsonApiRequest $request
* @param Document $document
* @return array
*/
abstract protected function data(JsonApiRequest $request, Document $document);
@@ -93,7 +94,7 @@ abstract class SerializeAction extends JsonApiAction
/**
* Serialize the data as appropriate.
*
* @param \Tobscure\JsonApi\SerializerInterface $serializer
* @param SerializerInterface $serializer
* @param array $data
* @return \Tobscure\JsonApi\Elements\ElementInterface
*/
@@ -103,8 +104,8 @@ abstract class SerializeAction extends JsonApiAction
* Extract parameters from the request input and assign them to the
* request, restricted by the action's specifications.
*
* @param \Flarum\Api\Request $request
* @return void
* @param Request $request
* @return JsonApiRequest
*/
protected static function buildJsonApiRequest(Request $request)
{
@@ -160,8 +161,8 @@ abstract class SerializeAction extends JsonApiAction
* Add pagination links to a JSON-API response, based on input parameters
* and the default parameters of this action.
*
* @param \Tobscure\JsonApi\Document $document
* @param \Flarum\Api\JsonApiRequest $request
* @param Document $document
* @param JsonApiRequest $request
* @param string $url The base URL to build pagination links with.
* @param integer|boolean $total The total number of results (used to build
* a 'last' link), or just true if there are more results but how many

View File

@@ -7,7 +7,7 @@ abstract class SerializeCollectionAction extends SerializeAction
/**
* Serialize the data as appropriate.
*
* @param \Tobscure\JsonApi\SerializerInterface $serializer
* @param SerializerInterface $serializer
* @param array $data
* @return \Tobscure\JsonApi\Elements\Collection
*/

View File

@@ -7,7 +7,7 @@ abstract class SerializeResourceAction extends SerializeAction
/**
* Serialize the data as appropriate.
*
* @param \Tobscure\JsonApi\SerializerInterface $serializer
* @param SerializerInterface $serializer
* @param array $data
* @return \Tobscure\JsonApi\Elements\Resource
*/

View File

@@ -1,10 +1,10 @@
<?php namespace Flarum\Api\Actions;
use Flarum\Api\Commands\GenerateAccessToken;
use Flarum\Api\Request;
use Flarum\Core\Commands\GenerateAccessTokenCommand;
use Flarum\Core\Repositories\UserRepositoryInterface;
use Flarum\Core\Users\UserRepositoryInterface;
use Flarum\Core\Exceptions\PermissionDeniedException;
use Flarum\Core\Events\UserEmailChangeWasRequested;
use Flarum\Core\Users\Events\UserEmailChangeWasRequested;
use Illuminate\Contracts\Bus\Dispatcher;
use Zend\Diactoros\Response\JsonResponse;
@@ -23,7 +23,7 @@ class TokenAction extends JsonApiAction
/**
* Log in and return a token.
*
* @param \Flarum\Api\Request $request
* @param Request $request
* @return \Psr\Http\Message\ResponseInterface
* @throws PermissionDeniedException
*/
@@ -40,6 +40,7 @@ class TokenAction extends JsonApiAction
if (! $user->is_activated) {
event(new UserEmailChangeWasRequested($user, $user->email));
return new JsonResponse([
'code' => 'confirm_email',
'email' => $user->email
@@ -47,7 +48,7 @@ class TokenAction extends JsonApiAction
}
$token = $this->bus->dispatch(
new GenerateAccessTokenCommand($user->id)
new GenerateAccessToken($user->id)
);
return new JsonResponse([

View File

@@ -1,7 +1,6 @@
<?php namespace Flarum\Api\Actions\Users;
use Flarum\Core\Models\Forum;
use Flarum\Core\Commands\RegisterUserCommand;
use Flarum\Core\Users\Commands\RegisterUser;
use Flarum\Api\Actions\CreateAction as BaseCreateAction;
use Flarum\Api\JsonApiRequest;
use Illuminate\Contracts\Bus\Dispatcher;
@@ -9,19 +8,10 @@ use Illuminate\Contracts\Bus\Dispatcher;
class CreateAction extends BaseCreateAction
{
/**
* The command bus.
*
* @var \Illuminate\Contracts\Bus\Dispatcher
* @var Dispatcher
*/
protected $bus;
/**
* The default forum instance.
*
* @var \Flarum\Core\Models\Forum
*/
protected $forum;
/**
* @inheritdoc
*/
@@ -58,27 +48,23 @@ class CreateAction extends BaseCreateAction
public static $sort;
/**
* Instantiate the action.
*
* @param \Illuminate\Contracts\Bus\Dispatcher $bus
* @param \Flarum\Core\Models\Forum $forum
* @param Dispatcher $bus
*/
public function __construct(Dispatcher $bus, Forum $forum)
public function __construct(Dispatcher $bus)
{
$this->bus = $bus;
$this->forum = $forum;
}
/**
* Register a user according to input from the API request.
*
* @param JsonApiRequest $request
* @return \Flarum\Core\Models\Model
* @return \Flarum\Core\Users\User
*/
protected function create(JsonApiRequest $request)
{
return $this->bus->dispatch(
new RegisterUserCommand($request->actor->getUser(), $this->forum, $request->get('data'))
new RegisterUser($request->actor, $request->get('data'))
);
}
}

View File

@@ -1,6 +1,6 @@
<?php namespace Flarum\Api\Actions\Users;
use Flarum\Core\Commands\DeleteUserCommand;
use Flarum\Core\Users\Commands\DeleteUser;
use Flarum\Api\Actions\DeleteAction as BaseDeleteAction;
use Flarum\Api\Request;
use Illuminate\Contracts\Bus\Dispatcher;
@@ -8,16 +8,12 @@ use Illuminate\Contracts\Bus\Dispatcher;
class DeleteAction extends BaseDeleteAction
{
/**
* The command bus.
*
* @var \Illuminate\Contracts\Bus\Dispatcher
* @var Dispatcher
*/
protected $bus;
/**
* Instantiate the action.
*
* @param \Illuminate\Contracts\Bus\Dispatcher $bus
* @param Dispatcher $bus
*/
public function __construct(Dispatcher $bus)
{
@@ -27,13 +23,12 @@ class DeleteAction extends BaseDeleteAction
/**
* Delete a user.
*
* @param \Flarum\Api\Request $request
* @return void
* @param Request $request
*/
protected function delete(Request $request)
{
$this->bus->dispatch(
new DeleteUserCommand($request->get('id'), $request->actor->getUser())
new DeleteUser($request->get('id'), $request->actor)
);
}
}

View File

@@ -1,6 +1,6 @@
<?php namespace Flarum\Api\Actions\Users;
use Flarum\Core\Commands\DeleteAvatarCommand;
use Flarum\Core\Users\Commands\DeleteAvatar;
use Flarum\Api\Actions\SerializeResourceAction;
use Flarum\Api\JsonApiRequest;
use Illuminate\Contracts\Bus\Dispatcher;
@@ -9,7 +9,7 @@ use Tobscure\JsonApi\Document;
class DeleteAvatarAction extends SerializeResourceAction
{
/**
* @var \Illuminate\Contracts\Bus\Dispatcher
* @var Dispatcher
*/
protected $bus;
@@ -19,9 +19,7 @@ class DeleteAvatarAction extends SerializeResourceAction
public static $serializer = 'Flarum\Api\Serializers\UserSerializer';
/**
* Instantiate the action.
*
* @param \Illuminate\Contracts\Bus\Dispatcher $bus
* @param Dispatcher $bus
*/
public function __construct(Dispatcher $bus)
{
@@ -32,14 +30,14 @@ class DeleteAvatarAction extends SerializeResourceAction
* Delete a user's avatar, and return the user ready to be serialized and
* assigned to the JsonApi response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @return \Flarum\Core\Models\Discussion
* @param JsonApiRequest $request
* @param Document $document
* @return \Flarum\Core\Users\User
*/
protected function data(JsonApiRequest $request, Document $document)
{
return $this->bus->dispatch(
new DeleteAvatarCommand($request->get('id'), $request->actor->getUser())
new DeleteAvatar($request->get('id'), $request->actor)
);
}
}

View File

@@ -1,7 +1,7 @@
<?php namespace Flarum\Api\Actions\Users;
use Flarum\Core\Search\Users\UserSearchCriteria;
use Flarum\Core\Search\Users\UserSearcher;
use Flarum\Core\Search\SearchCriteria;
use Flarum\Core\Users\Search\UserSearcher;
use Flarum\Api\Actions\SerializeCollectionAction;
use Flarum\Api\JsonApiRequest;
use Flarum\Http\UrlGeneratorInterface;
@@ -10,16 +10,12 @@ use Tobscure\JsonApi\Document;
class IndexAction extends SerializeCollectionAction
{
/**
* The user searcher.
*
* @var \Flarum\Core\Search\Users\UserSearcher
* @var UserSearcher
*/
protected $searcher;
/**
* The URL generator.
*
* @var \Flarum\Http\UrlGeneratorInterface
* @var UrlGeneratorInterface
*/
protected $url;
@@ -61,10 +57,8 @@ class IndexAction extends SerializeCollectionAction
public static $sort;
/**
* Instantiate the action.
*
* @param \Flarum\Core\Search\Users\UserSearcher $searcher
* @param \Flarum\Http\UrlGeneratorInterface $url
* @param UserSearcher $searcher
* @param UrlGeneratorInterface $url
*/
public function __construct(UserSearcher $searcher, UrlGeneratorInterface $url)
{
@@ -76,15 +70,15 @@ class IndexAction extends SerializeCollectionAction
* Get the user results, ready to be serialized and assigned to the
* document response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @param JsonApiRequest $request
* @param Document $document
* @return \Illuminate\Database\Eloquent\Collection
*/
protected function data(JsonApiRequest $request, Document $document)
{
$criteria = new UserSearchCriteria(
$request->actor->getUser(),
$request->get('q'),
$criteria = new SearchCriteria(
$request->actor,
$request->get('filter.q'),
$request->sort
);
@@ -97,6 +91,6 @@ class IndexAction extends SerializeCollectionAction
$results->areMoreResults()
);
return $results->getUsers();
return $results->getResults();
}
}

View File

@@ -1,6 +1,6 @@
<?php namespace Flarum\Api\Actions\Users;
use Flarum\Core\Repositories\UserRepositoryInterface;
use Flarum\Core\Users\UserRepositoryInterface;
use Flarum\Api\Actions\SerializeResourceAction;
use Flarum\Api\JsonApiRequest;
use Tobscure\JsonApi\Document;
@@ -8,7 +8,7 @@ use Tobscure\JsonApi\Document;
class ShowAction extends SerializeResourceAction
{
/**
* @var \Flarum\Core\Repositories\UserRepositoryInterface
* @var UserRepositoryInterface
*/
protected $users;
@@ -50,9 +50,7 @@ class ShowAction extends SerializeResourceAction
public static $sort;
/**
* Instantiate the action.
*
* @param \Flarum\Core\Repositories\UserRepositoryInterface $users
* @param UserRepositoryInterface $users
*/
public function __construct(UserRepositoryInterface $users)
{
@@ -63,9 +61,9 @@ class ShowAction extends SerializeResourceAction
* Get a single user, ready to be serialized and assigned to the JsonApi
* response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @return \Flarum\Core\Models\Discussion
* @param JsonApiRequest $request
* @param Document $document
* @return \Flarum\Core\Users\User
*/
protected function data(JsonApiRequest $request, Document $document)
{
@@ -75,6 +73,6 @@ class ShowAction extends SerializeResourceAction
$id = $this->users->getIdForUsername($id);
}
return $this->users->findOrFail($id, $request->actor->getUser());
return $this->users->findOrFail($id, $request->actor);
}
}

View File

@@ -1,6 +1,6 @@
<?php namespace Flarum\Api\Actions\Users;
use Flarum\Core\Commands\EditUserCommand;
use Flarum\Core\Users\Commands\EditUser;
use Flarum\Api\Actions\SerializeResourceAction;
use Flarum\Api\JsonApiRequest;
use Illuminate\Contracts\Bus\Dispatcher;
@@ -9,14 +9,14 @@ use Tobscure\JsonApi\Document;
class UpdateAction extends SerializeResourceAction
{
/**
* @var \Illuminate\Contracts\Bus\Dispatcher
* @var Dispatcher
*/
protected $bus;
/**
* @inheritdoc
*/
public static $serializer = 'Flarum\Api\Serializers\UserSerializer';
public static $serializer = 'Flarum\Api\Serializers\CurrentUserSerializer';
/**
* @inheritdoc
@@ -49,9 +49,7 @@ class UpdateAction extends SerializeResourceAction
public static $sort;
/**
* Instantiate the action.
*
* @param \Illuminate\Contracts\Bus\Dispatcher $bus
* @param Dispatcher $bus
*/
public function __construct(Dispatcher $bus)
{
@@ -62,14 +60,14 @@ class UpdateAction extends SerializeResourceAction
* Update a user according to input from the API request, and return it
* ready to be serialized and assigned to the JsonApi response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @return \Flarum\Core\Models\Discussion
* @param JsonApiRequest $request
* @param Document $document
* @return \Flarum\Core\Users\User
*/
protected function data(JsonApiRequest $request, Document $document)
{
return $this->bus->dispatch(
new EditUserCommand($request->get('id'), $request->actor->getUser(), $request->get('data'))
new EditUser($request->get('id'), $request->actor, $request->get('data'))
);
}
}

View File

@@ -1,6 +1,6 @@
<?php namespace Flarum\Api\Actions\Users;
use Flarum\Core\Commands\UploadAvatarCommand;
use Flarum\Core\Users\Commands\UploadAvatar;
use Flarum\Api\Actions\SerializeResourceAction;
use Flarum\Api\JsonApiRequest;
use Illuminate\Contracts\Bus\Dispatcher;
@@ -9,7 +9,7 @@ use Tobscure\JsonApi\Document;
class UploadAvatarAction extends SerializeResourceAction
{
/**
* @var \Illuminate\Contracts\Bus\Dispatcher
* @var Dispatcher
*/
protected $bus;
@@ -49,9 +49,7 @@ class UploadAvatarAction extends SerializeResourceAction
public static $sort;
/**
* Instantiate the action.
*
* @param \Illuminate\Contracts\Bus\Dispatcher $bus
* @param Dispatcher $bus
*/
public function __construct(Dispatcher $bus)
{
@@ -62,17 +60,17 @@ class UploadAvatarAction extends SerializeResourceAction
* Upload an avatar for a user, and return the user ready to be serialized
* and assigned to the JsonApi response.
*
* @param \Flarum\Api\JsonApiRequest $request
* @param \Tobscure\JsonApi\Document $document
* @return \Flarum\Core\Models\Discussion
* @param JsonApiRequest $request
* @param Document $document
* @return \Flarum\Core\Users\User
*/
protected function data(JsonApiRequest $request, Document $document)
{
return $this->bus->dispatch(
new UploadAvatarCommand(
new UploadAvatar(
$request->get('id'),
$request->http->getUploadedFiles()['avatar'],
$request->actor->getUser()
$request->actor
)
);
}