feat: WIP add watch history (#1098)

This commit is contained in:
Kyrch
2026-02-14 03:17:36 -03:00
committed by GitHub
parent ef56c3e130
commit dff1634480
45 changed files with 742 additions and 66 deletions
+49
View File
@@ -0,0 +1,49 @@
<?php
declare(strict_types=1);
namespace Database\Factories\User;
use App\Models\Auth\User;
use App\Models\List\Playlist;
use App\Models\User\Like;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @method Like createOne($attributes = [])
* @method Like makeOne($attributes = [])
*
* @extends Factory<Like>
*/
class LikeFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var class-string<Like>
*/
protected $model = Like::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
Like::ATTRIBUTE_USER => User::factory(),
];
}
public function forPlaylist(): static
{
return $this->for(Playlist::factory(), Like::RELATION_LIKEABLE);
}
public function forEntry(): static
{
return $this->for(AnimeThemeEntry::factory(), Like::RELATION_LIKEABLE);
}
}
@@ -0,0 +1,41 @@
<?php
declare(strict_types=1);
namespace Database\Factories\User;
use App\Models\Auth\User;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Models\Wiki\Video;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @method WatchHistory createOne($attributes = [])
* @method WatchHistory makeOne($attributes = [])
*
* @extends Factory<WatchHistory>
*/
class WatchHistoryFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var class-string<WatchHistory>
*/
protected $model = WatchHistory::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
WatchHistory::ATTRIBUTE_ENTRY => AnimeThemeEntry::factory(),
WatchHistory::ATTRIBUTE_USER => User::factory(),
WatchHistory::ATTRIBUTE_VIDEO => Video::factory(),
];
}
}
@@ -0,0 +1,33 @@
<?php
declare(strict_types=1);
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
{
if (! Schema::hasTable('watch_history')) {
Schema::create('watch_history', function (Blueprint $table) {
$table->id('id');
$table->unsignedBigInteger('entry_id');
$table->foreign('entry_id')->references('entry_id')->on('anime_theme_entries')->cascadeOnDelete();
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete();
$table->unsignedBigInteger('video_id');
$table->foreign('video_id')->references('video_id')->on('videos')->cascadeOnDelete();
$table->timestamps(6);
});
}
}
};
@@ -25,6 +25,7 @@ use App\Models\List\Playlist\PlaylistTrack;
use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\Submission;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
@@ -78,9 +79,10 @@ class PermissionSeeder extends Seeder
$this->registerResource(PlaylistTrack::class, CrudPermission::cases());
// User Resources
$this->registerResource(Like::class, [CrudPermission::VIEW, CrudPermission::CREATE, CrudPermission::DELETE]);
$this->registerResource(Notification::class, [CrudPermission::VIEW, CrudPermission::UPDATE]);
$this->registerResource(Like::class, CrudPermission::cases());
$this->registerResource(Notification::class, CrudPermission::cases());
$this->registerResource(Submission::class, CrudPermission::cases());
$this->registerResource(WatchHistory::class, CrudPermission::cases());
// Wiki Resources
$this->registerResource(Anime::class, $extendedCrudPermissions);
+4 -2
View File
@@ -26,6 +26,7 @@ use App\Models\List\Playlist\PlaylistTrack;
use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\Submission;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
@@ -86,9 +87,10 @@ class AdminSeeder extends RoleSeeder
$this->configureResource($role, PlaylistTrack::class, CrudPermission::cases());
// User Resources
$this->configureResource($role, Like::class, [CrudPermission::VIEW, CrudPermission::CREATE, CrudPermission::DELETE]);
$this->configureResource($role, Notification::class, [CrudPermission::VIEW, CrudPermission::UPDATE]);
$this->configureResource($role, Like::class, CrudPermission::cases());
$this->configureResource($role, Notification::class, CrudPermission::cases());
$this->configureResource($role, Submission::class, CrudPermission::cases());
$this->configureResource($role, WatchHistory::class, CrudPermission::cases());
// Wiki Resources
$this->configureResource($role, Anime::class, $extendedCrudPermissions);
@@ -17,6 +17,7 @@ use App\Models\List\Playlist;
use App\Models\List\Playlist\PlaylistTrack;
use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
@@ -63,8 +64,9 @@ class ContentModeratorRoleSeeder extends RoleSeeder
$this->configureResource($role, PlaylistTrack::class, CrudPermission::cases());
// User Resources
$this->configureResource($role, Like::class, [CrudPermission::VIEW, CrudPermission::CREATE, CrudPermission::DELETE]);
$this->configureResource($role, Notification::class, [CrudPermission::VIEW, CrudPermission::UPDATE]);
$this->configureResource($role, Like::class, CrudPermission::cases());
$this->configureResource($role, Notification::class, CrudPermission::cases());
$this->configureResource($role, WatchHistory::class, CrudPermission::cases());
$extendedCrudPermissions = array_merge(
CrudPermission::cases(),
@@ -16,6 +16,7 @@ use App\Models\List\Playlist;
use App\Models\List\Playlist\PlaylistTrack;
use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
@@ -57,8 +58,9 @@ class ContributorRoleSeeder extends RoleSeeder
$this->configureResource($role, PlaylistTrack::class, CrudPermission::cases());
// User Resources
$this->configureResource($role, Like::class, [CrudPermission::VIEW, CrudPermission::CREATE, CrudPermission::DELETE]);
$this->configureResource($role, Notification::class, [CrudPermission::VIEW, CrudPermission::UPDATE]);
$this->configureResource($role, Like::class, CrudPermission::cases());
$this->configureResource($role, Notification::class, CrudPermission::cases());
$this->configureResource($role, WatchHistory::class, CrudPermission::cases());
// Wiki Resources
$this->configureResource($role, Anime::class, [CrudPermission::VIEW]);
@@ -16,6 +16,7 @@ use App\Models\List\Playlist;
use App\Models\List\Playlist\PlaylistTrack;
use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
@@ -57,8 +58,9 @@ class DeveloperRoleSeeder extends RoleSeeder
$this->configureResource($role, PlaylistTrack::class, CrudPermission::cases());
// User Resources
$this->configureResource($role, Like::class, [CrudPermission::VIEW, CrudPermission::CREATE, CrudPermission::DELETE]);
$this->configureResource($role, Notification::class, [CrudPermission::VIEW, CrudPermission::UPDATE]);
$this->configureResource($role, Like::class, CrudPermission::cases());
$this->configureResource($role, Notification::class, CrudPermission::cases());
$this->configureResource($role, WatchHistory::class, CrudPermission::cases());
// Wiki Resources
$this->configureResource($role, Anime::class, [CrudPermission::VIEW]);
@@ -15,7 +15,9 @@ use App\Models\List\External\ExternalEntry;
use App\Models\List\ExternalProfile;
use App\Models\List\Playlist;
use App\Models\List\Playlist\PlaylistTrack;
use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
@@ -69,7 +71,9 @@ class EncoderRoleSeeder extends RoleSeeder
);
// User Resources
$this->configureResource($role, Notification::class, [CrudPermission::VIEW, CrudPermission::UPDATE]);
$this->configureResource($role, Like::class, CrudPermission::cases());
$this->configureResource($role, Notification::class, CrudPermission::cases());
$this->configureResource($role, WatchHistory::class, CrudPermission::cases());
// Wiki Resources
$this->configureResource($role, Anime::class, $extendedCrudPermissions);
@@ -16,6 +16,7 @@ use App\Models\List\Playlist;
use App\Models\List\Playlist\PlaylistTrack;
use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
@@ -57,8 +58,9 @@ class PanelViewerRoleSeeder extends RoleSeeder
$this->configureResource($role, PlaylistTrack::class, CrudPermission::cases());
// User Resources
$this->configureResource($role, Like::class, [CrudPermission::VIEW, CrudPermission::CREATE, CrudPermission::DELETE]);
$this->configureResource($role, Notification::class, [CrudPermission::VIEW, CrudPermission::UPDATE]);
$this->configureResource($role, Like::class, CrudPermission::cases());
$this->configureResource($role, Notification::class, CrudPermission::cases());
$this->configureResource($role, WatchHistory::class, CrudPermission::cases());
// Wiki Resources
$this->configureResource($role, Anime::class, [CrudPermission::VIEW]);
@@ -16,6 +16,7 @@ use App\Models\List\Playlist;
use App\Models\List\Playlist\PlaylistTrack;
use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\WatchHistory;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Models\Wiki\Anime\AnimeTheme;
@@ -57,8 +58,9 @@ class PatronRoleSeeder extends RoleSeeder
$this->configureResource($role, PlaylistTrack::class, CrudPermission::cases());
// User Resources
$this->configureResource($role, Like::class, [CrudPermission::VIEW, CrudPermission::CREATE, CrudPermission::DELETE]);
$this->configureResource($role, Notification::class, [CrudPermission::VIEW, CrudPermission::UPDATE]);
$this->configureResource($role, Like::class, CrudPermission::cases());
$this->configureResource($role, Notification::class, CrudPermission::cases());
$this->configureResource($role, WatchHistory::class, CrudPermission::cases());
// Wiki Resources
$this->configureResource($role, Anime::class, [CrudPermission::VIEW]);
@@ -12,6 +12,8 @@ use App\Models\List\ExternalProfile;
use App\Models\List\Playlist;
use App\Models\List\Playlist\PlaylistTrack;
use App\Models\User\Like;
use App\Models\User\Notification;
use App\Models\User\WatchHistory;
class VerifiedRoleSeeder extends RoleSeeder
{
@@ -28,7 +30,9 @@ class VerifiedRoleSeeder extends RoleSeeder
$role = Role::findOrCreate($roleEnum->value);
// User Resources
$this->configureResource($role, Like::class, [CrudPermission::VIEW, CrudPermission::CREATE, CrudPermission::DELETE]);
$this->configureResource($role, Like::class, CrudPermission::cases());
$this->configureResource($role, Notification::class, CrudPermission::cases());
$this->configureResource($role, WatchHistory::class, CrudPermission::cases());
// List Resources
$this->configureResource($role, ExternalEntry::class, [CrudPermission::VIEW]);