File: /home/bdedition/public_html/core/app/Http/Controllers/Admin/ManageUsersController.php
<?php
namespace App\Http\Controllers\Admin;
use App\Models\News;
use App\Models\User;
use App\Constants\Status;
use Illuminate\Http\Request;
use App\Models\NotificationLog;
use App\Rules\FileTypeValidate;
use Illuminate\Validation\Rule;
use App\Http\Controllers\Controller;
use App\Models\NotificationTemplate;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules\Password;
class ManageUsersController extends Controller
{
public function allUsers()
{
$pageTitle = 'All Staffs';
$users = $this->userData();
$countries = getCountryJson();
return view('admin.users.list', compact('pageTitle', 'users', 'countries'));
}
public function activeUsers()
{
$pageTitle = 'Active Staffs';
$users = $this->userData('active');
$countries = getCountryJson();
return view('admin.users.list', compact('pageTitle', 'users', 'countries'));
}
public function bannedUsers()
{
$pageTitle = 'Banned Staffs';
$users = $this->userData('banned');
$countries = getCountryJson();
return view('admin.users.list', compact('pageTitle', 'users', 'countries'));
}
public function emailUnverifiedUsers()
{
$pageTitle = 'Email Unverified Staffs';
$users = $this->userData('emailUnverified');
$countries = getCountryJson();
return view('admin.users.list', compact('pageTitle', 'users', 'countries'));
}
public function emailVerifiedUsers()
{
$pageTitle = 'Email Verified Staffs';
$users = $this->userData('emailVerified');
$countries = getCountryJson();
return view('admin.users.list', compact('pageTitle', 'users', 'countries'));
}
public function mobileUnverifiedUsers()
{
$pageTitle = 'Mobile Unverified Staffs';
$users = $this->userData('mobileUnverified');
$countries = getCountryJson();
return view('admin.users.list', compact('pageTitle', 'users', 'countries'));
}
public function mobileVerifiedUsers()
{
$pageTitle = 'Mobile Verified Staffs';
$users = $this->userData('mobileVerified');
$countries = getCountryJson();
return view('admin.users.list', compact('pageTitle', 'users', 'countries'));
}
protected function userData($scope = null)
{
if ($scope) {
$users = User::$scope();
} else {
$users = User::query();
}
return $users->searchable(['username', 'email'])->withCount('news')->orderBy('id', 'desc')->paginate(getPaginate());
}
public function detail($id)
{
$user = User::withCount('news')->findOrFail($id);
$pageTitle = 'Staff Detail - ' . $user->username;
$widget['pending'] = News::where('user_id', $id)->pending()->count();
$widget['approved'] = News::where('user_id', $id)->approved()->count();
$widget['rejected'] = News::where('user_id', $id)->rejected()->count();
$countries = getCountryJson();
return view('admin.users.detail', compact('pageTitle', 'user', 'countries', 'widget'));
}
public function update(Request $request, $id)
{
$user = User::findOrFail($id);
$countryData = getCountryJson();
$countryArray = (array)$countryData;
$countries = implode(',', array_keys($countryArray));
$countryCode = $request->country;
$country = $countryData->$countryCode->country;
$dialCode = $countryData->$countryCode->dial_code;
$request->validate([
'firstname' => 'required|string|max:40',
'lastname' => 'required|string|max:40',
'email' => 'required|email|string|max:40|unique:users,email,' . $user->id,
'mobile' => 'required|string|max:40',
'country' => 'required|in:' . $countries,
]);
$exists = User::where('mobile', $request->mobile)->where('dial_code', $dialCode)->where('id', '!=', $user->id)->exists();
if ($exists) {
$notify[] = ['error', 'The mobile number already exists.'];
return back()->withNotify($notify);
}
$user->mobile = $request->mobile;
$user->firstname = $request->firstname;
$user->lastname = $request->lastname;
$user->display_name = $request->display_name;
$user->fatherName = $request->fatherName;
$user->motherName = $request->motherName;
$user->nid = $request->nid;
$user->district = $request->district;
$user->upazila = $request->upazila;
$user->designation = $request->designation;
$user->auto_approval = $request->auto_approval ? Status::ENABLE : Status::DISABLE;
$user->email = $request->email;
$user->address = $request->address;
$user->city = $request->city;
$user->state = $request->state;
$user->zip = $request->zip;
$user->country_name = @$country;
$user->dial_code = $dialCode;
$user->country_code = $countryCode;
$user->ev = $request->ev ? Status::VERIFIED : Status::UNVERIFIED;
$user->sv = $request->sv ? Status::VERIFIED : Status::UNVERIFIED;
$user->ts = $request->ts ? Status::ENABLE : Status::DISABLE;
$user->save();
$notify[] = ['success', 'Staff details updated successfully'];
return back()->withNotify($notify);
}
public function storeNewUser(Request $request)
{
$countryData = (array)getCountryJson();
$countryCodes = implode(',', array_keys($countryData));
$mobileCodes = implode(',', array_column($countryData, 'dial_code'));
$countries = implode(',', array_column($countryData, 'country'));
$passwordValidation = Password::min(5);
$request->validate([
'firstname' => 'required',
'lastname' => 'required',
'email' => 'required|string|email|unique:users',
'password' => ['required', 'confirmed', $passwordValidation],
'country_code' => 'required|in:' . $countryCodes,
'country' => 'required|in:' . $countries,
'mobile_code' => 'required|in:' . $mobileCodes,
'username' => 'required|unique:users|min:5',
'mobile' => ['required', 'regex:/^([0-9]*)$/', Rule::unique('users')->where('dial_code', $request->mobile_code)],
], [
'firstname.required' => 'The first name field is required',
'lastname.required' => 'The last name field is required'
]);
if (preg_match("/[^a-z0-9_]/", trim($request->username))) {
$notify[] = ['info', 'Username can contain only small letters, numbers and underscore.'];
$notify[] = ['error', 'No special character, space or capital letters in username.'];
return back()->withNotify($notify)->withInput($request->all());
}
$user = new User();
$user->firstname = $request->firstname;
$user->lastname = $request->lastname;
$user->fatherName = $request->fatherName;
$user->motherName = $request->motherName;
$user->nid = $request->nid;
$user->district = $request->district;
$user->upazila = $request->upazila;
$user->designation = $request->designation;
$user->email = $request->email;
$user->password = Hash::make($request->password);
$user->username = $request->username;
$user->country_code = $request->country_code;
$user->country_name = $request->country;
$user->dial_code = $request->mobile_code;
$user->mobile = $request->mobile;
$user->ev = gs('ev') ? Status::NO : Status::YES;
$user->sv = gs('sv') ? Status::NO : Status::YES;
$user->ts = Status::DISABLE;
$user->tv = Status::ENABLE;
$user->save();
$notify[] = ['success', 'Staff created successfully'];
return back()->withNotify($notify);
}
public function login($id)
{
Auth::loginUsingId($id);
return to_route('user.home');
}
public function status(Request $request, $id)
{
$user = User::findOrFail($id);
if ($user->status == Status::USER_ACTIVE) {
$request->validate([
'reason' => 'required|string|max:255'
]);
$user->status = Status::USER_BAN;
$user->ban_reason = $request->reason;
$notify[] = ['success', 'Staff banned successfully'];
} else {
$user->status = Status::USER_ACTIVE;
$user->ban_reason = null;
$notify[] = ['success', 'Staff unbanned successfully'];
}
$user->save();
return back()->withNotify($notify);
}
public function showNotificationSingleForm($id)
{
$user = User::findOrFail($id);
if (!gs('en') && !gs('sn') && !gs('pn')) {
$notify[] = ['warning', 'Notification options are disabled currently'];
return to_route('admin.users.detail', $user->id)->withNotify($notify);
}
$pageTitle = 'Send Notification to ' . $user->username;
return view('admin.users.notification_single', compact('pageTitle', 'user'));
}
public function sendNotificationSingle(Request $request, $id)
{
$request->validate([
'message' => 'required',
'via' => 'required|in:email,sms,push',
'subject' => 'required_if:via,email,push',
'image' => ['nullable', 'image', new FileTypeValidate(['jpg', 'jpeg', 'png'])],
]);
if (!gs('en') && !gs('sn') && !gs('pn')) {
$notify[] = ['warning', 'Notification options are disabled currently'];
return to_route('admin.dashboard')->withNotify($notify);
}
$imageUrl = null;
if ($request->via == 'push' && $request->hasFile('image')) {
$imageUrl = fileUploader($request->image, getFilePath('push'));
}
$template = NotificationTemplate::where('act', 'DEFAULT')->where($request->via . '_status', Status::ENABLE)->exists();
if (!$template) {
$notify[] = ['warning', 'Default notification template is not enabled'];
return back()->withNotify($notify);
}
$user = User::findOrFail($id);
notify($user, 'DEFAULT', [
'subject' => $request->subject,
'message' => $request->message,
], [$request->via], pushImage: $imageUrl);
$notify[] = ['success', 'Notification sent successfully'];
return back()->withNotify($notify);
}
public function showNotificationAllForm()
{
if (!gs('en') && !gs('sn') && !gs('pn')) {
$notify[] = ['warning', 'Notification options are disabled currently'];
return to_route('admin.dashboard')->withNotify($notify);
}
$notifyToUser = User::notifyToUser();
$users = User::active()->count();
$pageTitle = 'Notification to Verified Staffs';
if (session()->has('SEND_NOTIFICATION') && !request()->email_sent) {
session()->forget('SEND_NOTIFICATION');
}
return view('admin.users.notification_all', compact('pageTitle', 'users', 'notifyToUser'));
}
public function sendNotificationAll(Request $request)
{
$request->validate([
'via' => 'required|in:email,sms,push',
'message' => 'required',
'subject' => 'required_if:via,email,push',
'start' => 'required|integer|gte:1',
'batch' => 'required|integer|gte:1',
'being_sent_to' => 'required',
'cooling_time' => 'required|integer|gte:1',
'number_of_top_deposited_user' => 'required_if:being_sent_to,topDepositedUsers|integer|gte:0',
'number_of_days' => 'required_if:being_sent_to,notLoginUsers|integer|gte:0',
'image' => ["nullable", 'image', new FileTypeValidate(['jpg', 'jpeg', 'png'])],
], [
'number_of_days.required_if' => "Number of days field is required",
'number_of_top_deposited_user.required_if' => "Number of top deposited user field is required",
]);
if (!gs('en') && !gs('sn') && !gs('pn')) {
$notify[] = ['warning', 'Notification options are disabled currently'];
return to_route('admin.dashboard')->withNotify($notify);
}
$template = NotificationTemplate::where('act', 'DEFAULT')->where($request->via . '_status', Status::ENABLE)->exists();
if (!$template) {
$notify[] = ['warning', 'Default notification template is not enabled'];
return back()->withNotify($notify);
}
if ($request->being_sent_to == 'selectedUsers') {
if (session()->has("SEND_NOTIFICATION")) {
$request->merge(['user' => session()->get('SEND_NOTIFICATION')['user']]);
} else {
if (!$request->user || !is_array($request->user) || empty($request->user)) {
$notify[] = ['error', "Ensure that the user field is populated when sending an email to the designated user group"];
return back()->withNotify($notify);
}
}
}
$scope = $request->being_sent_to;
$userQuery = User::oldest()->active()->$scope();
if (session()->has("SEND_NOTIFICATION")) {
$totalUserCount = session('SEND_NOTIFICATION')['total_user'];
} else {
$totalUserCount = (clone $userQuery)->count() - ($request->start - 1);
}
if ($totalUserCount <= 0) {
$notify[] = ['error', "Notification recipients were not found among the selected user base."];
return back()->withNotify($notify);
}
$imageUrl = null;
if ($request->via == 'push' && $request->hasFile('image')) {
if (session()->has("SEND_NOTIFICATION")) {
$request->merge(['image' => session()->get('SEND_NOTIFICATION')['image']]);
}
if ($request->hasFile("image")) {
$imageUrl = fileUploader($request->image, getFilePath('push'));
}
}
$users = (clone $userQuery)->skip($request->start - 1)->limit($request->batch)->get();
foreach ($users as $user) {
notify($user, 'DEFAULT', [
'subject' => $request->subject,
'message' => $request->message,
], [$request->via], pushImage: $imageUrl);
}
return $this->sessionForNotification($totalUserCount, $request);
}
private function sessionForNotification($totalUserCount, $request)
{
if (session()->has('SEND_NOTIFICATION')) {
$sessionData = session("SEND_NOTIFICATION");
$sessionData['total_sent'] += $sessionData['batch'];
} else {
$sessionData = $request->except('_token');
$sessionData['total_sent'] = $request->batch;
$sessionData['total_user'] = $totalUserCount;
}
$sessionData['start'] = $sessionData['total_sent'] + 1;
if ($sessionData['total_sent'] >= $totalUserCount) {
session()->forget("SEND_NOTIFICATION");
$message = ucfirst($request->via) . " notifications were sent successfully";
$url = route("admin.users.notification.all");
} else {
session()->put('SEND_NOTIFICATION', $sessionData);
$message = $sessionData['total_sent'] . " " . $sessionData['via'] . " notifications were sent successfully";
$url = route("admin.users.notification.all") . "?email_sent=yes";
}
$notify[] = ['success', $message];
return redirect($url)->withNotify($notify);
}
public function countBySegment($methodName)
{
return User::active()->$methodName()->count();
}
public function list()
{
$query = User::active();
if (request()->search) {
$query->where(function ($q) {
$q->where('email', 'like', '%' . request()->search . '%')->orWhere('username', 'like', '%' . request()->search . '%');
});
}
$users = $query->orderBy('id', 'desc')->paginate(getPaginate());
return response()->json([
'success' => true,
'users' => $users,
'more' => $users->hasMorePages()
]);
}
public function notificationLog($id)
{
$user = User::findOrFail($id);
$pageTitle = 'Notifications Sent to ' . $user->username;
$logs = NotificationLog::where('user_id', $id)->with('user')->orderBy('id', 'desc')->paginate(getPaginate());
return view('admin.reports.notification_history', compact('pageTitle', 'logs', 'user'));
}
}