user and role
WMS API/ERP-API/pipeline/head There was a failure building this commit
Details
WMS API/ERP-API/pipeline/head There was a failure building this commit
Details
This commit is contained in:
parent
2254c67eff
commit
3ad3a4d00f
|
|
@ -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
|
||||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -4,14 +4,19 @@ namespace App\Http\Controllers\Auth\User;
|
|||
|
||||
use App\Http\Controllers\Controller;
|
||||
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
|
||||
{
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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 [
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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'
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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'
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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 [
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -11,10 +11,7 @@ class ListRequest extends FormRequest
|
|||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
$user = auth()->user();
|
||||
$user->load("roles");
|
||||
|
||||
return false;
|
||||
return auth()->user()->checkPermission("auth.user:read");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -25,7 +22,18 @@ class ListRequest extends FormRequest
|
|||
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',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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'
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -10,6 +10,6 @@ class Role extends Model
|
|||
use HasFactory;
|
||||
|
||||
public function permissions(){
|
||||
return $this->hasMany(Permission::class);
|
||||
return $this->belongsToMany(Permission::class,"role_permission");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
use Laravel\Sanctum\HasApiTokens;
|
||||
use Cache;
|
||||
|
||||
class User extends Authenticatable
|
||||
{
|
||||
|
|
@ -44,6 +45,23 @@ class User extends Authenticatable
|
|||
];
|
||||
|
||||
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].":*");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -4,6 +4,7 @@ namespace Database\Seeders;
|
|||
|
||||
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||
use Illuminate\Database\Seeder;
|
||||
use DB;
|
||||
|
||||
class PermissionSeeder extends Seeder
|
||||
{
|
||||
|
|
@ -13,6 +14,21 @@ class PermissionSeeder extends Seeder
|
|||
public function run(): void
|
||||
{
|
||||
$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);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,10 @@
|
|||
Auth,User,*,auth.user.*,All operation data user
|
||||
Auth,User,*,auth.user.read,Show list data user
|
||||
Auth,User,*,auth.user.create,Create data user
|
||||
Auth,User,*,auth.user.update,Update data user
|
||||
Auth,User,*,auth.user.delete,Delete data user
|
||||
Auth,User,*,auth.user:*,All operation data user
|
||||
Auth,User,*,auth.user:read,Show list data user
|
||||
Auth,User,*,auth.user:create,Create data user
|
||||
Auth,User,*,auth.user:update,Update 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
|
||||
|
|
|
|||
|
|
|
@ -9,4 +9,15 @@ Route::get('current', 'CurrentController')->middleware("auth:sanctum");
|
|||
|
||||
Route::group(["namespace" => "User", "prefix" => "user", "middleware" => "auth:sanctum"], function () {
|
||||
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");
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
],
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
],
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -12,18 +12,42 @@ 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.user: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/user/');
|
||||
|
||||
$response->assertStatus(200);
|
||||
$response->assertJson([
|
||||
"data" => [
|
||||
[
|
||||
"id" => $user->id,
|
||||
"name" => $user->name,
|
||||
"email" => $user->email,
|
||||
"roles" => [
|
||||
[
|
||||
"id" => $role->id,
|
||||
"name" => $role->name
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
],
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
],
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue