From 98b354d6b24a9a7bc85e474e12c0ee09a80a599a Mon Sep 17 00:00:00 2001 From: CheeSiong Date: Wed, 18 Nov 2020 10:37:03 +0800 Subject: [PATCH] document --- .../ControllerLogic/ApproveDocumentLogic.php | 97 +++++++++++++++++++ .../ControllerLogic/ListDocumentLogic.php | 82 ++++++++++++++++ .../Documents/Services/ApprovesDocument.php | 23 +++++ .../Documents/Services/FetchesDocument.php | 33 +++++++ .../Documents/Services/ListsDocuments.php | 33 +++++++ .../Standards/Rules/CanListDocuments.php | 45 +++++++++ .../Standards/Rules/CanUpdateDocument.php | 53 ++++++++++ .../ValueObjects/Constants/ObjectStatus.php | 1 + .../Documents/ApproveDocumentController.php | 20 ++++ .../Documents/ListDocumentsController.php | 20 ++++ app/Http/Resources/DocumentResource.php | 26 +++++ app/Models/Document.php | 17 +++- app/Models/File.php | 5 + ...20_11_03_122319_create_documents_table.php | 4 +- .../seeds/AdminUserPermissionsTableSeeder.php | 6 ++ routes/api.php | 3 + routes/document.php | 12 +++ 17 files changed, 477 insertions(+), 3 deletions(-) create mode 100644 app/Classes/Modules/Documents/ControllerLogic/ApproveDocumentLogic.php create mode 100644 app/Classes/Modules/Documents/ControllerLogic/ListDocumentLogic.php create mode 100644 app/Classes/Modules/Documents/Services/ApprovesDocument.php create mode 100644 app/Classes/Modules/Documents/Services/FetchesDocument.php create mode 100644 app/Classes/Modules/Documents/Services/ListsDocuments.php create mode 100644 app/Classes/Modules/Documents/Standards/Rules/CanListDocuments.php create mode 100644 app/Classes/Modules/Documents/Standards/Rules/CanUpdateDocument.php create mode 100644 app/Http/Controllers/Documents/ApproveDocumentController.php create mode 100644 app/Http/Controllers/Documents/ListDocumentsController.php create mode 100644 app/Http/Resources/DocumentResource.php create mode 100644 routes/document.php diff --git a/app/Classes/Modules/Documents/ControllerLogic/ApproveDocumentLogic.php b/app/Classes/Modules/Documents/ControllerLogic/ApproveDocumentLogic.php new file mode 100644 index 00000000..c41ab371 --- /dev/null +++ b/app/Classes/Modules/Documents/ControllerLogic/ApproveDocumentLogic.php @@ -0,0 +1,97 @@ + 'Approve Document', + 'message' => 'You have successfully approved the Document' + ]; + } + + /** @var CanUpdateDocument */ + private $canUpdateDocument; + + /** @var ApprovesDocument */ + private $approvesDocument; + + /** @var FetchesDocument */ + private $fetchesDocument; + + /** + * UpdateStandardSegmentConstantLogic constructor. + * @param CanUpdateDocument $canUpdateDocument + * @param ApprovesDocument $approvesDocument + * @param FetchesDocument $fetchesDocument + */ + public function __construct( + canUpdateDocument $canUpdateDocument, + ApprovesDocument $approvesDocument, + FetchesDocument $fetchesDocument + ) + { + $this->canUpdateDocument = $canUpdateDocument; + $this->approvesDocument = $approvesDocument; + $this->fetchesDocument = $fetchesDocument; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + try { + DB::beginTransaction(); + + $document_query = $this->fetchesDocument->execute(['id' => $request->route('id')]); + + $document_object = new DocumentObject( + $document_query->owner_id, + $document_query->owner_type, + $document_query->document_type, + $document_query->reference, + ObjectStatus::ACTIVE, + \Auth::user()->id, + $document_query->issued_date, + $document_query->expired_date, + $document_query->approved_date + ); + $this->canUpdateDocument->passes($document_object); + $document_query = $this->approvesDocument->execute($document_query, $document_object); + + DB::commit(); + + return $this->resourceResponse(new DocumentResource($document_query)); + + } catch (\Exception $exception){ + dd($exception); + throw new ErrorException($exception->getMessage(), $exception->getCode()); + } + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Documents/ControllerLogic/ListDocumentLogic.php b/app/Classes/Modules/Documents/ControllerLogic/ListDocumentLogic.php new file mode 100644 index 00000000..25049850 --- /dev/null +++ b/app/Classes/Modules/Documents/ControllerLogic/ListDocumentLogic.php @@ -0,0 +1,82 @@ + 'Retrieved Document', + 'message' => 'You have successfully retrieved a list of Document' + ]; + } + + /** @var CanListDocuments */ + private $canListDocuments; + + /** @var ListsDocuments */ + private $listsDocuments; + + /** + * ListStandardSegmentLogic constructor. + * @param CanListDocuments $canListDocuments + * @param ListsDocuments $listsDocuments + */ + public function __construct(CanListDocuments $canListDocuments, ListsDocuments $listsDocuments) + { + $this->canListDocuments = $canListDocuments; + $this->listsDocuments = $listsDocuments; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + try { + + $document_type = $request->input('document_type'); + $reference = $request->input('reference'); + $status = $request->input('status'); + + $data = []; + + if ($document_type) { + $data['document_type'] = $document_type; + } + if ($reference) { + $data['reference'] = $reference; + } + if ($status) { + $data['status'] = $status; + } + + $this->canListDocuments->passes(); + + $query = $this->listsDocuments->execute($data); + + return $this->collectionResponse(DocumentResource::collection($query)); + + } catch (\Exception $exception){ + throw new ErrorException($exception->getMessage(), $exception->getCode()); + } + + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Documents/Services/ApprovesDocument.php b/app/Classes/Modules/Documents/Services/ApprovesDocument.php new file mode 100644 index 00000000..206d9efd --- /dev/null +++ b/app/Classes/Modules/Documents/Services/ApprovesDocument.php @@ -0,0 +1,23 @@ +status = $object->getStatus(); + $model->approved_by = $object->getApprovedBy(); + return $this->handler($model); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Documents/Services/FetchesDocument.php b/app/Classes/Modules/Documents/Services/FetchesDocument.php new file mode 100644 index 00000000..1aa12c87 --- /dev/null +++ b/app/Classes/Modules/Documents/Services/FetchesDocument.php @@ -0,0 +1,33 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Documents/Services/ListsDocuments.php b/app/Classes/Modules/Documents/Services/ListsDocuments.php new file mode 100644 index 00000000..9f372279 --- /dev/null +++ b/app/Classes/Modules/Documents/Services/ListsDocuments.php @@ -0,0 +1,33 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Documents/Standards/Rules/CanListDocuments.php b/app/Classes/Modules/Documents/Standards/Rules/CanListDocuments.php new file mode 100644 index 00000000..d94068b7 --- /dev/null +++ b/app/Classes/Modules/Documents/Standards/Rules/CanListDocuments.php @@ -0,0 +1,45 @@ +can('view document')) { + return false; + } + + return true; + + } + + /** + * @param DocumentObject $object + * @return bool + */ + protected function validators($object): bool + { + return true; + + } + + + /** + * @param DocumentObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Documents/Standards/Rules/CanUpdateDocument.php b/app/Classes/Modules/Documents/Standards/Rules/CanUpdateDocument.php new file mode 100644 index 00000000..f07fb166 --- /dev/null +++ b/app/Classes/Modules/Documents/Standards/Rules/CanUpdateDocument.php @@ -0,0 +1,53 @@ +documentValidation = $documentValidation; + } + + /** + * @return bool + */ + protected function authorized(): bool + { + // TODO Set Authorization rules + return true; + } + + /** + * @param DocumentObject $object + * @return bool + * @throws \App\Classes\Exceptions\RequestValidationException + */ + protected function validators($object): bool + { + return $this->documentValidation->validate($object); + } + + /** + * @param DocumentObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } + +} \ No newline at end of file diff --git a/app/Classes/ValueObjects/Constants/ObjectStatus.php b/app/Classes/ValueObjects/Constants/ObjectStatus.php index 55191cd5..18dcaa58 100644 --- a/app/Classes/ValueObjects/Constants/ObjectStatus.php +++ b/app/Classes/ValueObjects/Constants/ObjectStatus.php @@ -3,5 +3,6 @@ namespace App\Classes\ValueObjects\Constants; final class ObjectStatus { + public const ACTIVE = 1; public const PENDING = 9; } diff --git a/app/Http/Controllers/Documents/ApproveDocumentController.php b/app/Http/Controllers/Documents/ApproveDocumentController.php new file mode 100644 index 00000000..964a3811 --- /dev/null +++ b/app/Http/Controllers/Documents/ApproveDocumentController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/Documents/ListDocumentsController.php b/app/Http/Controllers/Documents/ListDocumentsController.php new file mode 100644 index 00000000..a440737d --- /dev/null +++ b/app/Http/Controllers/Documents/ListDocumentsController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/app/Http/Resources/DocumentResource.php b/app/Http/Resources/DocumentResource.php new file mode 100644 index 00000000..51aef2e7 --- /dev/null +++ b/app/Http/Resources/DocumentResource.php @@ -0,0 +1,26 @@ + $this->id, + 'document_type' => $this->document_type, + 'reference' => $this->reference, + 'status' => (int) $this->status, + 'approved_by' => (int) $this->approved_by, + 'files' => $this->files()->get() + ]; + } +} diff --git a/app/Models/Document.php b/app/Models/Document.php index 6c48c2c8..05899fdf 100644 --- a/app/Models/Document.php +++ b/app/Models/Document.php @@ -5,6 +5,8 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Database\Eloquent\Relations\hasMany; + /** * Class Document * @package App\Models @@ -22,5 +24,18 @@ use Illuminate\Database\Eloquent\SoftDeletes; */ class Document extends AbstractModel { - // + use SoftDeletes; + + protected $table = 'documents'; + + protected $dates = ['deleted_at']; + + /** + * @return hasMany + */ + public function files(): hasMany + { + return $this->hasMany(File::class, 'document_id'); + } + } diff --git a/app/Models/File.php b/app/Models/File.php index e22d3a4d..8c175039 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -21,4 +21,9 @@ class File extends AbstractModel protected $table = 'files'; protected $dates = ['deleted_at']; + + public function getFileAttribute($value) + { + return $value ? json_decode($value) : []; + } } diff --git a/database/migrations/2020_11_03_122319_create_documents_table.php b/database/migrations/2020_11_03_122319_create_documents_table.php index e81aefb7..dbe9c684 100644 --- a/database/migrations/2020_11_03_122319_create_documents_table.php +++ b/database/migrations/2020_11_03_122319_create_documents_table.php @@ -20,8 +20,8 @@ class CreateDocumentsTable extends Migration $table->string('document_type')->nullable(); $table->string('reference')->nullable(); $table->integer('status')->nullable(); - $table->bigInteger('approved_by')->unsigned(); - $table->foreign('approved_by')->references('id')->on('users')->onDelete('cascade')->nullable(); + $table->bigInteger('approved_by')->unsigned()->nullable(); + $table->foreign('approved_by')->references('id')->on('users')->onDelete('cascade'); $table->timestamp('issued_date')->nullable(); $table->timestamp('expired_date')->nullable(); $table->timestamp('approved_date')->nullable(); diff --git a/database/seeds/AdminUserPermissionsTableSeeder.php b/database/seeds/AdminUserPermissionsTableSeeder.php index 75a0edb8..21acdf8e 100644 --- a/database/seeds/AdminUserPermissionsTableSeeder.php +++ b/database/seeds/AdminUserPermissionsTableSeeder.php @@ -19,6 +19,12 @@ class AdminUserPermissionsTableSeeder extends Seeder app()['cache']->forget('spatie.permission.cache'); // admin permissions + Permission::create(['name' => 'view document', 'guard_name' => 'web']); + Permission::create(['name' => 'add document', 'guard_name' => 'web']); + Permission::create(['name' => 'edit document', 'guard_name' => 'web']); + Permission::create(['name' => 'delete document', 'guard_name' => 'web']); + + Permission::create(['name' => 'view standard_segment', 'guard_name' => 'web']); Permission::create(['name' => 'add standard_segment', 'guard_name' => 'web']); Permission::create(['name' => 'edit standard_segment', 'guard_name' => 'web']); diff --git a/routes/api.php b/routes/api.php index 6ff3b10c..7199a37a 100644 --- a/routes/api.php +++ b/routes/api.php @@ -17,6 +17,9 @@ use Illuminate\Support\Facades\Route; Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function () { require __DIR__ . '/account.php'; + + require __DIR__ . '/document.php'; + require __DIR__ . '/segment.php'; require __DIR__ . '/segment_constant.php'; diff --git a/routes/document.php b/routes/document.php new file mode 100644 index 00000000..d6d16a4e --- /dev/null +++ b/routes/document.php @@ -0,0 +1,12 @@ + 'Documents'], function () { + Route::group(['middleware' => 'valid.token'], function () { + Route::group(['prefix' => 'document'], function () { + Route::get('/list', 'ListDocumentsController@list')->name('document.list'); + Route::put('/approve/{id}', 'ApproveDocumentController@approve')->name('document.approve'); + }); + }); +}); \ No newline at end of file