user and role
WMS API/ERP-API/pipeline/head There was a failure building this commit Details

This commit is contained in:
Husnu Setiawan 2025-02-11 11:14:39 +07:00
parent 2254c67eff
commit 3ad3a4d00f
36 changed files with 1236 additions and 14 deletions

75
Envoy.blade.php Normal file
View File

@ -0,0 +1,75 @@
@servers(['prod' => 'ubuntu@172.26.12.217', 'dev' => 'ubuntu@smgdev.top'])
@setup
$repository = 'git@172.26.1.255:SMG_DEV/ERP-API.git';
$releases_dir = '/var/www/erp-api/releases';
$app_dir = '/var/www/erp-api';
$release = date('YmdHis');
$branch = 'production';
$new_release_dir = $releases_dir .'/'. $release;
@endsetup
@task('clone_repository')
echo 'Cloning repository'
[ -d {{ $releases_dir }} ] || mkdir {{ $releases_dir }}
git clone --depth 1 --single-branch --branch {{ $branch }} {{ $repository }} {{ $new_release_dir }}
cd {{ $new_release_dir }}
@endtask
@task('run_composer')
echo "Starting deployment ({{ $release }})"
cd {{ $new_release_dir }}
composer install --prefer-dist --no-scripts -q -o
@endtask
@task('update_symlinks')
echo "Linking storage directory"
rm -rf {{ $new_release_dir }}/storage
ln -nfs {{ $app_dir }}/storage {{ $new_release_dir }}/storage
echo 'Linking .env file'
ln -nfs {{ $app_dir }}/.env {{ $new_release_dir }}/.env
echo 'Linking current release'
ln -nfs {{ $new_release_dir }} {{ $app_dir }}/current
@endtask
@task('setup_laravel')
cd {{ $app_dir }}/current
php artisan migrate --force
php artisan storage:link
php artisan db:seed --class PermissionSeeder --force
@endtask
@task('clean_old_releases')
# This lists our releases by modification time and delete all but the 3 most recent.
purging=$(ls -dt {{ $releases_dir }}/* | tail -n +5);
if [ "{{ $releases_dir }}" != "" ]; then
if [ "$purging" != "" ]; then
echo Purging old releases: $purging;
rm -rf $purging;
else
echo "No releases found for purging at this time";
fi
fi
@endtask
@story('deploy',["on" => "prod"])
clone_repository
run_composer
update_symlinks
setup_laravel
clean_old_releases
@endstory
@story('deploy-dev',["on" => "dev"])
clone_repository
run_composer
update_symlinks
setup_laravel
clean_old_releases
@endstory

29
Jenkinsfile vendored Normal file
View File

@ -0,0 +1,29 @@
pipeline {
agent any
stages
{
stage("Deploy Dev"){
when {
branch 'development'
}
steps {
sshagent(credentials: ['dev-id_rsa']) {
sh "composer install"
sh "./vendor/bin/envoy run deploy-dev"
}
}
}
stage("Deploy Prod"){
when {
branch 'production'
}
steps {
sshagent(credentials: ['dev-id_rsa']) {
sh "composer install"
sh "./vendor/bin/envoy run deploy"
}
}
}
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers\Auth\Role;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\Auth\Role\DeleteRequest;
use App\Http\Resources\Auth\Role\ListResource as RowResource;
use App\Repositories\Auth\UserRepository;
use App\Models\Role;
class DeleteController extends Controller
{
/**
* Handle the incoming request.
*/
public function __invoke(DeleteRequest $request, Role $user, UserRepository $repository)
{
$data = $repository->delete($user);
return response()->json([
"success" => true
]);
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Auth\Role;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\Auth\Role\ListRequest;
use App\Http\Resources\Auth\Role\ListResource;
use App\Repositories\Auth\RoleRepository;
class ListController extends Controller
{
/**
* Handle the incoming request.
*/
public function __invoke(ListRequest $request, RoleRepository $repository)
{
$params = $request->validated();
$data = $repository->list($params);
return ListResource::collection($data);
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Auth\Role;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\Auth\Role\StoreRequest;
use App\Http\Resources\Auth\Role\ListResource as RowResource;
use App\Repositories\Auth\UserRepository;
class StoreController extends Controller
{
/**
* Handle the incoming request.
*/
public function __invoke(StoreRequest $request, UserRepository $repository)
{
$params = $request->validated();
$data = $repository->create($params);
return RowResource::make($data);
}
}

View File

@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Auth\Role;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\Auth\Role\UpdateRequest;
use App\Http\Resources\Auth\Role\ListResource as RowResource;
use App\Repositories\Auth\UserRepository;
use App\Models\Role;
class UpdateController extends Controller
{
/**
* Handle the incoming request.
*/
public function __invoke(UpdateRequest $request, Role $user, UserRepository $repository)
{
$params = $request->validated();
$data = $repository->update($user, $params);
return RowResource::make($data);
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers\Auth\User;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\Auth\User\DeleteRequest;
use App\Http\Resources\Auth\User\ListResource as RowResource;
use App\Repositories\Auth\UserRepository;
use App\Models\User;
class DeleteController extends Controller
{
/**
* Handle the incoming request.
*/
public function __invoke(DeleteRequest $request, User $user, UserRepository $repository)
{
$data = $repository->delete($user);
return response()->json([
"success" => true
]);
}
}

View File

@ -4,14 +4,19 @@ namespace App\Http\Controllers\Auth\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Requests\Auth\User\ListRequest;
use App\Http\Resources\Auth\User\ListResource;
use App\Repositories\Auth\UserRepository;
class ListController extends Controller class ListController extends Controller
{ {
/** /**
* Handle the incoming request. * Handle the incoming request.
*/ */
public function __invoke(Request $request) public function __invoke(ListRequest $request, UserRepository $repository)
{ {
// $params = $request->validated();
$data = $repository->list($params);
return ListResource::collection($data);
} }
} }

View File

@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Auth\User;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\Auth\User\StoreRequest;
use App\Http\Resources\Auth\User\ListResource as RowResource;
use App\Repositories\Auth\UserRepository;
class StoreController extends Controller
{
/**
* Handle the incoming request.
*/
public function __invoke(StoreRequest $request, UserRepository $repository)
{
$params = $request->validated();
$data = $repository->create($params);
return RowResource::make($data);
}
}

View File

@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Auth\User;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\Auth\User\UpdateRequest;
use App\Http\Resources\Auth\User\ListResource as RowResource;
use App\Repositories\Auth\UserRepository;
use App\Models\User;
class UpdateController extends Controller
{
/**
* Handle the incoming request.
*/
public function __invoke(UpdateRequest $request, User $user, UserRepository $repository)
{
$params = $request->validated();
$data = $repository->update($user, $params);
return RowResource::make($data);
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace App\Http\Requests\Auth\Role;
use Illuminate\Foundation\Http\FormRequest;
class DeleteRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return auth()->user()->checkPermission("auth.role:delete");
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
];
}
}

View File

@ -0,0 +1,39 @@
<?php
namespace App\Http\Requests\Auth\Role;
use Illuminate\Foundation\Http\FormRequest;
class ListRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return auth()->user()->checkPermission("auth.role:read");
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'limit' => 'nullable',
'offset' => 'nullable',
'search' => 'nullable',
'filter' => 'nullable|array',
'filter.*.column' => 'required|in:name,email',
'filter.*.operator' => 'nullable|in:eq,in',
'filter.*.query' => 'required',
'sort' => 'nullable|array',
'sort.column' => 'nullable|in:name,email',
'sort.dir' => 'nullable',
];
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Http\Requests\Auth\Role;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return auth()->user()->checkPermission("auth.user:create");
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'name' => 'required|string',
'email' => 'required|string',
'role_ids' => 'nullable|array',
'role_ids.*' => 'nullable|integer'
];
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Http\Requests\Auth\Role;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return auth()->user()->checkPermission("auth.role:update");
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'name' => 'required|string',
'email' => 'required|string',
'role_ids' => 'nullable|array',
'role_ids.*' => 'nullable|integer'
];
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace App\Http\Requests\Auth\User;
use Illuminate\Foundation\Http\FormRequest;
class DeleteRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return auth()->user()->checkPermission("auth.user:delete");
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
];
}
}

