Merge branch 'admin_account' into 'master'

admin account create and edit

See merge request CIEFWorldwideSdnBhd/exchange-2.0!46
This commit is contained in:
omair saleh
2021-05-31 02:10:17 +00:00
15 changed files with 658 additions and 94 deletions
@@ -0,0 +1,73 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Accounts\Standards\Rules\CanCreateUser;
use App\Classes\Modules\Accounts\Services\CreatesUser;
use App\Classes\Modules\Accounts\DataTransferObjects\RegistrationObject;
use App\Http\Resources\UserResource;
use App\Classes\ValueObjects\Constants\RoleTypes;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CreateAdminUserLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Created Account',
'message' => 'You have successfully created a new Account'
];
}
/** @var CanCreateUser */
private $canCreateUser;
/** @var CreatesUser */
private $createsUser;
/**
* CreateUserLogic constructor.
* @param CanCreateUser $canCreateUser
* @param CreatesUser $createsUser
*/
public function __construct(
CanCreateUser $canCreateUser,
CreatesUser $createsUser
)
{
$this->canCreateUser = $canCreateUser;
$this->createsUser = $createsUser;
}
/**
* @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
{
$user_object = new RegistrationObject($request->input('name'), $request->input('email'),
$request->input('password'), $request->input('password_confirmation'),
RoleTypes::ADMIN, ApprovalStatus::APPROVED);
$this->canCreateUser->passes($user_object);
$user = $this->createsUser->execute($user_object);
return $this->resourceResponse(new UserResource($user));
}
}
@@ -0,0 +1,76 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Http\Resources\UserResource;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Accounts\Services\FetchesUser;
use App\Classes\Modules\Accounts\Standards\Rules\CanDeleteUser;
use App\Classes\Modules\Accounts\Services\DeletesUser;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class DeleteUserLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Delete User',
'message' => 'You have successfully deleted the User'
];
}
/** @var CanDeleteUser */
private $canDeleteUser;
/** @var DeletesUser */
private $deletesUser;
/** @var FetchesUser */
private $fetchesUser;
public function __construct(
CanDeleteUser $canDeleteUser,
DeletesUser $deletesUser,
FetchesUser $fetchesUser
)
{
$this->canDeleteUser = $canDeleteUser;
$this->deletesUser = $deletesUser;
$this->fetchesUser = $fetchesUser;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
DB::beginTransaction();
$user = $this->fetchesUser->execute(['id' => $request->route('id')]);
$this->canDeleteUser->passes();
$this->deletesUser->execute($user);
DB::commit();
return $this->resourceResponse(new UserResource($user));
} catch (\Exception $exception){
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -3,20 +3,46 @@
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 UserObject implements DataTransferObject
{
/** @var string */
private $name;
/** @var string */
private $name;
private $email;
/** @var string */
private $password;
/** @var string */
private $passwordConfirmation;
/** @var int|null */
private $type;
/** @var int|null */
private $status;
/**
* NameObject constructor.
* 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)
public function __construct(string $name, string $email, string $password, string $passwordConfirmation, ?int $type = RoleTypes::USER, ?int $status = ApprovalStatus::PENDING_VERIFICATION)
{
$this->name = $name;
$this->name = $name;
$this->email = $email;
$this->password = $password;
$this->passwordConfirmation = $passwordConfirmation;
$this->type = $type;
$this->status = $status;
}
/**
@@ -25,6 +51,49 @@ class UserObject implements DataTransferObject
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;
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\General\Eloquent\AbstractDeleteRecord;
use App\Models\User;
class DeletesUser extends AbstractDeleteRecord
{
/**
* @param User $model
* @return mixed
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(User $model) {
return $this->handler($model);
}
}
@@ -0,0 +1,57 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Accounts\DataTransferObjects\RegistrationObject;
use App\Classes\Modules\Accounts\Standards\Validators\UserCreateValidation;
class CanCreateUser extends AbstractRule
{
/** @var UserCreateValidation */
private $userCreateValidation;
/**
* CanCreateAddress constructor.
* @param UserCreateValidation $userCreateValidation
*/
public function __construct(UserCreateValidation $userCreateValidation)
{
$this->userCreateValidation = $userCreateValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param RegistrationObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->userCreateValidation->validate($object);
}
/**
* @param AddressObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
class CanDeleteUser extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param UserObject $object
* @return bool
*/
protected function validators($object): bool
{
return true;
}
/**
* @param UserObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
class UserCreateValidation extends AbstractValidation
{
/**
* @param UserObject $object
* @return array
*/
protected function data($object): array
{
return [
'name' => $object->getName(),
'email' => $object->getEmail(),
'password' => $object->getPassword(),
];
}
/**
* @return array
*/
protected function rules(): array
{
return [
'name' => 'required',
'email' => 'required|unique:users',
'password' => 'required',
];
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Accounts;
use App\Classes\Modules\Accounts\ControllersLogic\CreateAdminUserLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreateAdminUserController
{
/**
* @param Request $request
* @param CreateAdminUserLogic $logic
* @return JsonResponse
*/
public function create(Request $request, CreateAdminUserLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers\Accounts;
use App\Classes\Modules\Accounts\ControllersLogic\DeleteUserLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class DeleteUserController
{
/**
* @param Request $request
* @param DeleteUserLogic $logic
* @return JsonResponse
*/
public function delete(Request $request, DeleteUserLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -1,8 +1,8 @@
<?php
namespace App\Http\Controllers\Bookings;
namespace App\Http\Controllers\Accounts;
use App\Classes\Modules\Bookings\ControllersLogic\DeleteBookingLogic;
use App\Classes\Modules\Accounts\ControllersLogic\DeleteBookingLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
File diff suppressed because one or more lines are too long
@@ -0,0 +1,33 @@
<template>
<div class="row">
<div class="col">
<loading-component style="height: 300px; top: 0;" key="1" color="success" v-show="isLoading" ></loading-component>
<div class="row justify-content-center" v-show="!isLoading">
<div class="col">
<div class="row m-b-20">
<div class="col">
<h3 class="all-caps">Are you Sure?</h3>
<div class="fs-11">Are you sure you want to delete this admin account?</div>
</div>
</div>
<div class="row">
<div class="col p-r-5">
<div class="btn btn-sm btn-success btn-block b-rad-none" data-dismiss="modal">Cancel</div>
</div>
<div class="col p-l-5">
<div class="btn btn-sm btn-danger btn-block b-rad-none" @click="submit(route('api.account.user.delete', item.id), 'delete', section, true, true)">Delete</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import componentHandler from '../../../general/mixins/componentHandler';
import ModalFormHandler from '../../../general/mixins/modalFormHandler';
export default {
mixins: [componentHandler, ModalFormHandler]
}
</script>
@@ -0,0 +1,117 @@
<template>
<div class="row">
<div class="col">
<loading-component style="height: 50px; top: 0;" key="1" color="success" v-show="$store.getters.isLoading(section)"></loading-component>
<div class="row" v-show="!$store.getters.isLoading(section)">
<div class="col">
<div class="row m-b-20">
<div class="col">
<h6 class="all-caps m-b-5 bold no-margin">Add Admin Account</h6>
</div>
</div>
<div class="row m-b-5 animate__animated animate__fadeInUpBig animate__fast" v-if="error">
<div class="col">
<small class="bold fs-10 text-danger">{{error}}</small>
</div>
</div>
<div class="row m-b-10">
<div class="col">
<validation-wrapper-component :validator="$v.parameters.name">
<label class="muted">Name</label>
<input type="text" class="form-control" v-model="parameters.name">
</validation-wrapper-component>
</div>
</div>
<div class="row m-b-10">
<div class="col">
<validation-wrapper-component :validator="$v.parameters.email">
<label class="muted">Email</label>
<input type="text" class="form-control" v-model="parameters.email">
</validation-wrapper-component>
</div>
</div>
<div class="row m-b-10">
<div class="col">
<validation-wrapper-component :validator="$v.parameters.password">
<label class="muted">Password</label>
<input type="password" class="form-control" v-model="parameters.password">
</validation-wrapper-component>
</div>
</div>
<div class="row m-b-10">
<div class="col">
<validation-wrapper-component :validator="$v.parameters.password_confirmation">
<label class="muted">Password Confirmation</label>
<input type="password" class="form-control" v-model="parameters.password_confirmation">
</validation-wrapper-component>
</div>
</div>
<div class="row">
<div class="col p-r-5">
<div class="btn btn-sm btn-default bg-master-lightest btn-block b-rad-none" :data-dismiss="closable ? 'modal' : ''" @click="$emit('close')">Cancel</div>
</div>
<div class="col p-l-5">
<div class="btn btn-sm btn-success btn-block b-rad-none" @click="submitForm()">Add Admin</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import FormHandler from '../../../general/mixins/formHandler';
import { required, sameAs, minLength , email} from "vuelidate/lib/validators";
export default {
props : {
closable: {
type: Boolean,
default: true
},
},
data(){
return {
parameters: {
name: '',
email: '',
password: '',
password_confirmation: '',
}
}
},
validations: {
parameters: {
name: {
required
},
email: {
required,
email
},
password: {
required,
minLength: minLength(6)
},
password_confirmation: {
required,
sameAsPassword: sameAs('password')
}
}
},
methods: {
submitForm(){
this.submit(route('api.account.user.admin.create'), 'post', this.section, true, false);
},
successHandler(response){
this.closeModal();
this.$emit('createdAdmin', response.payload.data);
this.formHandler();
this.resetForm();
},
errorHandler(error){
this.formHandler(error.message);
}
},
mixins: [FormHandler]
}
</script>
+36
View File
@@ -200,6 +200,42 @@
</div>
</div>
<template v-if="$store.getters.isSuperAdmin">
<div class="row tabsContainer hide tabContent" tab-name="team">
<div class="col">
<loading-component style="height: 200px; top: 0;" key="1" color="success" v-show="$store.getters.isLoading('accountsSection')"></loading-component>
<div class="row" v-show="!$store.getters.isLoading('accountsSection')">
<div class="col">
<div class="row p-b-5 m-b-20 b-b b-grey align-items-center parentContainer">
<div class="col">
<div class="font-heading all-caps fs-10 hint-text">
Admin Accounts
</div>
</div>
<div class="col-auto">
<button class="btn btn-xs btn-primary b-rad-none requestModal" data-type="createModal">
<i class="fa fa-plus m-r-5"></i>
Add Admin Account
</button>
<modal-form-component section="accountsSection">
<template slot="form" slot-scope="{section}">
<user-form-component :section="section"></user-form-component>
</template>
</modal-form-component>
</div>
</div>
<div class="row m-b-20">
<div class="col">
<list-component section="accountsSection" :endpoint="route('api.account.user.list')" :options="{'type': 2}">
<template slot="list" slot-scope="{data}">
<user-component :data="data"></user-component>
</template>
</list-component>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row tabsContainer hide tabContent" tab-name="currency">
<div class="col">
<loading-component style="height: 200px; top: 0;" key="1" color="success" v-show="$store.getters.isLoading('currenciesSection')"></loading-component>
+3
View File
@@ -38,5 +38,8 @@ Route::group(['prefix' => 'account', 'namespace' => 'Accounts', 'as' => 'account
Route::post('/show', 'FetchUserController@fetch')->name('show');
Route::get('/list', 'ListUsersController@list')->name('list');
Route::put('/update/{id}', 'UpdateUserController@update')->name('update');
Route::post('/admin/create', 'CreateAdminUserController@create')->name('admin.create');
Route::delete('/delete/{id}', 'DeleteUserController@delete')->name('delete');
});
});