Skip to content

Commit

Permalink
Added a first migration config version.
Browse files Browse the repository at this point in the history
  • Loading branch information
Christopher Lorke committed Sep 11, 2018
1 parent 039973a commit bd4bf46
Show file tree
Hide file tree
Showing 13 changed files with 512 additions and 10 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
Elasticsearch migration for laravel.

## Main features
- Migration
- Create index
- Update mappings
- Update settings

## Installation

Expand Down
47 changes: 47 additions & 0 deletions src/Business/Repository/ElasticsearchMigration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php
namespace Triadev\EsMigration\Business\Repository;

use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract;

class ElasticsearchMigration implements ElasticsearchMigrationContract
{
/**
* @inheritdoc
*/
public function createOrUpdate(
string $migration,
string $status
): \Triadev\EsMigration\Models\Entity\ElasticsearchMigration {
$dbMigration = $this->find($migration);

if (!$dbMigration) {
$dbMigration = new \Triadev\EsMigration\Models\Entity\ElasticsearchMigration();
$dbMigration->migration = $migration;
}

$dbMigration->status = $status;
$dbMigration->saveOrFail();

return $dbMigration;
}

/**
* @inheritdoc
*/
public function find(string $migration): ?\Triadev\EsMigration\Models\Entity\ElasticsearchMigration
{
return \Triadev\EsMigration\Models\Entity\ElasticsearchMigration::where('migration', $migration)
->orderBy('created_at', 'desc')
->first();
}

/**
* @inheritdoc
*/
public function delete(string $migration)
{
if ($migration = $this->find($migration)) {
$migration->delete();
}
}
}
4 changes: 3 additions & 1 deletion src/Contract/ElasticsearchMigrationContract.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ interface ElasticsearchMigrationContract
{
/**
* Migrate
*
* @param string $version
*/
public function migrate();
public function migrate(string $version);
}
36 changes: 36 additions & 0 deletions src/Contract/Repository/ElasticsearchMigrationContract.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php
namespace Triadev\EsMigration\Contract\Repository;

use Triadev\EsMigration\Models\Entity\ElasticsearchMigration;

interface ElasticsearchMigrationContract
{
/**
* Create or update
*
* @param string $migration
* @param string $status
* @return ElasticsearchMigration
*
* @throws \Throwable
*/
public function createOrUpdate(string $migration, string $status) : ElasticsearchMigration;

/**
* Find
*
* @param string $migration
* @return null|ElasticsearchMigration
*/
public function find(string $migration) : ?ElasticsearchMigration;

/**
* Delete
*
* @param string $migration
* @return bool
*
* @throws \Throwable
*/
public function delete(string $migration);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateElasticsearchMigrationTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('triadev_elasticsearch_migration', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('migration');
$table->string('status');
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('triadev_elasticsearch_migration');
}
}
92 changes: 87 additions & 5 deletions src/ElasticsearchMigration.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,24 @@
use Elasticsearch\Client;
use Elasticsearch\ClientBuilder;
use Triadev\EsMigration\Contract\ElasticsearchMigrationContract;
use Triadev\EsMigration\Models\Migration;

class ElasticsearchMigration implements ElasticsearchMigrationContract
{
/** @var Client */
private $client;
private $esClient;

/** @var string|null */
private $filePathMigrations;

/**
* ElasticsearchMigration constructor.
*/
public function __construct()
{
$this->client = $this->buildElasticsearchClient();
$this->esClient = $this->buildElasticsearchClient();

$this->filePathMigrations = config('triadev-elasticsearch-migration.migration.filePath');
}

private function buildElasticsearchClient() : Client
Expand All @@ -37,10 +43,86 @@ private function buildElasticsearchClient() : Client
}

/**
* Migrate
* @inheritdoc
*/
public function migrate()
public function migrate(string $version)
{
$migrations = $this->buildMigrations($version);

foreach ($migrations as $migration) {
switch ($migration->getType()) {
case 'create':
$this->create($migration);
break;
case 'update':
$this->update($migration);
break;
default:
break;
}
}
}

private function create(Migration $migration)
{
// TODO: Implement migrate() method.
$body = [
'mappings' => $migration->getMappings()
];

if ($migration->getSettings()) {
$body['settings'] = $migration->getSettings();
}

$this->esClient->indices()->create([
'index' => $migration->getIndex(),
'body' => $body
]);
}

private function update(Migration $migration)
{
if ($migration->getMappings()) {
foreach ($migration->getMappings() as $type => $mapping) {
$this->esClient->indices()->putMapping([
'index' => $migration->getIndex(),
'type' => $type,
'body' => $mapping
]);
}
}

if ($migration->getSettings()) {
$this->esClient->indices()->putSettings([
'index' => $migration->getIndex(),
'body' => [
'index' => $migration->getSettings()
]
]);
}
}

/**
* @param string $version
* @return Migration[]
*/
private function buildMigrations(string $version) : array
{
$migrationsConfigs = require sprintf("%s/%s/migrations.php", $this->filePathMigrations, $version);

$result = [];

foreach ($migrationsConfigs as $migrationsConfig) {
$migration = new Migration(
array_get($migrationsConfig, 'index'),
array_get($migrationsConfig, 'type')
);

$migration->setMappings(array_get($migrationsConfig, 'mappings'));
$migration->setSettings(array_get($migrationsConfig, 'settings'));

$result[] = $migration;
}

return $result;
}
}
24 changes: 24 additions & 0 deletions src/Models/Entity/ElasticsearchMigration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php
namespace Triadev\EsMigration\Models\Entity;

use Illuminate\Database\Eloquent\Model;

class ElasticsearchMigration extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'triadev_elasticsearch_migration';

/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'migration',
'status'
];
}
92 changes: 92 additions & 0 deletions src/Models/Migration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
<?php
namespace Triadev\EsMigration\Models;

class Migration
{
/** @var string */
private $index;

/** @var string */
private $type;

/** @var array|null */
private $mappings;

/** @var array|null */
private $settings;

/**
* Migrations constructor.
* @param string $index
* @param string $type
*/
public function __construct(string $index, string $type)
{
$this->index = $index;
$this->type = $type;
}

/**
* @return string
*/
public function getIndex(): string
{
return $this->index;
}

/**
* @param string $index
*/
public function setIndex(string $index)
{
$this->index = $index;
}

/**
* @return string
*/
public function getType(): string
{
return $this->type;
}

/**
* @param string $type
*/
public function setType(string $type)
{
$this->type = $type;
}

/**
* @return array|null
*/
public function getMappings(): ?array
{
return $this->mappings;
}

/**
* @param array|null $mappings
*/
public function setMappings(?array $mappings)
{
$this->mappings= $mappings;
}

/**
* @return array|null
*/
public function getSettings(): ?array
{
return $this->settings;
}

/**
* @param array|null $settings
*/
public function setSettings(?array $settings): void
{
$this->settings = $settings;
}
}
8 changes: 8 additions & 0 deletions src/Provider/ElasticsearchMigrationServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@ public function boot()
], 'config');

$this->mergeConfigFrom($source, 'triadev-elasticsearch-migration');

$this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations');

$this->app->bind(
\Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::class,
function () {
return app()->make(\Triadev\EsMigration\Business\Repository\ElasticsearchMigration::class);
});
}

/**
Expand Down
Loading

0 comments on commit bd4bf46

Please sign in to comment.