'map-editor/pages/(:all)/capture-image', 'method' => 'POST', 'auth' => false, 'action' => function (string $pageId) { try { $user = kirby()->user(); if (!$user && !kirby()->option('debug', false)) { return [ 'status' => 'error', 'message' => 'Unauthorized', 'code' => 401 ]; } $mapPage = kirby()->page($pageId); if (!$mapPage) { return [ 'status' => 'error', 'message' => 'Map page not found', 'code' => 404 ]; } if (!$mapPage->permissions()->can('update')) { return [ 'status' => 'error', 'message' => 'Forbidden', 'code' => 403 ]; } $data = kirby()->request()->data(); if (!isset($data['image'])) { return [ 'status' => 'error', 'message' => 'Image data is required', 'code' => 400 ]; } $imageData = $data['image']; if (preg_match('/^data:image\/(png|jpeg|jpg);base64,(.+)$/', $imageData, $matches)) { $imageData = $matches[2]; $extension = $matches[1] === 'jpeg' ? 'jpg' : $matches[1]; } else { return [ 'status' => 'error', 'message' => 'Invalid image format', 'code' => 400 ]; } $decodedImage = base64_decode($imageData); if ($decodedImage === false) { return [ 'status' => 'error', 'message' => 'Failed to decode image', 'code' => 400 ]; } $filename = 'map-static.' . $extension; $tempPath = sys_get_temp_dir() . '/' . uniqid() . '.' . $extension; file_put_contents($tempPath, $decodedImage); $existingFile = $mapPage->files()->filterBy('name', 'map-static')->first(); if ($existingFile) { $existingFile->delete(); } try { $file = $mapPage->createFile([ 'source' => $tempPath, 'filename' => $filename ]); @unlink($tempPath); } catch (Exception $e) { @unlink($tempPath); throw $e; } return [ 'status' => 'success', 'data' => [ 'message' => 'Image saved successfully', 'filename' => $filename, 'path' => $file->root() ] ]; } catch (Exception $e) { return [ 'status' => 'error', 'message' => $e->getMessage(), 'code' => 500 ]; } } ];