Added Team Member API. Closes #1822

This commit is contained in:
James Brooks
2016-06-02 11:45:10 +01:00
committed by James Brooks
parent 690290449e
commit 2048e0899c
9 changed files with 406 additions and 2 deletions

View File

@@ -48,8 +48,9 @@ final class AddTeamMemberCommand
*/
public $rules = [
'name' => 'required|string',
'password' => 'string',
'level' => 'int',
'email' => 'required|email',
'password' => 'required|string',
'level' => 'int|min:1|max:2',
];
/**

View File

@@ -0,0 +1,90 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace CachetHQ\Cachet\Bus\Commands\User;
use CachetHQ\Cachet\Models\User;
/**
* This is the update team member command.
*
* @author James Brooks <james@alt-three.com>
*/
final class UpdateTeamMemberCommand
{
/**
* The user to update.
*
* @var \CachetHQ\Cachet\Models\User
*/
public $user;
/**
* The user username.
*
* @var string
*/
public $username;
/**
* The user password.
*
* @var string
*/
public $password;
/**
* The user email.
*
* @var string
*/
public $email;
/**
* The user level.
*
* @var int
*/
public $level;
/**
* The validation rules.
*
* @var string[]
*/
public $rules = [
'user' => 'required',
'name' => 'required|string',
'email' => 'required|email',
'password' => 'required|string',
'level' => 'int|min:1|max:2',
];
/**
* Create a new add team member command instance.
*
* @param \CachetHQ\Cachet\Models\User $user
* @param string $username
* @param string $password
* @param string $email
* @param int $level
*
* @return void
*/
public function __construct(User $user, $username, $password, $email, $level)
{
$this->user = $user;
$this->username = $username;
$this->password = $password;
$this->email = $email;
$this->level = $level;
}
}

View File

@@ -0,0 +1,41 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace CachetHQ\Cachet\Bus\Events\User;
use CachetHQ\Cachet\Models\User;
/**
* This is the user was updated event.
*
* @author James Brooks <james@alt-three.com>
*/
final class UserWasUpdatedEvent implements UserEventInterface
{
/**
* The user that has been updated.
*
* @var \CachetHQ\Cachet\Models\User
*/
public $user;
/**
* Create a new user was updated event instance.
*
* @param \CachetHQ\Cachet\Models\User $user
*
* @return void
*/
public function __construct(User $user)
{
$this->user = $user;
}
}

View File

@@ -0,0 +1,63 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace CachetHQ\Cachet\Bus\Handlers\Commands\User;
use CachetHQ\Cachet\Bus\Commands\User\UpdateTeamMemberCommand;
use CachetHQ\Cachet\Bus\Events\User\UserWasUpdatedEvent;
use CachetHQ\Cachet\Models\User;
/**
* This is the update team member command handler.
*
* @author James Brooks <james@alt-three.com>
*/
class UpdateTeamMemberCommandHandler
{
/**
* Handle the add team member command.
*
* @param \CachetHQ\Cachet\Bus\Commands\User\UpdateTeamMemberCommand $command
*
* @return \CachetHQ\Cachet\Models\User
*/
public function handle(UpdateTeamMemberCommand $command)
{
$user = $command->user;
$user->update($this->filter($command));
event(new UserWasUpdatedEvent($user));
return $user;
}
/**
* Filter the command data.
*
* @param \CachetHQ\Cachet\Bus\Commands\User\UpdateTeamMemberCommand $command
*
* @return array
*/
protected function filter(UpdateTeamMemberCommand $command)
{
$params = [
'username' => $command->username,
'password' => $command->password,
'email' => $command->email,
'level' => $command->level,
];
return array_filter($params, function ($val) {
return $val !== null;
});
}
}

View File

@@ -90,5 +90,8 @@ class EventServiceProvider extends ServiceProvider
'CachetHQ\Cachet\Bus\Events\User\UserWasInvitedEvent' => [
'CachetHQ\Cachet\Bus\Handlers\Events\User\SendInviteUserEmailHandler',
],
'CachetHQ\Cachet\Bus\Events\User\UserWasUpdatedEvent' => [
//
],
];
}

View File

