File: //proc/self/root/home/xedaptot/be.naniguide.com/app/Http/Controllers/Admin/TutorialController.php
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Model\Tutorial;
use App\Model\TutorialTranslation;
use Illuminate\Http\Request;
class TutorialController extends Controller
{
public function index(Request $request)
{
return view('admin.tutorials.index');
}
public function listing(Request $request)
{
$items = Tutorial::search($request->keyword)
->sorted()
->paginate($request->per_page ?? 20);
return view('admin.tutorials._list', ['items' => $items]);
}
public function create()
{
return view('admin.tutorials.create', [
'tutorial' => new Tutorial(),
]);
}
public function store(Request $request)
{
$request->validate([
'slug' => 'required|string|unique:tutorials,slug',
'category' => 'nullable|string',
'status' => 'required|in:active,inactive',
'translations' => 'required|array',
'translations.*.locale' => 'required|string',
'translations.*.title' => 'required|string',
'translations.*.body' => 'nullable|string',
]);
$tutorial = Tutorial::create([
'slug' => $request->slug,
'category' => $request->category,
'sort_order' => Tutorial::max('sort_order') + 1,
'status' => $request->status,
]);
foreach ($request->translations as $t) {
if (!empty($t['title'])) {
$tutorial->translations()->create([
'locale' => $t['locale'],
'title' => $t['title'],
'body' => $t['body'] ?? '',
]);
}
}
return redirect()->action([self::class, 'index'])
->with('alert-success', 'Tutorial created.');
}
public function edit(string $uid)
{
$tutorial = Tutorial::findByUid($uid);
abort_if(!$tutorial, 404);
$locales = $tutorial->translations->pluck('locale')->toArray();
if (!in_array('en', $locales)) {
$locales[] = 'en';
}
return view('admin.tutorials.edit', [
'tutorial' => $tutorial,
'locales' => $locales,
]);
}
public function update(Request $request, string $uid)
{
$tutorial = Tutorial::findByUid($uid);
abort_if(!$tutorial, 404);
$request->validate([
'slug' => 'required|string|unique:tutorials,slug,' . $tutorial->id,
'category' => 'nullable|string',
'status' => 'required|in:active,inactive',
'translations' => 'array',
'translations.*.locale' => 'required|string',
'translations.*.title' => 'required|string',
'translations.*.body' => 'nullable|string',
]);
$tutorial->update([
'slug' => $request->slug,
'category' => $request->category,
'status' => $request->status,
]);
foreach ($request->translations ?? [] as $t) {
if (empty($t['title'])) continue;
TutorialTranslation::updateOrCreate(
['tutorial_id' => $tutorial->id, 'locale' => $t['locale']],
['title' => $t['title'], 'body' => $t['body'] ?? '']
);
}
return redirect()->action([self::class, 'index'])
->with('alert-success', 'Tutorial updated.');
}
public function delete(Request $request)
{
$uids = explode(',', $request->uids);
Tutorial::whereIn('uid', $uids)->each(fn ($t) => $t->delete());
return redirect()->action([self::class, 'index'])
->with('alert-success', 'Tutorial(s) deleted.');
}
public function sort(Request $request)
{
foreach ($request->items ?? [] as $i => $uid) {
Tutorial::where('uid', $uid)->update(['sort_order' => $i]);
}
return response()->json(['status' => 'ok']);
}
}