feat: menu & API Informasi Sekolah untuk aplikasi wali

- Tabel school_informations (judul, isi, kategori, tanggal kegiatan, publish)
- Menu admin 'Informasi Sekolah' (CRUD + permission manage-school-info)
- API wali: GET /parent/school-informations (hanya yang dipublikasikan)
- 2 data contoh: Jadwal UTS & Class Meet
- Test suite tetap hijau (39 test)
This commit is contained in:
Novy San87
2026-08-05 21:11:06 +07:00
parent 1cb1cb0569
commit 31643ff7dc
8 changed files with 376 additions and 0 deletions
@@ -0,0 +1,61 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\SchoolInformation;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class SchoolInformationController extends Controller
{
public function index(): View
{
$items = SchoolInformation::query()
->with('creator:id,name')
->orderByDesc('event_date')
->orderByDesc('created_at')
->get();
return view('settings.school-info', compact('items'));
}
public function store(Request $request): RedirectResponse
{
$validated = $this->validateData($request);
SchoolInformation::create($validated + ['created_by' => $request->user()->id]);
return back()->with('success', 'Informasi "' . $validated['title'] . '" berhasil dipublikasikan.');
}
public function update(Request $request, int $id): RedirectResponse
{
$info = SchoolInformation::findOrFail($id);
$validated = $this->validateData($request);
$info->update($validated);
return back()->with('success', 'Informasi berhasil diperbarui.');
}
public function destroy(Request $request, int $id): RedirectResponse
{
$info = SchoolInformation::findOrFail($id);
$info->delete();
return back()->with('success', 'Informasi dihapus.');
}
protected function validateData(Request $request): array
{
return $request->validate([
'title' => ['required', 'string', 'max:200'],
'content' => ['nullable', 'string'],
'category' => ['required', 'string', 'max:50'],
'event_date' => ['nullable', 'date'],
'is_published' => ['nullable', 'boolean'],
]) + ['is_published' => $request->boolean('is_published')];
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\SchoolInformation;
use Illuminate\Http\JsonResponse;
class ParentSchoolInformationController extends Controller
{
/**
* Daftar informasi sekolah yang dipublikasikan (untuk app wali murid).
*/
public function index(): JsonResponse
{
$items = SchoolInformation::query()
->where('is_published', true)
->orderByDesc('event_date')
->orderByDesc('created_at')
->limit(50)
->get()
->map(fn (SchoolInformation $i) => [
'id' => $i->id,
'title' => $i->title,
'content' => $i->content,
'category' => $i->category,
'event_date' => $i->event_date?->toDateString(),
'created_at' => $i->created_at?->toISOString(),
]);
return response()->json(['informations' => $items]);
}
}