phpvms/app/Contracts/ImportExport.php

252 lines
5.6 KiB
PHP
Raw Normal View History

<?php
namespace App\Contracts;
use App\Models\Airline;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
2018-03-23 06:17:37 +08:00
use Illuminate\Validation\ValidationException;
/**
* Common functionality used across all of the importers
*/
class ImportExport
{
public $assetType;
2018-03-23 06:17:37 +08:00
public $status = [
'success' => [],
2018-08-27 00:40:04 +08:00
'errors' => [],
2018-03-23 06:17:37 +08:00
];
/**
* Hold the columns for the particular table
*/
public static $columns = [];
2018-04-23 21:46:28 +08:00
/**
* @param mixed $row
2018-08-27 00:40:04 +08:00
*
2018-04-23 21:46:28 +08:00
* @return array
*/
public function export($row): array
{
throw new \RuntimeException('export not implemented');
}
/**
* @param array $row
* @param mixed $index
2018-08-27 00:40:04 +08:00
*
2018-04-23 21:46:28 +08:00
* @throws \RuntimeException
2018-08-27 00:40:04 +08:00
*
* @return bool
2018-04-23 21:46:28 +08:00
*/
public function import(array $row, $index): bool
{
throw new \RuntimeException('import not implemented');
}
/**
* Get the airline from the ICAO. Create it if it doesn't exist
2018-08-27 00:40:04 +08:00
*
* @param $code
2018-08-27 00:40:04 +08:00
*
* @return Airline
*/
public function getAirline($code): Airline
{
$airline = Airline::firstOrCreate([
'icao' => $code,
], ['name' => $code]);
return $airline;
}
/**
* @return array
*/
public function getColumns()
{
return static::$columns;
}
2018-03-23 06:17:37 +08:00
/**
* Do a basic check that the number of columns match
2018-08-27 00:40:04 +08:00
*
2018-03-23 06:17:37 +08:00
* @param $row
2018-08-27 00:40:04 +08:00
*
2018-03-23 06:17:37 +08:00
* @return bool
*/
public function checkColumns($row): bool
{
return \count($row) === \count($this->getColumns());
}
/**
* Bubble up an error to the interface that we need to stop
2018-08-27 00:40:04 +08:00
*
2018-03-23 06:17:37 +08:00
* @param $error
* @param $e
2018-08-27 00:40:04 +08:00
*
2018-03-23 06:17:37 +08:00
* @throws ValidationException
*/
protected function throwError($error, \Exception $e = null): void
{
Log::error($error);
if ($e) {
Log::error($e->getMessage());
}
$validator = Validator::make([], []);
$validator->errors()->add('csv_file', $error);
2018-08-27 00:40:04 +08:00
2018-03-23 06:17:37 +08:00
throw new ValidationException($validator);
}
/**
* Add to the log messages for this importer
2018-08-27 00:40:04 +08:00
*
2018-03-23 06:17:37 +08:00
* @param $msg
*/
public function log($msg): void
{
$this->status['success'][] = $msg;
Log::info($msg);
}
/**
* Add to the error log for this import
2018-08-27 00:40:04 +08:00
*
2018-03-23 06:17:37 +08:00
* @param $msg
*/
public function errorLog($msg): void
{
$this->status['errors'][] = $msg;
Log::error($msg);
}
/**
* Set a key-value pair to an array
2018-08-27 00:40:04 +08:00
*
* @param $kvp_str
* @param array $arr
*/
protected function kvpToArray($kvp_str, array &$arr)
{
$item = explode('=', $kvp_str);
2018-08-27 00:40:04 +08:00
if (\count($item) === 1) { // just a list?
$arr[] = trim($item[0]);
2018-08-27 00:40:04 +08:00
} else { // actually a key-value pair
$k = trim($item[0]);
$v = trim($item[1]);
$arr[$k] = $v;
}
}
/**
* Parse a multi column values field. E.g:
* Y?price=200&cost=100; F?price=1200
* or
* gate=B32;cost index=100
*
* Converted into a multi-dimensional array
*
* @param $field
2018-08-27 00:40:04 +08:00
*
* @return array|string
*/
public function parseMultiColumnValues($field)
{
$ret = [];
$split_values = explode(';', $field);
2018-08-27 00:40:04 +08:00
// No multiple values in here, just a straight value
if (\count($split_values) === 1) {
2018-08-27 00:40:04 +08:00
if (trim($split_values[0]) === '') {
return [];
}
return [$split_values[0]];
}
foreach ($split_values as $value) {
$value = trim($value);
if ($value === '') {
continue;
}
2018-08-27 00:40:04 +08:00
// This isn't in the query string format, so it's
// just a straight key-value pair set
if (strpos($value, '?') === false) {
$this->kvpToArray($value, $ret);
continue;
}
2018-08-27 00:40:04 +08:00
// This contains the query string, which turns it
// into the multi-level array
$query_str = explode('?', $value);
$parent = trim($query_str[0]);
$children = [];
$kvp = explode('&', trim($query_str[1]));
foreach ($kvp as $items) {
2018-08-27 00:40:04 +08:00
if (!$items) {
continue;
}
$this->kvpToArray($items, $children);
}
$ret[$parent] = $children;
}
return $ret;
}
2018-03-22 06:07:30 +08:00
/**
* @param $obj
2018-08-27 00:40:04 +08:00
*
2018-03-22 06:07:30 +08:00
* @return mixed
*/
public function objectToMultiString($obj)
{
2018-08-27 00:40:04 +08:00
if (!\is_array($obj)) {
2018-03-22 06:07:30 +08:00
return $obj;
}
$ret_list = [];
foreach ($obj as $key => $val) {
2018-08-27 00:40:04 +08:00
if (is_numeric($key) && !\is_array($val)) {
2018-03-22 06:07:30 +08:00
$ret_list[] = $val;
continue;
}
$key = trim($key);
2018-08-27 00:40:04 +08:00
if (!\is_array($val)) {
2018-03-22 06:07:30 +08:00
$val = trim($val);
$ret_list[] = "{$key}={$val}";
} else {
$q = [];
2018-08-27 00:40:04 +08:00
foreach ($val as $subkey => $subval) {
if (is_numeric($subkey)) {
2018-03-22 06:07:30 +08:00
$q[] = $subval;
} else {
$q[] = "{$subkey}={$subval}";
}
}
$q = implode('&', $q);
2018-08-27 00:40:04 +08:00
if (!empty($q)) {
2018-03-22 06:07:30 +08:00
$ret_list[] = "{$key}?{$q}";
} else {
$ret_list[] = $key;
}
}
}
return implode(';', $ret_list);
}
}