Skip to content

Commit

Permalink
feat: update AccessRight module
Browse files Browse the repository at this point in the history
  • Loading branch information
unknown committed May 25, 2021
1 parent a05b9e2 commit 92676db
Show file tree
Hide file tree
Showing 14 changed files with 213 additions and 31 deletions.
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ DB_PASSWORD=
BROADCAST_DRIVER=pusher
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=file
SESSION_DRIVER=redis
SESSION_LIFETIME=120

MEMCACHED_HOST=127.0.0.1
Expand Down
39 changes: 23 additions & 16 deletions app/Http/Controllers/Api/AccessRight/AccessRightsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@
use App\Http\Requests\AccessRight\DestroyRequest;
use App\Http\Requests\AccessRight\StoreRequest;
use App\Http\Requests\AccessRight\UpdateRequest;
use App\Models\Role as ModelsRole;
use App\Models\Role;
use App\Traits\AccessRight\AccessRightServices;
use App\Traits\Api\ApiResponser;
use Spatie\Permission\Models\Role;

class AccessRightsController extends Controller
{
Expand All @@ -21,19 +20,28 @@ public function __construct()
}

/**
* Display a listing of the resource.
* Display a listing of the resource access rights.
*
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$roles = Role::latest()->get(['id', 'name', 'enabled']);
setSqlModeEmpty();

$roles = Role::selectRaw(
'roles.id,
roles.name,
COUNT(model_has_roles.role_id) as employees'
)
->leftJoin('model_has_roles', 'model_has_roles.role_id', '=', 'roles.id')
->groupBy('roles.id')
->get();

return !$roles->count()
? $this->noContent()
: $this->success($roles);
}

/**
* Store a newly created resource in storage.
*
Expand All @@ -56,17 +64,16 @@ public function store(StoreRequest $request)
/**
* Display the specified resource.
*
* @param ModelsRole $role
* @param Role $role
* @return \Illuminate\Http\JsonResponse
*/
public function show(ModelsRole $role)
public function show(Role $role)
{
return !$role
$result = Role::with('permissions')->find($role->id);

return !$result
? $this->noContent()
: $this->success([
'role' => $role->name,
'permissions' => $role->permissions->map->name
]);
: $this->success($result);
}

/**
Expand All @@ -76,18 +83,18 @@ public function show(ModelsRole $role)
* @param Role $role
* @return \Illuminate\Http\JsonResponse
*/
public function update(UpdateRequest $request, Role $role)
public function update(UpdateRequest $request, Role $roleModel)
{
$result = $this->updateAccessRight(
$role,
$request->role_name,
$roleModel,
$request->role,
$request->permissions,
$request->enabled
);

return $result !== true
? $this->error($result, 500)
: $this->success(null, 'Access right created successfully.');
: $this->success(null, 'Access right updated successfully.');
}

/**
Expand Down
32 changes: 23 additions & 9 deletions app/Http/Controllers/Api/AccessRight/PermissionController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
use Illuminate\Http\Request;
use App\Traits\Api\ApiResponser;
use App\Http\Controllers\Controller;
use App\Traits\Cache\CacheServices;
use Illuminate\Support\Facades\Cache;
use Spatie\Permission\Models\Permission;
use App\Models\Permission;

class PermissionController extends Controller
{
use ApiResponser;
use ApiResponser, CacheServices;

public function __construct()
{
Expand All @@ -23,13 +24,26 @@ public function __construct()
* @return \Illuminate\Http\Response
*/
public function __invoke()
{
$result = Cache::remember('permissions', 1, function () {
return Permission::all('id', 'name');
});
{
$key = $this->cacheKey('permissions');

$result = Cache::store('redis')
->remember($key, 15, function ()
{
$permissions = Permission::all('id', 'name', 'batch_name');
$groupedData = [];

foreach ($permissions as $permission) {
$groupedData[$permission->batch_name][] = $permission;
}

uasort($groupedData, function ($permissionOne, $permissionTwo) {
return count($permissionOne) <=> count($permissionTwo);
});

return $groupedData;
});

return !$result->count()
? $this->noContent()
: $this->success($result);
return $this->success($result);
}
}
47 changes: 47 additions & 0 deletions app/Http/Controllers/Api/AccessRight/RolesController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace App\Http\Controllers\Api\AccessRight;

use App\Models\Role;
use Illuminate\Http\Request;
use App\Traits\Api\ApiResponser;
use App\Http\Controllers\Controller;
use App\Traits\Cache\CacheServices;
use Carbon\Carbon;
use Illuminate\Support\Facades\Cache;

