From a2a640809aa013a5df6fcffe338cf548fb5efe1c Mon Sep 17 00:00:00 2001 From: HolgerHatGarKeineNode <123783602+HolgerHatGarKeineNode@users.noreply.github.com> Date: Mon, 29 Jun 2026 22:20:01 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Refactor=20components=20and=20model?= =?UTF-8?q?s:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 🔥 Removed deprecated `placeholder-pattern` component. - 🧹 Simplified and cleaned up Blade views by removing unused comments and sections. - 🗂️ Extracted `SetsCreatedBy` concern for DRY and reused it across models. - 🔧 Consolidated configuration for Horizon `authorized_nostr_keys`. - 🧪 Migrated media conversion to use new Spatie enums for clarity. - ♻️ Replaced repetitive link rendering with dynamic rendering in meetups and services views. --- .../Controllers/Api/CountryController.php | 25 ------ app/Http/Controllers/Api/CourseController.php | 7 -- .../Controllers/Api/LanguageController.php | 41 --------- app/Http/Controllers/LnurlAuthController.php | 20 ++--- app/Http/Middleware/SetTimezone.php | 17 +--- app/Models/BitcoinEvent.php | 17 ++-- app/Models/City.php | 19 ++-- app/Models/Concerns/SetsCreatedBy.php | 17 ++++ app/Models/Course.php | 11 +-- app/Models/CourseEvent.php | 11 +-- app/Models/Episode.php | 11 +-- app/Models/Lecturer.php | 16 +--- app/Models/Library.php | 11 +-- app/Models/LibraryItem.php | 32 ++----- app/Models/Meetup.php | 8 +- app/Models/MeetupEvent.php | 11 +-- app/Models/Podcast.php | 11 +-- app/Models/ProjectProposal.php | 17 ++-- app/Models/User.php | 10 --- app/Models/Venue.php | 23 +---- app/Providers/HorizonServiceProvider.php | 14 +-- config/horizon.php | 16 ++++ .../components/placeholder-pattern.blade.php | 12 --- .../livewire/auth/confirm-password.blade.php | 2 - .../livewire/auth/forgot-password.blade.php | 2 - resources/views/livewire/auth/login.blade.php | 36 -------- .../livewire/auth/reset-password.blade.php | 4 - .../views/livewire/meetups/index.blade.php | 60 ++++--------- .../views/livewire/services/index.blade.php | 88 ++++++------------- 29 files changed, 130 insertions(+), 439 deletions(-) create mode 100644 app/Models/Concerns/SetsCreatedBy.php delete mode 100644 resources/views/components/placeholder-pattern.blade.php diff --git a/app/Http/Controllers/Api/CountryController.php b/app/Http/Controllers/Api/CountryController.php index 51ee82d..8ee9df7 100644 --- a/app/Http/Controllers/Api/CountryController.php +++ b/app/Http/Controllers/Api/CountryController.php @@ -4,7 +4,6 @@ namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use App\Models\Country; -use Dedoc\Scramble\Attributes\ExcludeRouteFromDocs; use Dedoc\Scramble\Attributes\Group; use Dedoc\Scramble\Attributes\QueryParameter; use Illuminate\Database\Eloquent\Builder; @@ -48,28 +47,4 @@ class CountryController extends Controller return $country; }); } - - #[ExcludeRouteFromDocs] - public function store(Request $request) - { - // - } - - #[ExcludeRouteFromDocs] - public function show(Country $country) - { - // - } - - #[ExcludeRouteFromDocs] - public function update(Request $request, Country $country) - { - // - } - - #[ExcludeRouteFromDocs] - public function destroy(Country $country) - { - // - } } diff --git a/app/Http/Controllers/Api/CourseController.php b/app/Http/Controllers/Api/CourseController.php index 7658ae8..6ecf3ef 100644 --- a/app/Http/Controllers/Api/CourseController.php +++ b/app/Http/Controllers/Api/CourseController.php @@ -11,7 +11,6 @@ use App\Http\Resources\CourseResource; use App\Models\Course; use App\Models\CourseEvent; use App\Models\Lecturer; -use Dedoc\Scramble\Attributes\ExcludeRouteFromDocs; use Dedoc\Scramble\Attributes\Group; use Dedoc\Scramble\Attributes\QueryParameter; use Dedoc\Scramble\Attributes\Response as ResponseAttribute; @@ -201,10 +200,4 @@ class CourseController extends Controller return CourseResource::make($course->fresh()); } - - #[ExcludeRouteFromDocs] - public function destroy(Course $course) - { - // - } } diff --git a/app/Http/Controllers/Api/LanguageController.php b/app/Http/Controllers/Api/LanguageController.php index e1f40e0..2c55b04 100644 --- a/app/Http/Controllers/Api/LanguageController.php +++ b/app/Http/Controllers/Api/LanguageController.php @@ -6,7 +6,6 @@ use App\Http\Controllers\Controller; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Http\Response; use JoeDixon\Translation\Language; use JoeDixon\Translation\Translation; @@ -57,44 +56,4 @@ class LanguageController extends Controller return response()->json($array); } - - /** - * Store a newly created resource in storage. - * - * @return Response - */ - public function store(Request $request) - { - // - } - - /** - * Display the specified resource. - * - * @return Response - */ - public function show(Language $language) - { - // - } - - /** - * Update the specified resource in storage. - * - * @return Response - */ - public function update(Request $request, Language $language) - { - // - } - - /** - * Remove the specified resource from storage. - * - * @return Response - */ - public function destroy(Language $language) - { - // - } } diff --git a/app/Http/Controllers/LnurlAuthController.php b/app/Http/Controllers/LnurlAuthController.php index 30d1f82..3d9795f 100644 --- a/app/Http/Controllers/LnurlAuthController.php +++ b/app/Http/Controllers/LnurlAuthController.php @@ -60,7 +60,11 @@ final class LnurlAuthController extends Controller } $user = $this->findOrCreateUser($validated['k1'], $validated['key']); - $this->ensureLoginKeyExists($validated['k1'], $user->id); + + LoginKey::query()->updateOrCreate( + ['k1' => $validated['k1']], + ['user_id' => $user->id], + ); Log::info('LNURL auth successful', [ 'user_id' => $user->id, @@ -150,20 +154,6 @@ final class LnurlAuthController extends Controller ]); } - /** - * Ensure a login key record exists for the given challenge. - * - * @param string $k1 The challenge identifier - * @param int $userId The user ID - */ - private function ensureLoginKeyExists(string $k1, int $userId): void - { - LoginKey::query()->updateOrCreate( - ['k1' => $k1], - ['user_id' => $userId], - ); - } - /** * Return an LNURL-compliant error response. * diff --git a/app/Http/Middleware/SetTimezone.php b/app/Http/Middleware/SetTimezone.php index 24f635c..6cc2b6b 100644 --- a/app/Http/Middleware/SetTimezone.php +++ b/app/Http/Middleware/SetTimezone.php @@ -11,24 +11,15 @@ class SetTimezone /** * Handle an incoming request. * - * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next + * @param Closure(Request): (Response) $next */ public function handle(Request $request, Closure $next): Response { - if ( - $request->user() - && $timezone = $request->user()->timezone - ) { - config([ - 'app.timezone' => $timezone, - 'app.user-timezone' => $timezone, - ]); + $timezone = $request->user()?->timezone ?: 'Europe/Berlin'; - return $next($request); - } config([ - 'app.timezone' => 'Europe/Berlin', - 'app.user-timezone' => 'Europe/Berlin', + 'app.timezone' => $timezone, + 'app.user-timezone' => $timezone, ]); return $next($request); diff --git a/app/Models/BitcoinEvent.php b/app/Models/BitcoinEvent.php index 8e4f6f5..b48ef62 100644 --- a/app/Models/BitcoinEvent.php +++ b/app/Models/BitcoinEvent.php @@ -2,10 +2,11 @@ namespace App\Models; +use App\Models\Concerns\SetsCreatedBy; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Spatie\Image\Manipulations; +use Spatie\Image\Enums\Fit; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\MediaCollections\Models\Media; @@ -14,6 +15,7 @@ class BitcoinEvent extends Model implements HasMedia { use HasFactory; use InteractsWithMedia; + use SetsCreatedBy; /** * The attributes that aren't mass assignable. @@ -34,23 +36,14 @@ class BitcoinEvent extends Model implements HasMedia 'to' => 'datetime', ]; - protected static function booted() - { - static::creating(function ($model) { - if (! $model->created_by) { - $model->created_by = auth()->id(); - } - }); - } - public function registerMediaConversions(?Media $media = null): void { $this ->addMediaConversion('preview') - ->fit(Manipulations::FIT_CROP, 300, 300) + ->fit(Fit::Crop, 300, 300) ->nonQueued(); $this->addMediaConversion('thumb') - ->fit(Manipulations::FIT_CROP, 130, 130) + ->fit(Fit::Crop, 130, 130) ->width(130) ->height(130); } diff --git a/app/Models/City.php b/app/Models/City.php index b037c61..85d4990 100644 --- a/app/Models/City.php +++ b/app/Models/City.php @@ -3,6 +3,7 @@ namespace App\Models; use Akuechler\Geoly; +use App\Models\Concerns\SetsCreatedBy; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -13,9 +14,10 @@ use Spatie\Sluggable\SlugOptions; class City extends Model { + use Geoly; use HasFactory; use HasSlug; - use Geoly; + use SetsCreatedBy; /** * The attributes that aren't mass assignable. @@ -36,24 +38,15 @@ class City extends Model 'simplified_geojson' => 'json', ]; - protected static function booted() - { - static::creating(function ($model) { - if (! $model->created_by) { - $model->created_by = auth()->id(); - } - }); - } - /** * Get the options for generating the slug. */ public function getSlugOptions(): SlugOptions { return SlugOptions::create() - ->generateSlugsFrom(['country.code', 'name']) - ->saveSlugsTo('slug') - ->usingLanguage(Cookie::get('lang', config('app.locale'))); + ->generateSlugsFrom(['country.code', 'name']) + ->saveSlugsTo('slug') + ->usingLanguage(Cookie::get('lang', config('app.locale'))); } public function createdBy(): BelongsTo diff --git a/app/Models/Concerns/SetsCreatedBy.php b/app/Models/Concerns/SetsCreatedBy.php new file mode 100644 index 0000000..7662440 --- /dev/null +++ b/app/Models/Concerns/SetsCreatedBy.php @@ -0,0 +1,17 @@ +check() && ! $model->created_by) { + $model->created_by = auth()->id(); + } + }); + } +} diff --git a/app/Models/Course.php b/app/Models/Course.php index d36b191..b5a261e 100644 --- a/app/Models/Course.php +++ b/app/Models/Course.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Models\Concerns\SetsCreatedBy; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -18,6 +19,7 @@ class Course extends Model implements HasMedia use HasFactory; use HasTags; use InteractsWithMedia; + use SetsCreatedBy; /** * @var array @@ -38,15 +40,6 @@ class Course extends Model implements HasMedia 'lecturer_id' => 'integer', ]; - protected static function booted() - { - static::creating(function ($model) { - if (! $model->created_by) { - $model->created_by = auth()->id(); - } - }); - } - public function registerMediaConversions(?Media $media = null): void { $this diff --git a/app/Models/CourseEvent.php b/app/Models/CourseEvent.php index 903ae66..1a30116 100644 --- a/app/Models/CourseEvent.php +++ b/app/Models/CourseEvent.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Models\Concerns\SetsCreatedBy; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -10,6 +11,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany; class CourseEvent extends Model { use HasFactory; + use SetsCreatedBy; /** * The attributes that aren't mass assignable. @@ -31,15 +33,6 @@ class CourseEvent extends Model 'to' => 'datetime', ]; - protected static function booted() - { - static::creating(function ($model) { - if (! $model->created_by) { - $model->created_by = auth()->id(); - } - }); - } - public function createdBy(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); diff --git a/app/Models/Episode.php b/app/Models/Episode.php index da660a4..ec9d442 100644 --- a/app/Models/Episode.php +++ b/app/Models/Episode.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Models\Concerns\SetsCreatedBy; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -12,6 +13,7 @@ class Episode extends Model { use HasFactory; use HasTags; + use SetsCreatedBy; /** * The attributes that aren't mass assignable. @@ -31,15 +33,6 @@ class Episode extends Model 'data' => 'array', ]; - protected static function booted() - { - static::creating(function ($model) { - if (! $model->created_by) { - $model->created_by = auth()->id(); - } - }); - } - public function createdBy(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); diff --git a/app/Models/Lecturer.php b/app/Models/Lecturer.php index cd21e9d..e503331 100644 --- a/app/Models/Lecturer.php +++ b/app/Models/Lecturer.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Models\Concerns\SetsCreatedBy; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -20,6 +21,7 @@ class Lecturer extends Model implements HasMedia use HasFactory; use HasSlug; use InteractsWithMedia; + use SetsCreatedBy; /** * @var array @@ -51,15 +53,6 @@ class Lecturer extends Model implements HasMedia 'active' => 'boolean', ]; - protected static function booted() - { - static::creating(function ($model) { - if (! $model->created_by) { - $model->created_by = auth()->id(); - } - }); - } - public function registerMediaConversions(?Media $media = null): void { $this @@ -99,11 +92,6 @@ class Lecturer extends Model implements HasMedia return $this->belongsTo(User::class, 'created_by'); } - public function team(): BelongsTo - { - return $this->belongsTo(Team::class); - } - public function courses(): HasMany { return $this->hasMany(Course::class); diff --git a/app/Models/Library.php b/app/Models/Library.php index c572470..c42bfd4 100644 --- a/app/Models/Library.php +++ b/app/Models/Library.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Models\Concerns\SetsCreatedBy; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -10,6 +11,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany; class Library extends Model { use HasFactory; + use SetsCreatedBy; /** * The attributes that aren't mass assignable. @@ -28,15 +30,6 @@ class Library extends Model 'language_codes' => 'array', ]; - protected static function booted() - { - static::creating(function ($model) { - if (! $model->created_by) { - $model->created_by = auth()->id(); - } - }); - } - public function createdBy(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); diff --git a/app/Models/LibraryItem.php b/app/Models/LibraryItem.php index 17a6cf3..468e03a 100644 --- a/app/Models/LibraryItem.php +++ b/app/Models/LibraryItem.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Models\Concerns\SetsCreatedBy; use App\Support\CustomFeedItem; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -11,7 +12,7 @@ use Illuminate\Support\Facades\Cookie; use Spatie\EloquentSortable\Sortable; use Spatie\EloquentSortable\SortableTrait; use Spatie\Feed\Feedable; -use Spatie\Image\Manipulations; +use Spatie\Image\Enums\Fit; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\MediaCollections\Models\Media; @@ -27,6 +28,7 @@ class LibraryItem extends Model implements Feedable, HasMedia, Sortable use HasStatuses; use HasTags; use InteractsWithMedia; + use SetsCreatedBy; use SortableTrait; /** @@ -60,15 +62,6 @@ class LibraryItem extends Model implements Feedable, HasMedia, Sortable ->get(); } - protected static function booted() - { - static::creating(function ($model) { - if (! $model->created_by) { - $model->created_by = auth()->id(); - } - }); - } - public function getSlugOptions(): SlugOptions { return SlugOptions::create() @@ -81,13 +74,13 @@ class LibraryItem extends Model implements Feedable, HasMedia, Sortable { $this ->addMediaConversion('preview') - ->fit(Manipulations::FIT_CROP, 300, 300) + ->fit(Fit::Crop, 300, 300) ->nonQueued(); $this->addMediaConversion('seo') - ->fit(Manipulations::FIT_CROP, 1200, 630) + ->fit(Fit::Crop, 1200, 630) ->nonQueued(); $this->addMediaConversion('thumb') - ->fit(Manipulations::FIT_CROP, 130, 130) + ->fit(Fit::Crop, 130, 130) ->width(130) ->height(130); } @@ -149,17 +142,4 @@ class LibraryItem extends Model implements Feedable, HasMedia, Sortable ->link(url()->route('article.view', ['libraryItem' => $this])) ->authorName($this->lecturer->name); } - - public static function searchLibraryItems($type, $value = null) - { - $query = self::query() - ->where('type', $type) - ->latest('id'); - - if ($value) { - $query->whereLike('name', "%{$value}%"); - } - - return $query->get(); - } } diff --git a/app/Models/Meetup.php b/app/Models/Meetup.php index 7c2e0b2..5738f15 100644 --- a/app/Models/Meetup.php +++ b/app/Models/Meetup.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Models\Concerns\SetsCreatedBy; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -24,6 +25,7 @@ class Meetup extends Model implements HasMedia use HasFactory; use HasSlug; use InteractsWithMedia; + use SetsCreatedBy; /** * @var array @@ -120,12 +122,6 @@ class Meetup extends Model implements HasMedia protected static function booted() { - static::creating(function ($model) { - if (! $model->created_by) { - $model->created_by = auth()->id(); - } - }); - // Der Ersteller wird automatisch als Leiter in die meetup_user-Pivot eingetragen, // damit das Meetup einheitlich (MCP, REST-API, Livewire) in „Meine Meetups" // erscheint – egal über welchen Pfad es angelegt wurde. diff --git a/app/Models/MeetupEvent.php b/app/Models/MeetupEvent.php index 84120ca..4ddda76 100644 --- a/app/Models/MeetupEvent.php +++ b/app/Models/MeetupEvent.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Enums\RecurrenceType; use App\Enums\RsvpStatus; +use App\Models\Concerns\SetsCreatedBy; use App\Observers\MeetupEventObserver; use Illuminate\Database\Eloquent\Attributes\ObservedBy; use Illuminate\Database\Eloquent\Builder; @@ -16,6 +17,7 @@ use Illuminate\Support\Collection; class MeetupEvent extends Model { use HasFactory; + use SetsCreatedBy; /** * The attributes that aren't mass assignable. @@ -47,15 +49,6 @@ class MeetupEvent extends Model 'recurrence_type' => RecurrenceType::class, ]; - protected static function booted() - { - static::creating(function ($model) { - if (! $model->created_by) { - $model->created_by = auth()->id(); - } - }); - } - /** * Termine, die der Nutzer bearbeiten darf: selbst angelegt ODER Leader des * zugehörigen Meetups (deckungsgleich mit MeetupEventPolicy::update). diff --git a/app/Models/Podcast.php b/app/Models/Podcast.php index 7730bba..7abb00b 100644 --- a/app/Models/Podcast.php +++ b/app/Models/Podcast.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Models\Concerns\SetsCreatedBy; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -10,6 +11,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany; class Podcast extends Model { use HasFactory; + use SetsCreatedBy; /** * The attributes that aren't mass assignable. @@ -28,15 +30,6 @@ class Podcast extends Model 'data' => 'array', ]; - protected static function booted() - { - static::creating(function ($model) { - if (! $model->created_by) { - $model->created_by = auth()->id(); - } - }); - } - public function createdBy(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); diff --git a/app/Models/ProjectProposal.php b/app/Models/ProjectProposal.php index 50b51d6..b0a4f93 100644 --- a/app/Models/ProjectProposal.php +++ b/app/Models/ProjectProposal.php @@ -2,12 +2,13 @@ namespace App\Models; +use App\Models\Concerns\SetsCreatedBy; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Support\Facades\Cookie; -use Spatie\Image\Manipulations; +use Spatie\Image\Enums\Fit; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\MediaCollections\Models\Media; @@ -19,6 +20,7 @@ class ProjectProposal extends Model implements HasMedia use HasFactory; use HasSlug; use InteractsWithMedia; + use SetsCreatedBy; /** * The attributes that aren't mass assignable. @@ -37,15 +39,6 @@ class ProjectProposal extends Model implements HasMedia 'user_id' => 'integer', ]; - protected static function booted() - { - static::creating(function ($model) { - if (! $model->created_by) { - $model->created_by = auth()->id(); - } - }); - } - public function getSlugOptions(): SlugOptions { return SlugOptions::create() @@ -58,10 +51,10 @@ class ProjectProposal extends Model implements HasMedia { $this ->addMediaConversion('preview') - ->fit(Manipulations::FIT_CROP, 300, 300) + ->fit(Fit::Crop, 300, 300) ->nonQueued(); $this->addMediaConversion('thumb') - ->fit(Manipulations::FIT_CROP, 130, 130) + ->fit(Fit::Crop, 130, 130) ->width(130) ->height(130); } diff --git a/app/Models/User.php b/app/Models/User.php index 160e472..0ad4c3d 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -108,21 +108,11 @@ class User extends Authenticatable implements CipherSweetEncrypted return $this->belongsToMany(Meetup::class)->withPivot('is_leader'); } - public function reputations() - { - return $this->morphMany('QCod\Gamify\Reputation', 'subject'); - } - public function votes() { return $this->hasMany(Vote::class); } - public function paidArticles() - { - return $this->belongsToMany(LibraryItem::class, 'library_item_user', 'user_id', 'library_item_id'); - } - public function updateProfilePhoto(UploadedFile $photo) { tap($this->profile_photo_path, function ($previous) use ($photo) { diff --git a/app/Models/Venue.php b/app/Models/Venue.php index 0246698..e59d1fe 100644 --- a/app/Models/Venue.php +++ b/app/Models/Venue.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Models\Concerns\SetsCreatedBy; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -13,14 +14,13 @@ use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\MediaCollections\Models\Media; use Spatie\Sluggable\HasSlug; use Spatie\Sluggable\SlugOptions; -use Staudenmeir\EloquentHasManyDeep\HasRelationships; class Venue extends Model implements HasMedia { use HasFactory; - use HasRelationships; use HasSlug; use InteractsWithMedia; + use SetsCreatedBy; /** * The attributes that aren't mass assignable. @@ -39,15 +39,6 @@ class Venue extends Model implements HasMedia 'city_id' => 'integer', ]; - protected static function booted() - { - static::creating(function ($model) { - if (! $model->created_by) { - $model->created_by = auth()->id(); - } - }); - } - public function registerMediaConversions(?Media $media = null): void { $this @@ -88,16 +79,6 @@ class Venue extends Model implements HasMedia return $this->belongsTo(City::class); } - public function lecturers() - { - return $this->hasManyDeepFromRelations($this->courses(), (new Course)->lecturer()); - } - - public function courses() - { - return $this->hasManyDeepFromRelations($this->events(), (new CourseEvent)->course()); - } - public function courseEvents(): HasMany { return $this->hasMany(CourseEvent::class); diff --git a/app/Providers/HorizonServiceProvider.php b/app/Providers/HorizonServiceProvider.php index 9d945a8..e4b7215 100644 --- a/app/Providers/HorizonServiceProvider.php +++ b/app/Providers/HorizonServiceProvider.php @@ -3,7 +3,6 @@ namespace App\Providers; use Illuminate\Support\Facades\Gate; -use Laravel\Horizon\Horizon; use Laravel\Horizon\HorizonApplicationServiceProvider; class HorizonServiceProvider extends HorizonApplicationServiceProvider @@ -14,10 +13,6 @@ class HorizonServiceProvider extends HorizonApplicationServiceProvider public function boot(): void { parent::boot(); - - // Horizon::routeSmsNotificationsTo('15556667777'); - // Horizon::routeMailNotificationsTo('example@example.com'); - // Horizon::routeSlackNotificationsTo('slack-webhook-url', '#channel'); } /** @@ -28,11 +23,10 @@ class HorizonServiceProvider extends HorizonApplicationServiceProvider protected function gate(): void { Gate::define('viewHorizon', function ($user = null) { - return in_array(optional($user)->nostr, [ - 'npub1kz50hl2fk8rkkax3mv8kzx7vdhh3nmuegncsaj8r23w2a49nf3wsne6ejy', - 'npub1pt0kw36ue3w2g4haxq3wgm6a2fhtptmzsjlc2j2vphtcgle72qesgpjyc6', - 'npub1qwj482ffpvnwy4g7twejs4ckgnag9yxpjndqslk6juagmngwwhfsqfe5vq', - ]); + return in_array( + optional($user)->nostr, + config('horizon.authorized_nostr_keys', []), + ); }); } } diff --git a/config/horizon.php b/config/horizon.php index d9dc946..eab4dd1 100644 --- a/config/horizon.php +++ b/config/horizon.php @@ -85,6 +85,22 @@ return [ 'middleware' => ['web'], + /* + |-------------------------------------------------------------------------- + | Authorized Nostr Keys + |-------------------------------------------------------------------------- + | + | These Nostr public keys (npub) are allowed to access the Horizon + | dashboard via the "viewHorizon" gate in non-local environments. + | + */ + + 'authorized_nostr_keys' => [ + 'npub1kz50hl2fk8rkkax3mv8kzx7vdhh3nmuegncsaj8r23w2a49nf3wsne6ejy', + 'npub1pt0kw36ue3w2g4haxq3wgm6a2fhtptmzsjlc2j2vphtcgle72qesgpjyc6', + 'npub1qwj482ffpvnwy4g7twejs4ckgnag9yxpjndqslk6juagmngwwhfsqfe5vq', + ], + /* |-------------------------------------------------------------------------- | Queue Wait Time Thresholds diff --git a/resources/views/components/placeholder-pattern.blade.php b/resources/views/components/placeholder-pattern.blade.php deleted file mode 100644 index 8a434f0..0000000 --- a/resources/views/components/placeholder-pattern.blade.php +++ /dev/null @@ -1,12 +0,0 @@ -@props([ - 'id' => uniqid(), -]) - - - - - - - - - diff --git a/resources/views/livewire/auth/confirm-password.blade.php b/resources/views/livewire/auth/confirm-password.blade.php index dde8b71..07c53d9 100644 --- a/resources/views/livewire/auth/confirm-password.blade.php +++ b/resources/views/livewire/auth/confirm-password.blade.php @@ -42,11 +42,9 @@ class extends Component { :description="__('This is a secure area of the application. Please confirm your password before continuing.')" /> -
- - - str(session('lang_country', config('app.domain_country')))->after('-')->lower()], absolute: false), ); - - return; - - $this->validate(); - - $this->ensureIsNotRateLimited(); - - if (!Auth::attempt(['email' => $this->email, 'password' => $this->password], $this->remember)) { - RateLimiter::hit($this->throttleKey()); - - throw ValidationException::withMessages([ - 'email' => __('auth.failed'), - ]); - } - - RateLimiter::clear($this->throttleKey()); - Session::regenerate(); - session([ - 'lang_country' => $this->currentLangCountry, - ]); - - $this->redirectIntended( - default: route('dashboard', - ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()], - absolute: false), - navigate: true, - ); } /** @@ -276,7 +249,6 @@ class extends Component { data-nostr-challenge="{{ $nostrChallenge ?? '' }}">
-
- {{ __('Willkommen zurück') }} - -
-
-
-
-
Bitcoin, not blockchain. Bitcoin, not crypto.
-
diff --git a/resources/views/livewire/auth/reset-password.blade.php b/resources/views/livewire/auth/reset-password.blade.php index 1ebc64b..803d0a1 100644 --- a/resources/views/livewire/auth/reset-password.blade.php +++ b/resources/views/livewire/auth/reset-password.blade.php @@ -75,11 +75,9 @@ class extends Component {
- - - - + @php + $socialLinks = [ + ['value' => $meetup->telegram_link, 'href' => $meetup->telegram_link, 'icon' => 'paper-airplane', 'title' => __('Telegram')], + ['value' => $meetup->webpage, 'href' => $meetup->webpage, 'icon' => 'globe-alt', 'title' => __('Website')], + ['value' => $meetup->twitter_username, 'href' => 'https://twitter.com/'.$meetup->twitter_username, 'icon' => 'x-mark', 'title' => __('Twitter')], + ['value' => $meetup->matrix_group, 'href' => $meetup->matrix_group, 'icon' => 'chat-bubble-left', 'title' => __('Matrix')], + ['value' => $meetup->nostr, 'href' => 'https://njump.me/'.$meetup->nostr, 'icon' => 'bolt', 'title' => __('Nostr')], + ['value' => $meetup->simplex, 'href' => $meetup->simplex, 'icon' => 'chat-bubble-bottom-center-text', 'title' => __('Simplex')], + ['value' => $meetup->signal, 'href' => $meetup->signal, 'icon' => 'shield-check', 'title' => __('Signal')], + ]; + @endphp
- @if($meetup->telegram_link) - - - - @endif - @if($meetup->webpage) - - - - @endif - @if($meetup->twitter_username) - - - - @endif - @if($meetup->matrix_group) - - - - @endif - @if($meetup->nostr) - - - - @endif - @if($meetup->simplex) - - - - @endif - @if($meetup->signal) - - - - @endif + @foreach($socialLinks as $socialLink) + @if($socialLink['value']) + + + + @endif + @endforeach
diff --git a/resources/views/livewire/services/index.blade.php b/resources/views/livewire/services/index.blade.php index 9d5448b..a360c09 100644 --- a/resources/views/livewire/services/index.blade.php +++ b/resources/views/livewire/services/index.blade.php @@ -107,71 +107,33 @@ class extends Component { + @php + $serviceUrls = [ + ['href' => $service->url_clearnet, 'color' => 'text-blue-600 dark:text-blue-400', 'icon' => 'globe-alt', 'label' => 'Clearnet'], + ['href' => $service->url_onion, 'color' => 'text-purple-600 dark:text-purple-400', 'icon' => 'lock-closed', 'label' => 'Onion'], + ['href' => $service->url_i2p, 'color' => 'text-green-600 dark:text-green-400', 'icon' => 'link', 'label' => 'I2P'], + ['href' => $service->url_pkdns, 'color' => 'text-orange-600 dark:text-orange-400', 'icon' => 'link', 'label' => 'pkdns'], + ]; + @endphp
- @if($service->url_clearnet) -
- - - - Clearnet - - -
- - {{ __('Copy') }} - + @foreach($serviceUrls as $serviceUrl) + @if($serviceUrl['href']) +
+ + + + {{ $serviceUrl['label'] }} + + +
+ + {{ __('Copy') }} + +
-
- @endif - @if($service->url_onion) -
- - - - Onion - - -
- - {{ __('Copy') }} - -
-
- @endif - @if($service->url_i2p) -
- - - - I2P - - -
- - {{ __('Copy') }} - -
-
- @endif - @if($service->url_pkdns) -
- - - - pkdns - - -
- - {{ __('Copy') }} - -
-
- @endif + @endif + @endforeach @if($service->ip)