diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 33eb3fb66eb7..b90da60b2431 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -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)); + } } diff --git a/app/Http/Requests/User/StoreUserRequest.php b/app/Http/Requests/User/StoreUserRequest.php index d5a025dbff6b..890a508602aa 100644 --- a/app/Http/Requests/User/StoreUserRequest.php +++ b/app/Http/Requests/User/StoreUserRequest.php @@ -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); } diff --git a/app/Models/CompanyUser.php b/app/Models/CompanyUser.php index 4ecca6e0be28..c2987e161b84 100644 --- a/app/Models/CompanyUser.php +++ b/app/Models/CompanyUser.php @@ -25,6 +25,7 @@ class CompanyUser extends Pivot */ protected $casts = [ 'settings' => 'collection', + 'permissions' => 'object', ]; public function account() diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index b9bc399c2bac..12c5dc6c997d 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -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 => [ diff --git a/app/Repositories/BaseRepository.php b/app/Repositories/BaseRepository.php index 8d3f419bfd0c..0c7c4e6fdfc1 100644 --- a/app/Repositories/BaseRepository.php +++ b/app/Repositories/BaseRepository.php @@ -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) { diff --git a/app/Transformers/UserTransformer.php b/app/Transformers/UserTransformer.php index 9b24432e342c..e3c6372afc45 100644 --- a/app/Transformers/UserTransformer.php +++ b/app/Transformers/UserTransformer.php @@ -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); } diff --git a/app/Utils/Traits/MakesHash.php b/app/Utils/Traits/MakesHash.php index 1d51cb685798..867e8a0a81da 100644 --- a/app/Utils/Traits/MakesHash.php +++ b/app/Utils/Traits/MakesHash.php @@ -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); + + } } \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index b61b9cb8ed33..c28bf536c591 100644 --- a/routes/api.php +++ b/routes/api.php @@ -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 diff --git a/tests/Unit/PrimaryKeyTransformationTest.php b/tests/Unit/PrimaryKeyTransformationTest.php new file mode 100644 index 000000000000..3bcd594cfabe --- /dev/null +++ b/tests/Unit/PrimaryKeyTransformationTest.php @@ -0,0 +1,49 @@ +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)); + } + +}