class RolesController extends Controller
{
use ApiResponser, CacheServices;

public function __construct()
{
$this->middleware(['auth:api', 'permission:Manage Access Rights']);
}

/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function __invoke()
{
$id = request()->input('exceptRoleId');
$enabled = request()->input('enabled');

$key = $this->cacheKey('role');

$roles = Cache::store('redis')->remember($key, Carbon::now()->endOfDay()->addSecond(),
function () use ($id, $enabled) {
return Role::when($id, fn ($q) => $q->where('id', '!=', $id))
->when($enabled, fn ($q) => $q->where('enabled', $enabled))
->latest()
->get([ 'id', 'name', 'enabled' ]);
});

return !$roles->count()
? $this->noContent()
: $this->success($roles);
}
}
2 changes: 1 addition & 1 deletion app/Http/Requests/AccessRight/StoreRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public function rules()
{
return [
'role' => ['required', 'string', 'unique:roles,name'],
'permissions.*' => ['required', 'distinct', 'exists:permissions,name'],
'permissions.*' => ['required', 'distinct', 'exists:permissions,id'],
'enabled' => ['required', 'boolean']
];
}
Expand Down
2 changes: 1 addition & 1 deletion app/Http/Requests/AccessRight/UpdateRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public function rules()
return [
'id' => ['required', 'integer', 'exists:roles,id'],
'role' => ['required', 'string', 'unique:roles,name,' . $this->id],
'permissions.*' => ['required', 'distinct', 'exists:permissions,name'],
'permissions.*' => ['required', 'distinct', 'exists:permissions,id'],
'enabled' => ['required', 'boolean']
];
}
Expand Down
18 changes: 18 additions & 0 deletions app/Models/Permission.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Spatie\Permission\Models\Permission as ModelsPermission;

class Permission extends ModelsPermission
{
use HasFactory;

protected $fillable = [
'name',
'batch_number',
'batch_name',
'guard_name'
];
}
5 changes: 5 additions & 0 deletions app/Models/Role.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,9 @@ class Role extends ModelsRole
'enabled'
];

protected $hidden = [
'created_at',
'updated_at',
'guard_name'
];
}
28 changes: 28 additions & 0 deletions app/Traits/Cache/CacheServices.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace App\Traits\Cache;

trait CacheServices
{
/**
* cacheKey
*
* @param string $resource
* @param integer $resourceId
* @param string $subResource
* @param integer $subResourceId
* @return string
*/
public function cacheKey(string $resource, int $resourceId = null, string $subResource = null, int $subResourceId = null): string
{
$key = "${resource}:";

if ($resourceId) $key.= "${resourceId}:";

if ($subResource) $key.= "${subResource}:";

if ($subResourceId) $key.= "${subResourceId}:";

return $key;
}
}
2 changes: 1 addition & 1 deletion app/Traits/Sales/Invoice/EstimateInvoicesServices.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public function toInvoice (EstimateInvoice $estimateInvoice, string $invoiceNumb
]);

$estimateInvoice->histories()->create([
'status' => 'invoiced',
'status' => 'Invoiced',
'description' => "{$estimateInvoice->estimate_number} INVOICED!"
]);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddBatchNumberToPermissionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('permissions', function (Blueprint $table) {
$table->unsignedBigInteger('batch_number')->after('name');
$table->string('batch_name')->after('name');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('permissions', function (Blueprint $table) {
$table->dropColumn('batch_number');
$table->unsignedBigInteger('batch_name')->after('name');
});
}
}
4 changes: 3 additions & 1 deletion routes/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use App\Http\Controllers\Api\Item\Discount\DiscountsController;
use App\Http\Controllers\Api\AccessRight\AccessRightsController;
use App\Http\Controllers\Api\AccessRight\PermissionController;
use App\Http\Controllers\Api\AccessRight\RolesController;
use App\Http\Controllers\Api\Auth\VerificationController;
use App\Http\Controllers\Api\Banking\Account\AccountsController;
use App\Http\Controllers\Api\Item\Category\CategoriesController;
Expand Down Expand Up @@ -126,12 +127,13 @@
Route::prefix('access-rights')->group(function ()
{
Route::get('/', [AccessRightsController::class, 'index']);
Route::get('/{role}', [AccessRightsController::class, 'show']);
Route::get('/{role}/show', [AccessRightsController::class, 'show']);
Route::post('/', [AccessRightsController::class, 'store']);
Route::put('/{role}', [AccessRightsController::class, 'update']);
Route::delete('/', [AccessRightsController::class, 'destroy']);

Route::get('/permissions', PermissionController::class);
Route::get('/roles', RolesController::class);
});


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,16 @@

class PermissionControllerTest extends TestCase
{
/** test */
/** @test */
public function user_can_view_any_permissions()
{
$response = $this->get(
'/api/access-rights/permissions',
$this->apiHeader()
);

dd(json_decode($response->getContent()));

$this->assertResponse($response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Tests\Feature\Http\Controllers\Api\AccessRight;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class RolesControllerTest extends TestCase
{

/** @test */
public function user_can_view_any_roles()
{
$response = $this->get(
'/api/access-rights/roles',
$this->apiHeader()
);

dd(json_decode($response->getContent()));

$this->assertResponse($response);
}

}

0 comments on commit 92676db

Please sign in to comment.