Fix 'My Membership' 404 by adding missing profile flow

- Added a 'Create Member Profile' page for existing users who don't have a member record.
- Updated MemberDashboardController to redirect to profile creation instead of aborting 404.
- Added 'member.profile.create' and 'member.profile.store' routes.
This commit is contained in:
2025-11-28 00:25:04 +08:00
parent c7a1f9130e
commit 6890cf085d
3 changed files with 183 additions and 2 deletions

View File

@@ -2,7 +2,10 @@
namespace App\Http\Controllers;
use App\Models\Member;
use App\Support\AuditLogger;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class MemberDashboardController extends Controller
{
@@ -12,7 +15,7 @@ class MemberDashboardController extends Controller
$member = $user->member;
if (! $member) {
abort(404);
return redirect()->route('member.profile.create');
}
$member->load([
@@ -31,5 +34,58 @@ class MemberDashboardController extends Controller
'pendingPayment' => $pendingPayment,
]);
}
}
public function createProfile()
{
$user = Auth::user();
if ($user->member) {
return redirect()->route('member.dashboard');
}
return view('member.create-profile');
}
public function storeProfile(Request $request)
{
$user = Auth::user();
if ($user->member) {
return redirect()->route('member.dashboard');
}
$validated = $request->validate([
'full_name' => ['required', 'string', 'max:255'],
'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'],
]);
$member = Member::create([
'user_id' => $user->id,
'full_name' => $validated['full_name'],
'email' => $user->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.created_profile', $member, [
'user_id' => $user->id,
'name' => $member->full_name,
]);
return redirect()->route('member.dashboard')
->with('status', __('Profile completed! Please submit your membership payment.'));
}
}