<?php
							 | 
						|
								
							 | 
						|
								namespace App\Http\Controllers;
							 | 
						|
								
							 | 
						|
								use Laravel\Lumen\Routing\Controller as BaseController;
							 | 
						|
								use Illuminate\Http\Request;
							 | 
						|
								use DB;
							 | 
						|
								use Quartz;
							 | 
						|
								use Log;
							 | 
						|
								use DateTime, DateTimeZone;
							 | 
						|
								
							 | 
						|
								class Api extends BaseController
							 | 
						|
								{
							 | 
						|
								
							 | 
						|
								  public function query(Request $request) {
							 | 
						|
								    $token = $request->input('token');
							 | 
						|
								    if(!$token)
							 | 
						|
								      return response(json_encode(['error' => 'no token provided']))->header('Content-Type', 'application/json');
							 | 
						|
								
							 | 
						|
								    $db = DB::table('databases')->where('read_token','=',$token)->first();
							 | 
						|
								    if(!$db)
							 | 
						|
								      return response(json_encode(['error' => 'invalid token']))->header('Content-Type', 'application/json');
							 | 
						|
								
							 | 
						|
								    $qz = new Quartz\DB(env('STORAGE_DIR').$db->name, 'r');
							 | 
						|
								
							 | 
						|
								    if($date=$request->input('date')) {
							 | 
						|
								      if($request->input('tz')) {
							 | 
						|
								        $tz = $request->input('tz');
							 | 
						|
								      } else {
							 | 
						|
								        $tz = 'America/Los_Angeles';
							 | 
						|
								      }
							 | 
						|
								      $start = DateTime::createFromFormat('Y-m-d H:i:s', $date.' 00:00:00', new DateTimeZone($tz));
							 | 
						|
								      $end = DateTime::createFromFormat('Y-m-d H:i:s', $date.' 23:59:59', new DateTimeZone($tz));
							 | 
						|
								    } else {
							 | 
						|
								      return response(json_encode(['error' => 'no date provided']))->header('Content-Type', 'application/json');
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    $results = $qz->queryRange($start, $end);
							 | 
						|
								
							 | 
						|
								    $locations = [];
							 | 
						|
								
							 | 
						|
								    foreach($results as $id=>$record) {
							 | 
						|
								      $record->date->format('U.u');
							 | 
						|
								      $locations[] = $record->data;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    if($request->input('format') == 'linestring') {
							 | 
						|
								
							 | 
						|
								      $response = array(
							 | 
						|
								        'type' => 'LineString',
							 | 
						|
								        'coordinates' => array()
							 | 
						|
								      );
							 | 
						|
								      foreach($locations as $loc) {
							 | 
						|
								        $response['coordinates'][] = $loc->geometry->coordinates;
							 | 
						|
								      }
							 | 
						|
								
							 | 
						|
								    } else {
							 | 
						|
								      $response = [
							 | 
						|
								        'locations' => $locations
							 | 
						|
								      ];
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    return response(json_encode($response))->header('Content-Type', 'application/json');    
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  public function input(Request $request) {
							 | 
						|
								    $token = $request->input('token');
							 | 
						|
								    if(!$token)
							 | 
						|
								      return response(json_encode(['error' => 'no token provided']))->header('Content-Type', 'application/json');
							 | 
						|
								
							 | 
						|
								    $db = DB::table('databases')->where('write_token','=',$token)->first();
							 | 
						|
								    if(!$db)
							 | 
						|
								      return response(json_encode(['error' => 'invalid token']))->header('Content-Type', 'application/json');
							 | 
						|
								
							 | 
						|
								    if(!is_array($request->input('locations')))
							 | 
						|
								      return response(json_encode(['error' => 'invalid input', 'error_description' => 'parameter "locations" must be an array of GeoJSON data with a "timestamp" property']))->header('Content-Type', 'application/json');
							 | 
						|
								
							 | 
						|
								    $qz = new Quartz\DB(env('STORAGE_DIR').$db->name, 'w');
							 | 
						|
								
							 | 
						|
								    foreach($request->input('locations') as $loc) {
							 | 
						|
								      if(array_key_exists('properties', $loc) && array_key_exists('timestamp', $loc['properties'])) {
							 | 
						|
								        $date = DateTime::createFromFormat('U', $loc['properties']['timestamp']);
							 | 
						|
								        $line = $qz->add($date, $loc);
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    return response(json_encode(['result' => 'ok']))->header('Content-Type', 'application/json');
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								}
							 |