Transform id keys from Bulk routes

This commit is contained in:
David Bomba 2019-06-12 14:22:05 +10:00
parent 3ca2c26e90
commit 544e59bbba
9 changed files with 138 additions and 12 deletions

View File

@ -20,11 +20,13 @@ use App\Http\Requests\User\EditUserRequest;
use App\Http\Requests\User\ShowUserRequest; use App\Http\Requests\User\ShowUserRequest;
use App\Http\Requests\User\StoreUserRequest; use App\Http\Requests\User\StoreUserRequest;
use App\Http\Requests\User\UpdateUserRequest; use App\Http\Requests\User\UpdateUserRequest;
use App\Jobs\Company\CreateCompanyToken;
use App\Models\User; use App\Models\User;
use App\Repositories\UserRepository; use App\Repositories\UserRepository;
use App\Transformers\UserTransformer; use App\Transformers\UserTransformer;
use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesHash;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
/** /**
* Class UserController * Class UserController
@ -63,9 +65,11 @@ class UserController extends BaseController
*/ */
public function index(UserFilters $filters) public function index(UserFilters $filters)
{ {
$users = User::filter($filters); $users = User::filter($filters);
return $this->listResponse($users); return $this->listResponse($users);
} }
/** /**
@ -75,9 +79,11 @@ class UserController extends BaseController
*/ */
public function create(CreateUserRequest $request) public function create(CreateUserRequest $request)
{ {
$user = UserFactory::create(); $user = UserFactory::create();
return $this->itemResponse($user); return $this->itemResponse($user);
} }
/** /**
@ -88,8 +94,10 @@ class UserController extends BaseController
*/ */
public function store(StoreUserRequest $request) public function store(StoreUserRequest $request)
{ {
$company = auth()->user()->company(); $company = auth()->user()->company();
//save user //save user
$user = $this->user_repo->save($request->all(), UserFactory::create($company->id, auth()->user()->id)); $user = $this->user_repo->save($request->all(), UserFactory::create($company->id, auth()->user()->id));
$user->companies()->attach($company->id, [ $user->companies()->attach($company->id, [
@ -101,6 +109,8 @@ class UserController extends BaseController
'settings' => $request->input('settings'), 'settings' => $request->input('settings'),
]); ]);
CreateCompanyToken::dispatchNow($company, $user);
$user->load('companies'); $user->load('companies');
return $this->itemResponse($user); return $this->itemResponse($user);
@ -142,6 +152,7 @@ class UserController extends BaseController
*/ */
public function update(UpdateUserRequest $request, User $user) public function update(UpdateUserRequest $request, User $user)
{ {
$user = $this->user_repo->save($request->all(), $user); $user = $this->user_repo->save($request->all(), $user);
return $this->itemResponse($user); return $this->itemResponse($user);
@ -156,10 +167,39 @@ class UserController extends BaseController
*/ */
public function destroy(DestroyUserRequest $request, User $user) public function destroy(DestroyUserRequest $request, User $user)
{ {
$user->delete(); $user->delete();
$user->tokens->delete();
return response()->json([], 200); return response()->json([], 200);
}
/**
* Perform bulk actions on the list view
*
* @return Collection
*/
public function bulk()
{
$action = request()->input('action');
$ids = request()->input('ids');
$ids = $this->transformKeys($ids);
$users = User::withTrashed()->find($ids);
$users->each(function ($user, $key) use($action){
if(auth()->user()->can('edit', $user))
$this->user_repo->{$action}($user);
});
//todo need to return the updated dataset
return $this->listResponse(User::withTrashed()->whereIn('id', $ids));
} }
} }

View File

@ -11,6 +11,7 @@
namespace App\Http\Requests\User; namespace App\Http\Requests\User;
use App\DataMapper\DefaultSettings;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Http\ValidationRules\NewUniqueUserRule; use App\Http\ValidationRules\NewUniqueUserRule;
use App\Models\User; use App\Models\User;
@ -25,27 +26,39 @@ class StoreUserRequest extends Request
public function authorize() : bool public function authorize() : bool
{ {
return auth()->user()->can('create', User::class); return auth()->user()->can('create', User::class);
} }
public function rules() public function rules()
{ {
$this->sanitize();
return [ return [
'first_name' => 'required|string|max:100', 'first_name' => 'required|string|max:100',
'last_name' => 'required|string:max:100', 'last_name' => 'required|string:max:100',
'email' => new NewUniqueUserRule(), 'email' => new NewUniqueUserRule(),
'is_admin' => 'required',
]; ];
}
}
public function sanitize() public function sanitize()
{ {
//do post processing of user request $input = $this->all();
}
public function messages() if(!isset($input['is_admin']))
{ $input['is_admin'] = null;
if(!isset($input['permissions']))
$input['permissions'] = json_encode([]);
if(!isset($input['settings']))
$input['settings'] = json_encode(DefaultSettings::userSettings());
$this->replace($input);
} }

View File

@ -25,6 +25,7 @@ class CompanyUser extends Pivot
*/ */
protected $casts = [ protected $casts = [
'settings' => 'collection', 'settings' => 'collection',
'permissions' => 'object',
]; ];
public function account() public function account()

View File

@ -16,8 +16,8 @@ use App\Events\Invoice\InvoiceWasCreated;
use App\Events\Invoice\InvoiceWasMarkedSent; use App\Events\Invoice\InvoiceWasMarkedSent;
use App\Events\Invoice\InvoiceWasUpdated; use App\Events\Invoice\InvoiceWasUpdated;
use App\Events\Payment\PaymentWasCreated; use App\Events\Payment\PaymentWasCreated;
use App\Events\User\UserCreated;
use App\Events\User\UserLoggedIn; use App\Events\User\UserLoggedIn;
use App\Events\User\UserWasCreated;
use App\Listeners\Activity\CreatedClientActivity; use App\Listeners\Activity\CreatedClientActivity;
use App\Listeners\Activity\PaymentCreatedActivity; use App\Listeners\Activity\PaymentCreatedActivity;
use App\Listeners\Invoice\CreateInvoiceActivity; use App\Listeners\Invoice\CreateInvoiceActivity;
@ -35,7 +35,7 @@ class EventServiceProvider extends ServiceProvider
* @var array * @var array
*/ */
protected $listen = [ protected $listen = [
UserCreated::class => [ UserWasCreated::class => [
SendVerificationNotification::class, SendVerificationNotification::class,
], ],
UserLoggedIn::class => [ UserLoggedIn::class => [

View File

@ -11,12 +11,14 @@
namespace App\Repositories; namespace App\Repositories;
use App\Utils\Traits\MakesHash;
/** /**
* *
*/ */
class BaseRepository class BaseRepository
{ {
use MakesHash;
/** /**
* @return null * @return null
*/ */
@ -122,6 +124,8 @@ class BaseRepository
return 0; return 0;
} }
$ids = $this->transformKeys($ids);
$entities = $this->findByPublicIdsWithTrashed($ids); $entities = $this->findByPublicIdsWithTrashed($ids);
foreach ($entities as $entity) { foreach ($entities as $entity) {

View File

@ -84,10 +84,10 @@ class UserTransformer extends EntityTransformer
public function includeUserCompany(User $user) public function includeUserCompany(User $user)
{ {
//cannot use this here as it will fail retrieving the company as we depend on the token in the header which may not be present for this request
//$transformer = new CompanyUserTransformer($this->serializer); $transformer = new CompanyUserTransformer($this->serializer);
//return $this->includeItem($user->user_company(), $transformer, CompanyUser::class); return $this->includeItem($user->user_company(), $transformer, CompanyUser::class);
} }

View File

@ -72,4 +72,21 @@ trait MakesHash
return response()->json(['error'=>'Invalid primary key'],400); return response()->json(['error'=>'Invalid primary key'],400);
} }
} }
public function transformKeys($keys)
{
if(is_array($keys))
{
foreach($keys as &$value)
{
$value = $this->decodePrimaryKey($value);
}
return $keys;
}
else
return $this->decodePrimaryKey($keys);
}
} }

View File

@ -63,6 +63,8 @@ Route::group(['middleware' => ['db','api_secret_check','token_auth'], 'prefix' =
Route::resource('users', 'UserController'); // name = (users. index / create / show / update / destroy / edit Route::resource('users', 'UserController'); // name = (users. index / create / show / update / destroy / edit
Route::post('users/bulk', 'UserController@bulk')->name('users.bulk');
/* /*
Route::resource('tasks', 'TaskController'); // name = (tasks. index / create / show / update / destroy / edit Route::resource('tasks', 'TaskController'); // name = (tasks. index / create / show / update / destroy / edit

View File

@ -0,0 +1,49 @@
<?php
namespace Tests\Unit;
use App\DataMapper\ClientSettings;
use App\DataMapper\CompanySettings;
use App\Utils\Traits\MakesHash;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\TestCase;
/**
* @test
* @covers App\Utils\Traits\MakesHash;
*/
class PrimaryKeyTransformationTest extends TestCase
{
use MakesHash;
public function setUp() :void
{
parent::setUp();
}
public function testTransformationArray()
{
$keys = [
'gl9avZgaG1', '7LDdwrmb1Y'
];
$transformed_keys = $this->transformKeys($keys);
$this->assertEquals(310, $transformed_keys[0]);
$this->assertEquals(311, $transformed_keys[1]);
}
public function testTransformation()
{
$keys = 'gl9avZgaG1';
$this->assertEquals(310, $this->transformKeys($keys));
}
}