Skip to content
This repository was archived by the owner on Feb 18, 2023. It is now read-only.

Commit f3e1724

Browse files
committed
working roles endpoint #4
1 parent 7d31dd8 commit f3e1724

File tree

5 files changed

+180
-2
lines changed

5 files changed

+180
-2
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Api\Users;
4+
5+
use App\Entities\Role;
6+
use Illuminate\Http\Request;
7+
use Dingo\Api\Routing\Helpers;
8+
use App\Http\Controllers\Controller;
9+
use App\Transformers\Users\RoleTransformer;
10+
11+
class RolesController extends Controller
12+
{
13+
use Helpers;
14+
15+
/**
16+
* @var
17+
*/
18+
protected $model;
19+
20+
/**
21+
* UsersController constructor.
22+
* @param Role $model
23+
*/
24+
public function __construct(Role $model)
25+
{
26+
$this->model = $model;
27+
$this->middleware('permission:List roles')->only('index');
28+
$this->middleware('permission:List roles')->only('show');
29+
$this->middleware('permission:Create roles')->only('store');
30+
$this->middleware('permission:Update roles')->only('update');
31+
$this->middleware('permission:Delete roles')->only('destroy');
32+
}
33+
34+
35+
/**
36+
* @param Request $request
37+
* @return mixed
38+
*/
39+
public function index(Request $request)
40+
{
41+
$paginator = $this->model->with('permissions')
42+
->paginate($request->get('limit', config('app.pagination_limit')));
43+
return $this->response->paginator($paginator, new RoleTransformer());
44+
}
45+
46+
47+
/**
48+
* @param $id
49+
* @return mixed
50+
*/
51+
public function show($id)
52+
{
53+
$role = $this->model->with('permissions')->byUuid($id)->firstOrFail();
54+
return $this->response->item($role, new RoleTransformer());
55+
}
56+
57+
58+
/**
59+
* @param Request $request
60+
* @return mixed
61+
*/
62+
public function store(Request $request)
63+
{
64+
$this->validate($request, [
65+
'name' => 'required'
66+
]);
67+
$role = $this->model->create($request->all());
68+
return $this->response->created(url('api/roles/'.$role->uuid));
69+
}
70+
71+
72+
/**
73+
* @param Request $request
74+
* @param $uuid
75+
* @return mixed
76+
*/
77+
public function update(Request $request, $uuid)
78+
{
79+
$role = $this->model->byUuid($uuid)->firstOrFail();
80+
$rules = [
81+
'name' => 'required'
82+
];
83+
$this->validate($request, $rules);
84+
$role->update($request->except('_token'));
85+
return $this->response->item($role->fresh(), new RoleTransformer());
86+
}
87+
88+
/**
89+
* @param Request $request
90+
* @param $uuid
91+
* @return mixed
92+
*/
93+
public function destroy(Request $request, $uuid)
94+
{
95+
$user = $this->model->byUuid($uuid)->firstOrFail();
96+
$user->delete();
97+
return $this->response->noContent();
98+
}
99+
}

app/Http/Controllers/Api/Users/UsersController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public function update(Request $request, $uuid)
9696
}
9797
$this->validate($request, $rules);
9898
$user->update($request->except('_token'));
99-
return $this->response->item($user, new UserTransformer());
99+
return $this->response->item($user->fresh(), new UserTransformer());
100100
}
101101

102102
/**

app/Transformers/Users/RoleTransformer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class RoleTransformer extends TransformerAbstract
1515
/**
1616
* @var array
1717
*/
18-
protected $availableIncludes = ['permissions'];
18+
protected $defaultIncludes = ['permissions'];
1919

2020
/**
2121
* @param Role $model

routes/api.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@
1919
$api->delete('/{uuid}', 'Api\Users\UsersController@destroy');
2020
});
2121

22+
$api->group(['prefix' => 'roles'], function ($api) {
23+
$api->get('/', 'Api\Users\RolesController@index');
24+
$api->post('/', 'Api\Users\RolesController@store');
25+
$api->get('/{uuid}', 'Api\Users\RolesController@show');
26+
$api->put('/{uuid}', 'Api\Users\RolesController@update');
27+
$api->patch('/{uuid}', 'Api\Users\RolesController@update');
28+
$api->delete('/{uuid}', 'Api\Users\RolesController@destroy');
29+
});
30+
2231
});
2332

2433
});
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
3+
namespace Tests\Feature\Users;
4+
5+
use App\Entities\Role;
6+
use App\Entities\User;
7+
use Laravel\Passport\Passport;
8+
use Tests\TestCase;
9+
use Illuminate\Foundation\Testing\DatabaseMigrations;
10+
11+
class RolesEndpointsTest extends TestCase
12+
{
13+
14+
use DatabaseMigrations;
15+
16+
function setUp()
17+
{
18+
parent::setUp();
19+
$this->installApp();
20+
}
21+
22+
23+
public function test_it_list_roles()
24+
{
25+
factory(Role::class, 10)->create();
26+
Passport::actingAs(User::first());
27+
$response = $this->json('GET', 'api/roles');
28+
$response->assertStatus(200);
29+
$response->assertJson([
30+
'data' => [
31+
['name' => 'Administrator']
32+
],
33+
'meta' => [
34+
'pagination' => [
35+
'total' => 11
36+
]
37+
]
38+
]);
39+
}
40+
41+
public function test_it_prevents_unauthorized_roles_listing()
42+
{
43+
$user = factory(User::class)->create();
44+
Passport::actingAs($user);
45+
$response = $this->json('GET', 'api/roles');
46+
$response->assertStatus(403);
47+
}
48+
49+
public function test_it_can_create_a_role()
50+
{
51+
Passport::actingAs(User::first());
52+
$response = $this->json('POST', 'api/roles', [
53+
'name' => 'Guest'
54+
]);
55+
$response->assertStatus(201);
56+
$response->assertHeader('location');
57+
$this->assertDatabaseHas('roles', [
58+
'name' => 'Guest'
59+
]);
60+
}
61+
62+
public function test_it_validates_input_for_roles()
63+
{
64+
Passport::actingAs(User::first());
65+
$response = $this->json('POST', 'api/roles', [
66+
67+
]);
68+
$response->assertStatus(422);
69+
}
70+
}

0 commit comments

Comments
 (0)