You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
2.7 KiB

<?php
namespace App\Http\Controllers;
use Laravel\Lumen\Routing\Controller as BaseController;
use Illuminate\Http\Request;
use DB;
use Quartz;
class Share extends BaseController
{
private function _databaseFromToken($token) {
$share = DB::table('shares')
->where('token', $token)
->where('expires_at', '>', date('Y-m-d H:i:s'))
->first();
if(!$share) return false;
$database = DB::table('databases')->where('id', $share->database_id)->first();
return $database;
}
public function view(Request $request, $token) {
$database = $this->_databaseFromToken($token);
if(!$database) {
return view('share-expired');
}
return view('share', [
'database' => $database,
'share_token' => $token,
]);
}
public function current_location(Request $request) {
$database = $this->_databaseFromToken($request->input('token'));
if(!$database) {
return response(json_encode(['error' => 'invalid']))->header('Content-Type', 'application/json');
}
$response = [
'data' => json_decode($database->last_location),
];
return response(json_encode($response))->header('Content-Type', 'application/json');
}
public function history(Request $request) {
$database = $this->_databaseFromToken($request->input('token'));
if(!$database) {
return response(json_encode(['error' => 'invalid']))->header('Content-Type', 'application/json');
}
$share = DB::table('shares')
->where('token', $request->input('token'))
->first();
$share_date = strtotime($share->created_at);
$locations = [];
$db = new Quartz\DB(env('STORAGE_DIR').$database->name, 'r');
$results = $db->queryLast(100);
foreach($results as $id=>$record) {
if(!is_object($record) || !$record->data)
continue;
if(!property_exists($record->data->properties, 'horizontal_accuracy')
|| $record->data->properties->horizontal_accuracy >= 5000)
continue;
// Make sure this is from after the share was created
$record_date = $record->date->format('U');
if($record_date < $share_date)
continue;
$locations[] = $record->data;
}
$linestring = array(
'type' => 'LineString',
'coordinates' => [],
);
foreach($locations as $loc) {
if(property_exists($loc, 'geometry'))
$linestring['coordinates'][] = $loc->geometry->coordinates;
else
$linestring['coordinates'][] = null;
}
$response = array(
'linestring' => $linestring,
);
return response(json_encode($response))->header('Content-Type', 'application/json');
}
}