feat: initial project with Phase 1 complete

This commit is contained in:
2026-04-03 19:56:38 +02:00
commit 904cf1241b
132 changed files with 17894 additions and 0 deletions

View File

@@ -0,0 +1,39 @@
<?php
declare(strict_types=1);
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class MailwizzConfig extends Model
{
use HasFactory;
protected $fillable = [
'preregistration_page_id',
'api_key',
'list_uid',
'list_name',
'field_email',
'field_first_name',
'field_last_name',
'field_phone',
'tag_field',
'tag_value',
];
protected function casts(): array
{
return [
'api_key' => 'encrypted',
];
}
public function preregistrationPage(): BelongsTo
{
return $this->belongsTo(PreregistrationPage::class);
}
}

View File

@@ -0,0 +1,89 @@
<?php
declare(strict_types=1);
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
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\Database\Eloquent\Relations\HasOne;
use Illuminate\Support\Carbon;
class PreregistrationPage extends Model
{
use HasFactory;
protected $fillable = [
'slug',
'user_id',
'title',
'heading',
'intro_text',
'thank_you_message',
'expired_message',
'ticketshop_url',
'start_date',
'end_date',
'phone_enabled',
'background_image',
'logo_image',
'is_active',
];
protected function casts(): array
{
return [
'start_date' => 'datetime',
'end_date' => 'datetime',
'phone_enabled' => 'boolean',
'is_active' => 'boolean',
];
}
/**
* Route model binding uses 'slug' instead of 'id'.
*/
public function getRouteKeyName(): string
{
return 'slug';
}
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function subscribers(): HasMany
{
return $this->hasMany(Subscriber::class);
}
public function mailwizzConfig(): HasOne
{
return $this->hasOne(MailwizzConfig::class);
}
public function isBeforeStart(): bool
{
return Carbon::now()->lt($this->start_date);
}
public function isActive(): bool
{
$now = Carbon::now();
return $now->gte($this->start_date) && $now->lte($this->end_date);
}
public function isExpired(): bool
{
return Carbon::now()->gt($this->end_date);
}
public function scopeActive(Builder $query): Builder
{
return $query->where('is_active', true);
}
}

37
app/Models/Subscriber.php Normal file
View File

@@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Subscriber extends Model
{
use HasFactory;
protected $fillable = [
'preregistration_page_id',
'first_name',
'last_name',
'email',
'phone',
'synced_to_mailwizz',
'synced_at',
];
protected function casts(): array
{
return [
'synced_to_mailwizz' => 'boolean',
'synced_at' => 'datetime',
];
}
public function preregistrationPage(): BelongsTo
{
return $this->belongsTo(PreregistrationPage::class);
}
}

52
app/Models/User.php Normal file
View File

@@ -0,0 +1,52 @@
<?php
declare(strict_types=1);
namespace App\Models;
use Database\Factories\UserFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
/** @use HasFactory<UserFactory> */
use HasFactory, Notifiable;
protected $fillable = [
'name',
'email',
'password',
'role',
];
protected $hidden = [
'password',
'remember_token',
];
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
public function preregistrationPages(): HasMany
{
return $this->hasMany(PreregistrationPage::class);
}
public function isSuperadmin(): bool
{
return $this->role === 'superadmin';
}
public function isUser(): bool
{
return $this->role === 'user';
}
}