request = $request; $this->user = $user; $this->controller = $controller; } /** * Check if user has required permission * @return bool */ public function checkPermission() { // If no permission required, allow access if (!$this->requiredPermission) { return true; } // If no user, deny access if (!$this->user || !$this->user->id) { return false; } // Check permission return $this->user->can($this->requiredPermission); } /** * Render the app view * Override in subclass if custom rendering needed */ public function renderView() { $layout = $this->controller->layout(); // Set template if ($this->viewTemplate) { $layout->setTemplate($this->viewTemplate); } else { $layout->setTemplate("MobileApp/{$this->appName}"); } // Set default JS globals $layout->set("JSGlobals", $this->getJSGlobals()); } /** * Get JS globals to pass to frontend * Override in subclass to add app-specific globals */ protected function getJSGlobals() { $globals = [ 'BASE_PATH' => '/MobileApp/' . $this->appName, 'APP_NAME' => $this->appName, ]; if ($this->user && $this->user->id) { $globals['USER_ID'] = $this->user->id; $globals['USER_NAME'] = $this->user->name; } return $globals; } /** * Return JSON response (shorthand) */ protected static function returnJson($data, $statusCode = 200) { mfBaseController::returnJson($data, $statusCode); } /** * Get POST data from JSON body */ protected function getPostData() { return json_decode(file_get_contents('php://input'), true) ?? []; } /** * Get database instance */ protected function db() { return FronkDB::singleton(); } }