diff --git a/app/Auth/XenForoUser.php b/app/Auth/XenForoUser.php index 8cf5fcb..7d035e5 100644 --- a/app/Auth/XenForoUser.php +++ b/app/Auth/XenForoUser.php @@ -60,6 +60,7 @@ use Illuminate\Contracts\Auth\Authenticatable; * Custom properties. * * @property-read int $rhpz_entry_count + * @property-read int $nsfw_content */ class XenForoUser extends XenForoData implements Authenticatable, Authorizable, FilamentUser, HasName { diff --git a/app/Http/Requests/StoreEntryRequest.php b/app/Http/Requests/StoreEntryRequest.php index 276f472..91a5de9 100644 --- a/app/Http/Requests/StoreEntryRequest.php +++ b/app/Http/Requests/StoreEntryRequest.php @@ -138,6 +138,7 @@ class StoreEntryRequest extends FormRequest $ss .= ',locked'; $rules['submit-state'] = 'required|in:' . $ss; } else { + $rules['nsfw-entry'] = 'nullable|boolean'; if( $this->user()->can('skip-queue', '\App\Models\Entry') ){ $rules['submit-state'] = 'required|string|in:draft,pending,published'; } else { @@ -160,6 +161,7 @@ class StoreEntryRequest extends FormRequest $rules['comments_thread_id'] = 'nullable|integer'; $rules['featured'] = 'nullable|boolean'; $rules['refresh_created_at'] = 'nullable|boolean'; + $rules['nsfw-entry'] = 'nullable|boolean'; } return $rules; diff --git a/app/Models/Entry.php b/app/Models/Entry.php index 5fcb025..65fa513 100644 --- a/app/Models/Entry.php +++ b/app/Models/Entry.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Helpers\EntryHelpers; +use App\Models\Scopes\NsfwScope; use App\Traits\HasGallery; use App\Traits\HasXenforoUserId; use Illuminate\Database\Eloquent\Model; @@ -137,7 +138,8 @@ class Entry extends Model 'staff_comment', 'rejected_at', 'level_id', - 'created_at' + 'created_at', + 'nsfw' ]; /** @@ -151,11 +153,15 @@ class Entry extends Model ]; protected static function booted(): void { + + static::addGlobalScope(new NsfwScope); + static::saving( function( $entry ) { if( $entry->isDirty('version') ) { $entry->created_at = now(); } }); + } diff --git a/app/Models/Scopes/NsfwScope.php b/app/Models/Scopes/NsfwScope.php new file mode 100644 index 0000000..a84aa4a --- /dev/null +++ b/app/Models/Scopes/NsfwScope.php @@ -0,0 +1,29 @@ +nsfw_content === 1; + } + + /** + * Apply the scope to a given Eloquent query builder. + */ + public function apply(Builder $builder, Model $model): void + { + if( !$this->canNsfw() ) + $builder->where('nsfw', false ); + } +} diff --git a/app/Services/SubmissionsService.php b/app/Services/SubmissionsService.php index bef15f7..21c9267 100644 --- a/app/Services/SubmissionsService.php +++ b/app/Services/SubmissionsService.php @@ -174,7 +174,8 @@ class SubmissionsService { 'youtube_link' => $this->request->input('youtube_video'), 'user_id' => $user_id, 'complete_title' => $completeTitle, - 'level_id' => $this->request->input('level') + 'level_id' => $this->request->input('level'), + 'nsfw' => $this->request->input('nsfw-entry') ?? false, ]; $entry = Entry::create( $fields ); @@ -608,6 +609,7 @@ class SubmissionsService { $refresh_created_at = $this->request->input('refresh_created_at') ?? false; if( $refresh_created_at ) $fields['created_at'] = now(); + $fields['nsfw'] = $this->request->input('nsfw-entry') ?? false; } $this->entry->update( $fields ); diff --git a/database/migrations/2026_06_27_133557_add_nsfw_field_to_entries.php b/database/migrations/2026_06_27_133557_add_nsfw_field_to_entries.php new file mode 100644 index 0000000..83e79d3 --- /dev/null +++ b/database/migrations/2026_06_27_133557_add_nsfw_field_to_entries.php @@ -0,0 +1,28 @@ +boolean('nsfw')->default(false); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('entries', function (Blueprint $table) { + $table->dropColumn('nsfw'); + }); + } +}; diff --git a/resources/views/components/submit-entry-status.blade.php b/resources/views/components/submit-entry-status.blade.php index 581b50e..cb1e26f 100644 --- a/resources/views/components/submit-entry-status.blade.php +++ b/resources/views/components/submit-entry-status.blade.php @@ -26,7 +26,7 @@ @endif