feature flags and a bit on the design
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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.');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 [];
|
||||
}
|
||||
}
|
||||
@@ -40,6 +40,14 @@ class Product extends Model
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the route key for the model.
|
||||
*/
|
||||
public function getRouteKeyName(): string
|
||||
{
|
||||
return 'slug';
|
||||
}
|
||||
|
||||
/**
|
||||
* Boot the model.
|
||||
*/
|
||||
|
||||
@@ -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',
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user