airlineRepo = $airlineRepo; $this->airportRepo = $airportRepo; $this->userRepo = $userRepo; } /** * Return whether the vmsACARS module is enabled or not */ private function acarsEnabled(): bool { // Is the ACARS module enabled? $acars_enabled = false; $acars = Module::find('VMSAcars'); if ($acars) { $acars_enabled = $acars->isEnabled(); } return $acars_enabled; } /** * Redirect to show() since only a single page gets shown and the template controls * the other items that are/aren't shown * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function index() { return $this->show(Auth::user()->id); } /** * @param $id * * @return mixed */ public function show($id) { /** @var \App\Models\User $user */ $with = ['airline', 'awards', 'current_airport', 'fields.field', 'home_airport', 'last_pirep', 'rank']; $user = User::with($with)->where('id', $id)->first(); if (empty($user)) { Flash::error('User not found!'); return redirect(route('frontend.dashboard.index')); } $userFields = $this->userRepo->getUserFields($user, true); return view('profile.index', [ 'user' => $user, 'userFields' => $userFields, 'acars' => $this->acarsEnabled(), ]); } /** * Show the edit for form the user's profile * * @param Request $request * * @throws \Exception * * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View */ public function edit(Request $request) { /** @var \App\Models\User $user */ $user = User::with('fields.field')->where('id', Auth::id())->first(); if (empty($user)) { Flash::error('User not found!'); return redirect(route('frontend.dashboard.index')); } $airlines = $this->airlineRepo->selectBoxList(); $airports = $this->airportRepo->selectBoxList(false, setting('pilots.home_hubs_only')); $userFields = $this->userRepo->getUserFields($user); return view('profile.edit', [ 'user' => $user, 'airlines' => $airlines, 'airports' => $airports, 'countries' => Countries::getSelectList(), 'timezones' => Timezonelist::toArray(), 'userFields' => $userFields, ]); } /** * @param Request $request * * @throws \Prettus\Validator\Exceptions\ValidatorException * * @return mixed */ public function update(Request $request) { $id = Auth::user()->id; $user = $this->userRepo->findWithoutFail($id); $rules = [ 'name' => 'required', 'email' => 'required|unique:users,email,'.$id, 'airline_id' => 'required', 'password' => 'confirmed', 'avatar' => 'nullable|mimes:jpeg,png,jpg', ]; $userFields = UserField::where(['show_on_registration' => true, 'required' => true])->get(); foreach ($userFields as $field) { $rules['field_'.$field->slug] = 'required'; } $validator = Validator::make($request->toArray(), $rules); if ($validator->fails()) { Log::info('validator failed for user '.$user->ident); Log::info($validator->errors()->toArray()); return redirect(route('frontend.profile.edit', $id)) ->withErrors($validator) ->withInput(); } $req_data = $request->all(); if (!$request->filled('password')) { unset($req_data['password']); } else { $req_data['password'] = Hash::make($req_data['password']); } if (isset($req_data['avatar']) !== null) { Storage::delete($user->avatar); } // Find out the user's private channel id /* // TODO: Uncomment when Discord API functionality is enabled if ($request->filled('discord_id')) { $discord_id = $request->post('discord_id'); if ($discord_id !== $user->discord_id) { $req_data['discord_private_channel_id'] = Discord::getPrivateChannelId($discord_id); } }*/ if ($request->hasFile('avatar')) { $avatar = $request->file('avatar'); $file_name = $user->ident.'.'.$avatar->getClientOriginalExtension(); $path = "avatars/{$file_name}"; // Create the avatar, resizing it and keeping the aspect ratio. // https://stackoverflow.com/a/26892028 $w = config('phpvms.avatar.width'); $h = config('phpvms.avatar.height'); $canvas = Image::canvas($w, $h); $image = Image::make($avatar)->resize($w, $h, static function ($constraint) { $constraint->aspectRatio(); }); $canvas->insert($image); Log::info('Uploading avatar into folder '.public_path('uploads/avatars')); $canvas->save(public_path('uploads/avatars/'.$file_name)); $req_data['avatar'] = $path; } $this->userRepo->update($req_data, $id); // Save all of the user fields $userFields = UserField::all(); foreach ($userFields as $field) { $field_name = 'field_'.$field->slug; UserFieldValue::updateOrCreate([ 'user_field_id' => $field->id, 'user_id' => $id, ], ['value' => $request->get($field_name)]); } Flash::success('Profile updated successfully!'); return redirect(route('frontend.profile.index')); } /** * Regenerate the user's API key * * @param Request $request * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ public function regen_apikey(Request $request) { $user = User::find(Auth::user()->id); Log::info('Regenerating API key "'.$user->ident.'"'); $user->api_key = Utils::generateApiKey(); $user->save(); flash('New API key generated!')->success(); return redirect(route('frontend.profile.index')); } /** * Generate the ACARS config and send it to download * * @param \Illuminate\Http\Request $request * * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response */ public function acars(Request $request) { $user = Auth::user(); $config = view('system.acars.config', ['user' => $user])->render(); return response($config)->withHeaders([ 'Content-Type' => 'text/xml', 'Content-Length' => strlen($config), 'Cache-Control' => 'no-store, no-cache', 'Content-Disposition' => 'attachment; filename="settings.xml', ]); } }