big commit

This commit is contained in:
omair saleh
2021-04-05 11:58:32 +08:00
parent fb5dda8cf9
commit b679ae7f40
49 changed files with 1215 additions and 444 deletions
@@ -3,14 +3,17 @@
namespace App\Classes\General\Abstracts;
use App\Classes\Exceptions\ErrorException;
use App\Classes\Exceptions\InternalServerErrorException;
use App\Classes\ValueObjects\Constants\Notifications;
use App\Classes\ValueObjects\Constants\HttpStatus;
use App\Classes\ValueObjects\Response\ApiResponseObject;
use ErrorException;
use ErrorException as GeneralExceptions;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Http\Resources\Json\ResourceCollection;
use Illuminate\Support\Facades\DB;
abstract class AbstractControllerLogic
{
@@ -49,10 +52,17 @@ abstract class AbstractControllerLogic
try {
return $this->logic($request);
DB::beginTransaction();
} catch (ErrorException $exception){
return (new ApiResponseObject($this->getNotificationTitle().' failed', $exception->getMessage(), $exception->getCode() === 0 ? 500 : $exception->getCode()))->handler();
$response = $this->logic($request);
DB::commit();
return $response;
} catch (ErrorException|GeneralExceptions $exception){
return (new ApiResponseObject($this->getNotificationTitle().' failed', $exception->getMessage(),
$exception->getCode() ? $exception->getCode() : HttpStatus::SERVER_ERROR))->handler();
}
}
@@ -0,0 +1,9 @@
<?php
namespace App\Classes\General\Interfaces;
Interface DataTransferObject
{
}
@@ -119,7 +119,7 @@ class CreateUserLogic extends AbstractControllerLogic
// $this->sendUserVerificationEmail::dispatch($user, $attempt);
$request->request->set('name', $request->input('type') === 2 ? $request->input('company_name') : $request->input('name'));
$request->request->set('name', $request->input('type') === 1 ? $request->input('company_name') : $request->input('name'));
/** @var Company $company */
$company = $this->createCompanyProcessor->execute($request);
@@ -0,0 +1,91 @@
<?php
namespace App\Classes\Modules\Companies\ControllersLogic;
use App\Classes\Modules\Companies\Services\UpdatesCompanyStatus;
use App\Classes\Modules\Documents\Services\RejectsDocument;
use App\Classes\Modules\Documents\Standards\Rules\CanApproveDocument;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Http\Resources\DocumentResource;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Documents\Services\FetchesDocument;
use App\Classes\Modules\Documents\Services\ApprovesDocument;
use App\Models\Document;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ApproveIdentificationDocumentLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Approve Document',
'message' => 'You have successfully approved the Document'
];
}
/** @var CanApproveDocument*/
private $canApproveDocument;
/** @var ApprovesDocument */
private $approvesDocument;
/** @var RejectsDocument */
private $rejectsDocument;
/** @var FetchesDocument */
private $fetchesDocument;
/** @var UpdatesCompanyStatus */
private $updatesCompanyStatus;
/**
* ApproveIdentificationDocumentLogic constructor.
* @param CanApproveDocument $canApproveDocument
* @param ApprovesDocument $approvesDocument
* @param RejectsDocument $rejectsDocument
* @param FetchesDocument $fetchesDocument
* @param UpdatesCompanyStatus $updatesCompanyStatus
*/
public function __construct(CanApproveDocument $canApproveDocument, ApprovesDocument $approvesDocument, RejectsDocument $rejectsDocument, FetchesDocument $fetchesDocument, UpdatesCompanyStatus $updatesCompanyStatus)
{
$this->canApproveDocument = $canApproveDocument;
$this->approvesDocument = $approvesDocument;
$this->rejectsDocument = $rejectsDocument;
$this->fetchesDocument = $fetchesDocument;
$this->updatesCompanyStatus = $updatesCompanyStatus;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request) : JsonResponse
{
$status = $request->route('status');
/** @var Document $document */
$document = $this->fetchesDocument->execute(['id' => $request->route('document_id')]);
$this->canApproveDocument->passes();
$document = $status === 'approve' ? $this->approvesDocument->execute($document) : $this->rejectsDocument->execute($document);
$this->updatesCompanyStatus->execute($document->owner, $status === 'approve' ? ApprovalStatus::APPROVED : ApprovalStatus::PENDING_SUBMISSION);
return $this->resourceResponse(new DocumentResource($document));
}
}
@@ -17,6 +17,7 @@ use App\Classes\ValueObjects\Constants\DocumentType;
use App\Classes\ValueObjects\Constants\OwnerType;
use App\Http\Resources\CompanyResource;
use App\Http\Resources\DocumentResource;
use App\Models\Company;
use App\Models\Document;
use ErrorException;
use Illuminate\Http\JsonResponse;
@@ -70,31 +71,22 @@ class UpdateCompanyIdentificationDocumentLogic extends AbstractControllerLogic
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function logic(Request $request) : JsonResponse
{
try {
/** @var Company $company */
$company = $this->fetchesCompany->execute(['id' => $request->route('id')]);
$object = new DocumentObject($company->type === CompanyTypes::COMPANY_BUSINESS ? DocumentType::SSM_REGISTRATION: DocumentType::IDENTITY_CARD, $request->input('files'),
$request->input('reference'), ApprovalStatus::PENDING_VERIFICATION, 'identifications');
$company = $this->fetchesCompany->execute(['id' => $request->route('id')]);
/** @var Document $document */
$document = $this->createsDocument->execute($company, $object);
$this->createsFile->execute($document, $object);
$object = new DocumentObject(
$company->type === CompanyTypes::COMPANY_BUSINESS ? DocumentType::SSM_REGISTRATION: DocumentType::IDENTITY_CARD,
$request->input('files'), $request->input('reference'));
/** @var Document $document */
$document = $this->createsDocument->execute($company, $object);
$this->createsFile->execute($document, $object);
$this->updatesCompanyStatus->execute($company, ApprovalStatus::PENDING_VERIFICATION);
return $this->resourceResponse(new DocumentResource($document));
} catch (\Exception $exception){
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
$this->updatesCompanyStatus->execute($company, ApprovalStatus::PENDING_VERIFICATION);
return $this->response([]);
}
}
@@ -0,0 +1,71 @@
<?php
namespace App\Classes\Modules\Documents\ControllersLogic;
use App\Classes\Modules\Documents\Services\RejectsDocument;
use App\Classes\Modules\Documents\Standards\Rules\CanApproveDocument;
use App\Http\Resources\DocumentResource;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Documents\Services\FetchesDocument;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class RejectDocumentLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Reject Document',
'message' => 'You have successfully rejected the Document'
];
}
/** @var CanApproveDocument*/
private $canApproveDocument;
/** @var RejectsDocument */
private $rejectsDocument;
/** @var FetchesDocument */
private $fetchesDocument;
/**
* RejectDocumentLogic constructor.
* @param CanApproveDocument $canApproveDocument
* @param RejectsDocument $rejectsDocument
* @param FetchesDocument $fetchesDocument
*/
public function __construct(CanApproveDocument $canApproveDocument, RejectsDocument $rejectsDocument, FetchesDocument $fetchesDocument)
{
$this->canApproveDocument = $canApproveDocument;
$this->rejectsDocument = $rejectsDocument;
$this->fetchesDocument = $fetchesDocument;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request) : JsonResponse
{
$document = $this->fetchesDocument->execute(['id' => $request->route('id')]);
$this->canApproveDocument->passes();
$document_query = $this->rejectsDocument->execute($document);
return $this->resourceResponse(new DocumentResource($document_query));
}
}
@@ -0,0 +1,60 @@
<?php
namespace App\Classes\Modules\Documents\ControllersLogic;
use App\Classes\Exceptions\AccessForbiddenException;
use App\Classes\Exceptions\RequestValidationException;
use App\Classes\Exceptions\ResourceNotFoundException;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Documents\Standards\Rules\CanRenderDocument;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Tymon\JWTAuth\JWT;
class RenderDocumentLogic extends AbstractControllerLogic
{
/**
* RenderDocumentLogic constructor.
* @param CanRenderDocument $canRenderDocument
*/
public function __construct(CanRenderDocument $canRenderDocument)
{
$this->canRenderDocument = $canRenderDocument;
}
protected function notification(): array {
return [
'title' => '',
'message' => ''
];
}
/** @var CanRenderDocument */
private $canRenderDocument;
/**
* @param Request $request
* @return JsonResponse
* @throws AccessForbiddenException
* @throws RequestValidationException
* @throws ResourceNotFoundException
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function logic(Request $request) : JsonResponse
{
$file = $request->route('fileName');
$this->canRenderDocument->passes();
if(!Storage::disk('documents')->exists($file))
{
throw new ResourceNotFoundException('Requested File not found');
}
return $this->response(['src' => explode('.', $file)[1] == 'pdf' ? chunk_split(base64_encode(Storage::disk('documents')->get($file))) : Storage::disk('documents')->get($file) ]);
}
}
@@ -2,7 +2,7 @@
namespace App\Classes\Modules\Documents\DataTransferObjects;
use App\Classes\Interfaces\DataTransferObject;
use App\Classes\General\Interfaces\DataTransferObject;
use App\Classes\Modules\Documents\Services\ConvertsBase64ToFile;
class DocumentObject implements DataTransferObject
@@ -14,20 +14,30 @@ class DocumentObject implements DataTransferObject
/** @var array */
private $files;
/** @var string|null */
/** @var string */
private $reference;
/** @var int */
private $status;
/** @var string|null */
private $path;
/**
* DocumentObject constructor.
* @param string $document_type
* @param array $files
* @param null|string $reference
* @param string $reference
* @param int $status
* @param null|string $path
*/
public function __construct(string $document_type, array $files, ?string $reference = null)
public function __construct(string $document_type, array $files, string $reference, int $status, ?string $path = '')
{
$this->document_type = $document_type;
$this->files = $files;
$this->reference = $reference;
$this->status = $status;
$this->path = $path;
}
@@ -40,20 +50,29 @@ class DocumentObject implements DataTransferObject
}
/**
* @return string|null
* @return string
*/
public function getReference(): string
{
return $this->reference;
}
/**
* @return int
*/
public function getStatus(): int
{
return $this->status;
}
/**
* @return array
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function getFiles(): array
{
return (new ConvertsBase64ToFile())->convert($this->files);
return (new ConvertsBase64ToFile($this->path))->convert($this->files);
}
@@ -3,7 +3,6 @@
namespace App\Classes\Modules\Documents\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Models\Document;
use Carbon\Carbon;
@@ -18,7 +17,7 @@ class ApprovesDocument extends AbstractUpdateRecord
*/
public function execute(Document $model)
{
$model->status = ApprovalStatus::ACTIVE;
$model->status = ApprovalStatus::APPROVED;
$model->approved_by = Auth()->user()->id;
$model->approved_date = Carbon::now();
@@ -24,9 +24,6 @@ class ConvertsBase64ToFile
{
$this->path = $path;
$this->filesInfo = [];
File::isDirectory(storage_path($this->path)) or
File::makeDirectory(storage_path($this->path), 0777, true, true);
}
@@ -101,10 +98,9 @@ class ConvertsBase64ToFile
* @throws MalformedRequestException
*/
private function generateFile(FileObject $file, string $suffix = '') {
$filePath = $this->path.'/'.$file->getFileName().$suffix.'.'.$file->getExtension();
$filePath = storage_path($this->path.'/'.$file->getFileName().$suffix.'.'.$file->getExtension());
Storage::put($filePath, $file->getDecodedData());
Storage::disk('documents')->put($filePath, $file->getDecodedData());
return $filePath;
@@ -0,0 +1,26 @@
<?php
namespace App\Classes\Modules\Documents\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Models\Document;
use Carbon\Carbon;
class RejectsDocument extends AbstractUpdateRecord
{
/**
* @param Document $model
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Document $model)
{
$model->status = ApprovalStatus::REJECTED;
$model->approved_by = Auth()->user()->id;
$model->approved_date = Carbon::now();
return $this->handler($model);
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Classes\Modules\Documents\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
class CanApproveDocument extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param $object
* @return bool
*/
protected function validators($object): bool
{
return true;
}
/**
* @param $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Classes\Modules\Documents\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
class CanRenderDocument extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param $object
* @return bool
*/
protected function validators($object): bool
{
return true;
}
/**
* @param $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -5,4 +5,5 @@ namespace App\Classes\ValueObjects\Constants;
final class DocumentType {
public const SSM_REGISTRATION = 'SSM_REGISTRATION';
public const IDENTITY_CARD = 'IDENTITY_CARD';
public const IDENTIFICATION_DOCUMENTS = [self::IDENTITY_CARD, self::SSM_REGISTRATION];
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Companies;
use App\Classes\Modules\Companies\ControllersLogic\ApproveIdentificationDocumentLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ApproveIdentificationDocumentController
{
/**
* @param Request $request
* @param ApproveIdentificationDocumentLogic $logic
* @return JsonResponse
*/
public function approve(Request $request, ApproveIdentificationDocumentLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Documents;
use App\Classes\Modules\Companies\ControllersLogic\ApproveIdentificationDocumentLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ApproveDocumentController
{
/**
* @param Request $request
* @param ApproveIdentificationDocumentLogic $logic
* @return JsonResponse
*/
public function approve(Request $request, ApproveIdentificationDocumentLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Documents;
use App\Classes\Modules\Documents\ControllersLogic\ListDocumentLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ListDocumentsController
{
/**
* @param Request $request
* @param ListDocumentLogic $logic
* @return JsonResponse
*/
public function list(Request $request, ListDocumentLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Documents;
use App\Classes\Modules\Documents\ControllersLogic\RejectDocumentLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class RejectDocumentController
{
/**
* @param Request $request
* @param RejectDocumentLogic $logic
* @return JsonResponse
*/
public function reject(Request $request, RejectDocumentLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Documents;
use App\Classes\Modules\Documents\ControllersLogic\RenderDocumentLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class RenderDocumentController
{
/**
* @param Request $request
* @param RenderDocumentLogic $logic
* @return JsonResponse
*/
public function fileStorageServe(Request $request, RenderDocumentLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -77,9 +77,9 @@ class OrderController
'marking' => CompanyConnections::where('module_one', $order->importer->modules->first()->id)->first()->marking
];
return view('pages.pdf.qr', $data);
// return view('pages.pdf.qr', $data);
return $pdf->loadView('pages.pdf.qr', $data)->download();
return $pdf->loadView('pages.pdf.qr', $data)->stream();
}
}
+3 -1
View File
@@ -4,6 +4,7 @@ namespace App\Http\Resources;
use App\Classes\ValueObjects\Constants\AccountStatus;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\DocumentType;
use App\Models\CompanyConnections;
use Illuminate\Http\Resources\Json\JsonResource;
@@ -26,7 +27,8 @@ class CompanyResource extends JsonResource
'status' => (int) $this->status,
'delivery_address' => new AddressResource($this->deliveryAddress),
'contact' => new ContactResource($this->contacts->first()),
'total_orders' => count($this->orders)
'total_orders' => count($this->orders),
'identification' => new DocumentResource($this->whenLoaded('documents', $this->documents->whereIn('document_type', DocumentType::IDENTIFICATION_DOCUMENTS)->first())),
];
}
}