mapguesser/src/Controller/MapsController.php

85 lines
2.5 KiB
PHP
Raw Normal View History

<?php namespace MapGuesser\Controller;
2023-04-07 20:28:14 +02:00
use SokoWeb\Database\Query\Select;
use SokoWeb\Database\RawExpression;
use SokoWeb\Interfaces\Authentication\IUser;
use SokoWeb\Interfaces\Database\IResultSet;
use SokoWeb\Interfaces\Response\IContent;
use SokoWeb\Response\HtmlContent;
class MapsController
{
public function getMaps(): IContent
{
//TODO: from repository - count should be added
$select = new Select(\Container::$dbConnection, 'maps');
$select->columns([
['maps', 'id'],
['maps', 'name'],
['maps', 'description'],
['maps', 'bound_south_lat'],
['maps', 'bound_west_lng'],
['maps', 'bound_north_lat'],
['maps', 'bound_east_lng'],
['maps', 'area'],
2022-05-26 14:21:05 +02:00
['maps', 'unlisted'],
new RawExpression('COUNT(places.id) AS num_places')
]);
$select->leftJoin('places', ['places', 'map_id'], '=', ['maps', 'id']);
2020-06-10 23:11:55 +02:00
$select->groupBy(['maps', 'id']);
$select->orderBy('name');
2023-04-20 00:19:54 +02:00
$user = \Container::$request->user();
2022-05-26 14:21:05 +02:00
$isAdmin = $user !== null && $user->hasPermission(IUser::PERMISSION_ADMIN);
if (!$isAdmin) {
$select->where(['maps', 'unlisted'], '=', false);
}
$result = $select->execute();
$maps = [];
while ($map = $result->fetch(IResultSet::FETCH_ASSOC)) {
$map['area'] = $this->formatMapAreaForHuman($map['area']);
$maps[] = $map;
}
return new HtmlContent('maps', [
'maps' => $maps,
'isLoggedIn' => $user !== null,
2022-05-26 14:21:05 +02:00
'isAdmin' => $isAdmin
]);
}
private function formatMapAreaForHuman(float $area): array
{
if ($area < 0.01) {
$digits = 0;
$rounded = round($area * 1000000.0, -2);
$unit = 'm';
} elseif ($area < 0.1) {
2020-06-10 23:51:09 +02:00
$digits = 0;
$rounded = round($area * 1000000.0, -3);
2020-06-10 23:51:09 +02:00
$unit = 'm';
} elseif ($area < 1.0) {
2020-06-10 23:51:09 +02:00
$digits = 2;
$rounded = round($area, 2);
2020-06-10 23:51:09 +02:00
$unit = 'km';
} elseif ($area < 100.0) {
$digits = 0;
$rounded = round($area, 0);
$unit = 'km';
} elseif ($area < 10000.0) {
$digits = 0;
$rounded = round($area, -2);
$unit = 'km';
} else {
$digits = 0;
$rounded = round($area, -4);
$unit = 'km';
}
return [number_format($rounded, $digits, '.', ' '), $unit];
}
}