<?php
namespace App\Repositories\Eloquent;
use App\Helpers\Helper;
use App\Models\Customer;
use App\Models\User;
use App\Notifications\WelcomeEmailNotification;
use App\Repositories\Contracts\CustomerRepository;
use Exception;
use Illuminate\Config\Repository;
use Illuminate\Support\Arr;
use App\Exceptions\GeneralException;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Session;
use Throwable;
/**
* Class EloquentCustomerRepository.
*/
class EloquentCustomerRepository extends EloquentBaseRepository implements CustomerRepository
{
/**
* @var Repository
*/
protected Repository $config;
/**
* EloquentCustomerRepository constructor.
*
* @param User $user
* @param Repository $config
*/
public function __construct(User $user, Repository $config)
{
parent::__construct($user);
$this->config = $config;
}
/**
* @param array $input
* @param bool $confirmed
*
* @return User
* @throws GeneralException
*
*/
public function store(array $input, $confirmed = false): User
{
/** @var User $user */
$user = $this->make(Arr::only($input, ['first_name', 'last_name', 'email', 'status', 'timezone', 'locale']));
if (empty($user->locale)) {
$user->locale = $this->config->get('app.locale');
}
if (empty($user->timezone)) {
$user->timezone = $this->config->get('app.timezone');
}
$user->email_verified_at = now();
$user->is_admin = false;
$user->is_customer = true;
if ( ! $this->save($user, $input)) {
throw new GeneralException(__('locale.exceptions.something_went_wrong'));
}
Customer::create([
'user_id' => $user->id,
'phone' => $input['phone'],
'notifications' => json_encode([
'login' => 'no',
'sender_id' => 'yes',
'keyword' => 'yes',
'subscription' => 'yes',
'promotion' => 'yes',
'profile' => 'yes',
]),
]);
if (isset($input['welcome_message'])) {
$user->notify(new WelcomeEmailNotification($user->first_name, $user->last_name, $user->email, route('login'), $input['password']));
}
return $user;
}
/**
* @param User $customer
* @param array $input
*
* @return User
* @throws GeneralException
*/
public function update(User $customer, array $input): User
{
$customer->fill(Arr::except($input, 'password'));
if ( ! $this->save($customer, $input)) {
throw new GeneralException(__('locale.exceptions.something_went_wrong'));
}
return $customer;
}
/**
* @param User $user
* @param array $input
*
* @return bool
*/
private function save(User $user, array $input): bool
{
if (isset($input['password']) && ! empty($input['password'])) {
$user->password = Hash::make($input['password']);
}
if ( ! $user->save()) {
return false;
}
return true;
}
/**
* update user information
*
* @param User $customer
* @param array $input
*
* @return User
* @throws GeneralException
*/
public function updateInformation(User $customer, array $input): User
{
$get_customer = Customer::where('user_id', $customer->id)->first();
if ( ! $get_customer) {
throw new GeneralException(__('locale.exceptions.something_went_wrong'));
}
if (isset($input['notifications']) && count($input['notifications']) > 0) {
$defaultNotifications = [
'login' => 'no',
'sender_id' => 'no',
'keyword' => 'no',
'subscription' => 'no',
'promotion' => 'no',
'profile' => 'no',
];
$notifications = array_merge($defaultNotifications, $input['notifications']);
$input['notifications'] = json_encode($notifications);
}
$data = $get_customer->update($input);
if ( ! $data) {
throw new GeneralException(__('locale.exceptions.something_went_wrong'));
}
return $customer;
}
/**
* update permissions
*
* @param User $customer
* @param array $input
*
* @return User
* @throws GeneralException
*/
public function permissions(User $customer, array $input): User
{
$data = array_values($input['permissions']);
$status = $customer->customer()->update([
'permissions' => json_encode($data),
]);
if ( ! $status) {
throw new GeneralException(__('locale.exceptions.something_went_wrong'));
}
return $customer;
}
/**
* @param User $customer
*
* @return bool
* @throws GeneralException
*/
public function destroy(User $customer): bool
{
if ( ! $customer->can_delete) {
throw new GeneralException(__('exceptions.backend.users.first_user_cannot_be_destroyed'));
}
if ( ! $customer->delete()) {
throw new GeneralException(__('exceptions.backend.users.delete'));
}
return true;
}
/**
* @param array $ids
*
* @return mixed
* @throws Exception|Throwable
*
*/
public function batchEnable(array $ids): bool
{
DB::transaction(function () use ($ids) {
if ($this->query()->whereIn('uid', $ids)
->update(['status' => true])
) {
return true;
}
throw new GeneralException(__('exceptions.backend.users.update'));
});
return true;
}
/**
* @param array $ids
*
* @return mixed
* @throws Exception|Throwable
*
*/
public function batchDisable(array $ids): bool
{
DB::transaction(function () use ($ids) {
if ($this->query()->whereIn('uid', $ids)
->update(['status' => false])
) {
return true;
}
throw new GeneralException(__('exceptions.backend.users.update'));
});
return true;
}
/*
|--------------------------------------------------------------------------
| Version 3.3
|--------------------------------------------------------------------------
|
| Logged in as customer
|
*/
/**
* @throws GeneralException
*/
public function impersonate(User $customer)
{
if ($customer->is_admin) {
throw new GeneralException(__('locale.customer.admin_cannot_be_impersonated'));
}
$authenticatedUser = auth()->user();
if ($authenticatedUser->id === $customer->id || Session::get('admin_user_id') === $customer->id) {
return redirect()->route('admin.home');
}
if ( ! Session::get('admin_user_id')) {
session(['admin_user_id' => $authenticatedUser->id]);
session(['admin_user_name' => $authenticatedUser->displayName()]);
session(['temp_user_id' => $customer->id]);
$permissions = collect(json_decode($customer->customer->permissions, true));
session(['permissions' => $permissions]);
}
//Login user
auth()->loginUsingId($customer->id);
return redirect(Helper::home_route());
}
}