From bf8a18a4fd57495d1e8e69449d7ee213716d9b1e Mon Sep 17 00:00:00 2001 From: glovetleong Date: Thu, 1 Jul 2021 13:54:29 +0800 Subject: [PATCH] entity api --- .../Controllers/User/Api/EntityController.php | 48 ++++ app/Http/Modules/User/EntityModule.php | 211 ++++++++++++++++++ app/Http/Rule/User/UnderCheck.php | 16 ++ app/Models/Entity.php | 23 +- config/constants.php | 10 + .../SodaVendorEntitySignaturesTableSeeder.php | 4 +- .../seeders/UserPermissionsTableSeeder.php | 20 ++ routes/user/api.php | 39 ++++ 8 files changed, 367 insertions(+), 4 deletions(-) create mode 100644 app/Http/Controllers/User/Api/EntityController.php create mode 100644 app/Http/Modules/User/EntityModule.php diff --git a/app/Http/Controllers/User/Api/EntityController.php b/app/Http/Controllers/User/Api/EntityController.php new file mode 100644 index 0000000..d595626 --- /dev/null +++ b/app/Http/Controllers/User/Api/EntityController.php @@ -0,0 +1,48 @@ +query(), 'entity_query'); + + $name = $request->get('name', null); + $status = $request->get('status', []); + $page = $request->get('page', null); + $limit = $request->get('limit', 10); + + $query = Entity::query(); + + if (strlen($name) > 0) { + $query->where('name', 'like', '%' . $name . '%'); + } + + if (!empty($status) > 0) { + $query->whereIn('status', $status); + } + + $query->where('user_id', Auth::guard('user-api')->user()->id); + + $query->orderBy('id', 'desc'); + + $params = [ + 'name' => $name, + 'status' => $status, + 'page' => $page + ]; + + $entity_list = $query->paginate($limit); + + $extract = []; + foreach ($entity_list as $key => $row) { + $extract[] = $row; + + } + $pagination = General::paginationGenerator($entity_list, $params, $extract); + + return $pagination; + } + + public static function show(Request $request, $hash_id) + { + $id = Hasher::decode('entities', $hash_id); + $entity = Entity::find($id); + if ($entity) { + $data = General::returnData($entity, ''); + return response()->json($data); + } + $data = General::returnNotFoundData(); + return response()->json($data); + } + + public static function store(Request $request) + { + $validation = EntityModule::validation($request); + if (!$validation->status) { + return response()->json($validation, 422); + } + + DB::beginTransaction(); + + $name = $request->input('name'); + + $entity = new Entity(); + $entity->user_id = Auth::guard('user-api')->user()->id; + $entity->name = $name; + $entity->status = config('constants.entity.status.active'); + $entity->save(); + + // log + EntityModule::makeLog($entity->id, 'user (' . Auth::guard('user-api')->user()->id . ') created'); + + DB::commit(); + + $query_string = General::getCachePerviousQuery('entity_query'); + $data = General::returnData($entity, $query_string); + + return response()->json($data); + } + + public static function update(Request $request, $hash_id) + { + $id = Hasher::decode('entities', $hash_id); + $validation = EntityModule::validation($request, $hash_id, 'PUT'); + if (!$validation->status) { + return response()->json($validation, 422); + } + + DB::beginTransaction(); + + $name = $request->input('name'); + + $entity = Entity::find($id); + $entity->name = $name ?? $entity->name; + $entity->update(); + + // log + EntityModule::makeLog($entity->id, 'user (' . Auth::guard('user-api')->user()->id . ') updated'); + + DB::commit(); + + $query_string = General::getCachePerviousQuery('entity_query'); + $data = General::returnData($entity, $query_string); + + return response()->json($data); + } + + public static function delete(Request $request, $hash_id) + { + $id = Hasher::decode('entities', $hash_id); + $validation = EntityModule::validation($request, $hash_id, 'DEL'); + if (!$validation->status) { + return response()->json($validation, 422); + } + + DB::beginTransaction(); + + $entity = Entity::find($id); + $entity->status = config('constants.contact_template.status.delete'); + $entity->update(); + + // log + EntityModule::makeLog($entity->id, 'user (' . Auth::guard('user-api')->user()->id . ') delete'); + + DB::commit(); + + $query_string = General::getCachePerviousQuery('entity_query'); + $data = General::returnData($entity, $query_string); + + return response()->json($data); + } + + + private static function validation(Request $request, $id = '', $method = 'POST') + { + $data = $request->all(); + $rule= []; + + if ($method == 'POST') { + $rule = [ + 'name' => 'required', + ]; + } + + if ($method == 'PUT') { + $data['id'] = $id; + $rule = [ + 'id' => [new UnderCheck('entity'), new ExistCheck('entity')], + 'name' => 'required', + ]; + } + + if ($method == 'DEL') { + $data['id'] = $id; + $rule = [ + 'id' => [new UnderCheck('entity'), new ExistCheck('entity')], + ]; + } + + $validator = Validator::make($data, $rule, config('error_code')); + + $errors = $validator->errors(); + + if ($validator->fails()) { + $data = General::returnErrorData($errors); + return $data; + } + else { + return (object)['status' => true]; + } + } + + public static function makeLog($id = '', $remark = '') + { + $entity = Entity::find($id); + $entity_log = new EntityLog(); + $entity_log->entity_id = $entity->id; + $entity_log->history = json_encode($entity); + $entity_log->remark = $remark; + $entity_log->save(); + } +} diff --git a/app/Http/Rule/User/UnderCheck.php b/app/Http/Rule/User/UnderCheck.php index 74341e3..aa6271a 100644 --- a/app/Http/Rule/User/UnderCheck.php +++ b/app/Http/Rule/User/UnderCheck.php @@ -3,6 +3,7 @@ namespace App\Http\Rules\User; use Auth; +use App\Models\Entity; use App\Models\ContractTemplate; use App\Models\ContractTemplateObligation; @@ -37,6 +38,21 @@ class UnderCheck implements Rule $this->attribute = $attribute; $value = is_array($value) ? $value : [$value]; + if ($this->type == 'entity') { + foreach ($value as $key => $row) { + if(!empty($row)) { + $id = Hasher::decode('entities', $row); + $data = Entity:: + where('id', $id) + ->where('user_id', Auth::guard('user-api')->user()->id) + ->count(); + if (!$data) { + return false; + } + } + } + } + if ($this->type == 'contract_template') { foreach ($value as $key => $row) { if(!empty($row)) { diff --git a/app/Models/Entity.php b/app/Models/Entity.php index 0551d0a..52a14ce 100644 --- a/app/Models/Entity.php +++ b/app/Models/Entity.php @@ -2,10 +2,29 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Factories\HasFactory; +use App\Http\Helpers\Hasher; + use Illuminate\Database\Eloquent\Model; +use Carbon\Carbon; class Entity extends Model { - use HasFactory; + protected $table = 'entities'; + + protected $appends = ['hash_id']; + + public function getHashIdAttribute() + { + return Hasher::encode('entities', $this->id); + } + + public function getUpdatedAtAttribute($date) + { + return $date ? Carbon::parse($date)->timezone('Asia/Kuala_Lumpur')->format('Y-m-d') : ''; + } + + public function getCreatedAtAttribute($date) + { + return $date ? Carbon::parse($date)->timezone('Asia/Kuala_Lumpur')->format('Y-m-d') : ''; + } } diff --git a/config/constants.php b/config/constants.php index f133bbd..00628e7 100644 --- a/config/constants.php +++ b/config/constants.php @@ -8,6 +8,16 @@ 'description' => 'Unity', ], 'version' => 1, + 'entity' => [ + 'signature' => [ + 'master_key' => 1, + ], + 'status' => [ + 'active' => 1, + 'delete' => 2, + 'pending' => 9 + ] + ], 'contact_template' => [ 'status' => [ 'active' => 1, diff --git a/database/seeders/SodaVendorMachine/SodaVendorEntitySignaturesTableSeeder.php b/database/seeders/SodaVendorMachine/SodaVendorEntitySignaturesTableSeeder.php index 22c50df..cb82961 100644 --- a/database/seeders/SodaVendorMachine/SodaVendorEntitySignaturesTableSeeder.php +++ b/database/seeders/SodaVendorMachine/SodaVendorEntitySignaturesTableSeeder.php @@ -19,7 +19,7 @@ class SodaVendorEntitySignaturesTableSeeder extends Seeder [ 'id' => 1, 'entity_id' => 1, - 'type' => 1, + 'type' => config('constants.entity.signature.master_key'), 'status' => 1, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s') @@ -27,7 +27,7 @@ class SodaVendorEntitySignaturesTableSeeder extends Seeder [ 'id' => 2, 'entity_id' => 2, - 'type' => 1, + 'type' => config('constants.entity.signature.master_key'), 'status' => 1, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s') diff --git a/database/seeders/UserPermissionsTableSeeder.php b/database/seeders/UserPermissionsTableSeeder.php index 0c8ee7a..d176fb0 100644 --- a/database/seeders/UserPermissionsTableSeeder.php +++ b/database/seeders/UserPermissionsTableSeeder.php @@ -22,6 +22,11 @@ class UserPermissionsTableSeeder extends Seeder app()['cache']->forget('spatie.permission.cache'); // user permissions + Permission::create(['name' => 'view entity', 'guard_name' => 'user']); + Permission::create(['name' => 'add entity', 'guard_name' => 'user']); + Permission::create(['name' => 'edit entity', 'guard_name' => 'user']); + Permission::create(['name' => 'delete entity', 'guard_name' => 'user']); + Permission::create(['name' => 'view contract_template', 'guard_name' => 'user']); Permission::create(['name' => 'add contract_template', 'guard_name' => 'user']); Permission::create(['name' => 'edit contract_template', 'guard_name' => 'user']); @@ -37,6 +42,21 @@ class UserPermissionsTableSeeder extends Seeder Permission::create(['name' => 'edit contract_template_obligation_dependency', 'guard_name' => 'user']); Permission::create(['name' => 'delete contract_template_obligation_dependency', 'guard_name' => 'user']); + Permission::create(['name' => 'view contract', 'guard_name' => 'user']); + Permission::create(['name' => 'add contract', 'guard_name' => 'user']); + Permission::create(['name' => 'edit contract', 'guard_name' => 'user']); + Permission::create(['name' => 'delete contract', 'guard_name' => 'user']); + + Permission::create(['name' => 'view contract_entity', 'guard_name' => 'user']); + Permission::create(['name' => 'add contract_entity', 'guard_name' => 'user']); + Permission::create(['name' => 'edit contract_entity', 'guard_name' => 'user']); + Permission::create(['name' => 'delete contract_entity', 'guard_name' => 'user']); + + Permission::create(['name' => 'view contract_obligation', 'guard_name' => 'user']); + Permission::create(['name' => 'add contract_obligation', 'guard_name' => 'user']); + Permission::create(['name' => 'edit contract_obligation', 'guard_name' => 'user']); + Permission::create(['name' => 'delete contract_obligation', 'guard_name' => 'user']); + $normal_user_role = Role::create([ 'name' => 'Normal User', 'guard_name' => 'user', diff --git a/routes/user/api.php b/routes/user/api.php index ee2a3f9..7334ce7 100644 --- a/routes/user/api.php +++ b/routes/user/api.php @@ -13,6 +13,45 @@ Route::group(['namespace' => 'User', 'prefix' => 'user-backsys/api'], function ( ); }); + // Entity + Route::prefix('entity')->group(function () { + Route::get('list', + [ + 'as' => 'api.entity.list', + 'uses' => 'EntityController@list', + 'middleware' => ['permission:view entity'] + ] + ); + Route::get('show/{hash_id}', + [ + 'as' => 'api.entity.show', + 'uses' => 'EntityController@show', + 'middleware' => ['permission:view entity'] + ] + ); + Route::post('store', + [ + 'as' => 'api.entity.store', + 'uses' => 'EntityController@store', + 'middleware' => ['permission:add entity'] + ] + ); + Route::put('update/{hash_id}', + [ + 'as' => 'api.entity.update', + 'uses' => 'EntityController@update', + 'middleware' => ['permission:edit entity'] + ] + ); + Route::delete('delete/{hash_id}', + [ + 'as' => 'api.entity.delete', + 'uses' => 'EntityController@delete', + 'middleware' => ['permission:delete entity'] + ] + ); + }); + // Contract Templete Route::prefix('contract-template')->group(function () { Route::get('list',