View File

@ -11,10 +11,7 @@ class ListRequest extends FormRequest
*/ */
public function authorize(): bool public function authorize(): bool
{ {
$user = auth()->user(); return auth()->user()->checkPermission("auth.user:read");
$user->load("roles");
return false;
} }
/** /**
@ -25,7 +22,18 @@ class ListRequest extends FormRequest
public function rules(): array public function rules(): array
{ {
return [ return [
// 'limit' => 'nullable',
'offset' => 'nullable',
'search' => 'nullable',
'filter' => 'nullable|array',
'filter.*.column' => 'required|in:name,email',
'filter.*.operator' => 'nullable|in:eq,in',
'filter.*.query' => 'required',
'sort' => 'nullable|array',
'sort.column' => 'nullable|in:name,email',
'sort.dir' => 'nullable',
]; ];
} }
} }

View File

@ -0,0 +1,31 @@
<?php
namespace App\Http\Requests\Auth\User;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return auth()->user()->checkPermission("auth.user:create");
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'name' => 'required|string',
'email' => 'required|string',
'role_ids' => 'nullable|array',
'role_ids.*' => 'nullable|integer'
];
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Http\Requests\Auth\User;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return auth()->user()->checkPermission("auth.user:update");
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'name' => 'required|string',
'email' => 'required|string',
'role_ids' => 'nullable|array',
'role_ids.*' => 'nullable|integer'
];
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Http\Resources\Auth\Role;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ListResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
"id" => $this->id,
"name" => $this->name,
];
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace App\Http\Resources\Auth\User;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Http\Resources\Auth\Role\ListResource as RoleResource;
class ListResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
"id" => $this->id,
"name" => $this->name,
"email" => $this->email,
"roles" => RoleResource::collection($this->roles)
];
}
}

View File

@ -10,6 +10,6 @@ class Role extends Model
use HasFactory; use HasFactory;
public function permissions(){ public function permissions(){
return $this->hasMany(Permission::class); return $this->belongsToMany(Permission::class,"role_permission");
} }
} }

View File

@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens; use Laravel\Sanctum\HasApiTokens;
use Cache;
class User extends Authenticatable class User extends Authenticatable
{ {
@ -44,6 +45,23 @@ class User extends Authenticatable
]; ];
public function roles(){ public function roles(){
return $this->hasMany(Role::class)->with("permissions"); return $this->belongsToMany(Role::class,'user_role')->with("permissions");
}
public function getPermission(){
$user = $this;
return Cache::rememberForever("permission_".$this->id, function() use ($user){
return $user->roles->flatMap(function($role){
return $role->permissions->map(function($permission){
return $permission->code;
});
});
});
}
public function checkPermission($code){
$permissions = $this->getPermission();
$code_arr = explode(":",$code);
return $permissions->contains($code) || $permissions->contains($code_arr[0].":*");
} }
} }

View File

@ -0,0 +1,51 @@
<?php
namespace App\Repositories\Auth;
use App\Models\Role;
class RoleRepository
{
public function list($params){
$limit = @$params["limit"] ?? 10;
$offset = @$params["offset"] ?? 0;
$sortColumn = @$params["sort"]["column"] ?? "id";
$sortDir = @$params["sort"]["dir"] ?? "desc";
return Role::skip($offset)
->orderBy($sortColumn, $sortDir)
->when(@$params["filter"], function ($query) use ($params) {
foreach ($params["filter"] as $filter) {
$query->where($filter["column"], $filter["query"]);
}
})
->paginate($limit);
}
public function create($params){
$params["password"] = "-";
$model = Role::create($params);
if (@$params["role_ids"]){
$model->roles()->sync($params["role_ids"]);
}
return $model;
}
public function update($model, $params){
$model->update($params);
if (@$params["role_ids"]){
$model->roles()->sync($params["role_ids"]);
}
return $model;
}
public function delete($model){
$model->delete();
}
}

View File

@ -0,0 +1,51 @@
<?php
namespace App\Repositories\Auth;
use App\Models\User;
class UserRepository
{
public function list($params){
$limit = @$params["limit"] ?? 10;
$offset = @$params["offset"] ?? 0;
$sortColumn = @$params["sort"]["column"] ?? "id";
$sortDir = @$params["sort"]["dir"] ?? "desc";
return User::skip($offset)
->orderBy($sortColumn, $sortDir)
->when(@$params["filter"], function ($query) use ($params) {
foreach ($params["filter"] as $filter) {
$query->where($filter["column"], $filter["query"]);
}
})
->paginate($limit);
}
public function create($params){
$params["password"] = "-";
$user = User::create($params);
if (@$params["role_ids"]){
$user->roles()->sync($params["role_ids"]);
}
return $user;
}
public function update($user, $params){
$user->update($params);
if (@$params["role_ids"]){
$user->roles()->sync($params["role_ids"]);
}
return $user;
}
public function delete($user){
$user->delete();
}
}

View File

@ -0,0 +1,23 @@
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Role>
*/
class RoleFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => fake()->name(),
];
}
}

View File

@ -4,6 +4,7 @@ namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
use DB;
class PermissionSeeder extends Seeder class PermissionSeeder extends Seeder
{ {
@ -13,6 +14,21 @@ class PermissionSeeder extends Seeder
public function run(): void public function run(): void
{ {
$permissions = file_get_contents(__DIR__ . "/permissions.csv"); $permissions = file_get_contents(__DIR__ . "/permissions.csv");
$permissions = explode("\n", $permissions);
$data = [];
foreach($permissions as $permission){
if ($permission == "")
continue;
$row = explode(",", $permission);
$data[] = [
"module" => $row[0],
"feature" => $row[1],
"action" => $row[2],
"code" => $row[3],
"name" => $row[4]
];
}
DB::table("permissions")->insertOrIgnore($data);
} }
} }

View File

@ -1,5 +1,10 @@
Auth,User,*,auth.user.*,All operation data user Auth,User,*,auth.user:*,All operation data user
Auth,User,*,auth.user.read,Show list data user Auth,User,*,auth.user:read,Show list data user
Auth,User,*,auth.user.create,Create data user Auth,User,*,auth.user:create,Create data user
Auth,User,*,auth.user.update,Update data user Auth,User,*,auth.user:update,Update data user
Auth,User,*,auth.user.delete,Delete data user Auth,User,*,auth.user:delete,Delete data user
Auth,Role,*,auth.role:*,All operation data role
Auth,Role,*,auth.role:read,Show list data role
Auth,Role,*,auth.role:create,Create data role
Auth,Role,*,auth.role:update,Update data role
Auth,Role,*,auth.role:delete,Delete data role

