feat: API penerima push presensi dari e-jurnal

- AttendanceSyncController: POST /api/v1/attendance/sync
  Token auth, upsert per (student_id, date, lesson_hour)
- Ping endpoint: GET /api/v1/attendance/ping?token=
- CSRF exclusion for api/* routes
- Settings: generate/regenerate E-Jurnal token + copy
- Menu Sinkron: form input token E-Jurnal
This commit is contained in:
Bro
2026-07-24 12:54:09 +07:00
parent fb5e349ae6
commit a1dfd75d7d
5 changed files with 258 additions and 2 deletions
+23 -1
View File
@@ -18,6 +18,25 @@ class SyncController extends Controller
$this->syncService = $syncService;
}
public function saveEjurnalToken(Request $request): RedirectResponse
{
$validated = $request->validate([
'ejurnal_token' => ['required', 'string', 'min:16'],
]);
Setting::setValue('ejurnal_sync_token', $validated['ejurnal_token'], 'integration', 'Token untuk push presensi dari E-Jurnal Guru');
return back()->with('success', 'Token E-Jurnal berhasil ' . ($request->input('_regenerate') ? 'diperbarui' : 'disimpan') . '.');
}
public function generateEjurnalToken(): RedirectResponse
{
$token = \Illuminate\Support\Str::random(48);
Setting::setValue('ejurnal_sync_token', $token, 'integration', 'Token untuk push presensi dari E-Jurnal Guru');
return back()->with('success', 'Token baru berhasil digenerate. Salin dan paste di E-Jurnal Guru.');
}
public function index(): View
{
$baseUrl = Setting::getValue('kesiswaan_base_url', '');
@@ -25,7 +44,10 @@ class SyncController extends Controller
$hasToken = !empty($savedToken);
$studentCount = \App\Models\Student::count();
return view('settings.sync', compact('baseUrl', 'savedToken', 'hasToken', 'studentCount'));
$ejurnalToken = Setting::getValue('ejurnal_sync_token', '');
$hasEjurnalToken = !empty($ejurnalToken);
return view('settings.sync', compact('baseUrl', 'savedToken', 'hasToken', 'studentCount', 'ejurnalToken', 'hasEjurnalToken'));
}
public function syncNow(Request $request): RedirectResponse