| Server IP : 138.197.107.151 / Your IP : 216.73.217.7 Web Server : Apache/2.4.58 (Ubuntu) System : Linux BloxBy-Builder 6.8.0-71-generic #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 x86_64 User : wpbetasites_mrakzqskir ( 1022) PHP Version : 8.3.6 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/shark-admin/app/Http/Controllers/ |
Upload File : |
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
use App\Models\UserSetting;
use App\Models\Website;
use App\Models\Prompt;
use App\Models\Provider;
use Illuminate\Support\Facades\Hash;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Illuminate\Support\Facades\Validator;
use App\Services\EmailValidatorService;
use DB;
class UsersController extends Controller
{
//
public function index(Request $request)
{
$users = User::query();
$title = "Users list";
if($request->q){
$users->where(function($query) use($request) {
$query->where('name', 'like', '%'.$request->q.'%')
->orWhere('email', 'like', '%'.$request->q.'%');
});
}
$dir = $request->get('dir', 'desc');
if (!in_array(strtolower($dir), ['asc', 'desc'])) {
$dir = 'desc';
}
$col = "users.created_at";
if($request->col){
$col = $request->col;
}
$users = $users->whereIn('role',['user','agency'])->orderBy($col, $dir);
$users = $users->paginate(20); // 10 users per page
foreach ($users as $key => $user) {
$delete_flag = "confirm"; // default
if (!empty($user->websites)) {
foreach ($user->websites as $website) {
if ($website->plan) {
$delete_flag = "not_allowed";
break; // stop checking further websites
} else {
$delete_flag = "warn"; // at least one website without plan
}
}
}
$users[$key]->delete_flag = $delete_flag;
}
return view('users.index', compact('users','title'));
}
public function create(Request $request)
{
$title = "Create user";
return view('users.create', compact('title'));
}
public function store(Request $request)
{
// 1. Validate input
$validator = Validator::make($request->all(),[
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email',
//'phone_full' => 'required|string|max:20',
'password' => 'required|string|min:6|confirmed',
'role' => 'required'
]);
$emailValidatorService = new EmailValidatorService;
$response = $emailValidatorService->validate($request->email);
//print_r($response); die;
if($response["disposable"]){
$validator->after(function ($v) {
$v->errors()->add('email', 'Please enter non disposable emails.');
});
}
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
// 2. Create user
$user = User::create([
'name' => $request->name,
'email' => $request->email,
//'phone' => $request->phone_full,
'password' => Hash::make($request->password),
'role' => $request->role,
'email_verified_at'=>date("Y-m-d H:i:s")
]);
// 3. Redirect or respond
return redirect()->route('users.list')->with('success', 'User created successfully.');
}
public function toggleBlock($id)
{
$user = User::findOrFail($id);
$user->is_blocked = !$user->is_blocked;
$user->save();
$status = $user->is_blocked ? 'blocked' : 'unblocked';
return redirect()->back()->with('success', "User has been $status.");
}
public function edit(Request $request, $id)
{
$title = "Edit user";
$user = User::findOrFail($id);
$prompts = Prompt::query();
//->where("website_id",null)
$prompts_count = $prompts->where("user_id",$id)->count();
return view('users.edit', compact('title','id','user','prompts_count'));
}
public function update(Request $request, $id)
{
$user = User::findOrFail($id);
$validated = $request->validate([
'name' => 'required|string|max:255',
'phone_full' => 'nullable|string|max:20',
'role' => 'required'
]);
$user->name = $validated['name'];
$user->phone = $validated['phone'] ?? $request->phone_full;
$user->role = $validated['role'];
$user->save();
return redirect()->back()->with('success', 'User profile updated successfully.');
}
public function settings(Request $request, $id)
{
$title = "Update settings";
$setting = UserSetting::where("user_id", $id)->first();
$user = User::where("id", $id)->first();
$prompts = Prompt::query();
//->where("website_id",null)
$prompts_count = $prompts->where("user_id",$id)->count();
return view('users.settings', compact('title','id','setting','prompts_count','user'));
}
public function updateSettings(Request $request, $id)
{
$user = User::findOrFail($id);
$validated = $request->validate([
'websites_limit' => 'required|integer|min:1|max:10'
]);
$websites = Website::where("user_id", $user->id)->count();
if($websites > $request->websites_limit){
return redirect()->back()->with('error', 'You cannot set limit smaller than number of websites created by the user. Please remove extra websites first.');
}
$setting = UserSetting::where("user_id", $user->id)->first();
if(!$setting){
$setting = new UserSetting;
$setting->user_id = $user->id;
}
$setting->websites_limit = $request->websites_limit;
$setting->is_wp_admin_access = $request->has('is_wp_admin_access') ? 1 : 0;
$websites = Website::where("user_id", $user->id)->get();
foreach($websites as $website){
if($setting->is_wp_admin_access){
$this->changeRole($website, "administrator");
} else {
if($website->active_plan_id == null){
$this->changeRole($website, "editor");
} else {
$this->changeRole($website, "bloxby-user");
}
}
}
if($user->email_verified_at == null){
$dateTime = \DateTime::createFromFormat('d-m-Y H:i', $request->trial_ending_at);
// Convert to MySQL format
$mysqlDateTime = $dateTime->format('Y-m-d H:i:s'); // "2025-08-29 10:30:00"
$user->trial_ending_at = $mysqlDateTime;
$user->save();
}
$setting->save();
return redirect()->back()->with('success', 'User settings updated successfully.');
}
public function changeRole($website, $role){
if($website){
$user = $website->user;
$server_meta = json_decode($website->server_meta, true);
$process = new Process([
'sudo',
'/var/bloxbycommands/changeinrole.sh',
'/var/www/'.$server_meta["folder"].'/'.$server_meta["sftp_user"]."/public_html",
$user->email,
$role
]);
$process->setTimeout(300); // Increase for long tasks
$process->run();
if (!$process->isSuccessful()) {
return response()->json(['status' => 'error', 'message' => $process->getErrorOutput()], 500);
}
}
}
public function deleteUser(Request $request, $id){
try{
DB::Begintransaction();
$user = User::where("id", $id)->first();
$error = false;
if($user){
$websites = Website::where("user_id", $user->id)->get();
foreach($websites as $website){
if($website->plan){
return redirect()->back()->with('error', 'You cannot delete the user because they are on a paid plan');
}else if($website->status!='completed'){
return redirect()->back()->with('error', 'One of websites generation is in progress, please wait till it is completed.');
}
}
foreach($websites as $website){
$response = $this->removeWebsite($website);
if(!$response["error"]){
$website->delete();
} else {
$error = true;
}
}
if(!$error){
Prompt::where("user_id", $user->id)->delete();
UserSetting::where("user_id", $user->id)->delete();
Provider::where("user_id", $user->id)->delete();
$user->delete();
} else {
DB::Rollback();
return redirect()->back()->with('error', 'Some error occur while deleting a website');
}
}
DB::commit();
return redirect()->back()->with('success', 'User has been deleted successfully.');
} catch(Exception $e){
DB::Rollback();
return redirect()->back()->with('error', $e->getMessage());
}
}
public function removeWebsite($website){
if($website){
$server_meta = json_decode($website->server_meta, true);
$process = new Process([
'sudo',
'/var/bloxbycommands/remove_site.sh',
'--folder', $server_meta["folder"],
'--site', $server_meta["site"],
'--wpsite', $server_meta["slug_environment"],
'--domain', $server_meta["domain"]
]);
//$process = Process::fromShellCommandline(env("SITEREMPATH")." site_bloxy_wp_".$website->id." site_bloxy_db_".$website->id); // change to your command
$process->setTimeout(300); // Increase for long tasks
$process->run();
if (!$process->isSuccessful()) {
return ["error"=>true, "message" => $process->getErrorOutput()];
//return response()->json(['status' => 'error', 'message' => $process->getErrorOutput()], 500);
} else {
return ["error"=>false, "message"=> $process->getOutput()];
//$website->delete();
//return redirect()->back()->with(['status' => 'success', 'output' => $process->getOutput()]);
}
}
return ["error"=>true, "message"=> "Website not found"];
}
}