1 Auth User * auth.user.* auth.user:* All operation data user
2 Auth User * auth.user.read auth.user:read Show list data user
3 Auth User * auth.user.create auth.user:create Create data user
4 Auth User * auth.user.update auth.user:update Update data user
5 Auth User * auth.user.delete auth.user:delete Delete data user
6 Auth Role * auth.role:* All operation data role
7 Auth Role * auth.role:read Show list data role
8 Auth Role * auth.role:create Create data role
9 Auth Role * auth.role:update Update data role
10 Auth Role * auth.role:delete Delete data role

View File

@ -9,4 +9,15 @@ Route::get('current', 'CurrentController')->middleware("auth:sanctum");
Route::group(["namespace" => "User", "prefix" => "user", "middleware" => "auth:sanctum"], function () { Route::group(["namespace" => "User", "prefix" => "user", "middleware" => "auth:sanctum"], function () {
Route::get('/', 'ListController')->middleware("auth:sanctum"); Route::get('/', 'ListController')->middleware("auth:sanctum");
Route::post('/', 'StoreController')->middleware("auth:sanctum");
Route::post('/{user}', 'UpdateController')->middleware("auth:sanctum");
Route::post('/{user}/delete', 'DeleteController')->middleware("auth:sanctum");
});
Route::group(["namespace" => "Role", "prefix" => "role", "middleware" => "auth:sanctum"], function () {
Route::get('/', 'ListController')->middleware("auth:sanctum");
Route::post('/', 'StoreController')->middleware("auth:sanctum");
Route::post('/{role}', 'UpdateController')->middleware("auth:sanctum");
Route::post('/{role}/delete', 'DeleteController')->middleware("auth:sanctum");
}); });

View File

@ -0,0 +1,40 @@
<?php
namespace Tests\Feature\Auth\Role;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Models\Role;
use App\Models\Permission;
use App\Models\User;
use Laravel\Sanctum\Sanctum;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class DeleteTest extends TestCase
{
use DatabaseTransactions;
/**
* A basic feature test example.
*/
public function test_success(): void
{
$permission = Permission::where("code","auth.user:delete")->first();
$role = Role::factory()->create();
$role->permissions()->attach($permission->id);
$user = User::factory()->create();
$user->roles()->attach($role->id);
Sanctum::actingAs($user);
$data = User::factory()->create();
$response = $this->post('/auth/user/'.$data->id.'/delete');
$response->assertStatus(200);
}
}

View File

