Skip to content

Commit

Permalink
add soft delete to card, deck, membership, and user (#110)
Browse files Browse the repository at this point in the history
  • Loading branch information
jxjj authored Jan 23, 2025
1 parent be124ce commit 3de165a
Show file tree
Hide file tree
Showing 8 changed files with 108 additions and 42 deletions.
3 changes: 2 additions & 1 deletion app/Models/Card.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\DB;
use OwenIt\Auditing\Auditable as AuditableTrait;
use OwenIt\Auditing\Contracts\Auditable as AuditableContract;

class Card extends Model implements AuditableContract
{
use AuditableTrait, HasFactory;
use AuditableTrait, HasFactory, SoftDeletes;

protected $casts = [
'front' => 'array',
Expand Down
3 changes: 2 additions & 1 deletion app/Models/Deck.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\DB;
use OwenIt\Auditing\Auditable as AuditableTrait;
use OwenIt\Auditing\Contracts\Auditable as AuditableContract;

class Deck extends Model implements AuditableContract
{
use AuditableTrait, HasFactory;
use AuditableTrait, HasFactory, SoftDeletes;

protected $casts = [
'last_attempted_at' => 'datetime',
Expand Down
3 changes: 2 additions & 1 deletion app/Models/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Nova\Auth\Impersonatable;
Expand All @@ -13,7 +14,7 @@

class User extends Authenticatable implements AuditableContract
{
use AuditableTrait, HasFactory, HasRoles, Impersonatable, Notifiable;
use AuditableTrait, HasFactory, HasRoles, Impersonatable, Notifiable, SoftDeletes;

/**
* The attributes that are mass assignable.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<?php

use App\Models\Card;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Expand All @@ -14,16 +13,15 @@ public function up(): void
{
Schema::table('cards', function (Blueprint $table) {
// for each text column, convert it into json stringified object
Card::all()->each(function ($card) {
$card->front = json_encode([
'type' => 'text',
'content' => $card->front,
]);
$card->back = json_encode([
'type' => 'text',
'content' => $card->back,
]);
$card->save();
DB::table('cards')->select('id', 'front', 'back')->chunkById(100, function ($cards) {
foreach ($cards as $card) {
DB::table('cards')
->where('id', $card->id)
->update([
'front' => json_encode(['type' => 'text', 'content' => $card->front]),
'back' => json_encode(['type' => 'text', 'content' => $card->back]),
]);
}
});

// change the column type to json
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?php

use App\Models\Deck;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
Expand All @@ -12,11 +12,15 @@
*/
public function up(): void
{
Deck::all()->each(function (Deck $deck) {
$deck->memberships()->create([
'user_id' => $deck->owner_id,
'role' => 'owner',
]);
// Insert owners into memberships table
DB::table('decks')->select('id', 'owner_id')->chunkById(100, function ($decks) {
foreach ($decks as $deck) {
DB::table('memberships')->insert([
'deck_id' => $deck->id,
'user_id' => $deck->owner_id,
'role' => 'owner',
]);
}
});

Schema::table('decks', function (Blueprint $table) {
Expand All @@ -30,18 +34,20 @@ public function up(): void
*/
public function down(): void
{
Schema::table('memberships', function (Blueprint $table) {
Schema::table('decks', function (Blueprint $table) {
$table->foreignId('owner_id')->constrained('users')->cascadeOnDelete()->cascadeOnUpdate();
});

// move owners back to owner_id
Deck::all()->each(function (Deck $deck) {
$deck->update(['owner_id' => $deck->owner->id]);
// Move owners back to owner_id
DB::table('memberships')->where('role', 'owner')->chunkById(100, function ($memberships) {
foreach ($memberships as $membership) {
DB::table('decks')
->where('id', $membership->deck_id)
->update(['owner_id' => $membership->user_id]);
}
});

// remove owners from memberships
Deck::all()->each(function (Deck $deck) {
$deck->memberships()->where('role', 'owner')->delete();
});
// Remove owners from memberships
DB::table('memberships')->where('role', 'owner')->delete();
}
};
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
<?php

use App\Models\Card;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;

return new class extends Migration
{
private function initMeta(array $side): array
{
$side['meta'] ??= [];
$side['meta']['hints'] ??= [];
$side['meta']['alt'] ??= '';
$side['meta'] = $side['meta'] ?? [];
$side['meta']['hints'] = $side['meta']['hints'] ?? [];
$side['meta']['alt'] = $side['meta']['alt'] ?? '';

return $side;
}
Expand All @@ -19,10 +19,21 @@ private function initMeta(array $side): array
*/
public function up(): void
{
Card::all()->each(function (Card $card) {
$card->front = $this->initMeta($card->front);
$card->back = $this->initMeta($card->back);
$card->save();
DB::table('cards')->select('id', 'front', 'back')->chunkById(100, function ($cards) {
foreach ($cards as $card) {
$front = json_decode($card->front, true);
$back = json_decode($card->back, true);

$front = $this->initMeta($front);
$back = $this->initMeta($back);

DB::table('cards')
->where('id', $card->id)
->update([
'front' => json_encode($front),
'back' => json_encode($back),
]);
}
});
}

Expand All @@ -31,5 +42,6 @@ public function up(): void
*/
public function down(): void
{
//
}
};
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?php

use App\Models\Deck;
use App\Models\DeckInviteToken;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

return new class extends Migration
{
Expand All @@ -11,23 +11,26 @@
*/
public function up(): void
{
$decks = Deck::all();
// Retrieve all decks
$decks = DB::table('decks')->select('id')->get();

foreach ($decks as $deck) {
// Check and create tokens for each permission type
foreach (['view', 'edit'] as $permission) {
$existingToken = $deck->tokens()->where('permission', $permission)->first();
$existingToken = DB::table('deck_invite_tokens')
->where('deck_id', $deck->id)
->where('permission', $permission)
->first();

if (! $existingToken) {
DeckInviteToken::create([
DB::table('deck_invite_tokens')->insert([
'deck_id' => $deck->id,
'permission' => $permission,
'token' => Str::random(32),
]);
}
}
}

}

/**
Expand Down
44 changes: 44 additions & 0 deletions database/migrations/2025_01_23_021808_add_soft_deletes.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

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

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->softDeletes();
});

Schema::table('decks', function (Blueprint $table) {
$table->softDeletes();
});

Schema::table('cards', function (Blueprint $table) {
$table->softDeletes();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropSoftDeletes();
});

Schema::table('decks', function (Blueprint $table) {
$table->dropSoftDeletes();
});

Schema::table('cards', function (Blueprint $table) {
$table->dropSoftDeletes();
});
}
};

0 comments on commit 3de165a

Please sign in to comment.