preferencesModel = new PreferencesModel(); } /** * Display preferences page * GET /preferences/{userId} */ public function index($userId = null) { $sessionUserId = (int) (session()->get('user_id') ?? 0); if ($sessionUserId <= 0) { return redirect()->to('/login')->with('error', 'Please log in to view preferences'); } $userId = (int) ($userId ?? $sessionUserId); if (! $this->canAccessUserPreferences($userId, $sessionUserId)) { return redirect()->to('/access_denied'); } // Fetch preferences for the current user $preferences = $this->preferencesModel->where('user_id', $userId)->first(); // If preferences do not exist, set default preferences if (!$preferences) { $preferences = [ 'receive_email_notifications' => 1, 'receive_sms_notifications' => 1, 'theme' => 'light', 'language' => 'en', ]; } // Append style/menu selections from session or defaults $styleConfig = config('Style'); $preferences['style_color'] = $preferences['style_color'] ?? (session()->get('style_color') ?? ($styleConfig->defaultStyle ?? 'blue')); $preferences['menu_color'] = $preferences['menu_color'] ?? (session()->get('menu_color') ?? ($styleConfig->defaultMenu ?? 'white')); // Options for selectors $styleOptions = array_keys($styleConfig->stylePalettes ?? []); $menuOptions = array_keys($styleConfig->menuPalettes ?? []); // Load the view with the user's preferences return view('/preferences', [ 'preferences' => $preferences, 'styleOptions' => $styleOptions, 'menuOptions' => $menuOptions, 'userId' => $userId, ]); } /** * Update preferences * POST /preferences/update/{userId} */ public function updatePreferences($userId = null) { $sessionUserId = (int) (session()->get('user_id') ?? 0); if ($sessionUserId <= 0) { return redirect()->to('/login')->with('error', 'Please log in to update preferences'); } $userId = (int) ($userId ?? $sessionUserId); if (! $this->canAccessUserPreferences($userId, $sessionUserId)) { return redirect()->to('/access_denied'); } // Validation rules $validation = \Config\Services::validation(); $styleConfig = config('Style'); $styleOptions = implode(',', array_keys($styleConfig->stylePalettes ?? [])); $menuOptions = implode(',', array_keys($styleConfig->menuPalettes ?? [])); $validation->setRules([ 'receive_email_notifications' => 'permit_empty|in_list[0,1]', 'receive_sms_notifications' => 'permit_empty|in_list[0,1]', 'theme' => 'permit_empty|in_list[light,dark]', 'language' => 'permit_empty|in_list[en,fr,es]', 'style_color' => $styleOptions ? 'permit_empty|in_list[' . $styleOptions . ']' : 'permit_empty', 'menu_color' => $menuOptions ? 'permit_empty|in_list[' . $menuOptions . ']' : 'permit_empty', ]); if (!$validation->run($this->request->getPost())) { $preferences = $this->preferencesModel->where('user_id', $userId)->first(); if (!$preferences) { $preferences = [ 'receive_email_notifications' => 1, 'receive_sms_notifications' => 1, 'theme' => 'light', 'language' => 'en', ]; } $preferences['style_color'] = $this->request->getPost('style_color') ?? ($preferences['style_color'] ?? (session()->get('style_color') ?? ($styleConfig->defaultStyle ?? 'blue'))); $preferences['menu_color'] = $this->request->getPost('menu_color') ?? ($preferences['menu_color'] ?? (session()->get('menu_color') ?? ($styleConfig->defaultMenu ?? 'white'))); return view('/preferences', [ 'preferences' => $preferences, 'styleOptions' => array_keys($styleConfig->stylePalettes ?? []), 'menuOptions' => array_keys($styleConfig->menuPalettes ?? []), 'validation' => $validation, 'userId' => $userId, ]); } // Prepare updated data (map form fields to database fields) $updateData = [ 'receive_email_notifications' => $this->request->getPost('receive_email_notifications') ?? $this->request->getPost('notification_email') ?? 1, 'receive_sms_notifications' => $this->request->getPost('receive_sms_notifications') ?? $this->request->getPost('notification_sms') ?? 1, 'theme' => $this->request->getPost('theme') ?? 'light', 'language' => $this->request->getPost('language') ?? 'en', ]; // Store style/menu selections in session (no DB column dependency) $styleColor = $this->request->getPost('style_color'); $menuColor = $this->request->getPost('menu_color'); if ($styleColor && isset(($styleConfig->stylePalettes ?? [])[$styleColor])) { session()->set('style_color', $styleColor); $updateData['style_color'] = $styleColor; } if ($menuColor && isset(($styleConfig->menuPalettes ?? [])[$menuColor])) { session()->set('menu_color', $menuColor); $updateData['menu_color'] = $menuColor; } // Check if preferences already exist, update if they do, otherwise insert new preferences $existing = $this->preferencesModel->where('user_id', $userId)->first(); if ($existing) { $this->preferencesModel->update($existing['id'], $updateData); } else { $updateData['user_id'] = $userId; $this->preferencesModel->insert($updateData); } // Redirect back to preferences page with success message return redirect()->to('/preferences/' . $userId)->with('success', 'Preferences updated successfully'); } private function canAccessUserPreferences(int $requestedUserId, int $sessionUserId): bool { if ($requestedUserId <= 0 || $sessionUserId <= 0) { return false; } if ($requestedUserId === $sessionUserId) { return true; } $roles = array_map( static fn ($role): string => strtolower(trim((string) $role)), array_filter(array_merge((array) session()->get('roles'), [session()->get('role')])) ); return (bool) array_intersect($roles, ['administrator', 'administrative staff', 'principal', 'admin']); } }