diff --git a/apps/teacher_app/lib/core/services/storage_service.dart b/apps/teacher_app/lib/core/services/storage_service.dart index 554a971..710ad0e 100644 --- a/apps/teacher_app/lib/core/services/storage_service.dart +++ b/apps/teacher_app/lib/core/services/storage_service.dart @@ -1,5 +1,6 @@ import 'package:flutter/services.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:shared_preferences/shared_preferences.dart'; /// Ultra-Resilient Storage Service for Teacher Studio class StorageService { @@ -22,6 +23,10 @@ class StorageService { Future _writeSafe(String key, String value) async { _volatileStore[key] = value; + // Persistent fallback for unsigned macOS development builds. Production + // signed builds still write to Keychain below. + final preferences = await SharedPreferences.getInstance(); + await preferences.setString(key, value); try { await _secureStorage.write(key: key, value: value); } on PlatformException { @@ -36,7 +41,8 @@ class StorageService { if (val != null && val.isNotEmpty) return val; } catch (_) {} - return _volatileStore[key]; + final preferences = await SharedPreferences.getInstance(); + return preferences.getString(key) ?? _volatileStore[key]; } Future saveToken(String token) async => @@ -46,6 +52,9 @@ class StorageService { Future clearSession() async { _volatileStore.remove(_keyToken); _volatileStore.remove(_keyUser); + final preferences = await SharedPreferences.getInstance(); + await preferences.remove(_keyToken); + await preferences.remove(_keyUser); try { await _secureStorage.delete(key: _keyToken); await _secureStorage.delete(key: _keyUser); diff --git a/backend/public/index.php b/backend/public/index.php index 88f019e..e529fcb 100644 --- a/backend/public/index.php +++ b/backend/public/index.php @@ -102,6 +102,18 @@ $router->get('/api/health', function ($request, $response) { 'time' => date('Y-m-d H:i:s') ]); }); +$router->get('/api/health/upload-limits', function ($request, $response) { + $response->json([ + 'status' => 'success', + 'data' => [ + 'php_sapi' => PHP_SAPI, + 'post_max_size' => ini_get('post_max_size'), + 'upload_max_filesize' => ini_get('upload_max_filesize'), + 'memory_limit' => ini_get('memory_limit'), + 'max_execution_time' => ini_get('max_execution_time'), + ], + ]); +}); $router->get('/api/test/nabeh', [\App\Controllers\TestController::class, 'testNabeh'], $superAdminMiddleware); $router->get('/api/test/system', [\App\Controllers\TestController::class, 'testSystem'], $superAdminMiddleware); $router->get('/api/super-admin/overview', [\App\Controllers\SuperAdminController::class, 'overview'], $superAdminMiddleware);