1+ <?php
2+
3+ namespace App \Http \Middleware ;
4+
5+ use App \Models \Event ;
6+ use App \Models \EventUser ;
7+ use App \Services \TokenRefreshService ;
8+ use Closure ;
9+ use Illuminate \Http \Request ;
10+ use Illuminate \Support \Facades \Auth ;
11+ use Illuminate \Support \Facades \Http ;
12+ use Illuminate \Support \Facades \Log ;
13+
14+ class EnsureEventUserMiddleware
15+ {
16+ public function handle (Request $ request , Closure $ next )
17+ {
18+ $ user = $ request ->user ();
19+
20+ if (!$ user ) {
21+ return $ next ($ request );
22+ }
23+
24+ $ activeEvent = Event::getActiveEvent ();
25+
26+ if (!$ activeEvent ) {
27+ return $ next ($ request );
28+ }
29+
30+ // Check if user already has an EventUser entry for current event
31+ $ eventUser = EventUser::where ([
32+ 'user_id ' => $ user ->id ,
33+ 'event_id ' => $ activeEvent ->id ,
34+ ])->first ();
35+
36+ if ($ eventUser && $ eventUser ->valid_registration ) {
37+ return $ next ($ request );
38+ }
39+
40+ try {
41+ // Get fresh token or use existing one
42+ $ tokenService = new TokenRefreshService ($ user );
43+ $ accessToken = $ tokenService ->getValidAccessToken ();
44+
45+ if (!$ accessToken ) {
46+ Log::warning ('User missing access token, logging out ' , ['user_id ' => $ user ->id ]);
47+ Auth::logout ();
48+ return redirect ()->route ('welcome ' )->with ('message ' , 'Your session has expired. Please log in again to access your registration. ' );
49+ }
50+
51+ // Get attendee info
52+ $ attendeeListResponse = Http::attsrv ()
53+ ->withToken ($ accessToken )
54+ ->get ('/attendees ' );
55+
56+ if (!$ attendeeListResponse ->successful ()) {
57+ Log::warning ('Failed to get attendee list ' , ['user_id ' => $ user ->id , 'status ' => $ attendeeListResponse ->status ()]);
58+ Auth::logout ();
59+ return redirect ()->route ('welcome ' )->with ('message ' , 'Unable to verify your registration. Please log in again. ' );
60+ }
61+
62+ $ attendeeData = $ attendeeListResponse ->json ();
63+ $ regId = $ attendeeData ['ids ' ][0 ] ?? null ;
64+
65+ if (!$ regId ) {
66+ Log::info ('User has no active registration ' , ['user_id ' => $ user ->id ]);
67+ Auth::logout ();
68+ return redirect ()->route ('welcome ' )->with ('message ' , 'Please register for the convention first before trying to obtain a fursuit badge. ' );
69+ }
70+
71+ // Get registration status
72+ $ statusResponse = Http::attsrv ()
73+ ->withToken ($ accessToken )
74+ ->get ('/attendees/ ' . $ regId . '/status ' );
75+
76+ if (!$ statusResponse ->successful ()) {
77+ Log::warning ('Failed to get registration status ' , ['user_id ' => $ user ->id , 'reg_id ' => $ regId ]);
78+ Auth::logout ();
79+ return redirect ()->route ('welcome ' )->with ('message ' , 'Unable to verify your registration status. Please log in again. ' );
80+ }
81+
82+ $ statusData = $ statusResponse ->json ();
83+ $ validRegistration = in_array ($ statusData ['status ' ], ['paid ' , 'checked in ' ]);
84+
85+ if (!$ validRegistration ) {
86+ Log::info ('User has invalid registration ' , ['user_id ' => $ user ->id , 'status ' => $ statusData ['status ' ]]);
87+ Auth::logout ();
88+ return redirect ()->route ('welcome ' )->with ('message ' , 'Please complete your convention registration payment before accessing fursuit badges. ' );
89+ }
90+
91+ // Create or update EventUser relationship
92+ $ eventUser = EventUser::updateOrCreate ([
93+ 'user_id ' => $ user ->id ,
94+ 'event_id ' => $ activeEvent ->id ,
95+ ], [
96+ 'attendee_id ' => $ regId ,
97+ 'valid_registration ' => $ validRegistration ,
98+ ]);
99+
100+ // Check for fursuit packages to set prepaid badges
101+ try {
102+ $ fursuit = Http::attsrv ()
103+ ->withToken ($ accessToken )
104+ ->get ('/attendees/ ' . $ regId . '/packages/fursuit ' )
105+ ->json ();
106+
107+ if ($ fursuit ['present ' ] && $ fursuit ['count ' ] > 0 ) {
108+ $ fursuitAdditional = Http::attsrv ()
109+ ->withToken ($ accessToken )
110+ ->get ('/attendees/ ' . $ regId . '/packages/fursuitadd ' )
111+ ->json ();
112+
113+ $ additionalCopies = $ fursuitAdditional ['present ' ] ? $ fursuitAdditional ['count ' ] : 0 ;
114+ $ totalPrepaidBadges = $ fursuit ['count ' ] + $ additionalCopies ;
115+
116+ $ eventUser ->update (['prepaid_badges ' => $ totalPrepaidBadges ]);
117+
118+ // Mark as not created in reg system
119+ Http::attsrv ()
120+ ->withToken ($ accessToken )
121+ ->post ('/attendees/ ' . $ regId . '/additional-info/fursuitbadge ' , [
122+ 'created ' => false ,
123+ ]);
124+ }
125+ } catch (\Exception $ e ) {
126+ Log::warning ('Failed to check fursuit packages ' , ['user_id ' => $ user ->id , 'error ' => $ e ->getMessage ()]);
127+ // Continue without setting prepaid badges if fursuit package check fails
128+ }
129+
130+ return $ next ($ request );
131+
132+ } catch (\Exception $ e ) {
133+ Log::error ('EventUser middleware error ' , [
134+ 'user_id ' => $ user ->id ,
135+ 'event_id ' => $ activeEvent ->id ,
136+ 'error ' => $ e ->getMessage (),
137+ ]);
138+
139+ Auth::logout ();
140+ return redirect ()->route ('welcome ' )->with ('message ' , 'An error occurred while verifying your registration. Please log in again. ' );
141+ }
142+ }
143+ }
0 commit comments