diff --git a/api-endpoint/user/contract-template.json b/api-endpoint/user/contract-template.json new file mode 100644 index 0000000..1cf30e9 --- /dev/null +++ b/api-endpoint/user/contract-template.json @@ -0,0 +1,13 @@ +https://unity.test/ + +///////////////////////////////////////////////////////////////////////////////////////////// + +GET +user-backsys/api/contract-template/list + +///////////////////////////////////////////////////////////////////////////////////////////// + +GET +user-backsys/api/contract-template/show/hash_id + +///////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/api-endpoint/user/login.json b/api-endpoint/user/login.json new file mode 100644 index 0000000..704f8d5 --- /dev/null +++ b/api-endpoint/user/login.json @@ -0,0 +1,15 @@ +https://unity.test/ + +///////////////////////////////////////////////////////////////////////////////////////////// + +POST +user-backsys/api/login +{ + "App-Key": "base64:l/rL1EymG3bAXHY6g+ZuPTyJgDm0myx/tBELy9CHcgg=" +} +{ + "email": "one@izyim.com", + "password": "pass123" +} + +///////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/app/Http/Controllers/User/Api/ContractTemplateController.php b/app/Http/Controllers/User/Api/ContractTemplateController.php new file mode 100644 index 0000000..bf0e7bb --- /dev/null +++ b/app/Http/Controllers/User/Api/ContractTemplateController.php @@ -0,0 +1,48 @@ + false, + 'errors' => [config('error_code.exist_error')] + ]; + + return $data; + } + public static function returnErrorData($error = []) { $data = (object)[ diff --git a/app/Http/Helpers/Hasher.php b/app/Http/Helpers/Hasher.php index 91653bc..3964b2e 100644 --- a/app/Http/Helpers/Hasher.php +++ b/app/Http/Helpers/Hasher.php @@ -12,7 +12,7 @@ class Hasher public static function encode($entity = '', ...$args) { - $hash = new Hashids($entity, 11); + $hash = new Hashids($entity, 20); return $hash->encode(...$args); } @@ -22,7 +22,7 @@ class Hasher return $enc; } - $hash = new Hashids($entity, 11); + $hash = new Hashids($entity, 20); return $hash->decode($enc) ? $hash->decode($enc)[0] : ''; } diff --git a/app/Http/Modules/User/ContractTemplateModule.php b/app/Http/Modules/User/ContractTemplateModule.php new file mode 100644 index 0000000..9f281de --- /dev/null +++ b/app/Http/Modules/User/ContractTemplateModule.php @@ -0,0 +1,218 @@ +query(), 'contract_template_query'); + + $name = $request->get('name', null); + $status = $request->get('status', []); + $page = $request->get('page', null); + $limit = $request->get('limit', 10); + + $query = ContractTemplate::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 + ]; + + $contract_template_list = $query->paginate($limit); + + $extract = []; + foreach ($contract_template_list as $key => $row) { + $extract[] = $row; + + } + $pagination = General::paginationGenerator($contract_template_list, $params, $extract); + + return $pagination; + } + + public static function show(Request $request, $hash_id) + { + $id = Hasher::decode('contract_templates', $hash_id); + $contract_template = ContractTemplate::find($id); + if ($contract_template) { + $data = General::returnData($contract_template, ''); + return response()->json($data); + } + $data = General::returnNotFoundData(); + return response()->json($data); + } + + public static function store(Request $request) + { + $validation = ContractTemplateModule::validation($request); + if (!$validation->status) { + return response()->json($validation, 422); + } + + DB::beginTransaction(); + + $name = $request->input('name'); + $complete_day_range = $request->input('complete_day_range'); + + $contract_template = new ContractTemplate(); + $contract_template->user_id = Auth::guard('user-api')->user()->id; + $contract_template->name = $name; + $contract_template->complete_day_range = $complete_day_range; + $contract_template->status = config('constants.contact_template.status.pending'); + $contract_template->save(); + + // log + ContractTemplateModule::makeLog($contract_template->id, 'user (' . Auth::guard('user-api')->user()->id . ') created'); + + DB::commit(); + + $query_string = General::getCachePerviousQuery('contract_template_query'); + $data = General::returnData($contract_template, $query_string); + + return response()->json($data); + } + + public static function update(Request $request, $hash_id) + { + $id = Hasher::decode('contract_templates', $hash_id); + $validation = ContractTemplateModule::validation($request, $hash_id, 'PUT'); + if (!$validation->status) { + return response()->json($validation, 422); + } + + DB::beginTransaction(); + + $name = $request->input('name'); + $complete_day_range = $request->input('complete_day_range'); + + $contract_template = ContractTemplate::find($id); + $contract_template->name = $name ?? $contract_template->name; + $contract_template->complete_day_range = $complete_day_range ?? $contract_template->complete_day_range; + $contract_template->update(); + + // log + ContractTemplateModule::makeLog($contract_template->id, 'user (' . Auth::guard('user-api')->user()->id . ') updated'); + + DB::commit(); + + $query_string = General::getCachePerviousQuery('contract_template_query'); + $data = General::returnData($contract_template, $query_string); + + return response()->json($data); + } + + public static function delete(Request $request, $hash_id) + { + $id = Hasher::decode('contract_templates', $hash_id); + $validation = ContractTemplateModule::validation($request, $hash_id, 'DEL'); + if (!$validation->status) { + return response()->json($validation, 422); + } + + DB::beginTransaction(); + + $contract_template = ContractTemplate::find($id); + $contract_template->status = config('constants.contact_template.status.delete'); + $contract_template->update(); + + // log + ContractTemplateModule::makeLog($contract_template->id, 'user (' . Auth::guard('user-api')->user()->id . ') delete'); + + DB::commit(); + + $query_string = General::getCachePerviousQuery('contract_template_query'); + $data = General::returnData($contract_template, $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', + 'complete_day_range' => 'required|numeric|gt:-1' + ]; + } + + if ($method == 'PUT') { + $data['id'] = $id; + $rule = [ + 'id' => [new UnderCheck('contract_template'), new ExistCheck('contract_template')], + 'name' => 'required', + 'complete_day_range' => 'required|numeric|gt:-1' + ]; + } + + if ($method == 'DEL') { + $data['id'] = $id; + $rule = [ + 'id' => [new UnderCheck('contract_template'), new ExistCheck('contract_template')], + ]; + } + + $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 = '') + { + $contract_template = ContractTemplate::find($id); + $contract_template_log = new ContractTemplateLog(); + $contract_template_log->contract_template_id = $contract_template->id; + $contract_template_log->history = json_encode($contract_template); + $contract_template_log->remark = $remark; + $contract_template_log->save(); + } +} diff --git a/app/Http/Rule/User/ExistCheck.php b/app/Http/Rule/User/ExistCheck.php new file mode 100644 index 0000000..720a9ff --- /dev/null +++ b/app/Http/Rule/User/ExistCheck.php @@ -0,0 +1,65 @@ +type = $type; + } + + /** + * Determine if the validation rule passes. + * + * @param string $attribute + * @param mixed $value + * @return bool + */ + public function passes($attribute, $value) + { + $this->attribute = $attribute; + $value = is_array($value) ? $value : [$value]; + + if ($this->type == 'contract_template') { + foreach ($value as $key => $row) { + if(!empty($row)) { + $id = Hasher::decode('contract_templates', $row); + $data = ContractTemplate:: + where('id', $id) + ->count(); + if (!$data) { + return false; + } + } + } + } + + return true; + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + return config('error_code.exist_error'); + } +} diff --git a/app/Http/Rule/User/LoginRule.php b/app/Http/Rule/User/LoginRule.php index 5c0ad4c..534118c 100644 --- a/app/Http/Rule/User/LoginRule.php +++ b/app/Http/Rule/User/LoginRule.php @@ -60,48 +60,6 @@ class LoginRule implements Rule return true; } } - - // if ($this->type == 'social') { - // $social_media_type_id = $value; - // $provider_id = $this->password; - // $data = UserSocialAccount:: - // where('social_media_type_id', $social_media_type_id) - // ->where('provider_id', $provider_id) - // ->whereHas('user', function($q) { - // $q->whereIn('status', [1]); - // }) - // ->count(); - - // if (!$data) { - // return false; - // } - // return true; - // } - - // if ($this->type == 'totp') { - // $social_media_type_id = $value; - // $provider_id = $this->password; - // $data = UserSocialAccount:: - // where('social_media_type_id', $social_media_type_id) - // ->where('provider_id', $provider_id) - // ->count(); - // if (!$data) { - // return false; - // } - // $totp = new TOTP( - // $social_media_type_id . $provider_id, - // env('TOTP_SECRET'), - // 100, - // 'sha512', - // 8 - // ); - - // if (!$totp->verify($this->totp)) { - // return false; - // } - // return true; - // } - } /** diff --git a/app/Http/Rule/User/UnderCheck.php b/app/Http/Rule/User/UnderCheck.php new file mode 100644 index 0000000..7178e42 --- /dev/null +++ b/app/Http/Rule/User/UnderCheck.php @@ -0,0 +1,66 @@ +type = $type; + } + + /** + * Determine if the validation rule passes. + * + * @param string $attribute + * @param mixed $value + * @return bool + */ + public function passes($attribute, $value) + { + $this->attribute = $attribute; + $value = is_array($value) ? $value : [$value]; + + if ($this->type == 'contract_template') { + foreach ($value as $key => $row) { + if(!empty($row)) { + $id = Hasher::decode('contract_templates', $row); + $data = ContractTemplate:: + where('id', $id) + ->where('user_id', Auth::guard('user-api')->user()->id) + ->count(); + if (!$data) { + return false; + } + } + } + } + + return true; + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + return config('error_code.under_error'); + } +} diff --git a/app/Models/ContractTemplate.php b/app/Models/ContractTemplate.php index d507095..adff273 100644 --- a/app/Models/ContractTemplate.php +++ b/app/Models/ContractTemplate.php @@ -2,21 +2,39 @@ namespace App\Models; +use App\Http\Helpers\Hasher; + use Illuminate\Database\Eloquent\Model; +use Carbon\Carbon; class ContractTemplate extends Model { protected $table = 'contract_templates'; - protected $appends = ['contract_template_obligation_list']; + protected $appends = ['hash_id', 'contract_template_obligation_list']; public function contract_template_obligation() { return $this->hasMany('App\Models\ContractTemplateObligation', 'contract_template_id'); } + public function getHashIdAttribute() + { + return Hasher::encode('contract_templates', $this->id); + } + public function getContractTemplateObligationListAttribute() { return $this->contract_template_obligation()->get(); } + + 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 ecc82eb..473d23b 100644 --- a/config/constants.php +++ b/config/constants.php @@ -8,9 +8,17 @@ 'description' => 'Unity', ], 'version' => 1, + 'contact_template' => [ + 'status' => [ + 'active' => 1, + 'delete' => 2, + 'pending' => 9 + ] + ], 'contract_obligation' => [ 'complete_status' => [ 'pending' => 9, + 'delete' => 2, 'completed' => 1, ], 'accept_status' => [ diff --git a/config/error_code.php b/config/error_code.php index ff037e6..98764b8 100644 --- a/config/error_code.php +++ b/config/error_code.php @@ -1,6 +1,7 @@ 'INVALID_APP_KEY', + 'under_error' => 'UNDER_ERROR', 'exist_error' => 'EXIST_ERROR', 'unique_error' => 'UNIQUE_ERRO', 'img_error' => 'IMG_ERROR', diff --git a/database/seeders/AdminPermissionsTableSeeder.php b/database/seeders/AdminPermissionsTableSeeder.php index 8bd69be..d78e86f 100644 --- a/database/seeders/AdminPermissionsTableSeeder.php +++ b/database/seeders/AdminPermissionsTableSeeder.php @@ -22,11 +22,6 @@ class AdminPermissionsTableSeeder extends Seeder app()['cache']->forget('spatie.permission.cache'); // admin permissions - Permission::create(['name' => 'view keyword', 'guard_name' => 'admin']); - Permission::create(['name' => 'add keyword', 'guard_name' => 'admin']); - Permission::create(['name' => 'edit keyword', 'guard_name' => 'admin']); - Permission::create(['name' => 'delete keyword', 'guard_name' => 'admin']); - Permission::create(['name' => 'view admin', 'guard_name' => 'admin']); Permission::create(['name' => 'add admin', 'guard_name' => 'admin']); Permission::create(['name' => 'edit admin', 'guard_name' => 'admin']); @@ -37,16 +32,6 @@ class AdminPermissionsTableSeeder extends Seeder Permission::create(['name' => 'edit user', 'guard_name' => 'admin']); Permission::create(['name' => 'delete user', 'guard_name' => 'admin']); - Permission::create(['name' => 'view contributor', 'guard_name' => 'admin']); - Permission::create(['name' => 'add contributor', 'guard_name' => 'admin']); - Permission::create(['name' => 'edit contributor', 'guard_name' => 'admin']); - Permission::create(['name' => 'delete contributor', 'guard_name' => 'admin']); - - Permission::create(['name' => 'view reviewer', 'guard_name' => 'admin']); - Permission::create(['name' => 'add reviewer', 'guard_name' => 'admin']); - Permission::create(['name' => 'edit reviewer', 'guard_name' => 'admin']); - Permission::create(['name' => 'delete reviewer', 'guard_name' => 'admin']); - Permission::create(['name' => 'view role', 'guard_name' => 'admin']); Permission::create(['name' => 'add role', 'guard_name' => 'admin']); Permission::create(['name' => 'edit role', 'guard_name' => 'admin']); @@ -57,58 +42,6 @@ class AdminPermissionsTableSeeder extends Seeder Permission::create(['name' => 'edit permission', 'guard_name' => 'admin']); Permission::create(['name' => 'delete permission', 'guard_name' => 'admin']); - Permission::create(['name' => 'view mime_type', 'guard_name' => 'admin']); - Permission::create(['name' => 'add mime_type', 'guard_name' => 'admin']); - Permission::create(['name' => 'edit mime_type', 'guard_name' => 'admin']); - Permission::create(['name' => 'delete mime_type', 'guard_name' => 'admin']); - - Permission::create(['name' => 'view media_property_type', 'guard_name' => 'admin']); - Permission::create(['name' => 'add media_property_type', 'guard_name' => 'admin']); - Permission::create(['name' => 'edit media_property_type', 'guard_name' => 'admin']); - Permission::create(['name' => 'delete media_property_type', 'guard_name' => 'admin']); - - Permission::create(['name' => 'view license_type', 'guard_name' => 'admin']); - Permission::create(['name' => 'add license_type', 'guard_name' => 'admin']); - Permission::create(['name' => 'edit license_type', 'guard_name' => 'admin']); - Permission::create(['name' => 'delete license_type', 'guard_name' => 'admin']); - - Permission::create(['name' => 'view country', 'guard_name' => 'admin']); - Permission::create(['name' => 'add country', 'guard_name' => 'admin']); - Permission::create(['name' => 'edit country', 'guard_name' => 'admin']); - Permission::create(['name' => 'delete country', 'guard_name' => 'admin']); - - Permission::create(['name' => 'view language', 'guard_name' => 'admin']); - Permission::create(['name' => 'add language', 'guard_name' => 'admin']); - Permission::create(['name' => 'edit language', 'guard_name' => 'admin']); - Permission::create(['name' => 'delete language', 'guard_name' => 'admin']); - - Permission::create(['name' => 'view currency', 'guard_name' => 'admin']); - Permission::create(['name' => 'add currency', 'guard_name' => 'admin']); - Permission::create(['name' => 'edit currency', 'guard_name' => 'admin']); - Permission::create(['name' => 'delete currency', 'guard_name' => 'admin']); - - Permission::create(['name' => 'view system_bank', 'guard_name' => 'admin']); - Permission::create(['name' => 'add system_bank', 'guard_name' => 'admin']); - Permission::create(['name' => 'edit system_bank', 'guard_name' => 'admin']); - Permission::create(['name' => 'delete system_bank', 'guard_name' => 'admin']); - - Permission::create(['name' => 'view package', 'guard_name' => 'admin']); - Permission::create(['name' => 'add package', 'guard_name' => 'admin']); - Permission::create(['name' => 'edit package', 'guard_name' => 'admin']); - Permission::create(['name' => 'delete package', 'guard_name' => 'admin']); - - Permission::create(['name' => 'view on_demand_credit', 'guard_name' => 'admin']); - Permission::create(['name' => 'add on_demand_credit', 'guard_name' => 'admin']); - Permission::create(['name' => 'edit on_demand_credit', 'guard_name' => 'admin']); - Permission::create(['name' => 'delete on_demand_credit', 'guard_name' => 'admin']); - - Permission::create(['name' => 'view subscription_plan', 'guard_name' => 'admin']); - Permission::create(['name' => 'add subscription_plan', 'guard_name' => 'admin']); - Permission::create(['name' => 'edit subscription_plan', 'guard_name' => 'admin']); - Permission::create(['name' => 'delete subscription_plan', 'guard_name' => 'admin']); - - /////////////////////////////////////////////////////////////////////// - $shadow_admin_role = Role::create([ 'name' => 'Shadow Admin', 'guard_name' => 'admin', diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 24e5832..e5fae99 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -22,6 +22,7 @@ class DatabaseSeeder extends Seeder // User $this->call(UsersTableSeeder::class); + $this->call(UserPermissionsTableSeeder::class); // Soda Vendor Machine $this->call(SodaVendorMachine\SodaVendorContractTemplatesTableSeeder::class); diff --git a/database/seeders/UserPermissionsTableSeeder.php b/database/seeders/UserPermissionsTableSeeder.php new file mode 100644 index 0000000..0c8ee7a --- /dev/null +++ b/database/seeders/UserPermissionsTableSeeder.php @@ -0,0 +1,59 @@ +forget('spatie.permission.cache'); + + // user permissions + 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']); + Permission::create(['name' => 'delete contract_template', 'guard_name' => 'user']); + + Permission::create(['name' => 'view contract_template_obligation', 'guard_name' => 'user']); + Permission::create(['name' => 'add contract_template_obligation', 'guard_name' => 'user']); + Permission::create(['name' => 'edit contract_template_obligation', 'guard_name' => 'user']); + Permission::create(['name' => 'delete contract_template_obligation', 'guard_name' => 'user']); + + Permission::create(['name' => 'view contract_template_obligation_dependency', 'guard_name' => 'user']); + Permission::create(['name' => 'add contract_template_obligation_dependency', 'guard_name' => 'user']); + Permission::create(['name' => 'edit contract_template_obligation_dependency', 'guard_name' => 'user']); + Permission::create(['name' => 'delete contract_template_obligation_dependency', 'guard_name' => 'user']); + + $normal_user_role = Role::create([ + 'name' => 'Normal User', + 'guard_name' => 'user', + 'status' => 1 + ]); + + $normal_user_role->givePermissionTo(Permission::where('guard_name', 'user')->get()); + + $user = User::find(1); + $user->assignRole($normal_user_role); + + $user = User::find(2); + $user->assignRole($normal_user_role); + + $user = User::find(3); + $user->assignRole($normal_user_role); + + /////////////////////////////////////////////////////////////////////// + } +} diff --git a/routes/user/api.php b/routes/user/api.php index 88a5453..e1b4351 100644 --- a/routes/user/api.php +++ b/routes/user/api.php @@ -12,5 +12,46 @@ Route::group(['namespace' => 'User', 'prefix' => 'user-backsys/api'], function ( ] ); }); + + // Contract Templete + Route::prefix('contract-template')->group(function () { + Route::get('list', + [ + 'as' => 'api.contract-template.list', + 'uses' => 'ContractTemplateController@list', + 'middleware' => ['permission:view contract_template'] + ] + ); + Route::get('show/{hash_id}', + [ + 'as' => 'api.contract-template.show', + 'uses' => 'ContractTemplateController@show', + 'middleware' => ['permission:view contract_template'] + ] + ); + Route::post('store', + [ + 'as' => 'api.contract-template.store', + 'uses' => 'ContractTemplateController@store', + 'middleware' => ['permission:add contract_template'] + ] + ); + Route::put('update/{hash_id}', + [ + 'as' => 'api.contract-template.update', + 'uses' => 'ContractTemplateController@update', + 'middleware' => ['permission:edit contract_template'] + ] + ); + Route::delete('delete/{hash_id}', + [ + 'as' => 'api.contract-template.delete', + 'uses' => 'ContractTemplateController@delete', + 'middleware' => ['permission:delete contract_template'] + ] + ); + }); + + }); }); \ No newline at end of file