feature flags and a bit on the design

This commit is contained in:
Doar Mihai
2026-02-15 16:24:47 +02:00
parent 4bc77d455b
commit 5a0e6e4165
22 changed files with 663 additions and 102 deletions
+16
View File
@@ -0,0 +1,16 @@
<?php
namespace App\Features;
use Illuminate\Support\Lottery;
class UpVotes
{
/**
* Resolve the feature's initial value.
*/
public function resolve(mixed $scope): mixed
{
return false;
}
}
+19
View File
@@ -0,0 +1,19 @@
<?php
namespace App\Features;
use Illuminate\Support\Lottery;
use Laravel\Pennant\Attributes\Name;
use Laravel\Pennant\Feature;
#[Name('WaitlistPage')]
class WaitlistPage
{
/**
* Resolve the feature's initial value.
*/
public function resolve(mixed $scope): mixed
{
return Feature::active('WaitlistPage');
}
}
@@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers;
use App\Mail\WaitlistWelcome;
use App\Models\WaitlistEntry;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use Illuminate\Validation\ValidationException;
class WaitlistController extends Controller
{
public function index()
{
return view('waitlist.index');
}
public function store(Request $request)
{
$request->validate([
'email' => 'required|email|unique:waitlist_entries,email',
]);
try {
$entry = WaitlistEntry::create([
'email' => $request->email,
]);
// Send welcome email
Mail::to($entry->email)->send(new WaitlistWelcome($entry));
return redirect()->back()->with('success', 'Thank you for joining our waitlist! Check your email for confirmation.');
} catch (\Exception $e) {
return redirect()->back()->with('error', 'Something went wrong. Please try again.');
}
}
}
+55
View File
@@ -0,0 +1,55 @@
<?php
namespace App\Mail;
use App\Models\WaitlistEntry;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class WaitlistWelcome extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(
public WaitlistEntry $entry
) {
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Welcome to Best Tech From EU Waitlist!',
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
view: 'emails.waitlist-welcome',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}
+8
View File
@@ -40,6 +40,14 @@ class Product extends Model
];
}
/**
* Get the route key for the model.
*/
public function getRouteKeyName(): string
{
return 'slug';
}
/**
* Boot the model.
*/
+17
View File
@@ -0,0 +1,17 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class WaitlistEntry extends Model
{
protected $fillable = [
'email',
'notified',
];
protected $casts = [
'notified' => 'boolean',
];
}