withNamesOrder($namesOrder) ->withLocales(\App\Helpers\LocaleHelper::getLocaleList()) ->withHours(\App\Helpers\DateHelper::getListOfHours()); } /** * Save user settings. * * @param SettingsRequest $request * @return \Illuminate\Http\Response */ public function save(SettingsRequest $request) { $user = $request->user(); $user->update( $request->only([ 'first_name', 'last_name', 'timezone', 'locale', 'currency_id', 'name_order', ]) + [ 'fluid_container' => $request->get('layout'), ] ); if ($user->email != $request->get('email')) { $user->email = $request->get('email'); $user->confirmation_code = str_random(30); $user->confirmed = false; $user->save(); $user->notify(new ConfirmEmail); } $user->account->default_time_reminder_is_sent = $request->get('reminder_time'); $user->account->save(); return redirect('settings') ->with('status', trans('settings.settings_success', [], $request['locale'])); } /** * Delete user account. * * @param Request $request * @return \Illuminate\Http\Response */ public function delete(Request $request) { $user = $request->user(); $account = $user->account; $tables = DB::select('SELECT table_name FROM information_schema.tables WHERE table_schema="monica"'); // Looping over the tables foreach ($tables as $table) { $tableName = $table->table_name; if (in_array($tableName, $this->ignoredTables)) { continue; } DB::table($tableName)->where('account_id', $account->id)->delete(); } DB::table('accounts')->where('id', $account->id)->delete(); $account = auth()->user()->account; if ($account->isSubscribed() && auth()->user()->has_access_to_paid_version_for_free == 0) { $account->subscription($account->getSubscribedPlanName())->cancelNow(); } auth()->logout(); $user->forceDelete(); return redirect('/'); } /** * Reset user account. * * @param Request $request * @return \Illuminate\Http\Response */ public function reset(Request $request) { $user = $request->user(); $account = $user->account; $tables = DB::select('SELECT table_name FROM information_schema.tables WHERE table_schema="monica"'); // Looping over the tables foreach ($tables as $table) { $tableName = $table->table_name; if (in_array($tableName, $this->ignoredTables)) { continue; } DB::table($tableName)->where('account_id', $account->id)->delete(); } $account->populateDefaultFields($account); return redirect('/settings') ->with('status', trans('settings.reset_success')); } /** * Display the export view. * * @return \Illuminate\Http\Response */ public function export() { return view('settings.export'); } /** * Exports the data of the account in SQL format. * * @return \Illuminate\Http\Response */ public function exportToSql() { $path = $this->dispatchNow(new ExportAccountAsSQL()); return response() ->download(Storage::disk('public')->getDriver()->getAdapter()->getPathPrefix().$path, 'monica.sql') ->deleteFileAfterSend(true); } /** * Display the import view. * * @return \Illuminate\Http\Response */ public function import() { if (auth()->user()->account->importjobs->count() == 0) { return view('settings.imports.blank'); } return view('settings.imports.index'); } /** * Display the Import people's view. * * @return \Illuminate\Http\Response */ public function upload() { if (config('monica.requires_subscription') && ! auth()->user()->account->isSubscribed()) { return redirect('/settings/subscriptions'); } return view('settings.imports.upload'); } public function storeImport(ImportsRequest $request) { $filename = $request->file('vcard')->store('imports', 'public'); $importJob = auth()->user()->account->importjobs()->create([ 'user_id' => auth()->user()->id, 'type' => 'vcard', 'filename' => $filename, ]); dispatch(new AddContactFromVCard($importJob, $request->get('behaviour'))); return redirect()->route('settings.import'); } /** * Display the import report view. * * @return \Illuminate\Http\Response */ public function report($importJobId) { $importJob = ImportJob::findOrFail($importJobId); if ($importJob->account_id != auth()->user()->account->id) { return redirect()->route('settings.index'); } return view('settings.imports.report', compact('importJob')); } /** * Display the users view. * * @return \Illuminate\Http\Response */ public function users() { $users = auth()->user()->account->users; if ($users->count() == 1 && auth()->user()->account->invitations()->count() == 0) { return view('settings.users.blank'); } return view('settings.users.index', compact('users')); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function addUser() { if (config('monica.requires_subscription') && ! auth()->user()->account->isSubscribed()) { return redirect('/settings/subscriptions'); } return view('settings.users.add'); } /** * Store a newly created resource in storage. * * @param InvitationRequest $request * @return \Illuminate\Http\Response */ public function inviteUser(InvitationRequest $request) { // Make sure the confirmation to invite has not been bypassed if (! $request->get('confirmation')) { return redirect()->back()->withErrors(trans('settings.users_error_please_confirm'))->withInput(); } // Is the email address already taken? $users = User::where('email', $request->only(['email']))->count(); if ($users > 0) { return redirect()->back()->withErrors(trans('settings.users_error_email_already_taken'))->withInput(); } // Has this user been invited already? $invitations = Invitation::where('email', $request->only(['email']))->count(); if ($invitations > 0) { return redirect()->back()->withErrors(trans('settings.users_error_already_invited'))->withInput(); } $invitation = auth()->user()->account->invitations()->create( $request->only([ 'email', ]) + [ 'invited_by_user_id' => auth()->user()->id, 'account_id' => auth()->user()->account_id, 'invitation_key' => str_random(100), ] ); dispatch(new SendInvitationEmail($invitation)); auth()->user()->account->update([ 'number_of_invitations_sent' => auth()->user()->account->number_of_invitations_sent + 1, ]); return redirect('settings/users') ->with('status', trans('settings.settings_success')); } /** * Remove the specified resource from storage. * * @param Invitation $invitation * @return \Illuminate\Http\Response */ public function destroyInvitation(Invitation $invitation) { $invitation->delete(); return redirect('/settings/users') ->with('success', trans('settings.users_invitation_deleted_confirmation_message')); } /** * Display the specified resource. * * @param string $key * @return \Illuminate\Http\Response */ public function acceptInvitation($key) { if (Auth::check()) { return redirect('/'); } Invitation::where('invitation_key', $key) ->firstOrFail(); return view('settings.users.accept', compact('key')); } /** * Store the specified resource. * * @param Request $request * @param string $key * @return \Illuminate\Http\Response */ public function storeAcceptedInvitation(Request $request, $key) { $invitation = Invitation::where('invitation_key', $key) ->firstOrFail(); // as a security measure, make sure that the new user provides the email // of the person who has invited him/her. if ($request->input('email_security') != $invitation->invitedBy->email) { return redirect()->back()->withErrors(trans('settings.users_error_email_not_similar'))->withInput(); } $user = User::createDefault($invitation->account_id, $request->input('first_name'), $request->input('last_name'), $request->input('email'), $request->input('password')); $invitation->delete(); // send me an alert dispatch(new SendNewUserAlert($user)); if (Auth::attempt(['email' => $user->email, 'password' => $request->input('password')])) { return redirect('dashboard'); } } /** * Delete additional user account. * * @param Request $request * @return \Illuminate\Http\Response */ public function deleteAdditionalUser(Request $request, $userID) { $user = User::find($userID); if ($user->account_id != auth()->user()->account_id) { return redirect('/'); } // make sure you don't delete yourself from this screen if ($user->id == auth()->user()->id) { return redirect('/'); } $user = User::find($userID); $user->delete(); return redirect('/settings/users') ->with('success', trans('settings.users_list_delete_success')); } /** * Display the list of tags for this account. */ public function tags() { return view('settings.tags'); } public function deleteTag(Request $request, $tagId) { $tag = Tag::findOrFail($tagId); if ($tag->account_id != auth()->user()->account_id) { return redirect('/'); } $tag->contacts()->detach(); $tag->delete(); return redirect('/settings/tags') ->with('success', trans('settings.tags_list_delete_success')); } public function api() { return view('settings.api.index'); } public function security(Request $request) { return view('settings.security.index', ['is2FAActivated' => app('pragmarx.google2fa')->isActivated()]); } }