From 05cb3dd35ef7f7defe2d1c74bebf88325e16712e Mon Sep 17 00:00:00 2001 From: glovetleong Date: Wed, 13 Oct 2021 14:10:32 +0800 Subject: [PATCH] cross login --- .../CrossAuthenticateUserLogic.php | 8 +- .../UserSocialAccountObject.php | 54 +++++++ .../CrossAuthenticationProcessor.php | 148 +++++++++++++++++- .../Services/CreatesUserSocialAccount.php | 24 +++ .../Services/CrossAuthenticatesUser.php | 4 + .../Services/FetchesUserSocialAccount.php | 33 ++++ app/Models/UserSocialAccount.php | 29 +++- .../forms/CrossPlatformLoginFormComponent.vue | 16 +- 8 files changed, 303 insertions(+), 13 deletions(-) create mode 100644 app/Classes/Modules/Accounts/DataTransferObjects/UserSocialAccountObject.php create mode 100644 app/Classes/Modules/Accounts/Services/CreatesUserSocialAccount.php create mode 100644 app/Classes/Modules/Accounts/Services/FetchesUserSocialAccount.php diff --git a/app/Classes/Modules/Accounts/ControllersLogic/CrossAuthenticateUserLogic.php b/app/Classes/Modules/Accounts/ControllersLogic/CrossAuthenticateUserLogic.php index 5819a4f0..33bce845 100644 --- a/app/Classes/Modules/Accounts/ControllersLogic/CrossAuthenticateUserLogic.php +++ b/app/Classes/Modules/Accounts/ControllersLogic/CrossAuthenticateUserLogic.php @@ -18,16 +18,16 @@ class CrossAuthenticateUserLogic extends AbstractControllerLogic } /** @var CrossAuthenticationProcessor */ - private $cressAuthenticationProcessor; + private $crossAuthenticationProcessor; /** * CrossAuthenticateUserLogic constructor. * @param CrossAuthenticationProcessor $authenticationProcessor */ - public function __construct(CrossAuthenticationProcessor $cressAuthenticationProcessor) + public function __construct(CrossAuthenticationProcessor $crossAuthenticationProcessor) { - $this->cressAuthenticationProcessor = $cressAuthenticationProcessor; + $this->crossAuthenticationProcessor = $crossAuthenticationProcessor; } /** @@ -38,7 +38,7 @@ class CrossAuthenticateUserLogic extends AbstractControllerLogic * @throws \App\Classes\Exceptions\RequestValidationException */ protected function logic(Request $request): JsonResponse { - return $this->response($this->cressAuthenticationProcessor->execute($request)); + return $this->response($this->crossAuthenticationProcessor->execute($request)); } } \ No newline at end of file diff --git a/app/Classes/Modules/Accounts/DataTransferObjects/UserSocialAccountObject.php b/app/Classes/Modules/Accounts/DataTransferObjects/UserSocialAccountObject.php new file mode 100644 index 00000000..7740a04e --- /dev/null +++ b/app/Classes/Modules/Accounts/DataTransferObjects/UserSocialAccountObject.php @@ -0,0 +1,54 @@ +app_id = $app_id; + $this->user = $user; + $this->platform = $platform; + } + + /** + * @return string + */ + public function getAppId(): String + { + return $this->app_id; + } + + /** + * @return User + */ + public function getUser(): User + { + return $this->user; + } + + /** + * @return int + */ + public function getPlatform(): int + { + return $this->platform; + } +} diff --git a/app/Classes/Modules/Accounts/Processors/CrossAuthenticationProcessor.php b/app/Classes/Modules/Accounts/Processors/CrossAuthenticationProcessor.php index 7d77aa05..5658f932 100644 --- a/app/Classes/Modules/Accounts/Processors/CrossAuthenticationProcessor.php +++ b/app/Classes/Modules/Accounts/Processors/CrossAuthenticationProcessor.php @@ -3,12 +3,35 @@ namespace App\Classes\Modules\Accounts\Processors; use App\Classes\Modules\Accounts\DataTransferObjects\CrossAuthenticationCredentialsObject; +use App\Classes\Modules\Companies\DataTransferObjects\CompanyConnectionObject; +use App\Classes\Modules\Companies\DataTransferObjects\EmploymentObject; +use App\Classes\Modules\Accounts\DataTransferObjects\UserSocialAccountObject; + use App\Classes\Modules\Accounts\Services\CrossAuthenticatesUser; 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\CanCrossAuthenticateUser; +use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; + +use App\Classes\Modules\Accounts\Processors\CreateUserProcessor; +use App\Classes\Modules\Companies\Processors\CreateCompanyProcessor; +use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; +use App\Classes\Modules\Companies\Processors\CreateCompanyModuleProcessor; +use App\Classes\Modules\Companies\Services\CreatesCompanyConnection; +use App\Classes\General\Services\GeneratesInitials; +use App\Classes\Modules\Companies\Services\ApprovesCompanyConnection; +use App\Classes\Modules\Companies\Processors\AssignEmployeeProcessor; +use App\Classes\Modules\Documents\Processors\UploadIdentityDocumentProcessor; +use App\Classes\Modules\Accounts\Services\CreatesUserSocialAccount; + +use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Classes\ValueObjects\Constants\BusinessType; +use App\Classes\ValueObjects\Constants\CompanyType; +use App\Classes\ValueObjects\Constants\RoleTypes; + use Illuminate\Http\Request; +use App\Models\UserSocialAccount; class CrossAuthenticationProcessor { @@ -28,6 +51,33 @@ class CrossAuthenticationProcessor /** @var AuthenticationRedirect */ private $authenticationRedirect; + /** @var CreateUserProcessor */ + private $createUserProcessor; + + /** @var CreateCompanyProcessor */ + private $createCompanyProcessor; + + /** @var CreateContactProcessor */ + private $createContactProcessor; + + /** @var CreateCompanyModuleProcessor */ + private $createCompanyModuleProcessor; + + /** @var CreatesCompanyConnection */ + private $createsCompanyConnection; + + /** @var ApprovesCompanyConnection */ + private $approvesCompanyConnection; + + /** @var AssignEmployeeProcessor */ + private $assignEmployeeProcessor; + + /** @var UploadIdentityDocumentProcessor */ + private $uploadIdentityDocumentProcessor; + + /** @var CreatesUserSocialAccount */ + private $createsUserSocialAccount; + /** * CrossAuthenticationProcessor constructor. * @param CanCrossAuthenticateUser $canCrossAuthenticateUser @@ -35,14 +85,48 @@ class CrossAuthenticationProcessor * @param GeneratesAuthenticationToken $generatesAuthenticationToken * @param FetchesUser $fetchesUser * @param AuthenticationRedirect $authenticationRedirect + * @param CreateUserProcessor $createUserProcessor + * @param CreateCompanyProcessor $createCompanyProcessor + * @param CreateContactProcessor $createContactProcessor + * @param CreateCompanyModuleProcessor $createCompanyModuleProcessor + * @param CreatesCompanyConnection $createsCompanyConnection + * @param ApprovesCompanyConnection $approvesCompanyConnection + * @param AssignEmployeeProcessor $assignEmployeeProcessor + * @param UploadIdentityDocumentProcessor $uploadIdentityDocumentProcessor + * @param CreatesUserSocialAccount $createsUserSocialAccount */ - public function __construct(CanCrossAuthenticateUser $canCrossAuthenticateUser, CrossAuthenticatesUser $crossAuthenticatesUser, GeneratesAuthenticationToken $generatesAuthenticationToken, FetchesUser $fetchesUser, AuthenticationRedirect $authenticationRedirect) + public function __construct( + CanCrossAuthenticateUser $canCrossAuthenticateUser, + CrossAuthenticatesUser $crossAuthenticatesUser, + GeneratesAuthenticationToken $generatesAuthenticationToken, + FetchesUser $fetchesUser, + AuthenticationRedirect $authenticationRedirect, + CreateUserProcessor $createUserProcessor, + CreateCompanyProcessor $createCompanyProcessor, + CreateContactProcessor $createContactProcessor, + CreateCompanyModuleProcessor $createCompanyModuleProcessor, + CreatesCompanyConnection $createsCompanyConnection, + ApprovesCompanyConnection $approvesCompanyConnection, + AssignEmployeeProcessor $assignEmployeeProcessor, + UploadIdentityDocumentProcessor $uploadIdentityDocumentProcessor, + CreatesUserSocialAccount $createsUserSocialAccount + ) { $this->canCrossAuthenticateUser = $canCrossAuthenticateUser; $this->crossAuthenticatesUser = $crossAuthenticatesUser; $this->generatesAuthenticationToken = $generatesAuthenticationToken; $this->fetchesUser = $fetchesUser; $this->authenticationRedirect = $authenticationRedirect; + $this->createUserProcessor = $createUserProcessor; + $this->createCompanyProcessor = $createCompanyProcessor; + $this->createContactProcessor = $createContactProcessor; + $this->createCompanyModuleProcessor = $createCompanyModuleProcessor; + $this->createsCompanyConnection = $createsCompanyConnection; + $this->createsCompanyConnection = $createsCompanyConnection; + $this->approvesCompanyConnection = $approvesCompanyConnection; + $this->assignEmployeeProcessor = $assignEmployeeProcessor; + $this->uploadIdentityDocumentProcessor = $uploadIdentityDocumentProcessor; + $this->createsUserSocialAccount = $createsUserSocialAccount; } @@ -60,7 +144,67 @@ class CrossAuthenticationProcessor $this->canCrossAuthenticateUser->passes($object); $cross = $this->crossAuthenticatesUser->execute($object); - dd($cross); + + $user_social_account = UserSocialAccount::where('app_id', $cross->token->user->id)->first(); + if (!$user_social_account) { + + $request->request->add([ + 'name' => $cross->token->user->name, + 'email' => $cross->token->user->email, + 'password' => 'pass123', + 'password_confirmation' => 'pass123', + ]); + + $user = $this->createUserProcessor->execute( + $request, + RoleTypes::USER, + env('APP_ENV') != 'production' ? ApprovalStatus::APPROVED : ApprovalStatus::PENDING_VERIFICATION + ); + + $company = $this->createCompanyProcessor->execute( + $cross->payload->data->name, + CompanyType::COMPANY_BUSINESS, + ApprovalStatus::PENDING_SUBMISSION + ); + + $contactObject = new ContactObject( + $cross->payload->data->contact->reference, + $cross->payload->data->contact->phone, + $cross->payload->data->contact->email, + $cross->payload->data->contact->wechat_id + ); + $contact = $this->createContactProcessor->execute($contactObject, $company); + + $companyModule = $this->createCompanyModuleProcessor->execute($company, BusinessType::IMPORTER); + + $connectionObject = new CompanyConnectionObject( + $companyModule, 'CIEF', + mt_rand(1000, 9999).(new GeneratesInitials())->name($company->name)->length(3)->generate() + ); + $connection = $this->createsCompanyConnection->execute($connectionObject); + + $this->approvesCompanyConnection->execute($connection); + + $object = new EmploymentObject($companyModule, $user); + $this->assignEmployeeProcessor->execute($object); + + $request->request->add([ + 'files' => [$cross->document->src], + 'identification_no' => $cross->payload->data->identification->reference, + ]); + + $this->uploadIdentityDocumentProcessor->execute($request, $company); + + $object = new UserSocialAccountObject( + $cross->token->user->id, + $user, + $request->input('platform') + ); + $this->createsUserSocialAccount->execute($object); + } + else { + $user = $user_social_account->user()->first(); + } return ['access_token' => $this->generatesAuthenticationToken->execute($user), 'redirect_url' => $this->authenticationRedirect->url($user)]; } diff --git a/app/Classes/Modules/Accounts/Services/CreatesUserSocialAccount.php b/app/Classes/Modules/Accounts/Services/CreatesUserSocialAccount.php new file mode 100644 index 00000000..a6fd8fcd --- /dev/null +++ b/app/Classes/Modules/Accounts/Services/CreatesUserSocialAccount.php @@ -0,0 +1,24 @@ +user_id = $object->getUser()->id; + $model->app_id = $object->getAppId(); + $model->platform = $object->getPlatform(); + return $this->handler($model); + + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Accounts/Services/CrossAuthenticatesUser.php b/app/Classes/Modules/Accounts/Services/CrossAuthenticatesUser.php index 93b2b200..54835b17 100644 --- a/app/Classes/Modules/Accounts/Services/CrossAuthenticatesUser.php +++ b/app/Classes/Modules/Accounts/Services/CrossAuthenticatesUser.php @@ -27,6 +27,10 @@ class CrossAuthenticatesUser $jwtPayload = json_decode($tokenPayload); $response = Http::withToken($object->getAccessToken())->get(env('EXCHANGE_URL') . 'api/v1/company/' . $jwtPayload->user->company_id . '/show')->object(); + + $response_document = Http::withToken($object->getAccessToken())->get(env('EXCHANGE_URL') . 'api/v1/storage/' . $response->payload->data->identification->files[0]->file->file_info[0]->original->file . '/fetch')->object(); + $response->token = $jwtPayload; + $response->document = $response_document->payload; } return $response; diff --git a/app/Classes/Modules/Accounts/Services/FetchesUserSocialAccount.php b/app/Classes/Modules/Accounts/Services/FetchesUserSocialAccount.php new file mode 100644 index 00000000..c2e1c676 --- /dev/null +++ b/app/Classes/Modules/Accounts/Services/FetchesUserSocialAccount.php @@ -0,0 +1,33 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} \ No newline at end of file diff --git a/app/Models/UserSocialAccount.php b/app/Models/UserSocialAccount.php index b8f01866..71aa73d8 100644 --- a/app/Models/UserSocialAccount.php +++ b/app/Models/UserSocialAccount.php @@ -2,10 +2,31 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Eloquent\SoftDeletes; -class UserSocialAccount extends Model +/** + * Class District + * @package App\Models + * + * @property \App\Models\User user_id + * @property string app_id + * @property int platform + */ +class UserSocialAccount extends AbstractModel { - use HasFactory; + use SoftDeletes; + + protected $table = 'user_social_accounts'; + + protected $dates = ['deleted_at']; + + /** + * @return BelongsTo + */ + public function user(): BelongsTo + { + return $this->belongsTo(User::class, 'user_id', 'id'); + } } diff --git a/resources/assets/vue/components/accounts/forms/CrossPlatformLoginFormComponent.vue b/resources/assets/vue/components/accounts/forms/CrossPlatformLoginFormComponent.vue index e9a38a4f..0634ddbe 100644 --- a/resources/assets/vue/components/accounts/forms/CrossPlatformLoginFormComponent.vue +++ b/resources/assets/vue/components/accounts/forms/CrossPlatformLoginFormComponent.vue @@ -28,26 +28,36 @@