mirror of
https://github.com/cachethq/cachet.git
synced 2026-06-29 07:16:20 +00:00
Added Team Member API. Closes #1822
This commit is contained in:
committed by
James Brooks
parent
690290449e
commit
2048e0899c
@@ -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',
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
90
app/Bus/Commands/User/UpdateTeamMemberCommand.php
Normal file
90
app/Bus/Commands/User/UpdateTeamMemberCommand.php
Normal 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;
|
||||
}
|
||||
}
|
||||
41
app/Bus/Events/User/UserWasUpdatedEvent.php
Normal file
41
app/Bus/Events/User/UserWasUpdatedEvent.php
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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' => [
|
||||
//
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
87
app/Http/Controllers/Api/UserController.php
Normal file
87
app/Http/Controllers/Api/UserController.php
Normal 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();
|
||||
}
|
||||
}
|
||||
@@ -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
57
tests/Api/UserTest.php
Normal 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);
|
||||
}
|
||||
}
|
||||
59
tests/Bus/Commands/User/UpdateTeamMemberCommandTest.php
Normal file
59
tests/Bus/Commands/User/UpdateTeamMemberCommandTest.php
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user