<?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');
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								}
							 |