simedkom/app/Http/Controllers/Dashboard/UserController.php

306 lines
9.9 KiB
PHP

<?php
namespace App\Http\Controllers\Dashboard;
use App\Http\Controllers\Controller;
use App\Http\Requests\AccountSettingRequest;
use App\Http\Requests\ChangePasswordRequest;
use App\Http\Requests\ResetPasswordRequest;
use App\Http\Requests\UserRequest;
use App\Mail\AccountVerification;
use App\Models\LoginHistory;
use App\Models\Role;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
class UserController extends Controller
{
public function index(Request $request){
return view('dashboard.users.index', [
'title' => 'Pengguna',
'role' => $request->input('role', null),
'status' => $request->input('status', null),
]);
}
public function create(){
return view('dashboard.users.create', [
'title' => 'Tambah Pengguna',
'roles' => Role::all()
]);
}
public function store(UserRequest $request){
$validatedData = $request->validated();
$createdUser = User::create($validatedData);
if($createdUser){
return redirect()->back()->with('success-status', 'Berhasil menambahkan pengguna.');
}else{
return redirect()->back()->with('failed-status', 'Gagal menambahkan pengguna.');
}
}
public function edit($id){
$user = User::with(['role'])->findOrFail(decrypt_id($id));
return view('dashboard.users.edit', [
'title' => 'Ubah Pengguna',
'user' => $user,
'roles' => Role::all()
]);
}
public function update(UserRequest $request, $id){
$validatedData = $request->validated();
if (isset($validatedData['password']) && !empty($validatedData['password'])) {
$validatedData['password'] = $request->input('password');
} else {
unset($validatedData['password']);
}
$user = User::findOrFail(decrypt_id($id));
$updatedUser = $user->update($validatedData);
if($updatedUser){
return redirect()->back()->with('success-status', 'Berhasil mengubah pengguna.');
}else{
return redirect()->back()->with('failed-status', 'Gagal mengubah pengguna.');
}
}
public function show($id, $type){
$user = User::with(['role', 'company.media.journalists'])->findOrFail(decrypt_id($id));
$data = [
'title' => 'Profile Pengguna',
'user' => $user,
'roles' => Role::all(),
'page' => 'show-user',
'type' => $type
];
if($type === 'account'){
return view('dashboard.users.profiles.account', $data);
}elseif($type === 'login-activities'){
$data['loginActivities'] = LoginHistory::where('user_id', $user->id)->orderByDesc('id')->simplePaginate(20);
return view('dashboard.users.profiles.login-activity', $data);
}elseif($type === 'company'){
return view('dashboard.users.profiles.company', $data);
}elseif($type === 'media'){
return view('dashboard.users.profiles.media', $data);
}elseif($type === 'journalists'){
return view('dashboard.users.profiles.journalists', $data);
}
}
public function resetPassword($id){
$user = User::with(['role'])->findOrFail(decrypt_id($id));
return view('dashboard.users.reset-password',[
'title' => 'Reset Password',
'page' => 'reset',
'user' => $user
]);
}
public function resetPasswordAction(ResetPasswordRequest $request, $id){
$validatedData = $request->validated();
$updatedUser = User::findOrFail(decrypt_id($id))->update([
'password' => $validatedData['password']
]);
if($updatedUser){
return redirect()->back()->with('success-status', 'Berhasil mereset password pengguna.');
}else{
return redirect()->back()->with('failed-status', 'Gagal mereset password pengguna.');
}
}
public function destroy($id)
{
try {
$user = User::with(['company.media.journalists'])->findOrFail(decrypt_id($id));
if ($user->role_id == '3') {
if ($user->company) {
$company = $user->company;
if ($company->media) {
$media = $company->media;
if ($media->journalists) {
$media->journalists->delete();
}
$media->delete();
}
$company->delete();
}
}
$user->delete();
return response()->json(['message' => 'Berhasil menghapus user beserta data terkait.']);
} catch (\Exception $e) {
return response()->json(['message' => 'Gagal menghapus user atau data terkait.'], 500);
}
}
public function profile($type){
$data = [
'title' => 'Detail Akun',
'user' => Auth::user(),
'roles' => Role::all(),
'page' => 'profile',
'type' => $type
];
if($type === 'account'){
return view('dashboard.users.profiles.account', $data);
}elseif($type === 'login-activities'){
$data['loginActivities'] = LoginHistory::where('user_id', Auth::user()->id)->orderByDesc('id')->simplePaginate(20);
return view('dashboard.users.profiles.login-activity', $data);
}elseif($type === 'company'){
return view('dashboard.users.profiles.company', $data);
}elseif($type === 'media'){
return view('dashboard.users.profiles.media', $data);
}elseif($type === 'journalists'){
return view('dashboard.users.profiles.journalists', $data);
}
}
public function filter(Request $request){
$filteredRequest = $request->except('_token');
$filterField = array_filter($filteredRequest, function ($value) {
return filled($value);
});
return redirect()->route('dashboard.users.index', $filterField);
}
public function process($id, $type, $process){
$user = User::with(['role', 'company.media.journalists'])->findOrFail(decrypt_id($id));
$data = [
'title' => 'Profile Pengguna',
'user' => $user,
'roles' => Role::all(),
'page' => 'process',
'type' => $type,
'process' => $process,
];
if($type === 'account'){
return view('dashboard.users.profiles.account', $data);
}elseif($type === 'login-activities'){
$data['loginActivities'] = LoginHistory::where('user_id', $user->id)->orderByDesc('id')->simplePaginate(20);
return view('dashboard.users.profiles.login-activity', $data);
}elseif($type === 'company'){
return view('dashboard.users.profiles.company', $data);
}elseif($type === 'media'){
return view('dashboard.users.profiles.media', $data);
}elseif($type === 'journalists'){
return view('dashboard.users.profiles.journalists', $data);
}
}
public function statusAction(Request $request, $id, $action){
$user = User::findOrFail(decrypt_id($id));
if($user->status === '0' && Auth::check() && is_role(['1'])){
if($action == 'accept'){
$user->update([
'status' => '1'
]);
Mail::to($user->email)->send(new AccountVerification($user, 'accepted'));
return response()->json(['message' => 'Berhasil menyetujui pengguna.']);
}else if($action == 'reject'){
$validatedData = $request->validate([
'rejection_reason' => ['required'],
], [
'rejection_reason.required' => 'Alasan penolakan wajib diisi.',
]);
$user->update([
'status' => '3'
]);
$user->company->update([
'rejection_reason' => $validatedData['rejection_reason']
]);
Mail::to($user->email)->send(new AccountVerification($user, 'rejected', strip_tags($validatedData['rejection_reason'])));
return redirect()->back()->with('success-status', 'Berhasil menolak pengguna.');
}
}
}
public function setting(){
$user = Auth::user();
return view('dashboard.users.setting', [
'title' => 'Pengaturan Akun',
'user' => $user,
]);
}
public function settingAction(AccountSettingRequest $request){
$validatedData = $request->validated();
$user = User::findOrFail(Auth::id());
$updatedUser = $user->update([
'name' => $validatedData['name'],
'email' => $validatedData['email'],
]);
if($updatedUser){
return redirect()->back()->with('success-status', 'Berhasil mengubah data akun.');
}else{
return redirect()->back()->with('failed-status', 'Gagal mengubah data akun.');
}
}
public function changePassword(){
$user = User::with(['role'])->findOrFail(Auth::id());
return view('dashboard.users.reset-password',[
'title' => 'Ubah Password',
'page' => 'change',
'user' => $user
]);
}
public function changePasswordAction(ChangePasswordRequest $request){
$validatedData = $request->validated();
$updatedUser = User::findOrFail(Auth::id())->update([
'password' => $validatedData['password']
]);
if($updatedUser){
return redirect()->route('dashboard.users.setting')->with('success-status', 'Berhasil mengubah password.');
}else{
return redirect()->back()->with('failed-status', 'Gagal mengubah password.');
}
}
}