Files
exchange-2.0/app/Classes/Modules/Accounts/ControllersLogic/UpdateUserLogic.php
T
2020-12-28 00:03:14 +08:00

159 lines
5.2 KiB
PHP

<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Http\Resources\UserResource;
use App\Classes\General\Abstracts\AbstractControllersLogic;
use App\Classes\Modules\Accounts\Services\FetchesUser;
use App\Classes\Modules\Companies\Standards\Rules\CanUpdateCompany;
use App\Classes\Modules\Companies\Services\UpdatesCompany;
use App\Classes\Modules\Companies\DataTransferObjects\CompanyObject;
use App\Classes\Modules\Documents\Standards\Rules\CanCreateDocument;
use App\Classes\Modules\Documents\Services\CreatesDocument;
use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject;
use App\Classes\Modules\Documents\Standards\Rules\CanCreateFile;
use App\Classes\Modules\Documents\Services\CreatesFile;
use App\Classes\Modules\Documents\Services\Convert64ToFile;
use App\Classes\Modules\Documents\DataTransferObjects\FileObject;
use App\Classes\ValueObjects\Constants\OwnerType;
use App\Classes\ValueObjects\Constants\DocumentType;
use App\Classes\ValueObjects\Constants\ObjectStatus;
use App\Classes\ValueObjects\Constants\FileType;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class UpdateUserLogic extends AbstractControllersLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Update User',
'message' => 'You have successfully update a user'
];
}
/** @var FetchesUser */
private $fetchesUser;
/** @var CanUpdateCompany */
private $canUpdateCompany;
/** @var UpdatesCompany */
private $updatesCompany;
/** @var CanCreateDocument */
private $canCreateDocument;
/** @var CreatesDocument */
private $createsDocument;
/** @var CanCreateFile */
private $canCreateFIle;
/** @var CreatesFile */
private $createsFile;
/** @var Convert64ToFile */
private $convert64ToFile;
/**
* UpdateUserLogic constructor.
* @param FetchesUser $fetchesUser
* @param CanUpdateCompany $canUpdateCompany
* @param UpdatesCompany $updatesCompany
* @param CanCreateDocument $canCreateDocument
* @param CreatesDocument $createsDocument
* @param CanCreateFile $canCreateFile
* @param CreatesFile $createsFile
* @param Convert64ToFile $convert64ToFile
*/
public function __construct(
FetchesUser $fetchesUser,
CanUpdateCompany $canUpdateCompany,
UpdatesCompany $updatesCompany,
CanCreateDocument $canCreateDocument,
CreatesDocument $createsDocument,
CanCreateFile $canCreateFile,
CreatesFile $createsFile,
Convert64ToFile $convert64ToFile
)
{
$this->fetchesUser = $fetchesUser;
$this->canUpdateCompany = $canUpdateCompany;
$this->updatesCompany = $updatesCompany;
$this->canCreateDocument = $canCreateDocument;
$this->createsDocument = $createsDocument;
$this->canCreateFile = $canCreateFile;
$this->createsFile = $createsFile;
$this->convert64ToFile = $convert64ToFile;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
DB::beginTransaction();
$user_query = $this->fetchesUser->execute(['id' => \Auth::user()->id]);
$company_query = $user_query->company()->first();
$company_object = new CompanyObject(
$request->input('company_name', $company_query->name),
$request->input('company_reference', $company_query->refence),
$request->input('type', $company_query->type)
);
$this->canUpdateCompany->passes($company_object);
$company_query = $this->updatesCompany->execute($company_query, $company_object);
$document_type = $company_query->type == 1 ? DocumentType::COMPANY_PUBLIC_SMS_REGISTER : DocumentType::COMPANY_PERSONAL_IC;
$document_object = new DocumentObject(
$user_query->id,
OwnerType::COMPANY,
$document_type,
$request->input('document_reference'),
ObjectStatus::PENDING,
null,
null,
null,
null
);
$this->canCreateDocument->passes($document_object);
$document_query = $this->createsDocument->execute($document_object);
$file = $this->convert64ToFile->convert($request->input('file'));
$file_type = $company_query->type == 1 ? FileType::COMPANY_PUBLIC_SMS_REGISTER : FileType::COMPANY_PERSONAL_IC;
$file_object = new FileObject(
$document_query->id,
!empty($file[0]) ? json_encode($file[0]) : null,
$file_type
);
$this->canCreateFile->passes($file_object);
$file_query = $this->createsFile->execute($file_object);
DB::commit();
return $this->resourceResponse(new UserResource(\Auth::user()));
} catch (\Exception $exception) {
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}