@ -0,0 +1,46 @@
<?php
namespace Tests\Feature\Auth\Role;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Models\Role;
use App\Models\Permission;
use App\Models\User;
use Laravel\Sanctum\Sanctum;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ListTest extends TestCase
{
use DatabaseTransactions;
/**
* A basic feature test example.
*/
public function test_success(): void
{
$permission = Permission::where("code","auth.role:read")->first();
$role = Role::factory()->create();
$role->permissions()->attach($permission->id);
$user = User::factory()->create();
$user->roles()->attach($role->id);
Sanctum::actingAs($user);
$response = $this->get('/auth/role/');
$response->assertStatus(200);
$response->assertJson([
"data" => [
[
"id" => $role->id,
"name" => $role->name
]
]
]);
}
}

View File

@ -0,0 +1,87 @@
<?php
namespace Tests\Feature\Auth\Role;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Models\Role;
use App\Models\Permission;
use App\Models\User;
use Laravel\Sanctum\Sanctum;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class StoreTest extends TestCase
{
use DatabaseTransactions;
/**
* A basic feature test example.
*/
public function test_success(): void
{
$permission = Permission::where("code","auth.user:create")->first();
$role = Role::factory()->create();
$role->permissions()->attach($permission->id);
$user = User::factory()->create();
$user->roles()->attach($role->id);
Sanctum::actingAs($user);
$response = $this->post('/auth/user/',[
"name" => "new user",
"email" => "user@gmail.com"
]);
$response->assertStatus(201);
$response->assertJson([
"data" => [
"name" => "new user",
"email" => "user@gmail.com"
]
]);
}
/**
* A basic feature test example.
*/
public function test_with_roles_success(): void
{
$permission = Permission::where("code","auth.user:create")->first();
$role = Role::factory()->create();
$role->permissions()->attach($permission->id);
$user = User::factory()->create();
$user->roles()->attach($role->id);
$role2 = Role::factory()->create();
Sanctum::actingAs($user);
$response = $this->post('/auth/user/',[
"name" => "new user",
"email" => "user@gmail.com",
"role_ids" => [$role->id, $role2->id]
]);
$response->assertStatus(201);
$response->assertJson([
"data" => [
"name" => "new user",
"email" => "user@gmail.com",
"roles" => [
[
"id" => $role->id
],
[
"id" => $role2->id
],
]
]
]);
}
}

View File

@ -0,0 +1,91 @@
<?php
namespace Tests\Feature\Auth\Role;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Models\Role;
use App\Models\Permission;
use App\Models\User;
use Laravel\Sanctum\Sanctum;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class UpdateTest extends TestCase
{
use DatabaseTransactions;
/**
* A basic feature test example.
*/
public function test_success(): void
{
$permission = Permission::where("code","auth.user:update")->first();
$role = Role::factory()->create();
$role->permissions()->attach($permission->id);
$user = User::factory()->create();
$user->roles()->attach($role->id);
Sanctum::actingAs($user);
$data = User::factory()->create();
$response = $this->post('/auth/user/'.$data->id,[
"name" => "update user",
"email" => "user_update@gmail.com"
]);
$response->assertStatus(200);
$response->assertJson([
"data" => [
"name" => "update user",
"email" => "user_update@gmail.com"
]
]);
}
/**
* A basic feature test example.
*/
public function test_with_roles_success(): void
{
$permission = Permission::where("code","auth.user:update")->first();
$role = Role::factory()->create();
$role->permissions()->attach($permission->id);
$user = User::factory()->create();
$user->roles()->attach($role->id);
Sanctum::actingAs($user);
$data = User::factory()->create();
$role2 = Role::factory()->create();
$response = $this->post('/auth/user/'.$data->id,[
"name" => "update user",
"email" => "user_update@gmail.com",
"role_ids" => [
$role->id, $role2->id
]
]);
$response->assertStatus(200);
$response->assertJson([
"data" => [
"name" => "update user",
"email" => "user_update@gmail.com",
"roles" => [
[
"id" => $role->id
],
[
"id" => $role2->id
],
]
]
]);
}
}

View File

@ -0,0 +1,40 @@
<?php
namespace Tests\Feature\Auth\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Models\Role;
use App\Models\Permission;
use App\Models\User;
use Laravel\Sanctum\Sanctum;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class DeleteTest extends TestCase
{
use DatabaseTransactions;
/**
* A basic feature test example.
*/
public function test_success(): void
{
$permission = Permission::where("code","auth.user:delete")->first();
$role = Role::factory()->create();
$role->permissions()->attach($permission->id);
$user = User::factory()->create();
$user->roles()->attach($role->id);
Sanctum::actingAs($user);
$data = User::factory()->create();
$response = $this->post('/auth/user/'.$data->id.'/delete');
$response->assertStatus(200);
}
}

