From 9f1f968430b0c0221875a242e01d4b3b5096c04d Mon Sep 17 00:00:00 2001 From: MarceauKa Date: Wed, 4 Jan 2023 13:55:23 +0100 Subject: [PATCH] Some fixes and installation documentation (#46) * :bug: Fix migration CreateUsersWorkspacesTable with two errors from SQL constraints :bug: Fix MySQL transaction on CreateUsersWorkspacesTable migration (MariaDB) :wrench: .gitignore for Clockwork * :construction: Doc Co-authored-by: Julien Nahum --- README.md | 40 ++++++- ...3_142022_create_users_workspaces_table.php | 102 ++++++++---------- storage/clockwork/.gitignore | 3 + 3 files changed, 89 insertions(+), 56 deletions(-) create mode 100644 storage/clockwork/.gitignore diff --git a/README.md b/README.md index 53f4e0f..ac65a58 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,45 @@ It takes 1 minute to try out the builder for free. You'll have high availability ## Self-hosting -This section hasn't been written yet, we need to work on this. +🚧 This section is under construction! + +### Requirements + +- PHP >= 8.0 +- MySQL/MariaDB or PostgreSQL +- Node.js and NPM/Yarn/... to compile assets + +### Local installation + +First, let's work with the codebase and its dependencies. + +```bash +# Get the code! +git clone git@github.com:JhumanJ/OpnForm.git && cd OpnForm + +# Install PHP and JS dependencies +composer install && npm install + +# Compile assets (see the scripts section in package.json) +npm run dev # or prod, or watch +``` + +Now, we can configure Laravel. We just need to prepare some vars in our `.env` file, just create it with `cp .env.example .env` then open it! + +Configure the desired database in the `DATABASE_` section. You can fine tune your installation on the [laravel documentation](https://laravel.com/docs/9.x). + +Finally, just run these artisan commands and you're done! + +```bash +# Generate needed secrets 🙈 +php artisan key:generate +php artisan jwt:secret # and select yes! + +# Creates DB schemas +php artisan migrate +``` + +🎉 Done! Enjoy your personal OpnForm instance at: [http://opnform.test](http://opnform.test). ## Tech Stack diff --git a/database/migrations/2021_10_13_142022_create_users_workspaces_table.php b/database/migrations/2021_10_13_142022_create_users_workspaces_table.php index 437e53d..6dd2776 100644 --- a/database/migrations/2021_10_13_142022_create_users_workspaces_table.php +++ b/database/migrations/2021_10_13_142022_create_users_workspaces_table.php @@ -2,6 +2,7 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; class CreateUsersWorkspacesTable extends Migration @@ -13,68 +14,59 @@ class CreateUsersWorkspacesTable extends Migration */ public function up() { - \Illuminate\Support\Facades\DB::transaction(function () { + Schema::create('user_workspace', function (Blueprint $table) { + $table->id(); + $table->foreignId('workspace_id')->references('id')->on('workspaces')->cascadeOnUpdate()->cascadeOnDelete(); + $table->foreignId('user_id')->references('id')->on('users')->cascadeOnUpdate()->cascadeOnDelete(); + $table->unique(['workspace_id', 'user_id']); + $table->boolean('is_owner')->default(false); + $table->string('access_token')->nullable(); + $table->timestamps(); + }); - Schema::create('user_workspace', function (Blueprint $table) { - $table->id(); - $table->integer('workspace_id')->unsigned(); - $table->integer('user_id')->unsigned(); - $table->unique(['workspace_id', 'user_id']); - $table->boolean('is_owner')->default(false); - $table->string('access_token')->nullable(); - $table->foreign('workspace_id')->references('id')->on('workspaces') - ->onDelete('cascade')->onUpdate('cascade'); - $table->foreign('user_id')->references('id')->on('users') - ->onDelete('cascade')->onUpdate('cascade'); - $table->timestamps(); - }); + // Add creator id to forms table + Schema::table('forms', function (Blueprint $table) { + $table->foreignId('creator_id')->references('id')->on('users')->cascadeOnUpdate()->cascadeOnDelete(); + }); - // Add creator id to forms table - Schema::table('forms', function (Blueprint $table) { - $table->integer('creator_id')->unsigned()->nullable(); - $table->foreign('creator_id')->references('id')->on('users') - ->onDelete('cascade')->onUpdate('cascade'); - }); + // Create relation - can't use models because of new methods clash + DB::table('workspaces') + ->orderBy('id') + ->chunk(100, function ($workspaces) { + foreach ($workspaces as $workspace) { + echo '.'; - // Create relation - can't use models because of new methods clash - \Illuminate\Support\Facades\DB::table('workspaces') - ->orderBy('id') - ->chunk(100, function ($workspaces) { - foreach ($workspaces as $workspace) { - echo '.'; - - // Make sure user wasn't deleted - if (!\Illuminate\Support\Facades\DB::table('users')->where('id', - $workspace->user_id)->exists()) { - continue; - } - - // Create relation - $now = now(); - \Illuminate\Support\Facades\DB::table('user_workspace')->insert([ - 'workspace_id' => $workspace->id, - 'access_token' => $workspace->access_token, - 'user_id' => $workspace->user_id, - 'is_owner' => true, - 'created_at' => $now, - 'updated_at' => $now - ]); - - // Set form creator id - foreach (\App\Models\Forms\Form::withTrashed()->where('workspace_id',$workspace->id)->get() as $form) { - $form->update(['creator_id'=>$workspace->user_id]); - } + // Make sure user wasn't deleted + if (!DB::table('users')->where('id', + $workspace->user_id)->exists()) { + continue; } - }); - // Drop column - Schema::table('workspaces', function (Blueprint $table) { - $table->dropColumn(['user_id','access_token']); + // Create relation + $now = now(); + \Illuminate\Support\Facades\DB::table('user_workspace')->insert([ + 'workspace_id' => $workspace->id, + 'access_token' => $workspace->access_token, + 'user_id' => $workspace->user_id, + 'is_owner' => true, + 'created_at' => $now, + 'updated_at' => $now + ]); + + // Set form creator id + foreach (\App\Models\Forms\Form::withTrashed()->where('workspace_id',$workspace->id)->get() as $form) { + $form->update(['creator_id'=>$workspace->user_id]); + } + } }); - Schema::table('user_workspace', function (Blueprint $table) { - $table->string('access_token')->nullable(false)->change(); - }); + // Drop column + Schema::table('workspaces', function (Blueprint $table) { + $table->dropColumn(['user_id','access_token']); + }); + + Schema::table('user_workspace', function (Blueprint $table) { + $table->string('access_token')->nullable(false)->change(); }); } diff --git a/storage/clockwork/.gitignore b/storage/clockwork/.gitignore new file mode 100644 index 0000000..3fac1bf --- /dev/null +++ b/storage/clockwork/.gitignore @@ -0,0 +1,3 @@ +*.json +*.json.gz +index