large commit

This commit is contained in:
omair saleh
2021-03-11 13:06:02 +08:00
parent 13ddf458db
commit 05401f6bbc
729 changed files with 23312 additions and 7218 deletions
+4 -1
View File
@@ -45,4 +45,7 @@ PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
JWT_SECRET= FILESYSTEM_DRIVER="documents"
JWT_SECRET=
JWT_TTL=1440
@@ -3,7 +3,6 @@
namespace App\Classes\Exceptions; namespace App\Classes\Exceptions;
use Exception; use Exception;
use Illuminate\Support\Facades\Log;
class ErrorException extends Exception { class ErrorException extends Exception {
@@ -3,16 +3,19 @@
namespace App\Classes\General\Abstracts; 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\Notifications;
use App\Classes\ValueObjects\Constants\HttpStatus; use App\Classes\ValueObjects\Constants\HttpStatus;
use App\Classes\ValueObjects\Response\ApiResponseObject; use App\Classes\ValueObjects\Response\ApiResponseObject;
use ErrorException; use ErrorException as GeneralExceptions;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Http\Resources\Json\ResourceCollection; use Illuminate\Http\Resources\Json\ResourceCollection;
use Illuminate\Support\Facades\DB;
abstract class AbstractControllersLogic abstract class AbstractControllerLogic
{ {
/** /**
@@ -49,10 +52,17 @@ abstract class AbstractControllersLogic
try { try {
return $this->logic($request); DB::beginTransaction();
} catch (ErrorException $exception){ $response = $this->logic($request);
return (new ApiResponseObject($this->getNotificationTitle().' failed', $exception->getMessage(), $exception->getCode()))->handler();
DB::commit();
return $response;
} catch (ErrorException|GeneralExceptions $exception){
return (new ApiResponseObject($this->getNotificationTitle().' failed', $exception->getMessage(),
$exception->getCode() ? $exception->getCode() : HttpStatus::SERVER_ERROR))->handler();
} }
} }
@@ -5,7 +5,7 @@ namespace App\Classes\General\Abstracts;
use App\Classes\Exceptions\AccessForbiddenException; use App\Classes\Exceptions\AccessForbiddenException;
use App\Classes\Exceptions\RequestValidationException; use App\Classes\Exceptions\RequestValidationException;
use App\Classes\Interfaces\DataTransferObject; use App\Classes\General\Interfaces\DataTransferObject;
abstract class AbstractRule abstract class AbstractRule
{ {
@@ -3,7 +3,7 @@
namespace App\Classes\General\Abstracts; namespace App\Classes\General\Abstracts;
use App\Classes\Exceptions\MalformedRequestException; use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Interfaces\DataTransferObject; use App\Classes\General\Interfaces\DataTransferObject;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
@@ -16,7 +16,7 @@ abstract class AbstractService
* @return mixed * @return mixed
* @throws MalformedRequestException * @throws MalformedRequestException
*/ */
public function execute(Model $model, DataTransferObject $object){ public function execute(Model $model){
try{ try{
@@ -4,7 +4,7 @@ namespace App\Classes\General\Abstracts;
use App\Classes\Exceptions\RequestValidationException; use App\Classes\Exceptions\RequestValidationException;
use App\Classes\Interfaces\DataTransferObject; use App\Classes\General\Interfaces\DataTransferObject;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
abstract class AbstractValidation abstract class AbstractValidation
@@ -31,6 +31,7 @@ abstract class AbstractValidation
/** /**
* @param DataTransferObject $object * @param DataTransferObject $object
* @param null|string $type
* @return bool * @return bool
* @throws RequestValidationException * @throws RequestValidationException
*/ */
@@ -0,0 +1,10 @@
<?php
namespace App\Classes\General;
use App\Classes\General\Interfaces\DataTransferObject;
class DummyDataTransferObject implements DataTransferObject
{
}
@@ -22,7 +22,6 @@ abstract class AbstractDeleteRecord
} }
} catch (QueryException|\Exception $exception){ } catch (QueryException|\Exception $exception){
dd($exception->getMessage());
throw new MalformedRequestException('Unable to update the record due to unexpected error'); throw new MalformedRequestException('Unable to update the record due to unexpected error');
} }
} }
@@ -18,13 +18,10 @@ abstract class AbstractUpdateRecord
public function handler(Model $model){ public function handler(Model $model){
try{ try{
if($model->save()){ if($model->save()){ return $model; }
return $model;
}
} catch (QueryException $exception){ } catch (QueryException $exception){
throw new MalformedRequestException($exception); throw new MalformedRequestException($exception);
// throw new MalformedRequestException('Unable to update the record due to unexpected error');
} }
} }
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\General\Eloquent;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOneOrMany;
use Illuminate\Database\QueryException;
abstract class AbstractUpdateRelationshipRecord
{
/**
* @param HasOneOrMany $relation
* @param Model $model
* @return Model
* @throws MalformedRequestException
*/
public function handler(HasOneOrMany $relation, Model $model){
try{
if($relation->save($model)){
return $model;
}
} catch (QueryException $exception){
throw new MalformedRequestException($exception->getMessage());
}
}
}
@@ -4,7 +4,6 @@ namespace App\Classes\General\Eloquent;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str; use Illuminate\Support\Str;
class ApplyFiltersToQuery class ApplyFiltersToQuery
@@ -4,7 +4,7 @@ namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
class UserName implements Filter class BusinessType implements Filter
{ {
/** /**
@@ -14,9 +14,7 @@ class UserName implements Filter
*/ */
public static function apply(Builder $builder, $value) public static function apply(Builder $builder, $value)
{ {
return $builder->where(function($query) use ($value) { return $builder->where('business_type', $value);
$query->where('first_name', 'LIKE', '%' . $value . '%')->orWhere('last_name', 'LIKE', '%' . $value . '%');
});
} }
} }
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class CountryId implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->where('country_id', $value);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use App\Classes\ValueObjects\Constants\SegmentConstants;
use Illuminate\Database\Eloquent\Builder;
class CustomServiceType implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->where('reference', SegmentConstants::CUSTOM_SERVICE_TYPE)->where('detail->id', $value);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class DocumentTypeIn implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->whereIn('document_type', $value);
}
}
@@ -14,7 +14,7 @@ class Email implements Filter
*/ */
public static function apply(Builder $builder, $value) public static function apply(Builder $builder, $value)
{ {
return $builder->where('email', 'LIKE', '%' . $value . '%'); return $builder->where('email', '=', $value);
} }
} }
@@ -4,7 +4,7 @@ namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
class NotId implements Filter class IdNot implements Filter
{ {
/** /**
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class IdNotIn implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->whereNotIn('id', $value);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class Marking implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->where('marking', $value);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
class NotExpired implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->whereDate('expires_on', '>=', Carbon::now());
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class OriginalCurrencyIdIn implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->whereIn('original_currency_id', $value);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class Reference implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->where('Reference', '=', $value);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class ServiceId implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->where('service_id', $value);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use App\Classes\ValueObjects\Constants\SegmentConstants;
use Illuminate\Database\Eloquent\Builder;
class ServiceType implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->where('reference', SegmentConstants::SERVICE_TYPE)->where('detail->id', $value);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class ShortCode implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->where('short_code', $value);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class StatusIn implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->whereIn('status', $value);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use App\Classes\ValueObjects\Constants\SegmentConstants;
use Illuminate\Database\Eloquent\Builder;
class SupplierCurrencies implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->where('reference', SegmentConstants::SUPPLIER_CURRENCIES)->where('detail->id', $value);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class Type implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->where('type', $value);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class WithBookings implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->with('bookings');
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class WithCompany implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->with('owner');
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class WithTransactions implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->with('transactions');
}
}
@@ -4,7 +4,7 @@ namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
class DefaultType implements Filter class isDefault implements Filter
{ {
/** /**
+27
View File
@@ -0,0 +1,27 @@
<?php
namespace App\Classes\General;
use Illuminate\Support\Str;
class Helper
{
/**
* @param string $methodName
* @return string
*/
static function getPropertyName(string $methodName){
return Str::snake(str_replace('get', '', $methodName));
}
/**
* @param string $className
* @return array
*/
static function getClassMethodsArray(string $className){
return array_slice(get_class_methods($className), 1);
}
}
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Classes\Interfaces; namespace App\Classes\General\Interfaces;
Interface DataTransferObject Interface DataTransferObject
@@ -0,0 +1,13 @@
<?php
namespace App\Classes\General\Interfaces;
use Illuminate\Database\Eloquent\Relations\MorphMany;
interface Documentable
{
public function documents(): morphMany;
}
@@ -0,0 +1,42 @@
<?php
namespace App\Classes\Jobs;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Modules\Accounts\Services\ExpiresEmailVerificationAttempt;
use App\Classes\Modules\Accounts\Services\ExpiresPasswordReset;
use App\Models\PasswordReset;
use App\Models\UserEmailVerification;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class EmailVerificationAttemptExpiration implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/** @var UserEmailVerification */
private $attempt;
/**
* EmailVerificationAttemptExpiration constructor.
* @param UserEmailVerification $attempt
*/
public function __construct(UserEmailVerification $attempt)
{
$this->attempt = $attempt;
}
/**
* @throws MalformedRequestException
*/
public function handle()
{
(new ExpiresEmailVerificationAttempt())->execute($this->attempt);
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Classes\Jobs;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Modules\Accounts\Services\ExpiresPasswordReset;
use App\Models\PasswordReset;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class PasswordResetTokenExpiration implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/** @var PasswordReset */
private $attempt;
/**
* PasswordResetTokenExpiration constructor.
* @param PasswordReset $attempt
*/
public function __construct(PasswordReset $attempt)
{
$this->attempt = $attempt;
}
/**
* @throws MalformedRequestException
*/
public function handle()
{
(new ExpiresPasswordReset())->execute($this->attempt);
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Classes\Jobs;
use App\Classes\Notifications\ResetPasswordEmail;
use App\Models\PasswordReset;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendResetPasswordEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/** @var User */
private $user;
/** @var PasswordReset */
private $attempt;
/**
* SendResetPasswordEmail constructor.
* @param User $user
* @param PasswordReset $attempt
*/
public function __construct(User $user, PasswordReset $attempt)
{
$this->user = $user;
$this->attempt = $attempt;
}
public function handle()
{
$this->user->notify(new ResetPasswordEmail($this->user, $this->attempt));
}
}
@@ -0,0 +1,41 @@
<?php
namespace App\Classes\Jobs;
use App\Classes\Notifications\UserVerificationEmail;
use App\Models\User;
use App\Models\UserEmailVerification;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendUserVerificationEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/** @var User */
private $user;
/** @var UserEmailVerification */
private $attempt;
/**
* SendUserVerificationEmail constructor.
* @param User $user
* @param UserEmailVerification $attempt
*/
public function __construct(User $user, UserEmailVerification $attempt)
{
$this->user = $user;
$this->attempt = $attempt;
}
public function handle()
{
$this->user->notify(new UserVerificationEmail($this->user, $this->attempt));
}
}
@@ -2,17 +2,12 @@
namespace App\Classes\Modules\Accounts\ControllersLogic; namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\Modules\Accounts\DataTransferObjects\AuthenticationCredentialsObject; use App\Classes\Modules\Accounts\Processors\AuthenticationProcessor;
use App\Classes\Modules\Accounts\Services\AuthenticatesUser; use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Accounts\Services\AuthenticationRedirect;
use App\Classes\Modules\Accounts\Standards\Rules\CanAuthenticateUser;
use App\Classes\General\Abstracts\AbstractControllersLogic;
use App\Classes\ValueObjects\Constants\Notifications;
use ErrorException;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class AuthenticateUserLogic extends AbstractControllersLogic class AuthenticateUserLogic extends AbstractControllerLogic
{ {
protected function notification():array { protected function notification():array {
@@ -22,51 +17,30 @@ class AuthenticateUserLogic extends AbstractControllersLogic
]; ];
} }
/** @var CanAuthenticateUser */ /** @var AuthenticationProcessor */
private $canAuthenticateUser; private $authenticationProcessor;
/** @var AuthenticatesUser */
private $authenticatesUser;
/** @var AuthenticationRedirect */
private $authenticationRedirect;
/** /**
* AuthenticateUserLogic constructor. * AuthenticateUserLogic constructor.
* @param CanAuthenticateUser $canAuthenticateUser * @param AuthenticationProcessor $authenticationProcessor
* @param AuthenticatesUser $authenticatesUser
* @param AuthenticationRedirect $authenticationRedirect
*/ */
public function __construct(CanAuthenticateUser $canAuthenticateUser, AuthenticatesUser $authenticatesUser, AuthenticationRedirect $authenticationRedirect) public function __construct(AuthenticationProcessor $authenticationProcessor)
{ {
$this->canAuthenticateUser = $canAuthenticateUser; $this->authenticationProcessor = $authenticationProcessor;
$this->authenticatesUser = $authenticatesUser;
$this->authenticationRedirect = $authenticationRedirect;
} }
/** /**
* @param Request $request * @param Request $request
* @return JsonResponse * @return JsonResponse
* @throws ErrorException * @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\AccessUnauthorisedException
* @throws \App\Classes\Exceptions\InternalServerErrorException
* @throws \App\Classes\Exceptions\RequestValidationException
*/ */
protected function logic(Request $request): JsonResponse { protected function logic(Request $request): JsonResponse {
try { return $this->response($this->authenticationProcessor->execute($request));
$object = new AuthenticationCredentialsObject($request->input('email'),
$request->input('password'), $request->input('remember_me'));
$this->canAuthenticateUser->passes($object);
$token = $this->authenticatesUser->execute($object);
return $this->response(['access_token' => $token, 'redirect_url' => $this->authenticationRedirect->url()]);
} catch (\Exception $exception){
dd($exception);
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
} }
} }
@@ -2,18 +2,13 @@
namespace App\Classes\Modules\Accounts\ControllersLogic; namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\Modules\Accounts\DataTransferObjects\AuthenticationCredentialsObject;
use App\Classes\Modules\Accounts\Services\AuthenticatesUser;
use App\Classes\Modules\Accounts\Services\AuthenticationRedirect;
use App\Classes\Modules\Accounts\Services\FetchesUser; use App\Classes\Modules\Accounts\Services\FetchesUser;
use App\Classes\Modules\Accounts\Standards\Rules\CanAuthenticateUser; use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\General\Abstracts\AbstractControllersLogic;
use App\Classes\ValueObjects\Constants\Notifications;
use ErrorException; use ErrorException;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class CheckEmailLogic extends AbstractControllersLogic class CheckEmailLogic extends AbstractControllerLogic
{ {
protected function notification():array { protected function notification():array {
@@ -0,0 +1,108 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Accounts\Processors\AuthenticationProcessor;
use App\Classes\Modules\Accounts\Processors\CreateUserProcessor;
use App\Classes\Modules\Accounts\Processors\GenerateEmailVerificationAttemptProcessor;
use App\Classes\Modules\Companies\Processors\AssignEmployeeProcessor;
use App\Classes\Modules\Companies\Processors\AssignSegmentProcessor;
use App\Classes\Modules\Companies\Processors\CreateCompanyProcessor;
use App\Classes\Modules\Companies\DataTransferObjects\EmploymentObject;
use App\Classes\Modules\Contacts\Processors\CreateContactProcessor;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\BusinessType;
use App\Classes\ValueObjects\Constants\RoleTypes;
use App\Models\Company;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
class CreateCustomerLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Created User',
'message' => 'You have successfully created a new User'
];
}
/** @var CreateUserProcessor */
private $createUserProcessor;
/** @var CreateCompanyProcessor */
private $createCompanyProcessor;
/** @var CreateContactProcessor */
private $createContactProcessor;
/** @var AssignEmployeeProcessor */
private $assignEmployeeProcessor;
/** @var AssignSegmentProcessor */
private $assignSegmentProcessor;
/** @var AuthenticationProcessor */
private $authenticationProcessor;
/** @var GenerateEmailVerificationAttemptProcessor */
private $generateEmailVerificationAttemptProcessor;
/**
* CreateCustomerLogic constructor.
* @param CreateUserProcessor $createUserProcessor
* @param CreateCompanyProcessor $createCompanyProcessor
* @param CreateContactProcessor $createContactProcessor
* @param AssignEmployeeProcessor $assignEmployeeProcessor
* @param AssignSegmentProcessor $assignSegmentProcessor
* @param AuthenticationProcessor $authenticationProcessor
* @param GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor
*/
public function __construct(CreateUserProcessor $createUserProcessor, CreateCompanyProcessor $createCompanyProcessor, CreateContactProcessor $createContactProcessor, AssignEmployeeProcessor $assignEmployeeProcessor, AssignSegmentProcessor $assignSegmentProcessor, AuthenticationProcessor $authenticationProcessor, GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor)
{
$this->createUserProcessor = $createUserProcessor;
$this->createCompanyProcessor = $createCompanyProcessor;
$this->createContactProcessor = $createContactProcessor;
$this->assignEmployeeProcessor = $assignEmployeeProcessor;
$this->assignSegmentProcessor = $assignSegmentProcessor;
$this->authenticationProcessor = $authenticationProcessor;
$this->generateEmailVerificationAttemptProcessor = $generateEmailVerificationAttemptProcessor;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\AccessUnauthorisedException
* @throws \App\Classes\Exceptions\InternalServerErrorException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request) : JsonResponse
{
/** @var User $user */
$user = $this->createUserProcessor->execute($request, RoleTypes::USER, App::environment(['local', 'staging']) ? ApprovalStatus::APPROVED : ApprovalStatus::PENDING_VERIFICATION);
/** @var Company $company */
$company = $this->createCompanyProcessor->execute($request, BusinessType::IMPORTER, $request->input('type'), ApprovalStatus::PENDING_SUBMISSION);
$this->createContactProcessor->execute($request, $company);
$Object = new EmploymentObject($company, $user);
$this->assignEmployeeProcessor->execute($Object);
$this->assignSegmentProcessor->execute($company);
$this->generateEmailVerificationAttemptProcessor->execute($user);
return $this->response($this->authenticationProcessor->execute($request));
}
}
@@ -1,184 +0,0 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllersLogic;
use App\Classes\Modules\Accounts\Standards\Rules\CanCreateUser;
use App\Classes\Modules\Accounts\Services\CreatesUser;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
use App\Http\Resources\UserResource;
use App\Classes\Modules\Companies\Standards\Rules\CanCreateCompany;
use App\Classes\Modules\Companies\Services\CreatesCompany;
use App\Classes\Modules\Companies\DataTransferObjects\CompanyObject;
use App\Classes\Modules\Contacts\Standards\Rules\CanCreateContact;
use App\Classes\Modules\Contacts\Services\CreatesContact;
use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject;
use App\Classes\Modules\CompanyEmployees\Standards\Rules\CanCreateCompanyEmployee;
use App\Classes\Modules\CompanyEmployees\Services\CreatesCompanyEmployee;
use App\Classes\Modules\CompanyEmployees\DataTransferObjects\CompanyEmployeeObject;
use App\Classes\Modules\SegmentCompanies\Standards\Rules\CanCreateSegmentCompany;
use App\Classes\Modules\SegmentCompanies\Services\CreatesSegmentCompany;
use App\Classes\Modules\SegmentCompanies\DataTransferObjects\SegmentCompanyObject;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CreateUserLogic extends AbstractControllersLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Created User',
'message' => 'You have successfully created a new User'
];
}
/** @var CanCreateUser */
private $canCreateUser;
/** @var CreatesUser */
private $createsUser;
/** @var CanCreateCompany */
private $canCreateCompany;
/** @var CreatesCompany */
private $createsCompany;
/** @var CanCreateContact */
private $canCreateContact;
/** @var CreatesContact */
private $createsContact;
/** @var CanCreateCompanyEmployee */
private $canCreateCompanyEmployee;
/** @var CreatesCompanyEmployee */
private $createsCompanyEmployee;
/** @var CanCreateSegmentCompany */
private $canCreateSegmentCompany;
/** @var CreatesSegmentCompany */
private $createsSegmentCompany;
/**
* CreateUserLogic constructor.
* @param CanCreateUser $canCreateUser
* @param CreatesUser $createsUser
* @param CanCreateCompany $canCreateCompany
* @param CreatesCompany $createsCompany
* @param CanCreateContact $canCreateContact
* @param CreatesContact $createsContact
* @param CanCreateCompanyEmployee $canCreateCompanyEmployee
* @param CreatesCompanyEmployee $createsCompanyEmployee
* @param CanCreateSegmentCompany $canCreateSegmentCompany
* @param CreatesSegmentCompany $createsSegmentCompany
*/
public function __construct(
CanCreateUser $canCreateUser,
CreatesUser $createsUser,
CanCreateCompany $canCreateCompany,
CreatesCompany $createsCompany,
CanCreateContact $canCreateContact,
CreatesContact $createsContact,
CanCreateCompanyEmployee $canCreateCompanyEmployee,
CreatesCompanyEmployee $createsCompanyEmployee,
CanCreateSegmentCompany $canCreateSegmentCompany,
CreatesSegmentCompany $createsSegmentCompany
)
{
$this->canCreateUser = $canCreateUser;
$this->createsUser = $createsUser;
$this->canCreateCompany = $canCreateCompany;
$this->createsCompany = $createsCompany;
$this->canCreateContact = $canCreateContact;
$this->createsContact = $createsContact;
$this->canCreateCompanyEmployee = $canCreateCompanyEmployee;
$this->createsCompanyEmployee = $createsCompanyEmployee;
$this->canCreateSegmentCompany = $canCreateSegmentCompany;
$this->createsSegmentCompany = $createsSegmentCompany;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
DB::beginTransaction();
$user_object = new UserObject(
$request->input('name'),
$request->input('email'),
$request->input('password'),
$request->input('password_confirmation'),
2,
9
);
$this->canCreateUser->passes($user_object);
$user_query = $this->createsUser->execute($user_object);
$company_object = new CompanyObject(
$request->input('company_name'),
$request->input('company_reference'),
null
);
$this->canCreateCompany->passes($company_object);
$company_query = $this->createsCompany->execute($company_object);
$contact_object = new ContactObject(
1,
$company_query->id,
$request->input('contact_reference'),
$request->input('phone'),
$request->input('contact_email'),
$request->input('wechat_id')
);
$this->canCreateContact->passes($contact_object);
$contact_query = $this->createsContact->execute($contact_object);
$company_employee_object = new CompanyEmployeeObject(
$company_query->id,
$user_query->id
);
$this->canCreateCompanyEmployee->passes($company_employee_object);
$company_employee_query = $this->createsCompanyEmployee->execute($user_query, $company_employee_object);
$segment_company_object = new SegmentCompanyObject(
1,
$company_query->id
);
$this->canCreateSegmentCompany->passes($segment_company_object);
$segment_company_query = $this->createsSegmentCompany->execute($company_query, $segment_company_object);
DB::commit();
return $this->resourceResponse(new UserResource($user_query));
} catch (\Exception $exception) {
dd($exception);
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,64 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\Modules\Accounts\Services\FetchesUser;
use App\Classes\Modules\Accounts\Standards\Rules\CanFetchUser;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Http\Resources\UserResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class FetchUserLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Fetch Users',
'message' => 'You have successfully retrieved the user'
];
}
/** @var CanFetchUser */
private $canFetchUser;
/** @var FetchesUser */
private $fetchessUser;
/**
* FetchUserLogic constructor.
* @param CanFetchUser $canFetchUser
* @param FetchesUser $fetchessUser
*/
public function __construct(CanFetchUser $canFetchUser, FetchesUser $fetchessUser)
{
$this->canFetchUser = $canFetchUser;
$this->fetchessUser = $fetchessUser;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
$this->canFetchUser->passes();
$query = $this->fetchessUser->execute(['id' => $request->input('user_id')]);
return $this->collectionResponse(UserResource::collection($query));
} catch (\Exception $exception){
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,86 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\Jobs\PasswordResetTokenExpiration;
use App\Classes\Jobs\SendResetPasswordEmail;
use App\Classes\Modules\Accounts\DataTransferObjects\GeneratePasswordResetObject;
use App\Classes\Modules\Accounts\Services\FetchesUser;
use App\Classes\Modules\Accounts\Services\GeneratesPasswordReset;
use App\Classes\Modules\Accounts\Standards\Rules\CanGeneratePasswordReset;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\ValueObjects\Constants\Notifications;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class GeneratePasswordResetLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Reset Password',
'message' => 'You have successfully sent you an email to reset your password'
];
}
/** @var CanGeneratePasswordReset */
private $canGeneratePasswordReset;
/** @var FetchesUser */
private $fetchesUser;
/** @var GeneratesPasswordReset */
private $generatesPasswordReset;
/** @var PasswordResetTokenExpiration */
private $passwordResetTokenExpiration;
/** @var SendResetPasswordEmail */
private $sendResetPasswordEmail;
/**
* GeneratePasswordResetLogic constructor.
* @param CanGeneratePasswordReset $canGeneratePasswordReset
* @param FetchesUser $fetchesUser
* @param GeneratesPasswordReset $generatesPasswordReset
* @param PasswordResetTokenExpiration $passwordResetTokenExpiration
* @param SendResetPasswordEmail $sendResetPasswordEmail
*/
public function __construct(CanGeneratePasswordReset $canGeneratePasswordReset, FetchesUser $fetchesUser, GeneratesPasswordReset $generatesPasswordReset, PasswordResetTokenExpiration $passwordResetTokenExpiration, SendResetPasswordEmail $sendResetPasswordEmail)
{
$this->canGeneratePasswordReset = $canGeneratePasswordReset;
$this->fetchesUser = $fetchesUser;
$this->generatesPasswordReset = $generatesPasswordReset;
$this->passwordResetTokenExpiration = $passwordResetTokenExpiration;
$this->sendResetPasswordEmail = $sendResetPasswordEmail;
}
/**
* @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 {
$object = new GeneratePasswordResetObject($request->input('email'));
if($this->canGeneratePasswordReset->passes($object)) {
$user = $this->fetchesUser->execute(['email' => $object->getEmail()]);
$attempt = $this->generatesPasswordReset->execute($user);
$this->passwordResetTokenExpiration::dispatch($attempt)->delay(now()->addHours(24));
$this->sendResetPasswordEmail::dispatch($user, $attempt);
return $this->response(['email' => $object->getEmail()]);
}
}
}
@@ -4,13 +4,13 @@ namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\Modules\Accounts\Services\ListsUsers; use App\Classes\Modules\Accounts\Services\ListsUsers;
use App\Classes\Modules\Accounts\Standards\Rules\CanListUsers; use App\Classes\Modules\Accounts\Standards\Rules\CanListUsers;
use App\Classes\General\Abstracts\AbstractControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Http\Resources\UserResource; use App\Http\Resources\UserResource;
use ErrorException; use ErrorException;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class ListUsersLogic extends AbstractControllersLogic class ListUsersLogic extends AbstractControllerLogic
{ {
/** /**
@@ -24,19 +24,19 @@ class ListUsersLogic extends AbstractControllersLogic
} }
/** @var CanListUsers */ /** @var CanListUsers */
private $canListUser; private $canListUsers;
/** @var ListsUsers */ /** @var ListsUsers */
private $listsUsers; private $listsUsers;
/** /**
* ListUsersControllersLogic constructor. * ListUsersLogic constructor.
* @param CanListUsers $canListUser * @param CanListUsers $canListUsers
* @param ListsUsers $listsUsers * @param ListsUsers $listsUsers
*/ */
public function __construct(CanListUsers $canListUser, ListsUsers $listsUsers) public function __construct(CanListUsers $canListUsers, ListsUsers $listsUsers)
{ {
$this->canListUser = $canListUser; $this->canListUsers = $canListUsers;
$this->listsUsers = $listsUsers; $this->listsUsers = $listsUsers;
} }
@@ -44,22 +44,17 @@ class ListUsersLogic extends AbstractControllersLogic
/** /**
* @param Request $request * @param Request $request
* @return JsonResponse * @return JsonResponse
* @throws ErrorException * @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/ */
public function logic(Request $request) : JsonResponse public function logic(Request $request) : JsonResponse
{ {
try { $this->canListUsers->passes();
$this->canListUser->passes(); $query = $this->listsUsers->execute($this->listsUsers->deserializeFilters($request->input('filters')));
$query = $this->listsUsers->execute($this->listsUsers->deserializeFilters($request->input('filters'))); return $this->collectionResponse(UserResource::collection($query));
return $this->collectionResponse(UserResource::collection($query));
} catch (\Exception $exception){
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
} }
} }
@@ -0,0 +1,44 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Accounts\Services\InvalidatesAuthenticationToken;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class LogoutUserLogic extends AbstractControllerLogic
{
protected function notification():array {
return [
'title' => 'Logout',
'message' => 'You have successfully logged out of your account'
];
}
/** @var InvalidatesAuthenticationToken */
private $invalidatesAuthenticationToken;
/**
* LogoutUserLogic constructor.
* @param InvalidatesAuthenticationToken $invalidatesAuthenticationToken
*/
public function __construct(InvalidatesAuthenticationToken $invalidatesAuthenticationToken)
{
$this->invalidatesAuthenticationToken = $invalidatesAuthenticationToken;
}
/**
* @param Request $request
* @return JsonResponse
*/
protected function logic(Request $request): JsonResponse {
$this->invalidatesAuthenticationToken->execute();
return $this->response();
}
}
@@ -0,0 +1,47 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Accounts\Processors\RefreshAuthenticationTokenProcessor;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class RefreshAuthenticationTokenLogic extends AbstractControllerLogic
{
protected function notification():array {
return [
'title' => 'Refresh Authentication',
'message' => 'You have successfully your account authentication'
];
}
/** @var RefreshAuthenticationTokenProcessor */
private $refreshAuthenticationTokenProcessor;
/**
* RefreshAuthenticationTokenLogic constructor.
* @param RefreshAuthenticationTokenProcessor $refreshAuthenticationTokenProcessor
*/
public function __construct(RefreshAuthenticationTokenProcessor $refreshAuthenticationTokenProcessor)
{
$this->refreshAuthenticationTokenProcessor = $refreshAuthenticationTokenProcessor;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\InternalServerErrorException
*/
protected function logic(Request $request): JsonResponse {
/** @var User $user */
$user = Auth()->user();
return $this->response($this->refreshAuthenticationTokenProcessor->execute($user));
}
}
@@ -1,159 +0,0 @@
<?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 RegistrationStep2Logic extends AbstractControllersLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Registration Step 2',
'message' => 'You have completed registration step 2'
];
}
/** @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;
/**
* RegistrationStep2Logic 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());
}
}
}
@@ -0,0 +1,51 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Accounts\Processors\GenerateEmailVerificationAttemptProcessor;
use App\Classes\Modules\Accounts\Services\FetchesUser;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ResendEmailVerificationLogic extends AbstractControllerLogic
{
public function notification(): array
{
return [
'title' => 'Resend Verification Email',
'message' => 'Successfully resent a new verification email'
];
}
/** @var FetchesUser */
private $fetchesUser;
/** @var GenerateEmailVerificationAttemptProcessor */
private $generateEmailVerificationAttemptProcessor;
/**
* ResendEmailVerificationLogic constructor.
* @param FetchesUser $fetchesUser
* @param GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor
*/
public function __construct(FetchesUser $fetchesUser, GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor)
{
$this->fetchesUser = $fetchesUser;
$this->generateEmailVerificationAttemptProcessor = $generateEmailVerificationAttemptProcessor;
}
public function logic(Request $request) : JsonResponse {
/** @var User $user */
$user = $this->fetchesUser->execute(['id' => $request->input('user_id')]);
$this->generateEmailVerificationAttemptProcessor->execute($user);
return $this->response([]);
}
}
@@ -0,0 +1,80 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\Modules\Accounts\DataTransferObjects\NewPasswordObject;
use App\Classes\Modules\Accounts\DataTransferObjects\PasswordResetObject;
use App\Classes\Modules\Accounts\Services\ChangesPassword;
use App\Classes\Modules\Accounts\Services\CompletesPasswordReset;
use App\Classes\Modules\Accounts\Services\FetchesPasswordReset;
use App\Classes\Modules\Accounts\Standards\Rules\CanResetPassword;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Models\PasswordReset;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ResetPasswordLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Password Change',
'message' => 'You have successfully changed your account\'t password'
];
}
/** @var CanResetPassword */
private $canResetPassword;
/** @var FetchesPasswordReset */
private $fetchesPasswordReset;
/** @var ChangesPassword */
private $changePassword;
/** @var CompletesPasswordReset */
private $completesPasswordResetToken;
/**
* ResetPasswordLogic constructor.
* @param CanResetPassword $canResetPassword
* @param FetchesPasswordReset $fetchesPasswordReset
* @param ChangesPassword $changePassword
* @param CompletesPasswordReset $completesPasswordResetToken
*/
public function __construct(CanResetPassword $canResetPassword, FetchesPasswordReset $fetchesPasswordReset, ChangesPassword $changePassword, CompletesPasswordReset $completesPasswordResetToken)
{
$this->canResetPassword = $canResetPassword;
$this->fetchesPasswordReset = $fetchesPasswordReset;
$this->changePassword = $changePassword;
$this->completesPasswordResetToken = $completesPasswordResetToken;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\InternalServerErrorException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request): JsonResponse {
$object = new PasswordResetObject($request->input('token'),
new NewPasswordObject($request->input('password'), $request->input('confirmPassword')));
$this->canResetPassword->passes($object);
/** @var PasswordReset $passwordReset */
$passwordReset = $this->fetchesPasswordReset->execute(['token' => $object->getToken(), 'with_user']);
$this->changePassword->execute($passwordReset->user, $object->getNewPassword());
$this->completesPasswordResetToken->execute($passwordReset);
return $this->response();
}
}
@@ -1,159 +0,0 @@
<?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());
}
}
}
@@ -0,0 +1,76 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Exceptions\ResourceNotFoundException;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Accounts\Services\CompletesEmailVerificationAttempt;
use App\Classes\Modules\Accounts\Services\FetchesEmailVerificationAttempt;
use App\Classes\Modules\Accounts\Services\VerifiesUser;
use App\Classes\Modules\Accounts\Standards\Criteria\EmailVerificationActiveAttemptExists;
use App\Models\UserEmailVerification;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UserEmailVerificationLogic extends AbstractControllerLogic
{
public function notification(): array
{
return [
'title' => 'Email Verification',
'message' => 'You have successfully verified your email address'
];
}
/** @var emailVerificationActiveAttemptExists */
private $emailVerificationActiveAttemptExists;
/** @var CompletesEmailVerificationAttempt */
private $completesEmailVerificationAttempt;
/** @var FetchesEmailVerificationAttempt */
private $fetchesEmailVerificationAttempt;
/** @var VerifiesUser */
private $verifiesUser;
/**
* UserEmailVerificationLogic constructor.
* @param EmailVerificationActiveAttemptExists $emailVerificationActiveAttemptExists
* @param CompletesEmailVerificationAttempt $completesEmailVerificationAttempt
* @param FetchesEmailVerificationAttempt $fetchesEmailVerificationAttempt
* @param VerifiesUser $verifiesUser
*/
public function __construct(EmailVerificationActiveAttemptExists $emailVerificationActiveAttemptExists, CompletesEmailVerificationAttempt $completesEmailVerificationAttempt, FetchesEmailVerificationAttempt $fetchesEmailVerificationAttempt, VerifiesUser $verifiesUser)
{
$this->emailVerificationActiveAttemptExists = $emailVerificationActiveAttemptExists;
$this->completesEmailVerificationAttempt = $completesEmailVerificationAttempt;
$this->fetchesEmailVerificationAttempt = $fetchesEmailVerificationAttempt;
$this->verifiesUser = $verifiesUser;
}
/**
* @param Request $request
* @return JsonResponse
* @throws MalformedRequestException
* @throws ResourceNotFoundException
*/
public function logic(Request $request) : JsonResponse {
$token = $request->input('token');
$this->emailVerificationActiveAttemptExists->execute($token);
/** @var UserEmailVerification $attempt */
$attempt = $this->fetchesEmailVerificationAttempt->execute(['token' => $token]);
$this->completesEmailVerificationAttempt->execute($attempt);
$this->verifiesUser->execute($attempt->user);
return $this->response([]);
}
}
@@ -3,7 +3,7 @@
namespace App\Classes\Modules\Accounts\DataTransferObjects; namespace App\Classes\Modules\Accounts\DataTransferObjects;
use App\Classes\Interfaces\DataTransferObject; use App\Classes\General\Interfaces\DataTransferObject;
class AuthenticationCredentialsObject implements DataTransferObject class AuthenticationCredentialsObject implements DataTransferObject
{ {
@@ -0,0 +1,34 @@
<?php
namespace App\Classes\Modules\Accounts\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
class GeneratePasswordResetObject implements DataTransferObject
{
/** @var string */
private $email;
/**
* GeneratePasswordResetObject constructor.
* @param string $email
*/
public function __construct(string $email)
{
$this->email = $email;
}
/**
* @return string
*/
public function getEmail(): string
{
return $this->email;
}
}
@@ -0,0 +1,45 @@
<?php
namespace App\Classes\Modules\Accounts\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
class NewPasswordObject implements DataTransferObject
{
/** @var String */
private $password;
/** @var String */
private $ConfirmPassword;
/**
* NewPassword constructor.
* @param String $password
* @param String $ConfirmPassword
*/
public function __construct(String $password, String $ConfirmPassword)
{
$this->password = $password;
$this->ConfirmPassword = $ConfirmPassword;
}
/**
* @return String
*/
public function getPassword(): String
{
return $this->password;
}
/**
* @return String
*/
public function getConfirmPassword(): String
{
return $this->ConfirmPassword;
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Classes\Modules\Accounts\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
class PasswordResetObject implements DataTransferObject
{
/** @var String */
private $token;
/** @var NewPasswordObject */
private $newPassword;
/**
* PasswordResetObject constructor.
* @param String $token
* @param NewPasswordObject $newPassword
*/
public function __construct(String $token, NewPasswordObject $newPassword)
{
$this->token = $token;
$this->newPassword = $newPassword;
}
/**
* @return String
*/
public function getToken(): String
{
return $this->token;
}
/**
* @return NewPasswordObject
*/
public function getNewPassword(): NewPasswordObject
{
return $this->newPassword;
}
}
@@ -0,0 +1,99 @@
<?php
namespace App\Classes\Modules\Accounts\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\RoleTypes;
class RegistrationObject implements DataTransferObject
{
/** @var string */
private $name;
/** @var string */
private $email;
/** @var string */
private $password;
/** @var string */
private $passwordConfirmation;
/** @var int|null */
private $type;
/** @var int|null */
private $status;
/**
* UserObject constructor.
* @param string $name
* @param string $email
* @param string $password
* @param string $passwordConfirmation
* @param int|null $type
* @param int|null $status
*/
public function __construct(string $name, string $email, string $password, string $passwordConfirmation, ?int $type = RoleTypes::USER, ?int $status = ApprovalStatus::PENDING_VERIFICATION)
{
$this->name = $name;
$this->email = $email;
$this->password = $password;
$this->passwordConfirmation = $passwordConfirmation;
$this->type = $type;
$this->status = $status;
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @return string
*/
public function getEmail(): string
{
return $this->email;
}
/**
* @return string
*/
public function getPassword(): string
{
return $this->password;
}
/**
* @return string
*/
public function getPasswordConfirmation(): string
{
return $this->passwordConfirmation;
}
/**
* @return int
*/
public function getType(): int
{
return $this->type;
}
/**
* @return int
*/
public function getStatus(): int
{
return $this->status;
}
}
@@ -1,100 +0,0 @@
<?php
namespace App\Classes\Modules\Accounts\DataTransferObjects;
use App\Classes\Interfaces\DataTransferObject;
class UserObject implements DataTransferObject
{
/** @var string|null */
private $name;
/** @var string|null */
private $email;
/** @var string|null */
private $password;
/** @var string|null */
private $password_confirmation;
/** @var int */
private $type;
/** @var int */
private $status;
/**
* UserObject constructor.
* @param string|null $name
* @param string|null $email
* @param string|null $password
* @param string|null $password_confirmation
* @param int $type
* @param int $status
*/
public function __construct(
?string $name,
?string $email,
?string $password,
?string $password_confirmation,
int $type,
int $status
)
{
$this->name = $name;
$this->email = $email;
$this->password = $password;
$this->password_confirmation = $password_confirmation;
$this->type = $type;
$this->status = $status;
}
/**
* @return string
*/
public function getName(): ?string
{
return $this->name;
}
/**
* @return string
*/
public function getEmail(): ?string
{
return $this->email;
}
/**
* @return string
*/
public function getPassword(): ?string
{
return $this->password;
}
/**
* @return string
*/
public function getPasswordConfirmation(): ?string
{
return $this->password_confirmation;
}
/**
* @return int
*/
public function getType(): int
{
return $this->type;
}
/**
* @return int
*/
public function getStatus(): int
{
return $this->status;
}
}
@@ -0,0 +1,71 @@
<?php
namespace App\Classes\Modules\Accounts\Processors;
use App\Classes\Modules\Accounts\DataTransferObjects\AuthenticationCredentialsObject;
use App\Classes\Modules\Accounts\Services\AuthenticatesUser;
use App\Classes\Modules\Accounts\Services\AuthenticationRedirect;
use App\Classes\Modules\Accounts\Services\FetchesUser;
use App\Classes\Modules\Accounts\Services\GeneratesAuthenticationToken;
use App\Classes\Modules\Accounts\Standards\Rules\CanAuthenticateUser;
use Illuminate\Http\Request;
class AuthenticationProcessor
{
/** @var CanAuthenticateUser */
private $canAuthenticateUser;
/** @var AuthenticatesUser */
private $authenticatesUser;
/** @var GeneratesAuthenticationToken */
private $generatesAuthenticationToken;
/** @var FetchesUser */
private $fetchesUser;
/** @var AuthenticationRedirect */
private $authenticationRedirect;
/**
* AuthenticationProcessor constructor.
* @param CanAuthenticateUser $canAuthenticateUser
* @param AuthenticatesUser $authenticatesUser
* @param GeneratesAuthenticationToken $generatesAuthenticationToken
* @param FetchesUser $fetchesUser
* @param AuthenticationRedirect $authenticationRedirect
*/
public function __construct(CanAuthenticateUser $canAuthenticateUser, AuthenticatesUser $authenticatesUser, GeneratesAuthenticationToken $generatesAuthenticationToken, FetchesUser $fetchesUser, AuthenticationRedirect $authenticationRedirect)
{
$this->canAuthenticateUser = $canAuthenticateUser;
$this->authenticatesUser = $authenticatesUser;
$this->generatesAuthenticationToken = $generatesAuthenticationToken;
$this->fetchesUser = $fetchesUser;
$this->authenticationRedirect = $authenticationRedirect;
}
/**
* @param Request $request
* @return array
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\AccessUnauthorisedException
* @throws \App\Classes\Exceptions\InternalServerErrorException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function execute(Request $request): array {
$object = new AuthenticationCredentialsObject($request->input('email'), $request->input('password'));
$this->canAuthenticateUser->passes($object);
$this->authenticatesUser->execute($object);
$user = $this->fetchesUser->execute(['email' => $object->getEmail()]);
return ['access_token' => $this->generatesAuthenticationToken->execute($user), 'redirect_url' => $this->authenticationRedirect->url($user)];
}
}
@@ -0,0 +1,55 @@
<?php
namespace App\Classes\Modules\Accounts\Processors;
use App\Classes\Modules\Accounts\DataTransferObjects\RegistrationObject;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
use App\Classes\Modules\Accounts\Services\CreatesUser;
use App\Classes\Modules\Accounts\Standards\Rules\CanRegisterUser;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Database\Eloquent\Model;
class CreateUserProcessor
{
/** @var CanRegisterUser */
private $canRegisterUser;
/** @var CreatesUser */
private $createsUser;
/**
* CreateUserProcessor constructor.
* @param CanRegisterUser $canRegisterUser
* @param CreatesUser $createsUser
*/
public function __construct(CanRegisterUser $canRegisterUser, CreatesUser $createsUser)
{
$this->canRegisterUser = $canRegisterUser;
$this->createsUser = $createsUser;
}
/**
* @param Request $request
* @param $roleType
* @param $status
* @return Model
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function execute(Request $request, $roleType, $status): Model {
$userObject = new RegistrationObject($request->input('name'), $request->input('email'),
$request->input('password'), $request->input('password_confirmation'),
$roleType, $status);
$this->canRegisterUser->passes($userObject);
/** @var User $user_query */
return $this->createsUser->execute($userObject);
}
}
@@ -0,0 +1,59 @@
<?php
namespace App\Classes\Modules\Accounts\Processors;
use App\Classes\Jobs\EmailVerificationAttemptExpiration;
use App\Classes\Jobs\SendUserVerificationEmail;
use App\Classes\Modules\Accounts\Services\GeneratesEmailVerificationAttempt;
use App\Classes\Modules\Accounts\Services\InvalidatesActiveEmailVerificationAttempts;
use App\Models\User;
class GenerateEmailVerificationAttemptProcessor
{
/** @var InvalidatesActiveEmailVerificationAttempts */
private $invalidatesActiveEmailVerificationAttempts;
/** @var GeneratesEmailVerificationAttempt */
private $generatesEmailVerificationAttempt;
/** @var EmailVerificationAttemptExpiration */
private $emailVerificationAttemptExpiration;
/** @var SendUserVerificationEmail */
private $sendUserVerificationEmail;
/**
* GenerateEmailVerificationAttemptProcessor constructor.
* @param InvalidatesActiveEmailVerificationAttempts $invalidatesActiveEmailVerificationAttempts
* @param GeneratesEmailVerificationAttempt $generatesEmailVerificationAttempt
* @param EmailVerificationAttemptExpiration $emailVerificationAttemptExpiration
* @param SendUserVerificationEmail $sendUserVerificationEmail
*/
public function __construct(InvalidatesActiveEmailVerificationAttempts $invalidatesActiveEmailVerificationAttempts, GeneratesEmailVerificationAttempt $generatesEmailVerificationAttempt, EmailVerificationAttemptExpiration $emailVerificationAttemptExpiration, SendUserVerificationEmail $sendUserVerificationEmail)
{
$this->invalidatesActiveEmailVerificationAttempts = $invalidatesActiveEmailVerificationAttempts;
$this->generatesEmailVerificationAttempt = $generatesEmailVerificationAttempt;
$this->emailVerificationAttemptExpiration = $emailVerificationAttemptExpiration;
$this->sendUserVerificationEmail = $sendUserVerificationEmail;
}
/**
* @param User $user
* @return void
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(User $user) {
$this->invalidatesActiveEmailVerificationAttempts->execute($user);
$attempt = $this->generatesEmailVerificationAttempt->execute($user);
$this->emailVerificationAttemptExpiration::dispatch($attempt)->delay(now()->addHours(48));
$this->sendUserVerificationEmail::dispatch($user, $attempt);
}
}
@@ -0,0 +1,43 @@
<?php
namespace App\Classes\Modules\Accounts\Processors;
use App\Classes\Modules\Accounts\Services\GeneratesAuthenticationToken;
use App\Classes\Modules\Accounts\Services\InvalidatesAuthenticationToken;
use App\Models\User;
class RefreshAuthenticationTokenProcessor
{
/** @var InvalidatesAuthenticationToken */
private $invalidatesAuthenticationToken;
/** @var GeneratesAuthenticationToken */
private $generatesAuthenticationToken;
/**
* RefreshAuthenticationTokenLogic constructor.
* @param InvalidatesAuthenticationToken $invalidatesAuthenticationToken
* @param GeneratesAuthenticationToken $generatesAuthenticationToken
*/
public function __construct(InvalidatesAuthenticationToken $invalidatesAuthenticationToken, GeneratesAuthenticationToken $generatesAuthenticationToken)
{
$this->invalidatesAuthenticationToken = $invalidatesAuthenticationToken;
$this->generatesAuthenticationToken = $generatesAuthenticationToken;
}
/**
* @param User $user
* @return array
* @throws \App\Classes\Exceptions\InternalServerErrorException
*/
public function execute(User $user): array {
$this->invalidatesAuthenticationToken->execute();
return ['refresh_token' => $this->generatesAuthenticationToken->execute($user)];
}
}
@@ -5,8 +5,6 @@ namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\AccessUnauthorisedException; use App\Classes\Exceptions\AccessUnauthorisedException;
use App\Classes\Modules\Accounts\DataTransferObjects\AuthenticationCredentialsObject; use App\Classes\Modules\Accounts\DataTransferObjects\AuthenticationCredentialsObject;
use Tymon\JWTAuth\Facades\JWTAuth;
class AuthenticatesUser class AuthenticatesUser
{ {
@@ -17,11 +15,12 @@ class AuthenticatesUser
*/ */
public function execute(AuthenticationCredentialsObject $object){ public function execute(AuthenticationCredentialsObject $object){
if (! $token = JWTAuth::attempt(['email' => $object->getEmail(), 'password' => $object->getPassword()])) { if (! auth()->validate(['email' => $object->getEmail(), 'password' => $object->getPassword()])) {
throw new AccessUnauthorisedException('These credentials do not match our records.'); throw new AccessUnauthorisedException('These credentials do not match our records.');
} }
return $token; return true;
} }
} }
@@ -2,18 +2,19 @@
namespace App\Classes\Modules\Accounts\Services; namespace App\Classes\Modules\Accounts\Services;
use App\Classes\ValueObjects\Constants\Roles; use App\Classes\ValueObjects\Constants\RoleTypes;
use App\Models\User;
class AuthenticationRedirect class AuthenticationRedirect
{ {
public function url(){ public function url(User $user){
if(\Auth::user()->hasRole('Shadow Admin') || \Auth::user()->hasRole('Ultimate Admin')){ if($user->type === RoleTypes::USER){
return route('dashboard.forwarder'); return route('dashboard');
} }
// return route('dashboard.importer', ['id' => Auth()->user()->employers->first()->company->id]); return route('dashboard');
} }
} }
@@ -0,0 +1,32 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Accounts\DataTransferObjects\NewPasswordObject;
use App\Models\User;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Hash;
class ChangesPassword
{
/**
* @param User $user
* @param NewPasswordObject $object
* @return bool
* @throws InternalServerErrorException
*/
public function execute(User $user, NewPasswordObject $object): bool {
try {
$user->password = Hash::make($object->getPassword());
return $user->save();
} catch (QueryException $exception){
throw new InternalServerErrorException($exception->getMessage());
}
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\UserEmailVerification;
use Illuminate\Database\Eloquent\Model;
class CompletesEmailVerificationAttempt extends AbstractUpdateRecord
{
/**
* @param UserEmailVerification $model
* @return Model
* @throws MalformedRequestException
*/
public function execute(UserEmailVerification $model): Model {
$model->is_complete = true;
return $this->handler($model);
}
}
@@ -0,0 +1,26 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\PasswordReset;
class CompletesPasswordReset extends AbstractUpdateRecord
{
/**
* @param PasswordReset $model
* @return \Illuminate\Database\Eloquent\Model
* @throws MalformedRequestException
*/
public function execute(PasswordReset $model){
$model->is_complete = true;
return $this->handler($model);
}
}
@@ -3,17 +3,18 @@
namespace App\Classes\Modules\Accounts\Services; namespace App\Classes\Modules\Accounts\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord; use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Accounts\DataTransferObjects\RegistrationObject;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject; use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
use App\Models\User; use App\Models\User;
class CreatesUser extends AbstractUpdateRecord class CreatesUser extends AbstractUpdateRecord
{ {
/** /**
* @param UserObject $object * @param RegistrationObject $object
* @return \Illuminate\Database\Eloquent\Model * @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException * @throws \App\Classes\Exceptions\MalformedRequestException
*/ */
public function execute(UserObject $object) { public function execute(RegistrationObject $object) {
$model = new User(); $model = new User();
$model->name = $object->getName(); $model->name = $object->getName();
$model->email = $object->getEmail(); $model->email = $object->getEmail();
@@ -0,0 +1,29 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\PasswordReset;
use App\Models\UserEmailVerification;
class ExpiresEmailVerificationAttempt extends AbstractUpdateRecord
{
/**
* @param UserEmailVerification $model
* @return \Illuminate\Database\Eloquent\Model
* @throws MalformedRequestException
*/
public function execute(UserEmailVerification $model){
$model->is_active = false;
return $this->handler($model);
}
}
@@ -0,0 +1,28 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\PasswordReset;
class ExpiresPasswordReset extends AbstractUpdateRecord
{
/**
* @param PasswordReset $model
* @return \Illuminate\Database\Eloquent\Model
* @throws MalformedRequestException
*/
public function execute(PasswordReset $model){
$model->is_expired = true;
return $this->handler($model);
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use App\Models\PasswordReset;
use App\Models\UserEmailVerification;
use Illuminate\Database\Eloquent\Builder;
class FetchesEmailVerificationAttempt extends AbstractFetchRecord
{
/** @var UserEmailVerification */
private $repository;
/**
* FetchesResetPasswordToken constructor.
* @param UserEmailVerification $repository
*/
public function __construct(UserEmailVerification $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use App\Models\PasswordReset;
use Illuminate\Database\Eloquent\Builder;
class FetchesPasswordReset extends AbstractFetchRecord
{
/** @var PasswordReset */
private $repository;
/**
* FetchesResetPasswordToken constructor.
* @param PasswordReset $repository
*/
public function __construct(PasswordReset $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,79 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\InternalServerErrorException;
use App\Classes\ValueObjects\Constants\RoleTypes;
use App\Models\Company;
use App\Models\Role;
use App\Models\User;
use Carbon\Carbon;
use Tymon\JWTAuth\JWT;
class GeneratesAuthenticationToken {
/** @var JWT */
private $builder;
/**
* GeneratesAuthenticationToken constructor.
* @param JWT $builder
*/
public function __construct(JWT $builder) {
$this->builder = $builder;
}
/**
* @param User $user
* @param bool $rememberUser
* @return string
*/
public function execute(User $user, bool $rememberUser = false): string {
$this->builder->manager()->setBlacklistEnabled(false);
// generate token for the customer
$this->builder->factory()->setTTL(Carbon::now()->addDay()->timestamp);
if ($rememberUser === true) {
$this->builder->factory()->setTTL(Carbon::now()->addWeek()->timestamp);
}
// set the claim based on the object
$this->setTokenClaims($user);
return $this->builder->fromUser($user);
}
/**
* @param User $user
*/
private function setTokenClaims(User $user): void {
/** @var Company $company */
$company = $user->company()->first();
$claims = [
'id' => $user->id,
'name' => $user->name,
'email' => $user->email,
'type' => $user->type,
'status' => $user->status
];
if($user->type === RoleTypes::USER) {
$claims = array_merge($claims, [
'company_id' => $company->id
]);
}
$this->builder->factory()->customClaims(['user' => $claims]);
$this->builder->factory()->buildClaimsCollection();
}
}
@@ -0,0 +1,32 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord;
use App\Models\User;
use App\Models\UserEmailVerification;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\QueryException;
use Illuminate\Support\Str;
class GeneratesEmailVerificationAttempt extends AbstractUpdateRelationshipRecord
{
/**
* @param User $user
* @return Model
* @throws MalformedRequestException
*/
public function execute(User $user): Model {
$model = new UserEmailVerification();
$model->token = Str::random(25);
$model->is_complete = false;
$model->is_active = true;
$model->is_sent = true;
return $this->handler($user->emailVerification(), $model);
}
}
@@ -0,0 +1,30 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord;
use App\Models\PasswordReset;
use App\Models\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
class GeneratesPasswordReset extends AbstractUpdateRelationshipRecord
{
/**
* @param User $user
* @return \Illuminate\Database\Eloquent\Model
* @throws MalformedRequestException
*/
public function execute(User $user): Model {
$model = new PasswordReset();
$model->token = Str::random(60);
$model->is_expired = false;
$model->is_complete = false;
return $this->handler($user->passwordReset(), $model);
}
}
@@ -0,0 +1,22 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Models\User;
class InvalidatesActiveEmailVerificationAttempts
{
/**
* @param User $user
* @return void
*/
public function execute(User $user) {
$user->emailVerification()->active()->update([
'is_active' => false
]);
}
}
@@ -0,0 +1,15 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
class InvalidatesAuthenticationToken
{
/**
* @return false|string
*/
public function execute(){
auth()->logout();
}
}
@@ -0,0 +1,29 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Models\User;
use App\Models\UserEmailVerification;
use Illuminate\Database\Eloquent\Model;
class VerifiesUser extends AbstractUpdateRecord
{
/**
* @param User $model
* @return Model
* @throws MalformedRequestException
*/
public function execute(User $model): Model {
$model->status = ApprovalStatus::APPROVED;
return $this->handler($model);
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Criteria;
use App\Classes\Exceptions\ResourceNotFoundException;
use App\Models\UserEmailVerification;
class EmailVerificationActiveAttemptExists
{
/** @var UserEmailVerification */
private $repository;
/**
* TokenExistsValidation constructor.
* @param UserEmailVerification $repository
*/
public function __construct(UserEmailVerification $repository)
{
$this->repository = $repository;
}
/**
* @param string $token
* @return bool
* @throws ResourceNotFoundException
*/
public function execute(string $token){
if(!$this->repository->active()->where('token', $token)->first()){
throw new ResourceNotFoundException('The email verification token has expired or doesn\'t exist');
}
return true;
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Criteria;
use App\Classes\Exceptions\ResourceNotFoundException;
use App\Models\PasswordReset;
class PasswordResetTokenExists
{
/** @var PasswordReset */
private $repository;
/**
* TokenExistsValidation constructor.
* @param PasswordReset $repository
*/
public function __construct(PasswordReset $repository)
{
$this->repository = $repository;
}
/**
* @param string $token
* @return bool
* @throws ResourceNotFoundException
*/
public function execute(string $token){
if(!$this->repository->active()->where('token', $token)->first()){
throw new ResourceNotFoundException('The reset password token has expired or doesn\'t exist');
}
return true;
}
}
@@ -0,0 +1,43 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Criteria;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Exceptions\ResourceNotFoundException;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Models\User;
use App\Models\UserEmailVerification;
class UnverifiedUserEmail
{
/** @var User */
private $repository;
/**
* TokenExistsValidation constructor.
* @param UserEmailVerification $repository
*/
public function __construct(UserEmailVerification $repository)
{
$this->repository = $repository;
}
/**
* @param string $token
* @return bool
* @throws MalformedRequestException
*/
public function execute(string $user){
if(!$this->repository->status === ApprovalStatus::PENDING_VERIFICATION){
throw new MalformedRequestException('The user email address has been verified already');
}
return true;
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Criteria;
use App\Classes\Exceptions\ResourceNotFoundException;
use App\Models\User;
class UserEmailExists
{
/** @var User */
private $repository;
/**
* UserEmailExists constructor.
* @param User $repository
*/
public function __construct(User $repository)
{
$this->repository = $repository;
}
/**
* @param string $email
* @return bool
* @throws ResourceNotFoundException
*/
public function execute(string $email){
if(!$this->repository->where('email', $email)->first()){
throw new ResourceNotFoundException('Unable to find any record that matches the email address provided');
}
return true;
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
class CanFetchUser extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
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,65 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Exceptions\RequestValidationException;
use App\Classes\Exceptions\ResourceNotFoundException;
use App\Classes\Modules\Accounts\DataTransferObjects\GeneratePasswordResetObject;
use App\Classes\Modules\Accounts\Standards\Criteria\UserEmailExists;
use App\Classes\Modules\Accounts\Standards\Validators\GeneratePasswordResetValidation;
class CanGeneratePasswordReset extends AbstractRule
{
/** @var GeneratePasswordResetValidation */
private $generatePasswordResetValidation;
/** @var UserEmailExists */
private $userEmailExists;
/**
* CanGeneratePasswordReset constructor.
* @param GeneratePasswordResetValidation $generatePasswordResetValidation
* @param UserEmailExists $userEmailExists
*/
public function __construct(GeneratePasswordResetValidation $generatePasswordResetValidation, UserEmailExists $userEmailExists)
{
$this->generatePasswordResetValidation = $generatePasswordResetValidation;
$this->userEmailExists = $userEmailExists;
}
/**
* @return bool
*/
protected function authorized(): bool
{
return true;
}
/**
* @param GeneratePasswordResetObject $object
* @return bool
* @throws RequestValidationException
*/
protected function validators($object): bool
{
return $this->generatePasswordResetValidation->validate($object);
}
/**
* @param GeneratePasswordResetObject $object
* @return bool
* @throws ResourceNotFoundException
*/
protected function criteria($object): bool
{
return $this->userEmailExists->execute($object->getEmail());
}
}
@@ -4,11 +4,7 @@ namespace App\Classes\Modules\Accounts\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule; use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Exceptions\RequestValidationException; use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
use App\Classes\Exceptions\ResourceNotFoundException;
use App\Classes\Modules\Accounts\DataTransferObjects\PasswordResetObject;
use App\Classes\Modules\Accounts\Standards\Criteria\PasswordResetTokenExists;
use App\Classes\Modules\Accounts\Standards\Validators\ResetPasswordValidation;
class CanListUsers extends AbstractRule class CanListUsers extends AbstractRule
{ {
@@ -24,7 +20,7 @@ class CanListUsers extends AbstractRule
} }
/** /**
* @param PasswordResetObject $object * @param UserObject $object
* @return bool * @return bool
*/ */
protected function validators($object): bool protected function validators($object): bool
@@ -35,7 +31,7 @@ class CanListUsers extends AbstractRule
/** /**
* @param PasswordResetObject $object * @param UserObject $object
* @return bool * @return bool
*/ */
protected function criteria($object): bool protected function criteria($object): bool
@@ -3,20 +3,20 @@
namespace App\Classes\Modules\Accounts\Standards\Rules; namespace App\Classes\Modules\Accounts\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule; use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject; use App\Classes\Modules\Accounts\DataTransferObjects\RegistrationObject;
use App\Classes\Modules\Accounts\Standards\Validators\UserValidation; use App\Classes\Modules\Accounts\Standards\Validators\UserRegistrationValidation;
class CanCreateUser extends AbstractRule class CanRegisterUser extends AbstractRule
{ {
/** @var UserValidation */ /** @var UserRegistrationValidation */
private $userValidation; private $userValidation;
/** /**
* CanCreateUser constructor. * CanCreateUser constructor.
* @param UserValidation $userValidation * @param UserRegistrationValidation $userValidation
*/ */
public function __construct(UserValidation $userValidation) public function __construct(UserRegistrationValidation $userValidation)
{ {
$this->userValidation = $userValidation; $this->userValidation = $userValidation;
} }
@@ -31,7 +31,7 @@ class CanCreateUser extends AbstractRule
} }
/** /**
* @param UserObject $object * @param RegistrationObject $object
* @return bool * @return bool
* @throws \App\Classes\Exceptions\RequestValidationException * @throws \App\Classes\Exceptions\RequestValidationException
*/ */
@@ -41,7 +41,7 @@ class CanCreateUser extends AbstractRule
} }
/** /**
* @param UserObject $object * @param RegistrationObject $object
* @return bool * @return bool
*/ */
protected function criteria($object): bool protected function criteria($object): bool
@@ -0,0 +1,42 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
class CanResendEmailVerification extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
return true;
}
/**
* @param $object
* @return bool
*/
protected function validators($object): bool
{
return true;
}
/**
* @param $object
* @return bool
*/
protected function criteria($object): bool
{
return $this->passwordResetTokenExists->execute($object->getToken());
}
}
@@ -0,0 +1,65 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Exceptions\RequestValidationException;
use App\Classes\Exceptions\ResourceNotFoundException;
use App\Classes\Modules\Accounts\DataTransferObjects\PasswordResetObject;
use App\Classes\Modules\Accounts\Standards\Criteria\PasswordResetTokenExists;
use App\Classes\Modules\Accounts\Standards\Validators\ResetPasswordValidation;
class CanResetPassword extends AbstractRule
{
/** @var ResetPasswordValidation */
private $resetPasswordValidation;
/** @var PasswordResetTokenExists */
private $passwordResetTokenExists;
/**
* CanResetPassword constructor.
* @param ResetPasswordValidation $resetPasswordValidation
* @param PasswordResetTokenExists $passwordResetTokenExists
*/
public function __construct(ResetPasswordValidation $resetPasswordValidation, PasswordResetTokenExists $passwordResetTokenExists)
{
$this->resetPasswordValidation = $resetPasswordValidation;
$this->passwordResetTokenExists = $passwordResetTokenExists;
}
/**
* @return bool
*/
protected function authorized(): bool
{
return true;
}
/**
* @param PasswordResetObject $object
* @return bool
* @throws RequestValidationException
*/
protected function validators($object): bool
{
return $this->resetPasswordValidation->validate($object);
}
/**
* @param PasswordResetObject $object
* @return bool
* @throws ResourceNotFoundException
*/
protected function criteria($object): bool
{
return $this->passwordResetTokenExists->execute($object->getToken());
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Accounts\DataTransferObjects\GeneratePasswordResetObject;
class GeneratePasswordResetValidation extends AbstractValidation
{
/**
* @param GeneratePasswordResetObject $object
* @return array
*/
protected function data($object): array {
return [
'email' => $object->getEmail()
];
}
/**
* @return array
*/
protected function rules(): array {
return [
'email' => 'required|email'
];
}
/**
* @return array
*/
protected function messages(): array {
return [];
}
}
@@ -0,0 +1,50 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Accounts\DataTransferObjects\PasswordResetObject;
class ResetPasswordValidation extends AbstractValidation
{
/**
* @param PasswordResetObject $object
* @return array
*/
protected function data($object): array {
return [
'token' => $object->getToken(),
'password' => $object->getNewPassword()->getPassword(),
'confirm_password' => $object->getNewPassword()->getConfirmPassword()
];
}
/**
* @return array
*/
protected function rules(): array {
return [
'token' => 'required',
'password' => 'required|min:6',
'confirm_password' => 'same:password'
];
}
/**
* @return array
*/
protected function messages(): array {
return [
'confirm_password' => [
'same' => 'The :attribute and :other must match.'
]
];
}
}
@@ -3,15 +3,17 @@
namespace App\Classes\Modules\Accounts\Standards\Validators; namespace App\Classes\Modules\Accounts\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation; use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject; use App\Classes\Modules\Accounts\DataTransferObjects\RegistrationObject;
class UserValidation extends AbstractValidation class UserRegistrationValidation extends AbstractValidation
{ {
/** /**
* @param UserObject $object * @param RegistrationObject $object
* @return array * @return array
*/ */
protected function data($object): array protected function data($object): array
{ {
return [ return [
'name' => $object->getName(), 'name' => $object->getName(),
@@ -26,7 +28,7 @@ class UserValidation extends AbstractValidation
/** /**
* @return array * @return array
*/ */
protected function rules(): array protected function rules(): array
{ {
return [ return [
'name' => 'required', 'name' => 'required',
@@ -40,7 +42,7 @@ class UserValidation extends AbstractValidation
/** /**
* @return array * @return array
*/ */
protected function messages(): array protected function messages(): array
{ {
return []; return [];
} }
@@ -3,16 +3,18 @@
namespace App\Classes\Modules\Addresses\ControllersLogic; namespace App\Classes\Modules\Addresses\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Addresses\Services\CreatesAddress; use App\Classes\Modules\Addresses\Services\CreatesAddress;
use App\Classes\Modules\Addresses\Services\FetchesDistrict;
use App\Classes\Modules\Addresses\Standards\Rules\CanCreateAddress; use App\Classes\Modules\Addresses\Standards\Rules\CanCreateAddress;
use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject; use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use App\Http\Resources\AddressResource; use App\Http\Resources\AddressResource;
use ErrorException; use ErrorException;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class CreateAddressLogic extends AbstractControllersLogic class CreateAddressLogic extends AbstractControllerLogic
{ {
/** /**
@@ -28,41 +30,49 @@ class CreateAddressLogic extends AbstractControllersLogic
/** @var CanCreateAddress */ /** @var CanCreateAddress */
private $canCreateAddress; private $canCreateAddress;
/** @var FetchesDistrict */
private $fetchesDistrict;
/** @var FetchesCompany */
private $fetchesCompany;
/** @var CreatesAddress */ /** @var CreatesAddress */
private $createsAddress; private $createsAddress;
/** /**
* CreateAddressControllersLogic constructor. * CreateAddressLogic constructor.
* @param CanCreateAddress $canCreateAddress * @param CanCreateAddress $canCreateAddress
* @param FetchesDistrict $fetchesDistrict
* @param FetchesCompany $fetchesCompany
* @param CreatesAddress $createsAddress * @param CreatesAddress $createsAddress
*/ */
public function __construct(CanCreateAddress $canCreateAddress, CreatesAddress $createsAddress) public function __construct(CanCreateAddress $canCreateAddress, FetchesDistrict $fetchesDistrict, FetchesCompany $fetchesCompany, CreatesAddress $createsAddress)
{ {
$this->canCreateAddress = $canCreateAddress; $this->canCreateAddress = $canCreateAddress;
$this->fetchesDistrict = $fetchesDistrict;
$this->fetchesCompany = $fetchesCompany;
$this->createsAddress = $createsAddress; $this->createsAddress = $createsAddress;
} }
/** /**
* @param Request $request * @param Request $request
* @return JsonResponse * @return JsonResponse
* @throws ErrorException * @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/ */
public function logic(Request $request) : JsonResponse public function logic(Request $request) : JsonResponse
{ {
try {
$object = new AddressObject($request->input('company_id'), $request->input('street_one'), $request->input('street_two'), $request->input('city'), $request->input('state'), $request->input('post_code'), $request->input('country'), $request->input('default'), $request->input('billing')); $district = $this->fetchesDistrict->execute(['id' => $request->input('district_id')]);
$this->canCreateAddress->passes($object); $object = new AddressObject($request->input('street_one'), $request->input('street_two'), $district->country_id, $district->state_id, $district->id, $request->input('post_code'));
$query = $this->createsAddress->execute($object); $this->canCreateAddress->passes($object);
return $this->resourceResponse(new AddressResource($query)); $query = $this->createsAddress->execute($this->fetchesCompany->execute(['id' => $request->input('company_id')]), $object);
} catch (\Exception $exception){ return $this->resourceResponse(new AddressResource($query));
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
} }
@@ -3,7 +3,7 @@
namespace App\Classes\Modules\Addresses\ControllersLogic; namespace App\Classes\Modules\Addresses\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Addresses\Services\DeletesAddress; use App\Classes\Modules\Addresses\Services\DeletesAddress;
use App\Classes\Modules\Addresses\Services\FetchesAddress; use App\Classes\Modules\Addresses\Services\FetchesAddress;
use App\Classes\Modules\Addresses\Standards\Rules\CanDeleteAddress; use App\Classes\Modules\Addresses\Standards\Rules\CanDeleteAddress;
@@ -11,7 +11,7 @@ use ErrorException;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class DeleteAddressLogic extends AbstractControllersLogic class DeleteAddressLogic extends AbstractControllerLogic
{ {
/** /**
* @return array * @return array
@@ -3,16 +3,15 @@
namespace App\Classes\Modules\Addresses\ControllersLogic; namespace App\Classes\Modules\Addresses\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Addresses\Services\FetchesAddress; use App\Classes\Modules\Addresses\Services\FetchesAddress;
use App\Classes\Modules\Addresses\Standards\Rules\CanFetchAddress; use App\Classes\Modules\Addresses\Standards\Rules\CanFetchAddress;
use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject;
use App\Http\Resources\AddressResource; use App\Http\Resources\AddressResource;
use ErrorException; use ErrorException;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class FetchAddressLogic extends AbstractControllersLogic class FetchAddressLogic extends AbstractControllerLogic
{ {
/** /**
@@ -3,7 +3,7 @@
namespace App\Classes\Modules\Addresses\ControllersLogic; namespace App\Classes\Modules\Addresses\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Addresses\Services\ListsAddresses; use App\Classes\Modules\Addresses\Services\ListsAddresses;
use App\Classes\Modules\Addresses\Standards\Rules\CanListAddresses; use App\Classes\Modules\Addresses\Standards\Rules\CanListAddresses;
use App\Http\Resources\AddressResource; use App\Http\Resources\AddressResource;
@@ -11,7 +11,7 @@ use ErrorException;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class ListAddressesLogic extends AbstractControllersLogic class ListAddressesLogic extends AbstractControllerLogic
{ {
/** /**
@@ -0,0 +1,54 @@
<?php
namespace App\Classes\Modules\Addresses\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Addresses\Services\ListsAddresses;
use App\Classes\Modules\Addresses\Services\ListsDistricts;
use App\Classes\Modules\Addresses\Standards\Rules\CanListAddresses;
use App\Http\Resources\AddressResource;
use App\Http\Resources\DistrictResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ListDistrictsLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Retrieved Addresses',
'message' => 'You have successfully retrieved a list of Addresses'
];
}
/** @var ListsDistricts */
private $listDistricts;
/**
* ListDistrictsLogic constructor.
* @param ListsDistricts $listDistricts
*/
public function __construct(ListsDistricts $listDistricts)
{
$this->listDistricts = $listDistricts;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function logic(Request $request) : JsonResponse
{
$query = $this->listDistricts->execute($this->listDistricts->deserializeFilters($request->input('filters')));
return $this->collectionResponse(DistrictResource::collection($query));
}
}
@@ -3,7 +3,7 @@
namespace App\Classes\Modules\Addresses\ControllersLogic; namespace App\Classes\Modules\Addresses\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Addresses\Services\UpdatesAddress; use App\Classes\Modules\Addresses\Services\UpdatesAddress;
use App\Classes\Modules\Addresses\Services\FetchesAddress; use App\Classes\Modules\Addresses\Services\FetchesAddress;
use App\Classes\Modules\Addresses\Standards\Rules\CanUpdateAddress; use App\Classes\Modules\Addresses\Standards\Rules\CanUpdateAddress;
@@ -13,7 +13,7 @@ use ErrorException;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class UpdateAddressLogic extends AbstractControllersLogic class UpdateAddressLogic extends AbstractControllerLogic
{ {
/** /**
@@ -2,69 +2,46 @@
namespace App\Classes\Modules\Addresses\DataTransferObjects; namespace App\Classes\Modules\Addresses\DataTransferObjects;
use App\Classes\Interfaces\DataTransferObject; use App\Classes\General\Interfaces\DataTransferObject;
class AddressObject implements DataTransferObject class AddressObject implements DataTransferObject
{ {
/** @var int */
private $companyId;
/** @var string */ /** @var string */
private $streetOne; private $streetOne;
/** @var string|null */ /** @var string|null */
private $streetTwo; private $streetTwo;
/** @var string */ /** @var int */
private $city; private $countryId;
/** @var string */ /** @var int */
private $state; private $stateId;
/** @var string */ /** @var int */
private $districtId;
/** @var int */
private $postCode; private $postCode;
/** @var string */
private $country;
/** @var int */
private $default;
/** @var int */
private $billing;
/** /**
* AddressObject constructor. * AddressObject constructor.
* @param int $companyId
* @param string $streetOne * @param string $streetOne
* @param null|string $streetTwo * @param null|string $streetTwo
* @param string $city * @param int $countryId
* @param string $state * @param int $stateId
* @param string $postCode * @param int $districtId
* @param string $country * @param int $postCode
* @param int $default
* @param int $billing
*/ */
public function __construct(int $companyId, string $streetOne, ?string $streetTwo, string $city, string $state, string $postCode, string $country, int $default, int $billing) public function __construct(string $streetOne, ?string $streetTwo, int $countryId, int $stateId, int $districtId, int $postCode)
{ {
$this->companyId = $companyId;
$this->streetOne = $streetOne; $this->streetOne = $streetOne;
$this->streetTwo = $streetTwo; $this->streetTwo = $streetTwo;
$this->city = $city; $this->countryId = $countryId;
$this->state = $state; $this->stateId = $stateId;
$this->districtId = $districtId;
$this->postCode = $postCode; $this->postCode = $postCode;
$this->country = $country;
$this->default = $default;
$this->billing = $billing;
}
/**
* @return int
*/
public function getCompanyId(): int
{
return $this->companyId;
} }
/** /**
@@ -84,52 +61,36 @@ class AddressObject implements DataTransferObject
} }
/** /**
* @return string * @return int
*/ */
public function getCity(): string public function getCountryId(): int
{ {
return $this->city; return $this->countryId;
} }
/** /**
* @return string * @return int
*/ */
public function getState(): string public function getStateId(): int
{ {
return $this->state; return $this->stateId;
} }
/** /**
* @return string * @return int
*/ */
public function getPostCode(): string public function getDistrictId(): int
{
return $this->districtId;
}
/**
* @return int
*/
public function getPostCode(): int
{ {
return $this->postCode; return $this->postCode;
} }
/**
* @return string
*/
public function getCountry(): string
{
return $this->country;
}
/**
* @return int
*/
public function getDefault(): int
{
return $this->default;
}
/**
* @return int
*/
public function getBilling(): int
{
return $this->billing;
}
} }
@@ -3,30 +3,30 @@
namespace App\Classes\Modules\Addresses\Services; namespace App\Classes\Modules\Addresses\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord; use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord;
use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject; use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject;
use App\Models\Address; use App\Models\Address;
use App\Models\Company;
class CreatesAddress extends AbstractUpdateRecord class CreatesAddress extends AbstractUpdateRelationshipRecord
{ {
/** /**
* @param Company $company
* @param AddressObject $object * @param AddressObject $object
* @return \Illuminate\Database\Eloquent\Model * @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException * @throws \App\Classes\Exceptions\MalformedRequestException
*/ */
public function execute(AddressObject $object) { public function execute(Company $company, AddressObject $object) {
$model = new Address(); $model = new Address();
$model->company_id = $object->getCompanyId();
$model->street_one = $object->getStreetOne(); $model->street_one = $object->getStreetOne();
$model->street_two = $object->getStreetTwo(); $model->street_two = $object->getStreetTwo();
$model->city = $object->getCity(); $model->country_id = $object->getCountryId();
$model->state = $object->getState(); $model->state_id = $object->getStateId();
$model->post_code = $object->getPostCode(); $model->district_id = $object->getDistrictId();
$model->country = $object->getCountry(); $model->postcode = $object->getPostCode();
$model->default = $object->getDefault();
$model->billing = $object->getBilling();
return $this->handler($model); return $this->handler($company->addresses(), $model);
} }
} }

Some files were not shown because too many files have changed in this diff Show More