2 Commits
v3.0 ... v3.1

Author SHA1 Message Date
Jani Gyllenberg
734a6a3cbd Ability to export existing models as sync files 2022-09-07 12:32:39 -04:00
Jani Gyllenberg
a241493142 Adds support for config defined Model namespace 2022-09-07 12:31:56 -04:00
5 changed files with 143 additions and 10 deletions

View File

@@ -1,7 +1,19 @@
<?php <?php
return [ return [
/**
* Namespace for Laravel Models
*/
'namespace' => '\\App\\Models\\',
/**
* Path to directory containing JSON files for synchronization
*/
'path' => base_path('sync'), 'path' => base_path('sync'),
/**
* Array of Model names which controls the synchronization order
*/
'order' => [ 'order' => [
// //
], ],

View File

@@ -0,0 +1,24 @@
<?php
namespace nullthoughts\LaravelDataSync\Console\Commands;
use nullthoughts\LaravelDataSync\Exporter;
use Illuminate\Console\Command;
class Export extends Command
{
protected $signature = 'data:export {model} {--criteria=*} {--except=*} {--only=*}';
protected $description = 'Export Model data for synchronization';
public function handle()
{
$model = $this->argument('model');
$this->info('Exporting ' . $model . ' model to sync data file');
(new Exporter($model, $this->option('criteria'), $this->option('except'), $this->option('only')))->run();
$this->comment('Export for data sync completed');
}
}

View File

@@ -17,6 +17,7 @@ class DataSyncBaseServiceProvider extends ServiceProvider
{ {
$this->commands([ $this->commands([
Console\Commands\Sync::class, Console\Commands\Sync::class,
Console\Commands\Export::class,
]); ]);
} }

96
src/Exporter.php Normal file
View File

@@ -0,0 +1,96 @@
<?php
namespace nullthoughts\LaravelDataSync;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Storage;
use nullthoughts\LaravelDataSync\Exceptions\FileDirectoryNotFoundException;
class Exporter
{
private $modelName;
private $criteria;
private $except;
private $only;
/**
* Get files in sync directory.
*
* @param string $model
* @param array $criteria
*
* @throws \nullthoughts\LaravelDataSync\Exceptions\FileDirectoryNotFoundException
*/
public function __construct(string $modelName, array $criteria = [], $except = [], $only = [])
{
$this->modelName = $modelName;
$this->criteria = $criteria;
$this->except = $except;
$this->only = $only;
}
/**
* Export Model data to sync file.
*
* @return mixed
*/
public function run()
{
$class = config('data-sync.namespace', '\\App\\Models\\') . $this->modelName;
$filename = $this->getDirectory() . '/' . $this->modelName . '.json';
$data = $this->prepareData($class);
file_put_contents($filename, $data);
}
/**
* Get directory path for sync files.
*
* @throws \nullthoughts\LaravelDataSync\Exceptions\FileDirectoryNotFoundException
*
* @return string
*/
protected function getDirectory()
{
$directory = config('data-sync.path', base_path('sync'));
if (! file_exists($directory)) {
throw new FileDirectoryNotFoundException();
}
return $directory;
}
protected function prepareData($class)
{
$class = new $class;
$keys = $this->prepareKeys($class);
return $class->select($keys)->get()->toJson();
}
protected function prepareKeys($class)
{
$keys = Schema::getColumnListing($class->getTable());
if ($this->only) {
$keys = array_intersect($keys, $this->only);
}
if ($this->except) {
$keys = array_diff($keys, $this->except);
}
return collect($keys)->map(function ($key) {
if (in_array($key, $this->criteria)) {
return $key . ' as _' . $key;
}
return $key;
})->toArray();
}
}

View File

@@ -10,7 +10,6 @@ use nullthoughts\LaravelDataSync\Exceptions\ErrorUpdatingModelException;
use nullthoughts\LaravelDataSync\Exceptions\FileDirectoryNotFoundException; use nullthoughts\LaravelDataSync\Exceptions\FileDirectoryNotFoundException;
use nullthoughts\LaravelDataSync\Exceptions\NoCriteriaException; use nullthoughts\LaravelDataSync\Exceptions\NoCriteriaException;
use nullthoughts\LaravelDataSync\Exceptions\NoRecordsInvalidJSONException; use nullthoughts\LaravelDataSync\Exceptions\NoRecordsInvalidJSONException;
use stdClass;
class Updater class Updater
{ {
@@ -37,7 +36,7 @@ class Updater
/** /**
* @var string * @var string
*/ */
private $baseNamespace = '\\App\\'; private $modelNamespace;
/** /**
* Get files in sync directory. * Get files in sync directory.
@@ -54,6 +53,7 @@ class Updater
{ {
$this->remote = $remote; $this->remote = $remote;
$this->disk = $disk; $this->disk = $disk;
$this->modelNamespace = config('data-sync.namespace', '\\App\\Models\\');
$this->directory = $this->getDirectory($path); $this->directory = $this->getDirectory($path);
$this->files = $this->getFiles($this->directory, $model); $this->files = $this->getFiles($this->directory, $model);
@@ -66,7 +66,7 @@ class Updater
*/ */
public function setNamespace($namespace) public function setNamespace($namespace)
{ {
$this->baseNamespace = $namespace; $this->modelNamespace = $namespace;
} }
/** /**
@@ -195,13 +195,13 @@ class Updater
/** /**
* Filter record criteria. * Filter record criteria.
* *
* @param stdClass $record * @param object $record
* *
* @throws \nullthoughts\LaravelDataSync\Exceptions\NoCriteriaException * @throws \nullthoughts\LaravelDataSync\Exceptions\NoCriteriaException
* *
* @return \Illuminate\Support\Collection * @return \Illuminate\Support\Collection
*/ */
protected function getCriteria(stdClass $record) protected function getCriteria(object $record)
{ {
$criteria = collect($record)->filter(function ($value, $key) { $criteria = collect($record)->filter(function ($value, $key) {
return $this->isCriteria($key); return $this->isCriteria($key);
@@ -219,11 +219,11 @@ class Updater
/** /**
* Filter record values. * Filter record values.
* *
* @param stdClass $record * @param object $record
* *
* @return \Illuminate\Support\Collection * @return \Illuminate\Support\Collection
*/ */
protected function getValues(stdClass $record) protected function getValues(object $record)
{ {
return collect($record)->reject(function ($value, $key) { return collect($record)->reject(function ($value, $key) {
if ($this->isCriteria($key)) { if ($this->isCriteria($key)) {
@@ -247,7 +247,7 @@ class Updater
*/ */
protected function getModel(string $name) protected function getModel(string $name)
{ {
return $this->baseNamespace.Str::studly(pathinfo($name, PATHINFO_FILENAME)); return $this->modelNamespace . Str::studly(pathinfo($name, PATHINFO_FILENAME));
} }
/** /**
@@ -288,11 +288,11 @@ class Updater
* Return ID for nested key-value pairs. * Return ID for nested key-value pairs.
* *
* @param string $key * @param string $key
* @param stdClass $values * @param object $values
* *
* @return array * @return array
*/ */
protected function resolveId(string $key, stdClass $values) protected function resolveId(string $key, object $values)
{ {
$model = $this->getModel($key); $model = $this->getModel($key);