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\StoreUserRequest;
use App\Http\Requests\User\UpdateUserRequest;
use App\Jobs\Company\CreateCompanyToken;
use App\Models\User;
use App\Repositories\UserRepository;
use App\Transformers\UserTransformer;
use App\Utils\Traits\MakesHash;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
/**
* Class UserController
@ -63,9 +65,11 @@ class UserController extends BaseController
*/
public function index(UserFilters $filters)
{
$users = User::filter($filters);
return $this->listResponse($users);
}
/**
@ -75,9 +79,11 @@ class UserController extends BaseController
*/
public function create(CreateUserRequest $request)
{
$user = UserFactory::create();
return $this->itemResponse($user);
}
/**
@ -88,8 +94,10 @@ class UserController extends BaseController
*/
public function store(StoreUserRequest $request)
{
$company = auth()->user()->company();
//save user
$user = $this->user_repo->save($request->all(), UserFactory::create($company->id, auth()->user()->id));
$user->companies()->attach($company->id, [
@ -101,6 +109,8 @@ class UserController extends BaseController
'settings' => $request->input('settings'),
]);
CreateCompanyToken::dispatchNow($company, $user);
$user->load('companies');
return $this->itemResponse($user);
@ -142,6 +152,7 @@ class UserController extends BaseController
*/
public function update(UpdateUserRequest $request, User $user)
{
$user = $this->user_repo->save($request->all(), $user);
return $this->itemResponse($user);
@ -156,10 +167,39 @@ class UserController extends BaseController
*/
public function destroy(DestroyUserRequest $request, User $user)
{
$user->delete();
$user->tokens->delete();
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;
use App\DataMapper\DefaultSettings;
use App\Http\Requests\Request;
use App\Http\ValidationRules\NewUniqueUserRule;
use App\Models\User;
@ -25,27 +26,39 @@ class StoreUserRequest extends Request
public function authorize() : bool
{
return auth()->user()->can('create', User::class);
}
public function rules()
{
$this->sanitize();
return [
'first_name' => 'required|string|max:100',
'last_name' => 'required|string:max:100',
'email' => new NewUniqueUserRule(),
'is_admin' => 'required',
];
}
}
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 = [
'settings' => 'collection',
'permissions' => 'object',
];
public function account()

View File

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

View File

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

View File

@ -84,10 +84,10 @@ class UserTransformer extends EntityTransformer
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);
}
}
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::post('users/bulk', 'UserController@bulk')->name('users.bulk');
/*
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));
}
}