simedkom/app/Http/Controllers/Dashboard/JournalistController.php
myuqinurrohman 8fcd20c9f5 feat: request edit journalist
chore: change UI for index company journalist page
2025-04-14 10:28:52 +07:00

245 lines
8.5 KiB
PHP

<?php
namespace App\Http\Controllers\Dashboard;
use App\Http\Controllers\Controller;
use App\Http\Requests\JournalistRequest;
use App\Models\Journalist;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class JournalistController extends Controller
{
public function index(){
if(is_role(['1'])){
return view('dashboard.journalists.admin.index',[
'title' => 'Data Jurnalis'
]);
}else if(is_role(['3'])){
$user = User::with(['role', 'company.media.journalists'])->findOrFail(Auth::id());
return view('dashboard.journalists.index',[
'title' => 'Data Jurnalis',
'user' => $user,
'journalists' => $user->company->media->journalists
->where('approved_status', '1')
->whereNull('deleted_at'),
]);
}
}
public function submission(){
return view('dashboard.journalists.submission',[
'title' => 'Data Permohonan Penambahan Jurnalis'
]);
}
public function processSubmission($id){
$journalist = Journalist::with(['media.company'])->findOrFail(decrypt_id($id));
return view('dashboard.journalists.process-submission',[
'title' => 'Data Permohonan Penambahan Jurnalis',
'journalist' => $journalist,
]);
}
public function processSubmissionAction(Request $request, $id, $action){
$journalist = Journalist::with(['media.company'])->findOrFail(decrypt_id($id));
if($action === 'accept'){
$acceptedJournalist = $journalist->update([
'approved_status' => '1',
'approved_at' => now(),
]);
if($acceptedJournalist){
return response()->json(['message' => 'Berhasil menyetujui jurnalis.']);
}
}else if($action === 'reject'){
$validatedData = $request->validate([
'rejection_reason' => ['required'],
], [
'rejection_reason.required' => 'Deskripsi wajib diisi.',
]);
$rejectedJournalist = $journalist->update([
'approved_status' => '2',
'rejection_reason' => $validatedData['rejection_reason']
]);
return redirect()->route('dashboard.journalists.submissions')->with('success-status', 'Berhasil menolak jurnalis.');
}
}
public function create(){
return view('dashboard.journalists.create',[
'title' => 'Tambah Data Jurnalis'
]);
}
public function store(JournalistRequest $request){
$validatedData = $request->validated();
$fileFieldMap = [
'journalist_ukw_sertificate_doc' => 'ukw_sertificate_doc',
'journalist_press_card_doc' => 'press_card_doc',
];
$journalistFileNames = [];
foreach ($fileFieldMap as $requestKey => $dbField) {
if ($request->hasFile($requestKey) && filled($validatedData[$requestKey])) {
$journalistFileNames[$requestKey] = store_file($validatedData[$requestKey], '/uploads/journalists', 'public')['randomFileName'];
}else{
$journalistFileNames[$requestKey] = null;
}
}
$createdJournalist = Journalist::create([
'name' => $validatedData['journalist_name'],
'email' => $validatedData['journalist_email'],
'phone_number' => $validatedData['journalist_phone_number'],
'press_card' => $validatedData['journalist_press_card'],
'press_card_doc' => $journalistFileNames['journalist_press_card_doc'],
'ukw_sertificate' => $validatedData['journalist_ukw_sertificate'],
'ukw_sertificate_doc' => $journalistFileNames['journalist_ukw_sertificate_doc'],
'approved_status' => '0',
'approved_at' => null,
'edit_description' => null,
'edit_status' => '0',
'media_id' => Auth::user()->company->media->id
]);
if($createdJournalist){
return redirect()->route('dashboard.journalists.index')->with('success-status', 'Berhasil menambahkan jurnalis.')->with('created-journalist', true);
}else{
return redirect()->route('dashboard.journalists.index')->with('failed-status', 'Gagal menambahkan jurnalis.');
}
}
public function editRequest($id){
$journalist = Journalist::findOrFail(decrypt_id($id));
if(!in_array($journalist->edit_status, ['0', '3'])){
abort(404);
}
return view('dashboard.journalists.edit-request', [
'title' => 'Permohonan Ubah Data Jurnalis',
'journalist' => $journalist
]);
}
public function editRequestAction(Request $request, $id){
$journalist = Journalist::findOrFail(decrypt_id($id));
if(!in_array($journalist->edit_status, ['0', '3'])){
abort(404);
}
$validatedData = $request->validate([
'edit_description' => ['required'],
], [
'edit_description.required' => 'Deskripsi wajib diisi.',
]);
if(!Auth::check()){
abort(404);
}
$updatedJournalist = $journalist->update([
'edit_status' => '1',
'edit_description' => $validatedData['edit_description']
]);
if($updatedJournalist){
return redirect()->route('dashboard.journalists.index')->with('success-status', 'Berhasil melakukan permohonan edit data jurnalis.');
}else{
return redirect()->route('dashboard.journalists.index')->with('failed-status', 'Gagal melakukan permohonan edit data jurnalis.');
}
}
public function processEdit($id){
$journalist = Journalist::findOrFail(decrypt_id($id));
if(!in_array($journalist->edit_status, ['1', '2']) || !is_role(['1'])){
abort(404);
}
return view('dashboard.journalists.show', [
'title' => 'Permohonan Ubah Data Jurnalis',
'journalist' => $journalist,
'purpose' => 'processEdit'
]);
}
public function processEditAction(Request $request, $id, $action){
$journalist = Journalist::findOrFail(decrypt_id($id));
if(!in_array($journalist->edit_status, ['1']) || !is_role(['1'])){
abort(404);
}
if(is_role(['1'])){
if($action === 'accept'){
$acceptedJournalist = $journalist->update([
'edit_status' => '2',
]);
if($acceptedJournalist){
return response()->json(['message' => 'Berhasil menyetujui permohonan edit jurnalis.']);
}
}else if($action === 'reject'){
$validatedData = $request->validate([
'edit_rejection_reason' => ['required'],
], [
'edit_rejection_reason.required' => 'Alasan penolakan wajib diisi.',
]);
$journalist->update([
'edit_status' => '3',
'edit_rejection_reason' => $validatedData['edit_rejection_reason']
]);
return redirect()->route('dashboard.journalists.index')->with('success-status', 'Berhasil menolak permohonan edit jurnalis.');
}
}
}
public function edit(){}
public function update(){}
public function show($id){
$journalist = Journalist::findOrFail(decrypt_id($id));
return view('dashboard.journalists.show', [
'title' => 'Detail Jurnalis',
'journalist' => $journalist
]);
}
public function destroy($id){
try {
$journalist = Journalist::findOrFail(decrypt_id($id));
$user = User::with(['company.media.journalists'])->findOrFail(Auth::id());
$journalists = optional($user->company?->media)->journalists?->whereNull('deleted_at')->where('approved_status', '1');
if ($journalists->count() <= 1) {
return response()->json([
'status' => 'failed',
'message' => 'Media harus punya minimal satu jurnalis.'
]);
}
$journalist->delete();
return response()->json(['message' => 'Berhasil menghapus jurnalis.']);
} catch (\Exception $e) {
return response()->json(['message' => 'Gagal menghapus jurnalis.'], 500);
}
}
}