500, 'message' => 'bad method invokation.' ]; } if (!requestIsValid($request, $fields)) { return [ 'status' => 403, 'message' => 'access to the requested resource is forbidden', ]; } $columns = getColumns($request); $recordsTotal = $data->count(); $recordsFiltered = $recordsTotal; $limit = $request->input('length'); $start = $request->input('start'); // $order = $columns[$request->input('order.0.column')]['name']['name']; // $dir = $request->input('order.0.dir'); // create searchable fields array $search_fields = []; $is_searchable = false; foreach ($columns as $key => $value) { $name_array = $columns[$key]['name']; $rel = null; if ($request->input('columns.'.$key.'.searchable') == 'true') { $arr = array( 'value' => $request->input('columns.'.$key.'.search.value'), 'type' => $columns[$key]['name']['type'], ); $field = $columns[$key]['name']['name']; $search_fields[$field] = $arr; $is_searchable = true; } } foreach ($search_fields as $field => $attributes) { if (isset($attributes['value'])) { $value = $attributes['value']; if ($attributes['type'] == 'text') { $data = $data->where($field, 'LIKE', "%{$value}%"); } elseif ($attributes['type'] == 'between') { $date_values = explode('&', $value); $date_values[0] .= " 00:00:00"; $date_values[1] .= " 23:59:59"; $data = $data->whereBetween($field, $date_values); } elseif ($attributes['type'] == 'between_time') { $times = explode('_', $value); $data = $data->where(function ($query) use ($times, $field) { foreach ($times as $idx => $time_values) { $time_values = explode('&', $time_values); if ($idx == 0) { $query = $query->whereBetween($field, $time_values); } else { $query = $query->orWhereBetween($field, $time_values); } } }); } elseif ($attributes['type'] == 'select') { $data = $data->where($field, "{$value}"); } // following types have been added for making finance table serverside. elseif ($attributes['type'] == 'is_null') { $data = $value ? $data->whereNull($field) : $data->whereNotNull($field); } elseif ($attributes['type'] == 'date_between') { $data = $data->whereBetween($field, explode('&', $value)); } elseif ($attributes['type'] == 'multi_select') { $data = $data->whereIn($field, explode(',', $value)); } // useful when we want to get rows of a table where have related data in another table with specific condition. elseif ($attributes['type'] == 'relation.multi_select') { if(!$relation){ return [ 'status' => 500, 'message' => 'bad method invokation.' ]; } $data = $data->whereHas($relation, function ($query) use ($field, $value) { $query->whereIn($field, explode(',', $value)); }); } } } foreach ($request->order as $key => $orderList) { $order = $columns[$orderList['column']]['name']['name']; $dir = $orderList['dir']; $data = $data->orderBy($order, $dir); } $recordsFiltered = $data->count(); $data = $data->offset($start) ->limit($limit) // ->orderBy($order, $dir) ->get(); return [ 'status' => 200, 'draw' => $request->draw, 'recordsTotal' => $recordsTotal, 'recordsFiltered' => $recordsFiltered, 'data' => $data ]; } } if (! function_exists('getColumns')) { function getColumns(Request $request) { // $columns = []; // foreach ($request->columns as $col) { // $columns[] = $col; // } return $request->columns; } } if (!function_exists('requestIsValid')) { function requestIsValid(Request $request, array $fields) { $columns = getColumns($request); // check column names foreach ($columns as $key => $value) { $colName = $columns[$key]['name']['name']; $colType = $columns[$key]['name']['type']; // do nothing if column is optional if (!in_array($colName, $fields) && $colType != 'option') { return false; } } // check order name $orderName = $columns[$request->input('order.0.column')]['name']['name']; if (!in_array($orderName, $fields)) { return false; } return true; } } if (!function_exists('makeSelectQuery')) { function makeSelectQuery(array $fields, array $aliases) { $select = ''; for ($i = 0; $i < count($fields); $i++) { if ($aliases[$i]) { $select .= $fields[$i]. ' as '. $aliases[$i]; } else { $select .= $fields[$i]; } if ($i != count($fields) - 1) { $select .= ', '; } } return $select; } } if (!function_exists('setAxisTypeFa')) { function setAxisTypeFa(int $axis_type) { if ($axis_type == '1') { $axis_type_fa = 'آزادراه'; } elseif ($axis_type == '2') { $axis_type_fa = 'بزرگراه'; } elseif ($axis_type == '3') { $axis_type_fa = 'اصلی'; } elseif ($axis_type == '4') { $axis_type_fa = 'فرعی'; } return $axis_type_fa; } } if (!function_exists('get_way_id_from_nominatim')) { function get_way_id_from_nominatim($lat, $lng) { $url = "https://testmap.141.ir/nominatim/reverse?format=jsonv2&lat=".$lat."&lon=".$lng."&zoom=16&addressdetails=16"; $arrContextOptions=array( "ssl"=>array( "verify_peer"=>false, "verify_peer_name"=>false, ), ); $result = file_get_contents($url, false, stream_context_create($arrContextOptions)); $result = json_decode($result); if (isset($result->osm_type)) { if ($result->osm_type == 'way') { return $result->osm_id; } } return 0; } } if (!function_exists('findCityFromGeoJson')) { function findCityFromGeoJson($lat, $lon) { $file_contents = file_get_contents(storage_path('cities-geojson.json')); $contents_array = json_decode($file_contents, true); $cities = $contents_array['features']; $city_idx = false; foreach ($cities as $idx => $city) { // dd($city['geometry']['coordinates'][0]); if (is_in_polygon($city['geometry']['coordinates'][0], $lat, $lon)) { $city_idx = $idx; break; } } // dd($cities[$city_idx]); return $city_idx ? $cities[$city_idx]['properties'] : false; } } if (!function_exists('is_in_polygon')) { function is_in_polygon($vertices, $latitude_y, $longitude_x) { $i = $j = $c = 0; $points_polygon = count($vertices); for ($i = 0, $j = $points_polygon - 1 ; $i < $points_polygon; $j = $i++) { if ((($vertices[$i][1] > $latitude_y != ($vertices[$j][1] > $latitude_y)) && ($longitude_x < ($vertices[$j][0] - $vertices[$i][0]) * ($latitude_y - $vertices[$i][1]) / ($vertices[$j][1] - $vertices[$i][1]) + $vertices[$i][0]))) { $c = !$c; } } return $c; } }