summaryrefslogtreecommitdiff
path: root/db/migrations
diff options
context:
space:
mode:
Diffstat (limited to 'db/migrations')
-rw-r--r--db/migrations/2019_10_15_000000_create_news_table.php137
1 files changed, 137 insertions, 0 deletions
diff --git a/db/migrations/2019_10_15_000000_create_news_table.php b/db/migrations/2019_10_15_000000_create_news_table.php
new file mode 100644
index 00000000..d6b93265
--- /dev/null
+++ b/db/migrations/2019_10_15_000000_create_news_table.php
@@ -0,0 +1,137 @@
+<?php
+declare(strict_types=1);
+
+namespace Engelsystem\Migrations;
+
+use Carbon\Carbon;
+use Engelsystem\Database\Migration\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use stdClass;
+
+/**
+ * This migration creates the news table and copies the existing News table records to the new one.
+ */
+class CreateNewsTable extends Migration
+{
+ use ChangesReferences, Reference;
+
+ /**
+ * Creates the news table, copies the data and drops the News table.
+ */
+ public function up(): void
+ {
+ $hasPreviousNewsTable = $this->schema->hasTable('News');
+
+ if ($hasPreviousNewsTable) {
+ // rename because some SQL DBMS handle identifiers case insensitive
+ $this->schema->rename('News', 'PreviousNews');
+ }
+
+ $this->createNewNewsTable();
+
+ if ($hasPreviousNewsTable) {
+ $this->copyPreviousToNewNewsTable();
+ $this->changeReferences(
+ 'PreviousNews',
+ 'ID',
+ 'news',
+ 'id',
+ 'unsignedInteger'
+ );
+ $this->schema->drop('PreviousNews');
+ }
+ }
+
+ /**
+ * Recreates the previous News table, copies back the data and drops the new news table.
+ */
+ public function down(): void
+ {
+ // rename because some SQL DBMS handle identifiers case insensitive
+ $this->schema->rename('news', 'new_news');
+
+ $this->createPreviousNewsTable();
+ $this->copyNewToPreviousNewsTable();
+ $this->changeReferences(
+ 'new_news',
+ 'id',
+ 'News',
+ 'ID',
+ 'unsignedInteger'
+ );
+ $this->schema->drop('new_news');
+ }
+
+ private function createNewNewsTable(): void
+ {
+ $this->schema->create('news', function (Blueprint $table) {
+ $table->increments('id');
+ $table->string('title', 150);
+ $table->text('text');
+ $table->boolean('is_meeting')->default(0);
+ $this->referencesUser($table, false);
+ $table->timestamps();
+ });
+ }
+
+ private function copyPreviousToNewNewsTable(): void
+ {
+ /** @var stdClass[] $previousNewsRecords */
+ $previousNewsRecords = $this->schema
+ ->getConnection()
+ ->table('PreviousNews')
+ ->get();
+
+ foreach ($previousNewsRecords as $previousNews) {
+ $date = Carbon::createFromTimestamp($previousNews->Datum);
+ $this->schema->getConnection()->table('news')->insert([
+ 'id' => $previousNews->ID,
+ 'title' => $previousNews->Betreff,
+ 'text' => $previousNews->Text,
+ 'is_meeting' => $previousNews->Treffen,
+ 'user_id' => $previousNews->UID,
+ 'created_at' => $date,
+ 'updated_at' => $date,
+ ]);
+ }
+ }
+
+ private function createPreviousNewsTable(): void
+ {
+ $this->schema->create('News', function (Blueprint $table) {
+ $table->increments('ID');
+ $table->integer('Datum');
+ $table->string('Betreff', 150)
+ ->default('');
+ $table->text('Text');
+ $table->boolean('Treffen');
+ $table->unsignedInteger('UID');
+ $table->foreign('UID')
+ ->references('id')
+ ->on('users');
+ });
+ }
+
+ private function copyNewToPreviousNewsTable(): void
+ {
+ /** @var stdClass[] $newsRecords */
+ $newsRecords = $this->schema
+ ->getConnection()
+ ->table('new_news')
+ ->get();
+
+ foreach ($newsRecords as $newsRecord) {
+ $date = Carbon::createFromFormat('Y-m-d H:i:s', $newsRecord->created_at)
+ ->getTimestamp();
+
+ $this->schema->getConnection()->table('News')->insert([
+ 'ID' => $newsRecord->id,
+ 'Datum' => $date,
+ 'Betreff' => $newsRecord->title,
+ 'Text' => $newsRecord->text,
+ 'UID' => $newsRecord->user_id,
+ 'Treffen' => $newsRecord->is_meeting,
+ ]);
+ }
+ }
+}