View File

@ -12,18 +12,42 @@ use App\Models\Permission;
use App\Models\User; use App\Models\User;
use Laravel\Sanctum\Sanctum; use Laravel\Sanctum\Sanctum;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ListTest extends TestCase class ListTest extends TestCase
{ {
use DatabaseTransactions;
/** /**
* A basic feature test example. * A basic feature test example.
*/ */
public function test_success(): void public function test_success(): void
{ {
$permission = Permission::where("code","auth.user:read")->first();
$role = Role::factory()->create();
$role->permissions()->attach($permission->id);
$user = User::factory()->create(); $user = User::factory()->create();
$user->roles()->attach($role->id);
Sanctum::actingAs($user); Sanctum::actingAs($user);
$response = $this->get('/auth/user/'); $response = $this->get('/auth/user/');
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson([
"data" => [
[
"id" => $user->id,
"name" => $user->name,
"email" => $user->email,
"roles" => [
[
"id" => $role->id,
"name" => $role->name
]
]
]
]
]);
} }
} }

View File

@ -0,0 +1,87 @@
<?php
namespace Tests\Feature\Auth\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Models\Role;
use App\Models\Permission;
use App\Models\User;
use Laravel\Sanctum\Sanctum;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class StoreTest extends TestCase
{
use DatabaseTransactions;
/**
* A basic feature test example.
*/
public function test_success(): void
{
$permission = Permission::where("code","auth.user:create")->first();
$role = Role::factory()->create();
$role->permissions()->attach($permission->id);
$user = User::factory()->create();
$user->roles()->attach($role->id);
Sanctum::actingAs($user);
$response = $this->post('/auth/user/',[
"name" => "new user",
"email" => "user@gmail.com"
]);
$response->assertStatus(201);
$response->assertJson([
"data" => [
"name" => "new user",
"email" => "user@gmail.com"
]
]);
}
/**
* A basic feature test example.
*/
public function test_with_roles_success(): void
{
$permission = Permission::where("code","auth.user:create")->first();
$role = Role::factory()->create();
$role->permissions()->attach($permission->id);
$user = User::factory()->create();
$user->roles()->attach($role->id);
$role2 = Role::factory()->create();
Sanctum::actingAs($user);
$response = $this->post('/auth/user/',[
"name" => "new user",
"email" => "user@gmail.com",
"role_ids" => [$role->id, $role2->id]
]);
$response->assertStatus(201);
$response->assertJson([
"data" => [
"name" => "new user",
"email" => "user@gmail.com",
"roles" => [
[
"id" => $role->id
],
[
"id" => $role2->id
],
]
]
]);
}
}

View File

@ -0,0 +1,91 @@
<?php
namespace Tests\Feature\Auth\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Models\Role;
use App\Models\Permission;
use App\Models\User;
use Laravel\Sanctum\Sanctum;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class UpdateTest extends TestCase
{
use DatabaseTransactions;
/**
* A basic feature test example.
*/
public function test_success(): void
{
$permission = Permission::where("code","auth.user:update")->first();
$role = Role::factory()->create();
$role->permissions()->attach($permission->id);
$user = User::factory()->create();
$user->roles()->attach($role->id);
Sanctum::actingAs($user);
$data = User::factory()->create();
$response = $this->post('/auth/user/'.$data->id,[
"name" => "update user",
"email" => "user_update@gmail.com"
]);
$response->assertStatus(200);
$response->assertJson([
"data" => [
"name" => "update user",
"email" => "user_update@gmail.com"
]
]);
}
/**
* A basic feature test example.
*/
public function test_with_roles_success(): void
{
$permission = Permission::where("code","auth.user:update")->first();
$role = Role::factory()->create();
$role->permissions()->attach($permission->id);
$user = User::factory()->create();
$user->roles()->attach($role->id);
Sanctum::actingAs($user);
$data = User::factory()->create();
$role2 = Role::factory()->create();
$response = $this->post('/auth/user/'.$data->id,[
"name" => "update user",
"email" => "user_update@gmail.com",
"role_ids" => [
$role->id, $role2->id
]
]);
$response->assertStatus(200);
$response->assertJson([
"data" => [
"name" => "update user",
"email" => "user_update@gmail.com",
"roles" => [
[
"id" => $role->id
],
[
"id" => $role2->id
],
]
]
]);
}
}