Files
usher-manage-stack/app/Http/Controllers/PublicMemberRegistrationController.php
2025-11-20 23:21:05 +08:00

89 lines
3.4 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Mail\MemberRegistrationWelcomeMail;
use App\Models\Member;
use App\Models\User;
use App\Support\AuditLogger;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Illuminate\Validation\Rules\Password;
class PublicMemberRegistrationController extends Controller
{
/**
* Show the member registration form
*/
public function create()
{
return view('register.member');
}
/**
* Handle member registration
*/
public function store(Request $request)
{
$validated = $request->validate([
'full_name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email', 'unique:members,email'],
'password' => ['required', 'confirmed', Password::defaults()],
'phone' => ['nullable', 'string', 'max:20'],
'national_id' => ['nullable', 'string', 'max:20'],
'address_line_1' => ['nullable', 'string', 'max:255'],
'address_line_2' => ['nullable', 'string', 'max:255'],
'city' => ['nullable', 'string', 'max:100'],
'postal_code' => ['nullable', 'string', 'max:10'],
'emergency_contact_name' => ['nullable', 'string', 'max:255'],
'emergency_contact_phone' => ['nullable', 'string', 'max:20'],
'terms_accepted' => ['required', 'accepted'],
]);
// Create user and member in a transaction
$member = DB::transaction(function () use ($validated) {
// Create user account
$user = User::create([
'name' => $validated['full_name'],
'email' => $validated['email'],
'password' => Hash::make($validated['password']),
]);
// Create member record with pending status
$member = Member::create([
'user_id' => $user->id,
'full_name' => $validated['full_name'],
'email' => $validated['email'],
'phone' => $validated['phone'] ?? null,
'national_id' => $validated['national_id'] ?? null,
'address_line_1' => $validated['address_line_1'] ?? null,
'address_line_2' => $validated['address_line_2'] ?? null,
'city' => $validated['city'] ?? null,
'postal_code' => $validated['postal_code'] ?? null,
'emergency_contact_name' => $validated['emergency_contact_name'] ?? null,
'emergency_contact_phone' => $validated['emergency_contact_phone'] ?? null,
'membership_status' => Member::STATUS_PENDING,
'membership_type' => Member::TYPE_REGULAR,
]);
AuditLogger::log('member.self_registered', $member, [
'email' => $member->email,
'name' => $member->full_name,
]);
return $member;
});
// Send welcome email with payment instructions
Mail::to($member->email)->queue(new MemberRegistrationWelcomeMail($member));
// Log the user in
auth()->loginUsingId($member->user_id);
return redirect()->route('member.dashboard')
->with('status', __('Registration successful! Please submit your membership payment to complete your registration.'));
}
}