![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/domains/pdf-ai.com/private_html/app/Http/Controllers/Admin/ |
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\URL;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rules;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Hash;
use App\Services\Statistics\UserRegistrationYearlyService;
use App\Services\Statistics\UserRegistrationMonthlyService;
use App\Services\Statistics\DavinciUsageService;
use App\Models\SubscriptionPlan;
use App\Models\Subscriber;
use App\Models\User;
use Carbon\Carbon;
use DataTables;
use Cache;
class AdminUserController extends Controller
{
/**
* Display user management dashboard
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
$year = $request->input('year', date('Y'));
$month = $request->input('month', date('m'));
$registration_yearly = new UserRegistrationYearlyService($year);
$registration_monthly = new UserRegistrationMonthlyService($month);
$user_data_year = [
'total_free_tier' => $registration_yearly->getTotalFreeRegistrations(),
'total_users' => $registration_yearly->getTotalUsers(),
'top_countries' => $this->getTopCountries(),
];
$chart_data['free_registration_yearly'] = json_encode($registration_yearly->getFreeRegistrations());
$chart_data['current_registered_users'] = json_encode($registration_monthly->getRegisteredUsers());
$chart_data['user_countries'] = json_encode($this->getAllCountries());
$cachedUsers = json_decode(Cache::get('isOnline', []), true);
$users_online = count($cachedUsers);
$users_today = User::whereNotNull('last_seen')->whereDate('last_seen', Carbon::today())->count();
return view('admin.users.dashboard.index', compact('chart_data', 'user_data_year', 'users_online', 'users_today'));
}
/**
* Display all users
*
* @return \Illuminate\Http\Response
*/
public function listUsers(Request $request)
{
if ($request->ajax()) {
$data = User::latest()->get();
return Datatables::of($data)
->addIndexColumn()
->addColumn('actions', function($row){
$actionBtn ='<div>
<a href="'. route("admin.user.show", $row["id"] ). '"><i class="fa-solid fa-clipboard-user table-action-buttons view-action-button" title="View User"></i></a>
<a href="'. route("admin.user.edit", $row["id"] ). '"><i class="fa-solid fa-user-pen table-action-buttons edit-action-button" title="Edit User Group"></i></a>
<a class="deleteUserButton" id="'. $row["id"] .'" href="#"><i class="fa-solid fa-user-slash table-action-buttons delete-action-button" title="Delete User"></i></a>
</div>';
return $actionBtn;
})
->addColumn('user', function($row){
if ($row['profile_photo_path']) {
$path = asset($row['profile_photo_path']);
$user = '<div class="d-flex">
<div class="widget-user-image-sm overflow-hidden mr-4"><img alt="Avatar" src="' . $path . '"></div>
<div class="widget-user-name"><span class="font-weight-bold">'. $row['name'] .'</span><br><span class="text-muted">'.$row["email"].'</span></div>
</div>';
} else {
$path = URL::asset('img/users/avatar.png');
$user = '<div class="d-flex">
<div class="widget-user-image-sm overflow-hidden mr-4"><img alt="Avatar" class="rounded-circle" src="' . $path . '"></div>
<div class="widget-user-name"><span class="font-weight-bold">'. $row['name'] .'</span><br><span class="text-muted">'.$row["email"].'</span></div>
</div>';
}
return $user;
})
->addColumn('created-on', function($row){
$created_on = '<span class="font-weight-bold">'.date_format($row["created_at"], 'd M Y').'</span><br><span>'.date_format($row["created_at"], 'H:i A').'</span>';
return $created_on;
})
->addColumn('last-seen', function($row){
$created_on = '<span class="font-weight-bold">'.date_format(Carbon::parse($row["last_seen"]), 'd M Y').'</span><br><span>'.date_format(Carbon::parse($row["last_seen"]), 'H:i A').'</span>';
return $created_on;
})
->addColumn('custom-status', function($row){
$custom_status = '<span class="cell-box user-'.$row["status"].'">'.ucfirst($row["status"]).'</span>';
return $custom_status;
})
->addColumn('custom-group', function($row){
$custom_group = '<span class="cell-box user-group-'.$row["group"].'">'.ucfirst($row["group"]).'</span>';
return $custom_group;
})
->addColumn('custom-country', function($row){
$custom_country = '<span class="font-weight-bold">'.$row["country"].'</span>';
return $custom_country;
})
->addColumn('words-left', function($row){
$words = (is_null($row['available_words'] + $row['available_words_prepaid'])) ? 0 : number_format($row["available_words"] + $row['available_words_prepaid']);
$used = '<span class="font-weight-bold">'.$words.'</span>';
return $used;
})
->addColumn('images-left', function($row){
$words = (is_null($row['available_images'] + $row['available_images_prepaid'])) ? 0 : number_format($row["available_images"] + $row['available_images_prepaid']);
$used = '<span class="font-weight-bold">'.$words.'</span>';
return $used;
})
->rawColumns(['actions', 'custom-status', 'custom-group', 'created-on', 'user', 'custom-country','words-left', 'last-seen', 'images-left'])
->make(true);
}
return view('admin.users.list.index');
}
/**
* Display user activity
*
* @return \Illuminate\Http\Response
*/
public function activity(Request $request)
{
$result = DB::table('sessions')
->join('users', 'sessions.user_id', '=', 'users.id')
->whereNotNull('sessions.user_id')
->select('sessions.ip_address', 'sessions.user_agent', 'sessions.last_activity', 'users.email', 'users.group')
->orderBy('sessions.last_activity', 'desc')
->get()->toArray();
return view('admin.users.activity.index', compact('result'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('admin.users.list.create');
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => ['required', 'confirmed', Rules\Password::min(8)],
'role' => 'required'
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'country' => $request->country,
'job_role' => $request->job_role,
'phone_number' => $request->phone_number,
'company' => $request->company,
'website' => $request->website,
'address' => $request->address,
'city' => $request->city,
'postal_code' => $request->postal_code,
'country' => $request->country,
]);
$user->syncRoles($request->role);
$user->status = 'active';
$user->group = $request->role;
$user->email_verified_at = now();
$user->available_words = config('settings.free_tier_words');
$user->save();
toastr()->success(__('Congratulation! New user has been created'));
return redirect()->back();
}
/**
* Display the details of selected user
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show(Request $request, User $user)
{
$year = $request->input('year', date('Y'));
$month = $request->input('month', date('m'));
$davinci = new DavinciUsageService($month, $year);
$data = [
'words' => $davinci->userTotalWordsGenerated($user->id),
'images' => $davinci->userTotalImagesGenerated($user->id),
];
$chart_data['word_usage'] = json_encode($davinci->userMonthlyWordsChart($user->id));
if ($user->hasActiveSubscription()) {
$subscription = Subscriber::where('user_id', $user->id)->where('status', 'Active')->first();
} else {
$subscription = false;
}
$user_subscription = ($subscription) ? SubscriptionPlan::where('id', $user->plan_id)->first() : '';
$progress = [
'words' => ($user->total_words > 0) ? (($user->available_words / $user->total_words) * 100) : 0,
];
return view('admin.users.list.show', compact('user', 'data', 'chart_data', 'user_subscription', 'progress', 'subscription'));
}
/**
* Show the form for editing the specified user
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit(User $user)
{
return view('admin.users.list.edit', compact('user'));
}
/**
* Show users credit capacity
*/
public function credit(User $user)
{
return view('admin.users.list.increase', compact('user'));
}
/**
* Change user credit capacity
*/
public function increase(Request $request, User $user)
{
$request->validate([
'words' => 'required|integer|min:0',
'images' => 'required|integer|min:0',
]);
$user->available_words_prepaid = ($user->available_words_prepaid + request('words'));
$user->available_images_prepaid = ($user->available_images_prepaid + request('images'));
$user->save();
toastr()->success(__('Credits have been added successfully'));
return redirect()->back();
}
/**
* Update selected user data
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(User $user)
{
$user->update(request()->validate([
'name' => 'required|string|max:255',
'email' => ['required','string','email','max:255',Rule::unique('users')->ignore($user)],
'job_role' => 'nullable|string|max:255',
'company' => 'nullable|string|max:255',
'website' => 'nullable|string|max:255',
'phone_number' => 'nullable|max:20',
'address' => 'nullable|string|max:255',
'city' => 'nullable|string|max:255',
'postal_code' => 'nullable|string|max:255',
'country' => 'string|max:255',
]));
toastr()->success(__('User profile was successfully updated'));
return redirect()->back();
}
/**
* Change user group/status/password
*/
public function change(Request $request, User $user)
{
$request->validate([
'password' => ['nullable', 'confirmed', Rules\Password::min(8)],
'status' => 'required',
'group' => 'required'
]);
$user->removeRole($user->group);
$user->assignRole($request->group);
$user->status = $request->status;
$user->group = $request->group;
$user->google2fa_enabled = $request->twoFactor_status;
if ($request->password) {
$user->password = Hash::make($request->password);
}
$user->save();
toastr()->success(__('User data was successfully updated'));
return redirect()->back();
}
/**
* Delete selected user.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function delete(Request $request)
{
if ($request->ajax()) {
$user = User::find(request('id'));
if($user) {
$user->delete();
return response()->json('success');
} else{
return response()->json('error');
}
}
}
/**
* Show list of all countries
*/
public function getAllCountries()
{
$countries = User::select(DB::raw("count(id) as data, country"))
->groupBy('country')
->orderBy('data')
->pluck('data', 'country');
return $countries;
}
/**
* Show top 30 countries
*/
public function getTopCountries()
{
$countries = User::select(DB::raw("count(id) as data, country"))
->groupBy('country')
->orderByDesc('data')
->pluck('data', 'country')
->take(30)
->toArray();
return $countries;
}
}