@@ -0,0 +1,87 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace CachetHQ\Cachet\Http\Controllers\Api;
use CachetHQ\Cachet\Bus\Commands\User\AddTeamMemberCommand;
use CachetHQ\Cachet\Bus\Commands\User\RemoveUserCommand;
use CachetHQ\Cachet\Bus\Commands\User\UpdateTeamMemberCommand;
use CachetHQ\Cachet\Models\User;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Database\QueryException;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
/**
* This is the user controller class.
*
* @author James Brooks <james@alt-three.com>
*/
class UserController extends AbstractApiController
{
/**
* Create a new user.
*
* @return \Illuminate\Http\JsonResponse
*/
public function postUsers()
{
try {
$user = dispatch(new AddTeamMemberCommand(
Binput::get('username'),
Binput::get('password'),
Binput::get('email'),
Binput::get('level', User::LEVEL_USER)
));
} catch (QueryException $e) {
throw new BadRequestHttpException();
}
return $this->item($user);
}
/**
* Update an existing user.
*
* @param \CachetHQ\Cachet\Models\User $user
*
* @return \Illuminate\Http\JsonResponse
*/
public function putUser(User $user)
{
try {
dispatch(new UpdateTeamMemberCommand(
$user,
Binput::get('username'),
Binput::get('password'),
Binput::get('email'),
Binput::get('level')
));
} catch (QueryException $e) {
throw new BadRequestHttpException();
}
return $this->item($user);
}
/**
* Delete a user from the system.
*
* @param \CachetHQ\Cachet\Models\User $user
*
* @return \Illuminate\Http\JsonResponse
*/
public function deleteUser(User $user)
{
dispatch(new RemoveUserCommand($user));
return $this->noContent();
}
}

View File

@@ -67,6 +67,7 @@ class ApiRoutes
$router->post('metrics/{metric}/points', 'MetricPointController@postMetricPoints');
$router->post('subscribers', 'SubscriberController@postSubscribers');
$router->post('tags', 'TagController@postTags');
$router->post('users', 'UserController@postUsers');
$router->put('components/groups/{component_group}', 'ComponentGroupController@putGroup');
$router->put('components/{component}', 'ComponentController@putComponent');
@@ -75,6 +76,7 @@ class ApiRoutes
$router->put('metrics/{metric}', 'MetricController@putMetric');
$router->put('metrics/{metric}/points/{metric_point}', 'MetricPointController@putMetricPoint');
$router->put('tags/{tag}', 'TagController@putTag');
$router->put('users/{user}', 'UserController@putUser');
$router->delete('components/groups/{component_group}', 'ComponentGroupController@deleteGroup');
$router->delete('components/tags', 'ComponentTagController@deleteTag');
@@ -86,6 +88,7 @@ class ApiRoutes
$router->delete('subscribers/{subscriber}', 'SubscriberController@deleteSubscriber');
$router->delete('subscriptions/{subscription}', 'SubscriberController@deleteSubscription');
$router->delete('tags/{tag}', 'TagController@deleteTag');
$router->delete('users/{user}', 'UserController@deleteUser');
});
});
}

57
tests/Api/UserTest.php Normal file
View File

@@ -0,0 +1,57 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace CachetHQ\Tests\Cachet\Api;
/**
* This is the user test class.
*
* @author James Brooks <james@alt-three.com>
*/
class UserTest extends AbstractApiTestCase
{
public function testCreateUser()
{
$this->beUser();
$this->post('/api/v1/users', [
'username' => 'Alt Three',
'email' => 'support@alt-three.com',
'password' => 'AltTheeWinsLife',
]);
$this->assertResponseOk();
$this->seeHeader('Content-Type', 'application/json');
$this->seeJson(['email' => 'support@alt-three.com']);
}
public function testUpdateUser()
{
$this->beUser();
$user = factory('CachetHQ\Cachet\Models\User')->create();
$this->put("/api/v1/users/{$user->id}", [
'username' => 'jbrooksuk',
]);
$this->seeHeader('Content-Type', 'application/json');
$this->seeJson(['username' => 'jbrooksuk']);
}
public function testDeleteUser()
{
$this->beUser();
$user = factory('CachetHQ\Cachet\Models\User')->create();
$this->delete("/api/v1/users/{$user->id}");
$this->assertResponseStatus(204);
}
}

View File

@@ -0,0 +1,59 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace CachetHQ\Tests\Cachet\Bus\Commands\User;
use AltThree\TestBench\CommandTrait;
use CachetHQ\Cachet\Bus\Commands\User\UpdateTeamMemberCommand;
use CachetHQ\Cachet\Bus\Handlers\Commands\User\UpdateTeamMemberCommandHandler;
use CachetHQ\Cachet\Models\User;
use CachetHQ\Tests\Cachet\AbstractTestCase;
/**
* This is the update team member command test class.
*
* @author James Brooks <james@alt-three.com>
*/
class UpdateTeamMemberCommandTest extends AbstractTestCase
{
use CommandTrait;
protected function getObjectAndParams()
{
$params = [
'user' => new User(),
'username' => 'Test',
'password' => 'fooey',
'email' => 'test@test.com',
'level' => 1,
];
$object = new UpdateTeamMemberCommand(
$params['user'],
$params['username'],
$params['password'],
$params['email'],
$params['level']
);
return compact('params', 'object');
}
protected function objectHasRules()
{
return true;
}
protected function getHandlerClass()
{
return UpdateTeamMemberCommandHandler::class;
}
}