Add ability to invite users

This commit is contained in:
James Cole
2022-10-01 12:21:42 +02:00
parent 9bfa52f3ce
commit ee9b651f0f
22 changed files with 656 additions and 115 deletions

View File

@@ -22,14 +22,17 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Admin;
use FireflyIII\Events\Admin\InvitationCreated;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Http\Requests\InviteUserFormRequest;
use FireflyIII\Http\Requests\UserFormRequest;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Log;
@@ -142,9 +145,17 @@ class UserController extends Controller
*/
public function index()
{
$subTitle = (string) trans('firefly.user_administration');
$subTitleIcon = 'fa-users';
$users = $this->repository->all();
$subTitle = (string) trans('firefly.user_administration');
$subTitleIcon = 'fa-users';
$users = $this->repository->all();
$singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data;
$allowInvites = false;
if (!$this->externalIdentity && $singleUserMode) {
// also registration enabled.
$allowInvites = true;
}
$invitedUsers = $this->repository->getInvitedUsers();
// add meta stuff.
$users->each(
@@ -154,7 +165,7 @@ class UserController extends Controller
}
);
return view('admin.users.index', compact('subTitle', 'subTitleIcon', 'users'));
return view('admin.users.index', compact('subTitle', 'subTitleIcon', 'users', 'allowInvites', 'invitedUsers'));
}
/**
@@ -185,6 +196,22 @@ class UserController extends Controller
);
}
/**
* @param InviteUserFormRequest $request
* @return RedirectResponse
*/
public function invite(InviteUserFormRequest $request): RedirectResponse
{
$address = (string) $request->get('invited_user');
$invitee = $this->repository->inviteUser(auth()->user(), $address);
session()->flash('info', trans('firefly.user_is_invited', ['address' => $address]));
// event!
event(new InvitationCreated($invitee));
return redirect(route('admin.users'));
}
/**
* Update single user.
*

View File

@@ -25,6 +25,7 @@ namespace FireflyIII\Http\Controllers\Auth;
use FireflyIII\Events\RegisteredUser;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Support\Http\Controllers\CreateStuff;
use FireflyIII\User;
use Illuminate\Contracts\Foundation\Application;
@@ -88,11 +89,15 @@ class RegisterController extends Controller
public function register(Request $request)
{
$allowRegistration = $this->allowedToRegister();
$inviteCode = (string) $request->get('invite_code');
$repository = app(UserRepositoryInterface::class);
$validCode = $repository->validateInviteCode($inviteCode);
if (false === $allowRegistration) {
if (false === $allowRegistration && false === $validCode) {
throw new FireflyException('Registration is currently not available :(');
}
$this->validator($request->all())->validate();
$user = $this->createUser($request->all());
Log::info(sprintf('Registered new user %s', $user->email));
@@ -104,6 +109,10 @@ class RegisterController extends Controller
$this->registered($request, $user);
if ($validCode) {
$repository->redeemCode($inviteCode);
}
return redirect($this->redirectPath());
}
@@ -157,4 +166,39 @@ class RegisterController extends Controller
return view('auth.register', compact('isDemoSite', 'email', 'pageTitle'));
}
/**
* Show the application registration form if the invitation code is valid.
*
* @param Request $request
*
* @return Factory|View
* @throws ContainerExceptionInterface
* @throws FireflyException
* @throws NotFoundExceptionInterface
*/
public function showInviteForm(Request $request, string $code)
{
$isDemoSite = app('fireflyconfig')->get('is_demo_site', config('firefly.configuration.is_demo_site'))->data;
$pageTitle = (string) trans('firefly.register_page_title');
$repository = app(UserRepositoryInterface::class);
$allowRegistration = $this->allowedToRegister();
$inviteCode = $code;
$validCode = $repository->validateInviteCode($inviteCode);
if (true === $allowRegistration) {
$message = 'You do not need an invite code on this installation.';
return view('error', compact('message'));
}
if(false === $validCode) {
$message = 'Invalid code.';
return view('error', compact('message'));
}
$email = $request->old('email');
return view('auth.register', compact('isDemoSite', 'email', 'pageTitle', 'inviteCode'));
}
}