geoproject-app/public/site/plugins/map-editor/routes/image/capture.php
isUnknown 208d46ff28
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 19s
refactor: one PHP file per route with subdirectories
Properly organize routes following design-to-pack pattern:
- routes/markers/get.php
- routes/markers/create.php
- routes/markers/update.php
- routes/markers/delete.php
- routes/position/update.php
- routes/image/capture.php
- routes/image/check-flag.php
- routes/image/clear-flag.php

Each route in its own file for better maintainability.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 11:58:54 +01:00

109 lines
3.1 KiB
PHP

<?php
/**
* POST capture and save map image
*/
return [
'pattern' => '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
];
}
}
];